TensorRT-LLM.V1.1.0rc1:Dockerfile.multi文件解读
一、TensorRT-LLM有三种安装方式,从简单到难
1.NGC上的预构建发布容器进行部署,见《tensorrt-llm0.20.0离线部署DeepSeek-R1-Distill-Qwen-32B》。
2.通过pip进行部署。
3.从源头构建再部署,《TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践》。
本次重点介绍Dockerfile.multi文件都包括什么。
Dockerfile.multi 是一个 工业级、生产就绪 的构建脚本,具备以下特点:
✅ 多阶段分离:开发、构建、发布、Triton 集成各司其职
✅ 可定制性强:通过 ARG 支持灵活配置
✅ 支持国内加速:GITHUB_MIRROR
✅ 安全加固:升级 protobuf 修复漏洞
✅ 缓存优化:使用 --mount=type=cache 提升构建速度
✅ 最终镜像精简:删除中间文件、清理缓存
Dockerfile 定义了 7 个构建阶段,每个阶段都有特定用途:
阶段名 | 作用 | 基于哪个镜像 |
base | 初始化基础环境,设置变量、清理配置 | ${BASE_IMAGE}:${BASE_TAG} |
devel | 开发环境:安装 Python、CMake、CUDA 工具链、TensorRT 等 | base |
triton | 引入 Triton Inference Server 基础镜像 | ${TRITON_IMAGE}:${TRITON_BASE_TAG} |
tritondevel | 在 devel 基础上集成 Triton 开发组件 | devel 和 triton |
wheel | 构建 TensorRT-LLM 的 Python wheel 包 | ${DEVEL_IMAGE}(动态指定) |
release | 运行时镜像:安装 wheel,准备运行环境 | ${DEVEL_IMAGE} |
tritonbuild / tritonrelease | 为 Triton Server 构建并集成后端 | release 和 wheel |
二、7 个构建阶段
2.1. base 阶段:基础初始化
FROM ${BASE_IMAGE}:${BASE_TAG} AS base
- 使用 NVIDIA PyTorch 官方镜像作为起点(如 nvcr.io/nvidia/pytorch:25.06-py3)。
- 设置 EULA 和 AI 使用条款标签。
- 设置 shell 环境变量(BASH_ENV, ENV)。
- 清理 pip 的约束文件(避免依赖冲突)。
- 设置默认 shell 为 /bin/bash -c。
✅ 目的:为后续阶段提供一个干净、标准化的基础镜像。
2.2. devel 阶段:核心开发环境
FROM base AS devel
在此阶段安装一系列开发所需工具和库:
操作 | 说明 |
install_base.sh | 安装基础工具(wget, git, unzip, cmake 等),可选 GitHub 镜像加速 |
install_cmake.sh | 安装较新版本的 CMake(可能比 base 镜像自带的更新) |
install_ccache.sh | 安装 ccache,加速 C++ 编译 |
install_cuda_toolkit.sh | 如果 base 镜像 CUDA 太旧,则升级 CUDA Toolkit |
install_tensorrt.sh | 下载并安装指定版本的 TensorRT(通过参数传入版本号) |
install_polygraphy.sh | 安装 Polygraphy(TensorRT 调试/分析工具) |
install_mpi4py.sh | 安装 mpi4py,支持多 GPU 分布式通信 |
install_pytorch.sh | 可选重装 PyTorch(skip 表示跳过) |
升级 protobuf | 修复安全漏洞(CVE) |
安装 opencv-python-headless | 支持图像处理(无 GUI) |
✅ 目的:构建一个功能完整的 C++/Python 深度学习开发环境,可用于编译 TensorRT-LLM。
2.3. triton 阶段:引入 Triton Inference Server
FROM ${TRITON_IMAGE}:${TRITON_BASE_TAG} AS triton
- 使用 NVIDIA Triton Server 镜像(如 nvcr.io/nvidia/tritonserver:25.06-py3)。
- 仅作为资源提供者,不直接运行。
- 后续阶段会从它复制文件。
2.4. tritondevel 阶段:集成 Triton 开发组件
FROM devel AS tritondevelCOPY --from=triton /opt/tritonserver/... ...
- 基于 devel 环境。
- 从 triton 镜像中复制以下内容到本地:
- Python 后端
- 库文件(.so)
- 头文件(include)
- 可执行文件(bin)
- 缓存目录
- 然后运行 install_triton.sh:可能安装 Triton 客户端 SDK 或 Python 包。
- 继续安装:
- UCX(高性能通信)
- NIXL(NVIDIA InfiniBand/X 网络库)
- etcd(分布式协调服务)
✅ 目的:构建一个支持 Triton 集成开发 的环境,可用于开发自定义后端或调试。
2.5. wheel 阶段:构建 Python Wheel 包
dockerfile
深色版本
FROM ${DEVEL_IMAGE} AS wheel
- 使用外部传入的开发镜像(${DEVEL_IMAGE},默认可能是 devel)。
- 将源码复制进来:
- cpp/, tensorrt_llm/, benchmarks/, 3rdparty/, setup.py 等
- 创建 pip 和 ccache 缓存目录
python3 scripts/build_wheel.py --clean --benchmarks
这会编译 C++ 扩展并生成 .whl 文件(如 tensorrt_llm-0.1.0-cp312-cp312-linux_x86_64.whl)
✅ 目的:编译并打包 TensorRT-LLM 为 Python wheel,便于分发和安装。
2.6. release 阶段:最终运行时镜像
FROM ${DEVEL_IMAGE} AS release
- 基于开发镜像(最小依赖)
- 从 wheel 阶段复制生成的 .whl 文件
- 使用 pip install 安装 wheel
- 删除 wheel 文件和 pip 缓存(减小镜像体积)
- 创建符号链接:
- bin/executorWorker → Python 安装路径下的可执行文件
- lib/libnvinfer_plugin_tensorrt_llm.so → 插件库
- 更新 ldconfig,确保动态库可被找到
- 验证链接完整性(ldd 检查是否缺失依赖)
- 复制示例代码(examples/)、文档、C++ 基准测试二进制文件
- 设置环境变量:
- TRT_LLM_GIT_COMMIT
- TRT_LLM_VERSION
✅ 目的:生成一个轻量、可运行、可用于部署的最终镜像。
2.7. tritonbuild & tritonrelease 阶段:Triton 后端集成
2.7.1tritonbuild:
FROM wheel AS tritonbuildRUN pip install /src/tensorrt_llm/build/tensorrt_llm*.whlCOPY ./triton_backend/ ./RUN bash ./triton_backend/inflight_batcher_llm/scripts/build.sh
- 安装 wheel
- 复制 Triton 自定义后端代码
- 编译 Inflight Batcher LLM 后端(用于在 Triton 中实现动态批处理)
2.7.2tritonrelease:
FROM release AS tritonreleaseCOPY --from=tritonbuild /opt/tritonserver/backends/tensorrtllm /opt/tritonserver/backends/tensorrtllm
- 基于 release 镜像
- 从 tritonbuild 复制编译好的 Triton 后端
- 同时复制所有 Triton 模型配置脚本和客户端工具
✅ 目的:生成一个完全集成 Triton Server 功能的最终镜像,可直接用于部署 LLM 服务。