减小为 LLM 模型提供服务的 Docker 镜像的大小

本文探讨了Docker镜像中基于Transformer模型如BERT和RoBERTa的大小问题,通过实例分析了镜像膨胀的原因,并提供了解决方案,以减少部署时的镜像大小,重点关注依赖项管理和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原文:Michał Marcińczuk Reducing the Size of Docker Images Serving LLM Models

Github: https://github.com/CodeNLP/codenlp-docker-ml

img

图片由 Dominik LückmannUnsplash 提供

介绍

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 GBmodel.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
  1. 重启 Docker 服务
sudo systemctl restart docker

以下命令将打印有关您的 GPU 的信息:

docker run --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

参考文献

[1] CodeNLP 的 GitHub 仓库

[2] papluca 的 XLM-RoBERTa Base 语言检测模型

[3] protectai 的 XLM-RoBERTa Base 语言检测模型 ONNX 版本

[4] ONNX 官方网站

[5] 降低 T5 模型推理时间的方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数智笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值