文章目录
原文:Michał Marcińczuk Reducing the Size of Docker Images Serving LLM Models
Github: https://github.com/CodeNLP/codenlp-docker-ml
图片由 Dominik Lückmann 在 Unsplash 提供
介绍
BERT、RoBERTa 或 T5 等基于 Transformer 的模型为自然语言处理中的许多自定义问题提供了最先进的解决方案。在生产环境中交付模型的一种常见方式是构建一个提供模型 API 的 Docker 镜像。该镜像封装了所需的依赖项、模型本身和用于处理输入数据的代码。与大型生成模型(GenAI)相比,这些模型相对较小,大小从 0.5 到 2 GB 不等。然而,当您按照直接的方式部署模型作为 Docker 镜像时,您可能会对镜像的大小感到惊讶,它可能达到 8 GB。您是否想知道目标镜像为何如此之大,以及是否有方法可以减小其大小?在本故事中,我将讨论 Docker 镜像可能如此庞大的原因以及如何减小其大小。
故事中使用的 Python 脚本和 Docker 文件的示例也可以在这个仓库中找到 [1]:
基准 Docker 镜像
让我们为语言检测模型构建一个简单的 Docker 镜像。以下是构建模型的一些假设:
- 我将使用一个经过训练的模型:
papluca/xlm-roberta-base-language-detection
[2]。 - 我将利用 GPU 来获得最佳性能。
- 我将使用 FastAPI 提供一个简单的端点来处理单个文本。
以下是构建镜像的 Dockerfile:
FROM nvidia/cuda:11.8.0-base-ubuntu22.04
RUN apt-get update && apt-get install -y build-essential
RUN apt-get install python3.9 -y
RUN apt-get install python3-pip -y
RUN python3 -m pip install --no-cache-dir --upgrade pip \
&& python3 -m pip install --no-cache-dir torch transformers fastapi uvicorn
WORKDIR /workspace
COPY models/xlm-roberta-base-language-detection models/xlm-roberta-base-language-detection
COPY api-cuda.py api.py
ENTRYPOINT ["uvicorn", "api:app", "--host", "0.0.0.0"]
用于加载模型并执行推理的代码如下:
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline
app = FastAPI()
model_ckpt = "models/xlm-roberta-base-language-detection"
pipe = pipeline("text-classification", model=model_ckpt, device="cuda:0")
class Input(BaseModel):
text: str
@app.post("/process")
async def process(input: Input) -> str:
return pipe(input.text, top_k=1, truncation=True)[0]['label']
以下是用于构建镜像的命令:
docker build -t language_detection_cuda . -f Dockerfile_cuda
… 并运行镜像:
docker run --gpus 0 -p 8000:8000 language_detection_cuda
… 让我们测试一下端点:
time curl -X 'POST' 'http://localhost:8000/process' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{
"text": "Certo ci sono stati dei problemi - problemi che dovremo risolvere in vista, per esempio, dell'\''ampliamento - ma a volte ne esageriamo il lato negativo."
}'
我们得到了以下输出:
"it"
到目前为止,没有什么特别的。端点做了它该做的事情。
模型大小为 1.11 GB(model.safetensors
文件),标记器还有 10 MB。现在,让我们看看我们的 Docker 镜像的大小:
docker images | grep language_detection_cuda
… 输出为:
language_detection_cuda latest 47f4c1c0de2d 33 minutes ago 7.05GB
Docker 镜像总共 7.05 GB。哇,这相当大,不是吗?但是为什么镜像如此之大呢?让我们进入容器并查看里面有什么。
docker run -it --gpus 0 -p 8000:8000 --entrypoint "/bin/bash" language_detection_cuda
为了分析镜像的大小,我将使用 du
命令和追踪最大的文件夹的组合。
du -h --max-depth 1 /
根目录的输出,包括最大的文件夹如下:
5.9G /usr
1.1G /workspace
...
workspace 文件夹包含模型和 Python 脚本,其大小主要由 model.safetensors
文件的大小决定。这里没有什么奇怪的。
usr 文件夹包含运行 Python 代码所需的依赖项。让我们查看文件夹中有什么。
5340M /usr/local/lib/python3.10/dist-packages/
2961M /usr/local/lib/python3.10/dist-packages/nvidia
1644M /usr/local/lib/python3.10/dist-packages/torch
439M /usr/local/lib/python3.10/dist-packages/triton
77M /usr/local/lib/python3.10/dist-packages/transformers
53M /usr/local/lib/python3.10/dist-packages
流量异常, 请尝试更换网络环境, 如果你觉得ip被误封了, 可尝试邮件联系我们, 当前ip:164.155.205.190
在终端中输入以下命令安装 Nvidia 容器工具包:
sudo apt install nvidia-container-toolkit
- 重启 Docker 服务
sudo systemctl restart docker
以下命令将打印有关您的 GPU 的信息:
docker run --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
参考文献
[2] papluca 的 XLM-RoBERTa Base 语言检测模型
[3] protectai 的 XLM-RoBERTa Base 语言检测模型 ONNX 版本
[4] ONNX 官方网站
[5] 降低 T5 模型推理时间的方法