如何精简 SBERT 的句子转换器库?

nmu*_*thy 5 python pytorch sentence-transformers huggingface large-language-model

SBERT ( https://www.sbert.net/ )sentence-transformer库 ( https://pypi.org/project/sentence-transformers/ ) 是 Python 开源 LLM 生态系统中用于生成文本块向量嵌入的最流行的库。它有一个简单的 API,但却是一个非常大的依赖项。它所有的膨胀从何而来?

下面是使用此工具构建基础 Docker 容器映像的屏幕截图,该工具接管11 mins构建,最终映像大小为7.5 GB

基础 docker 镜像

作为参考,这是我的Dockerfile.base

FROM python:3.11.2-slim-bullseye
RUN pip install --upgrade pip && pip install sentence-transformers
Run Code Online (Sandbox Code Playgroud)

我预计这是因为它安装了一些已经预先打包的模型,但是当我尝试他们流行的入门片段时

FROM python:3.11.2-slim-bullseye
RUN pip install --upgrade pip && pip install sentence-transformers
Run Code Online (Sandbox Code Playgroud)

它又向我的文件系统下载了数百 MB 的文件。所以我想找到一种方法将其精简为我需要的包。我相信这个库的大小很大程度上取决于底层torch依赖项(6.9 GB),而底层依赖项又由于其底层nvidia-*依赖项而占用了大量磁盘空间(顺便说一句,这些依赖项安装在哪里?)

假设我已经将一个模型下载到我的文件系统(即path/to/all-MiniLM-L6-v2来自 HuggingFace 的存储库),而我想要做的就是在 CPU 上运行上面的代码。如何才能只安装我需要的东西而不造成臃肿?

现在假设我选择了一个 GPU 来运行它。为了让这段代码在不膨胀的情况下运行,我需要的下一组边际依赖项是什么?

Nic*_*ell 8

它又向我的文件系统下载了数百 MB 的文件。所以我想找到一种方法将其精简为我需要的包。我相信这个库的大小很大程度上是由于底层的 torch 依赖项(6.9 GB),而它又由于其底层的 nvidia-* 依赖项而占用了大量磁盘空间(顺便说一句,这些依赖项安装在哪里?)

我喜欢使用docker div 工具来回答这类问题。除了缓存目录之外,图像的大部分空间似乎都被/usr/local/lib/python3.11/site-packages. /usr/local/lib/python3.11/site-packages/nvidia特别是,和似乎正在使用大量空间/usr/local/lib/python3.11/site-packages/torch

假设我已经将一个模型下载到我的文件系统(即 HuggingFace 的路径/to/all-MiniLM-L6-v2 存储库),而我想要做的就是在 CPU 上运行上面的代码。如何才能只安装我需要的东西而不造成臃肿?

我有两个建议。

  1. 第一个是--no-cache-dir。目前它正在内部存储 2.4 GB 的缓存包/root/.cache。您可以通过将此 Dockerfile 重写为以下内容来防止这种情况发生:

    FROM python:3.11.2-slim-bullseye
    RUN pip install --upgrade pip && pip install --no-cache-dir sentence-transformers
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我给出的第二个建议是使用仅 CPU 版本的 torch。许多依赖项仅用于在 Nvidia GPU 上运行模型。

    以下 Dockerfile 仅安装仅 CPU 依赖项。

    FROM python:3.11.2-slim-bullseye
    RUN pip install --no-cache-dir --upgrade pip
    RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
    RUN pip install --no-cache-dir sentence-transformers
    
    Run Code Online (Sandbox Code Playgroud)

    这导致图像大小为 1.39GB。

现在假设我选择了一个 GPU 来运行它。为了让这段代码在不膨胀的情况下运行,我需要什么下一组边际依赖项?

我对 CUDA 的了解不够,不知道可以在不破坏它的情况下删除它的哪些部分,抱歉。