[实践记录]qwen3的tensorRT跨版本量化
# 在 RTX 4090 上部署 TensorRT-LLM 0.12.0 并完成 Qwen3-0.6B W4A16 量化记录
## 1. 背景
本次目标是在 RTX 4090 主机上,使用 TensorRT-LLM 0.12.0 对 Qwen3-0.6B 进行 INT4 Weight Only 量化,生成可部署到 Jetson Orin NX 的 TensorRT-LLM checkpoint。
整体流程:
```text
Qwen3-0.6B HuggingFace FP16
|
v
TensorRT-LLM Qwen3 Converter
|
v
W4A16 INT4 checkpoint
|
v
Orin NX trtllm-build
|
v
TensorRT Engine
由于 TensorRT-LLM 0.12.0 原生不支持 Qwen3,因此首先从 NX 环境迁移 Qwen3 支持代码到 RTX 4090。
2. 环境信息
RTX 4090 主机
Ubuntu 22.04
CUDA 12.6
TensorRT 10.3
Python 3.10
TensorRT-LLM 0.12.0
模型路径:
/home/scjs/trt_models/Qwen3-0.6B
量化输出:
/home/scjs/trt_models/Qwen3-0.6B-trtllm-w4a16
3. 遇到的问题与解决方案
问题1:Executor 构造函数缺失导致 pybind 编译失败
现象
编译 TensorRT-LLM 时:
undefined reference to
tensorrt_llm::executor::Executor(
std::filesystem::path const&,
ModelType,
ExecutorConfig const&,
bool)
检查:
nm -C libtensorrt_llm_executor_static.a
发现:
存在:
Executor(path, ModelType, ExecutorConfig)
不存在:
Executor(path, ModelType, ExecutorConfig, bool)
但是 Python binding 中仍然绑定了:
py::init<
std::filesystem::path const&,
tle::ModelType,
tle::ExecutorConfig const&,
bool
>()
导致链接失败。
解决
修改:
cpp/tensorrt_llm/pybind/executor/executor.cpp
删除两个带:
bool use_mmap
参数的 executor binding。
原因:
checkpoint 转换流程不依赖 executor mmap 功能。
问题2:executorWorker 编译失败(MPI 符号缺失)
现象
链接:
executorWorker
失败:
undefined reference to:
ompi_mpi_comm_null
MPI_Comm_group
MPI_Recv
MPI_Wait
...
原因:
executorWorker 依赖 OpenMPI,而当前编译环境没有正确链接 MPI。
解决
发现:
checkpoint 转换并不需要 executorWorker。
修改:
scripts/build_wheel.py
关闭 executorWorker:
原:
executor_worker = "executorWorker"
修改:
executor_worker = ""
同时删除 wheel 打包阶段:
copy(
build_dir / "executorWorker",
bin_dir
)
避免打包失败。
问题3:TensorRT-LLM 导入失败(MPI ABI 不匹配)
现象
安装 wheel 后:
import tensorrt_llm
报:
undefined symbol:
ompi_mpi_comm_null
以及:
MpiComm(ompi_communicator_t*, bool)
缺失。
原因
预编译 executor:
libtensorrt_llm_executor_static.a
使用 OpenMPI ABI。
但是之前编译:
ENABLE_MULTI_DEVICE=0
生成:
MpiComm(int,bool)
导致 ABI 不一致。
解决
重新编译 TensorRT-LLM:
开启:
-DENABLE_MULTI_DEVICE=1
安装 OpenMPI:
检查:
which mpicxx
输出:
/usr/bin/mpicxx
确认:
ldconfig -p | grep libmpi
存在:
libmpi.so
libmpi_cxx.so
重新生成 wheel。
问题4:cuda-python 版本错误
现象
导入 TensorRT-LLM:
ImportError:
cannot import name 'cudart'
检查:
cuda-python 13.3.1
但是当前环境:
CUDA 12.6
TensorRT 10.3
TensorRT-LLM 0.12.0
需要对应 CUDA 12.6 版本。
解决
重新安装:
pip install cuda-python==12.6.0
验证:
from cuda import cudart
成功。
问题5:pynvml 版本导致导入失败
现象
错误:
AttributeError:
module 'pynvml' has no attribute '__version__'
原因:
安装了新版:
pynvml 13.x
而 TensorRT-LLM 0.12.0 使用旧接口。
解决
重新安装:
pip uninstall pynvml
pip install pynvml==11.5.0
验证:
import pynvml
print(pynvml.__version__)
输出:
11.5.0
问题6:Transformers 不支持 Qwen3
现象
运行 checkpoint 转换:
convert_checkpoint.py
报:
KeyError: qwen3
原因:
当前 Transformers:
4.42.4
不包含 Qwen3 配置。
解决
升级:
pip install transformers==4.51.3
验证:
from transformers import AutoConfig
config = AutoConfig.from_pretrained(
"/home/scjs/trt_models/Qwen3-0.6B"
)
print(config.model_type)
输出:
qwen3
问题7:运行 converter 使用错误 TensorRT-LLM
现象
执行:
python examples/qwen3/convert_checkpoint.py
加载:
site-packages/tensorrt_llm
而不是源码版本。
导致:
libnvinfer.so.10
undefined symbol
解决
使用源码优先:
PYTHONPATH=$PWD python examples/qwen3/convert_checkpoint.py
确保加载:
~/TensorRT-LLM/tensorrt_llm
4. TensorRT-LLM 修改总结
主要修改文件
1. scripts/build_wheel.py
修改:
- 跳过 requirements 自动安装
- 修正 TensorRT 本地 wheel 检测
- 禁用 executorWorker 编译
- 禁用 executorWorker 打包
2. cpp/tensorrt_llm/pybind/executor/executor.cpp
修改:
- 删除两个不兼容的 use_mmap executor binding
3. Qwen3 支持代码(从 NX 迁移)
迁移:
examples/qwen3/
tensorrt_llm/models/qwen3/
tensorrt_llm/layers/attention.py
用于:
- Qwen3 config 解析
- HuggingFace 权重加载
- TensorRT-LLM 模型定义
- INT4/INT8 weight-only 转换
5. 最终量化命令
W4A16 INT4
cd ~/TensorRT-LLM
PYTHONPATH=$PWD python examples/qwen3/convert_checkpoint.py \
--model_dir /home/scjs/trt_models/Qwen3-0.6B \
--output_dir /home/scjs/trt_models/Qwen3-0.6B-trtllm-w4a16 \
--dtype float16 \
--use_weight_only \
--weight_only_precision int4
输出:
Weights loaded.
Total time: 00:00:05
Total time of converting checkpoints:
00:00:07
生成:
Qwen3-0.6B-trtllm-w4a16/
├── config.json
└── rank0.safetensors
6. 最终总结
本次最大的难点不是量化流程,而是 TensorRT-LLM 环境适配:
主要问题:
- TensorRT-LLM 0.12.0 不支持 Qwen3
- executor 静态库 ABI 与本地编译不一致
- executorWorker 引入 MPI 编译问题
- CUDA / TensorRT / cuda-python 版本不匹配
- Transformers 版本过低无法识别 Qwen3
最终解决方案:
- 迁移 Qwen3 TensorRT-LLM 支持代码
- 修改 TensorRT-LLM 编译流程
- 修正 MPI ABI 配置
- 调整 CUDA Python、pynvml、Transformers 版本
- 成功生成 W4A16 INT4 checkpoint
最终链路:
Qwen3-0.6B FP16
|
v
TensorRT-LLM 0.12.0
|
v
W4A16 INT4 checkpoint
|
v
Jetson Orin NX TensorRT Engine
完成从 RTX 4090 量化到 Orin NX 部署的完整流程。
```
量化准备指南

浙公网安备 33010602011771号