[实践记录]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 环境适配:

主要问题:

  1. TensorRT-LLM 0.12.0 不支持 Qwen3
  2. executor 静态库 ABI 与本地编译不一致
  3. executorWorker 引入 MPI 编译问题
  4. CUDA / TensorRT / cuda-python 版本不匹配
  5. 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 部署的完整流程。
```

 
 
 
 

 

 
 
Codex
新建任务⌘N
已安排插件站点拉取请求
聊天⌥⌘N
项目
 
没有项目
任务
 
无任务
To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
 
继续设置2/7
 
 
启用通知设置每日更新分流 GitHub PR了解 Linear 近况查看最新方案在我的桌面上留个便条导入 Claude 设置
俞子睿
更新更新更新
 
 
 
 
我们该构建什么?
 
 
 
 
 
选择项目
 

量化准备指南

请求批准
 
5.6 Terra轻度5.6 Terra极高5.6 Terra极高5.4中
 
To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
posted @ 2026-07-13 13:46  阿基米德的澡盆  阅读(22)  评论(0)    收藏  举报