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_ENVENV)。
  • 清理 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 服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93663.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UniApp 实现pdf上传和预览

一、上传1、html<template><button click"takeFile">pdf上传</button> </template>2、JStakeFile() {// #ifdef H5// H5端使用input方式选择文件const input document.createElement(input);input.type file;input.accept .pdf;input.onc…

《用Proxy解构前端壁垒:跨框架状态共享库的从零到优之路》

一个项目中同时出现React的函数式组件、Vue的模板语法、Angular的依赖注入时,数据在不同框架体系间的流转便成了开发者不得不面对的难题—状态管理,这个本就复杂的命题,在跨框架场景下更显棘手。而Proxy,作为JavaScript语言赋予开发者的“元编程利器”,正为打破这道壁垒提…

MOESI FSM的全路径测试用例

MOESI FSM的全路径测试用例摘要&#xff1a;本文首先提供一个UVM版本的测试序列&#xff08;基于SystemVerilog和UVM框架&#xff09;&#xff0c;设计为覆盖MOESI FSM的全路径&#xff1b;其次详细解释如何使用覆盖组&#xff08;covergroup&#xff09;来量化测试的覆盖率&am…

git仓库和分支的关系

1️⃣ 仓库分支&#xff08;Repository Branch&#xff09;每个 Git 仓库都有自己的分支结构。分支决定你当前仓库看到的代码版本。示例&#xff1a;仓库分支只是局部修改&#xff0c;项目分支才是全局管理所有仓库分支的概念。wifi_camera 仓库&#xff1a; - main - dev - fe…

Linux的基本操作

Linux 系统基础操作完整指南一、文件与目录操作1. 导航与查看pwd (Print Working Directory)作用&#xff1a;显示当前所在目录的完整路径示例&#xff1a;pwd → 输出 /home/user/documents使用场景&#xff1a;当你在多层目录中迷失时快速定位当前位置ls (List)常用选项&…

npm设置了镜像 pnpm还需要设置镜像吗

npm配置镜像后是否需要为pnpm单独设置镜像&#xff1f; 是的&#xff0c;即使您已经为npm设置了镜像源&#xff08;如淘宝镜像&#xff09;&#xff0c;仍然需要单独为pnpm配置镜像源。这是因为npm和pnpm是两个独立的包管理工具&#xff0c;它们的配置系统和环境变量是分离的&a…

Linux管道

预备知识&#xff1a;进程通信进程需要某种协同&#xff0c;协同的前提条件是通信。有些数据是用来通知就绪的&#xff0c;有些是单纯的传输数据&#xff0c;还有一些是控制相关信息。进程具有独立性&#xff0c;所以通信的成本可能稍微高一点&#xff1b;进程间通信前提是让不…

基于Spring Boot的快递物流仓库管理系统 商品库存管理系统

&#x1f525;作者&#xff1a;it毕设实战小研&#x1f525; &#x1f496;简介&#xff1a;java、微信小程序、安卓&#xff1b;定制开发&#xff0c;远程调试 代码讲解&#xff0c;文档指导&#xff0c;ppt制作&#x1f496; 精彩专栏推荐订阅&#xff1a;在下方专栏&#x1…

脚手架开发-Common封装基础通用工具类<基础工具类>

书接上文 java一个脚手架搭建_redission java脚手架-CSDN博客 以微服务为基础搭建一套脚手架开始前的介绍-CSDN博客 脚手架开发-准备配置-进行数据初始化-配置文件的准备-CSDN博客 脚手架开发-准备配置-配置文件的准备项目的一些中间件-CSDN博客 脚手架开发-Nacos集成-CSD…

软件系统运维常见问题

系统部署常见问题 环境配置、兼容性问题。生产与测试环境的操作系统、库版本、中间件版本不一致&#xff0c;运行环境软件版本不匹配。新旧版本代码/依赖不兼容。依赖缺失或冲突问题。后端包启动失败&#xff0c;提示类/方法/第三方依赖库找不到或者版本冲突。配置错误。系统启…

2021 IEEE【论文精读】用GAN让音频隐写术骗过AI检测器 - 对抗深度学习的音频信息隐藏

使用GAN生成音频隐写术的隐写载体 本文为个人阅读GAN音频隐写论文&#xff0c;部分内容注解&#xff0c;由于原文篇幅较长这里就不再一一粘贴&#xff0c;仅对原文部分内容做注解&#xff0c;仅供参考详情参考原文链接 原文链接&#xff1a;https://ieeexplore.ieee.org/abstra…

PWA技术》》渐进式Web应用 Push API 和 WebSocket 、webworker 、serviceworker

PWA # 可离线 # 高性能 # 无需安装 # 原生体验Manifest {"name": "天气助手", // 应用全名"short_name": "天气", // 短名称&#xff08;主屏幕显示&#xff09;"start_url": "/index.html&…

数据结构——栈和队列oj练习

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 这一题需要我们充分理解队列和栈的特点。 队列&#xff1a;队头出数据&#xff0c;队尾入数据。 栈&#xff1a;栈顶出数据和入数据。 我们可以用两个队列实现栈&#xff0c;在这过程中&#xff0c;我们总要保持其…

Java基础 8.19

目录 1.局部内部类的使用 总结 1.局部内部类的使用 说明&#xff1a;局部内部类是定义在外部类的局部位置&#xff0c;比如方法中&#xff0c;并且有类名可以直接访问外部类的所有成员&#xff0c;包含私有的不能添加访问修饰符&#xff0c;因为它的地位就是一个局部变量。局…

从父类到子类:C++ 继承的奇妙旅程(2)

前言&#xff1a;各位代码航海家&#xff0c;欢迎回到C继承宇宙&#xff01;上回我们解锁了继承的「基础装备包」&#xff0c;成功驯服了public、protected和花式成员隐藏术。但——⚠️前方高能预警&#xff1a; 继承世界的暗流涌动远不止于此&#xff01;今天我们将勇闯三大神…

【图像算法 - 16】庖丁解牛:基于YOLO12与OpenCV的车辆部件级实例分割实战(附完整代码)

庖丁解牛&#xff1a;基于YOLO12与OpenCV的车辆部件级实例分割实战&#xff08;附完整代码&#xff09; 摘要&#xff1a; 告别“只见整车不见细节”&#xff01;本文将带您深入实战&#xff0c;利用YOLO12-seg训练实例分割模型&#xff0c;结合OpenCV的强大图像处理能力&…

ubuntu22.04配置远程桌面

文章目录前言检查桌面类型xorg远程桌面(xrdp)安装xrdpxrdp添加到ssl-certwayland远程桌面(gnome-remote-desktop)检查安装开启开启状况检查自动登录奇技淫巧前言 在windows上使用远程桌面服务&#xff0c;连接ubuntu主机的远程桌面 检查桌面类型 查看桌面类型、协议 echo $…

SQL Server 中子查询、临时表与 CTE 的选择与对比

在 SQL Server 的实际开发过程中&#xff0c;我们常常需要将复杂的查询逻辑分解为多个阶段进行处理。实现这一目标的常见手段有 子查询 (Subquery)、临时表 (Temporary Table) 和 CTE (Common Table Expression)。这三者在语法、执行效率以及可维护性方面各有优势与局限。如何选…

肖臻《区块链技术与应用》第20-22讲 - 以太坊难度调整、权益证明和智能合约

以太坊的“冰河时代”:详解难度调整算法与“难度炸弹” 摘要: 为了实现远快于比特币的十几秒出块速度,以太坊必须设计一套更为灵敏和复杂的挖矿难度调整算法。本文基于北京大学肖臻老师的公开课内容,深入剖析了以太坊独特的逐块难度调整机制。文章首先解释了其维持15秒平均…

C++中内存池(Memory Pool)详解和完整示例

1. 什么是内存池&#xff1f; 内存池&#xff08;Memory Pool / Pool Allocator&#xff09; 是一种内存管理机制&#xff0c;提前向系统申请一大块内存&#xff0c;再在这块内存里切分、分配和回收。 它相当于在用户空间建立了一层 “小型堆管理器”&#xff0c;避免频繁调用系…