环境搭建与核心组件:Docker镜像构建、TensorRT-LLM安装、模型转换工具(trtllm-build)初探

说实话,很多同学在学TensorRT-LLM时,第一步就卡住了。不是代码看不懂,而是环境搭不起来。我见过太多人花了两三天装环境,最后发现版本对不上,心态直接崩了。

这一章,我就带你走一遍我自己的标准流程。这套流程我在多个项目中验证过,踩过的坑也都填平了。你跟着做,基本不会出问题。

1. Docker镜像构建:为什么我推荐用Docker?

你想想看,TensorRT-LLM的依赖有多复杂?CUDA、cuDNN、TensorRT、PyTorch、Transformer Engine……每个版本都得对上。手动装?我试过一次,折腾了整整一天。

所以我的建议是:直接用Docker。NVIDIA官方已经帮我们准备好了基础镜像,我们只需要在上面叠一层自己的东西就行。

1.1 拉取基础镜像

我个人习惯用NVIDIA的PyTorch镜像作为基础。比如:

docker pull nvcr.io/nvidia/pytorch:23.12-py3

这个镜像里已经包含了CUDA 12.3、cuDNN 8.9、PyTorch 2.1。嗯,这里要注意,版本号不是随便选的。TensorRT-LLM的每个版本都对CUDA版本有要求,你得去官方GitHub的README里确认一下。

1.2 编写Dockerfile

我一般会在项目根目录放一个Dockerfile,内容大概长这样:

FROM nvcr.io/nvidia/pytorch:23.12-py3

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    wget \
    ninja-build \
    && rm -rf /var/lib/apt/lists/*

# 克隆TensorRT-LLM
RUN git clone https://github.com/NVIDIA/TensorRT-LLM.git /workspace/TensorRT-LLM

# 安装Python依赖
WORKDIR /workspace/TensorRT-LLM
RUN pip install -r requirements.txt

# 编译安装
RUN python setup.py install

# 设置工作目录
WORKDIR /workspace

这里有个小技巧:git clonepip install分开写。为什么?因为Docker会缓存每一层。如果你改了代码,只需要重新编译那层,不用重新下载依赖。我在项目中吃过这个亏,一开始全写在一行,每次改代码都得等半小时重新装依赖……

1.3 构建镜像

docker build -t trtllm-env:latest .

构建完成后,你可以用docker run --gpus all -it trtllm-env:latest启动容器。记得加--gpus all,不然GPU用不了。

⚠️ 注意: 如果你在Windows上用WSL2,记得先装好NVIDIA Container Toolkit。不然Docker里是认不到GPU的。我曾经帮一个同事排查了半天,最后发现他忘了装这个……

2. TensorRT-LLM安装:源码编译 vs pip安装

TensorRT-LLM有两种安装方式:源码编译pip安装。我个人的建议是:

  • 生产环境:用pip安装预编译的wheel包,省事
  • 开发调试:用源码编译,方便改代码

2.1 pip安装(推荐新手)

NVIDIA会为每个版本发布预编译的wheel包。你只需要:

pip install tensorrt_llm -U

但要注意,这个包对CUDA版本有要求。比如TensorRT-LLM 0.7.0要求CUDA 12.1以上。你可以在PyPI上查看具体版本对应关系。

2.2 源码编译(进阶玩法)

如果你需要定制某些算子,或者想调试底层代码,那就得源码编译了。步骤稍微多一点:

git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
git submodule update --init --recursive
pip install -r requirements.txt
python setup.py install

编译时间取决于你的机器。我用的A100机器,大概需要15-20分钟。如果你用普通显卡,可能得半小时以上。嗯,这时候可以去喝杯咖啡。

💡 小提示: 编译时加上--use-ninja参数可以加速。Ninja是一个比Make更快的构建工具。命令:python setup.py install --use-ninja

3. 模型转换工具(trtllm-build)初探

环境搭好了,接下来就是核心环节:把HuggingFace模型转成TensorRT-LLM的格式。这个工具叫trtllm-build,说白了就是一个命令行工具,负责把模型“编译”成TensorRT能跑的引擎。

3.1 基本用法

假设你有一个HuggingFace的LLaMA模型,想转成TensorRT-LLM格式。命令很简单:

trtllm-build --model_dir /path/to/llama \
             --output_dir /path/to/trtllm_engine \
             --dtype float16 \
             --max_batch_size 8 \
             --max_input_len 2048 \
             --max_output_len 512

这里每个参数的含义:

参数 说明 我的建议
--model_dir HuggingFace模型路径 确保里面有config.jsonpytorch_model.bin
--output_dir 输出引擎路径 建议用trtllm_engine命名,方便区分
--dtype 精度:float16或bfloat16 一般用float16,显存不够再考虑int8
--max_batch_size 最大batch大小 根据你的显存来,8是个安全值
--max_input_len 最大输入长度 2048够大多数场景用了
--max_output_len 最大输出长度 512一般够用,长文本生成可以设到1024

3.2 转换过程详解

当你运行trtllm-build时,背后其实做了三件事:

  1. 权重提取:从HuggingFace的pytorch_model.bin里读出所有参数
  2. 图优化:把Transformer的计算图转换成TensorRT的IR(中间表示)
  3. 引擎编译:针对你的GPU架构生成最优的CUDA kernel

这个过程会输出很多日志。你可能会看到类似这样的信息:

[TensorRT-LLM] Building engine for LLaMA-7B...
[TensorRT-LLM] Using precision: float16
[TensorRT-LLM] Max batch size: 8
[TensorRT-LLM] Max input length: 2048
[TensorRT-LLM] Max output length: 512
[TensorRT-LLM] Engine built successfully in 45.3 seconds

看到Engine built successfully就说明成功了。嗯,如果报错了也别慌,多半是参数没设对。

🔑 核心要点: trtllm-build生成的引擎文件(.engine)是平台相关的。你在A100上编译的引擎,不能直接拿到V100上用。因为不同GPU架构的CUDA kernel不一样。所以部署时,最好在目标机器上重新编译。

4. 本章知识体系总览

为了让你更直观地理解这一章的内容,我画了一张流程图:

环境搭建与核心组件流程 1. Docker镜像构建 2. TensorRT-LLM安装 3. trtllm-build转换 拉取基础镜像 编写Dockerfile docker build pip安装(推荐) 源码编译(进阶) 权重提取 图优化 引擎编译 最终产出:.engine 引擎文件(平台相关)

5. 避坑指南

最后,分享几个我踩过的坑:

  • 版本不匹配:我曾经把TensorRT-LLM 0.6.0和CUDA 11.8搭在一起,结果编译到一半就报错了。后来查文档才发现,0.6.0要求CUDA 12.0以上。所以,一定要看官方文档的版本对应表
  • 显存不足:转换LLaMA-13B时,我用了默认的float16精度,结果显存爆了。后来改成int8才搞定。如果你显存不够,可以试试--dtype int8
  • 路径问题--model_dir一定要指向包含config.json的目录。我有个同事把路径指向了模型文件夹的父目录,结果trtllm-build报错说找不到模型配置。

好了,环境搭建和核心组件就讲到这里。你跟着走一遍,应该能顺利跑起来。如果遇到问题,多看看日志,大部分错误信息都挺明确的。

专注资料整理