趋近智
部署机器学习模型需要将模型制品及其依赖项打包成可重现的格式。对于大型语言模型 (LLM),此过程会带来显著的操作困难,因为模型权重文件庞大,且其软件环境很复杂。在处理大小可达数十到数百GB的模型时,标准方法通常不够用。
与较小的机器学习模型不同,LLM 会带来特有的打包难题:
第一步是保存训练或微调后的模型权重。尽管存在标准的框架方法(torch.save、tf.saved_model.save),但它们可能不适用于 LLM。
pickle 模块,该模块存在已知的安全漏洞(可执行任意代码)。加载大型检查点也可能很慢。.safetensors)在大型模型中很受欢迎。它在设计上强调安全性(不会执行任意代码),并可能加载更快,尤其在使用内存映射时。它以扁平二进制布局存储张量,并带有一个描述张量元数据的 JSON 头部。考虑到其体积,直接将权重嵌入到版本控制系统或单个容器镜像层中通常是不实际的。常见的方法有:
精确定义软件环境十分要紧。
requirements.txt(针对 pip)或 environment.yml(针对 conda)来列出所有带有固定版本的 Python 依赖项。这包括深度学习框架、像 transformers、accelerate、bitsandbytes(用于量化)等库。nvcc、运行时库如 libcudart.so、libcudnn.so、libnccl.so)。这些依赖项最好通过容器化来管理。Docker 为复杂的 LLM 环境提供了必要的隔离性和可重现性。它将应用程序代码、模型(或获取模型的指令)、库和系统依赖项打包成一个独立单元:容器镜像。
为 LLM 创建一个高效的 Dockerfile 涉及多方面考量:
基础镜像选择:从包含所需 GPU 驱动和 CUDA 工具包版本的官方基础镜像开始。NVIDIA 在 NGC(NVIDIA GPU Cloud)上提供了针对不同 CUDA 版本和深度学习框架优化的容器镜像(例如 nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04)。选择正确的基础镜像可减少设置工作量,并确保与目标 GPU 硬件的兼容性。
安装依赖项:使用 pip 或 conda 安装需求文件中指定的 Python 包。确保安装过程高效且可重现。
模型制品处理:你有两种主要方法:
COPY model_weights /app/model_weights)。
对于大多数大规模 LLM 部署,由于体积限制和操作灵活性,在运行时加载权重是更受青睐的方法。
优化镜像体积和构建时间:
RUN 命令,以减少镜像层数。# 阶段 1:构建阶段(如果自定义组件需要)
# FROM ... 作为构建器
# RUN ... 构建自定义内核或依赖项 ...
# 阶段 2:最终运行时阶段
ARG CUDA_VERSION=12.1.1
ARG CUDNN_VERSION=8
ARG OS_VERSION=22.04
FROM nvidia/cuda:${CUDA_VERSION}-cudnn${CUDNN_VERSION}-runtime-ubuntu${OS_VERSION}
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive \
PIP_NO_CACHE_DIR=off \
TRANSFORMERS_CACHE=/app/.cache \
HF_HOME=/app/.cache
# 安装系统依赖项
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python3 python3-pip git curl \
&& rm -rf /var/lib/apt/lists/*
# 复制必要文件(需求、应用程序代码)
WORKDIR /app
COPY requirements.txt .
COPY src/ /app/src/
COPY scripts/ /app/scripts/
# 安装 Python 依赖项
RUN pip3 install --no-cache-dir --upgrade pip && \
pip3 install --no-cache-dir -r requirements.txt
# (可选)从构建阶段复制预编译组件
# COPY --from=builder /path/to/built/artifact /app/
# 设置入口点/命令以运行推理服务器
# 如果权重未挂载,此脚本将处理权重下载
COPY scripts/start_server.sh .
ENTRYPOINT ["/app/start_server.sh"]
# 暴露推理端口
EXPOSE 8000
一个用于 LLM 推理服务器的多阶段 Dockerfile 结构。它使用官方的 NVIDIA CUDA 基础镜像,安装依赖项,复制应用程序代码,并定义了一个入口点脚本。模型权重被假定由
start_server.sh在运行时加载。
在打包和容器化时,需要注意:
通过仔细管理模型序列化、依赖项和容器化方法,你可以为大型语言模型创建可重现、可移植且体积适中的部署单元,为在生产环境中高效提供服务创造条件。将权重打包到镜像中与在运行时加载它们的选择,很大程度上取决于你的具体基础设施、模型更新频率以及对冷启动延迟的容忍度。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造