[实践记录]orin NX跨版本部署qwen3 int4量化版本
其实我也不太知道我在干什么,因为这两天加班实在是有点昏头233
省流就是:因为一开始想兼容老项目,所以装了ubuntu22为基底的jetpack6.x
接下来就是一大堆版本不兼容,不支持qwen3,不支持量化这些
于是,在gpt的帮助下,大改了一通
包括kv cache、qvk投影层等
最终,是实现了在nx+jetpack6.x上部署了int4量化版本的qwen3-0.6b
1. 背景
项目初期,机器人端大语言模型采用 Ollama 作为本地推理后端。
整体架构:
机器人交互层
|
|
HTTP API
|
|
Ollama
|
|
Qwen3-0.6B
Ollama 优点是部署简单,但在 Jetson Orin NX 这类边缘设备上存在几个问题:
- 首 token 延迟较高
- GPU 利用率不高
- 推理优化能力有限
- 难以针对 NVIDIA GPU 做深度优化
因此计划将 LLM 后端替换为 TensorRT-LLM:
机器人交互层
|
|
HTTP API
|
|
TensorRT-LLM Server
|
|
TensorRT Engine
|
|
Qwen3-0.6B
目标:
- 保持原有 Ollama 风格接口
- 替换底层推理框架
- 支持流式输出
- 支持后续量化部署
2. TensorRT-LLM 部署结构理解
整个 TensorRT-LLM 流程中产生了三个重要模型文件。
2.1 原始 HuggingFace 模型
目录:
Qwen3-0.6B/
内容:
config.json
model.safetensors
tokenizer.json
tokenizer_config.json
...
这是官方发布的原始模型。
作用:
- 保存原始 FP16 权重
- 提供 tokenizer
- 作为转换输入
流程:
Qwen3-0.6B
|
|
convert_checkpoint.py
2.2 TensorRT-LLM checkpoint
目录:
Qwen3-0.6B-trtllm-checkpoint
这是 TensorRT-LLM 中间格式。
作用:
- 保存 TensorRT-LLM 已适配的模型结构
- 保存权重映射
- 保存 TensorRT-LLM 配置
它不是最终运行格式。
流程:
HF模型
|
|
convert_checkpoint.py
|
|
TRT-LLM checkpoint
TensorRT-LLM 官方流程也是:
HF weights
↓
convert_checkpoint.py
↓
TensorRT-LLM checkpoint
↓
trtllm-build
↓
TensorRT engine
2.3 TensorRT Engine
目录:
Qwen3-0.6B-engine
或者:
Qwen3-0.6B-engine-w4a16
这是最终运行文件。
运行时:
HTTP请求
|
|
TensorRT Engine
|
|
GPU Kernel
真正被 GPU 执行的是 engine。
因此:
| 文件 | 是否运行 | 作用 |
|---|---|---|
| safetensors | ❌ | 原始模型 |
| TRT-LLM checkpoint | ❌ | 中间格式 |
| TensorRT engine | ✅ | 实际推理 |
3. Qwen3 TensorRT-LLM 适配过程
最开始直接使用 Qwen2 的 TensorRT-LLM 实现:
tensorrt_llm/models/qwen
发现无法直接支持 Qwen3。
原因:
Qwen3 相比 Qwen2 有几个结构变化:
3.1 GQA Attention
Qwen3-0.6B:
hidden_size = 1024
Q heads:
16
KV heads:
8
head_dim:
128
因此:
Q:
16 × 128 = 2048
K:
8 × 128 = 1024
V:
8 × 128 = 1024
QKV:
4096
而旧 Qwen2 实现默认:
Q = K = V
导致:
16 × 3 × 128
=6144
出现:
reshape changes volume
4096 -> 6144
错误。
3.2 Q/K RMSNorm
Qwen3 Attention:
Q projection
|
|
q_norm
|
|
RoPE
K projection
|
|
k_norm
|
|
RoPE
因此 TensorRT-LLM Attention 需要支持:
q_layernorm
k_layernorm
最终修改:
- qwen3/config.py
- qwen3/model.py
- qwen3/convert.py
- Attention GQA逻辑
4. FP16 TensorRT-LLM 部署成功
修改完成后:
流程:
Qwen3-0.6B
↓
convert_checkpoint.py
↓
Qwen3-0.6B-trtllm-checkpoint
↓
trtllm-build
↓
Qwen3-0.6B-engine
成功运行。
测试:
你好,请用一句话介绍一下你自己。
能够正常生成。
说明:
- 模型结构转换正确
- 权重映射正确
- Attention实现正确
5. HTTP 后端替换 Ollama
原 Ollama:
POST
localhost:11434/api/chat
改造后:
POST
localhost:11434/api/chat
保持完全兼容。
上层机器人系统无需修改。
后端变化:
以前:
FastLlmClient
|
|
Ollama
现在:
FastLlmClient
|
|
TensorRT-LLM Server
|
|
Qwen3 Engine
接口:
- IP 不变
- 端口不变
- 请求格式不变
- 流式输出格式不变
实现了推理后端替换。
6. TensorRT-LLM 量化尝试
目标:
降低:
- 显存占用
- 内存带宽压力
尝试:
W8A16
命令:
--use_weight_only
--weight_only_precision int8
生成:
Qwen3-0.6B-trtllm-w8a16
W4A16
命令:
--use_weight_only
--weight_only_precision int4
生成:
Qwen3-0.6B-trtllm-w4a16
初始测试发现:
量化模型出现:
我是你吗?
我是你吗?
我是你吗?
重复输出。
初步怀疑:
- INT4 packing
- GQA QKV
- scale映射
- quant layer替换
7. 量化问题定位
重新设计验证流程。
固定:
- tokenizer
- chat template
- input_ids
- decoding参数
测试:
| 模型 | 结果 |
|---|---|
| FP16 | 正常 |
| W8A16 | 正常 |
| W4A16 | 正常 |
最终发现:
之前的问题不是量化失败,而是测试方式不一致。
主要差异:
之前:
直接输入:
你好,请用一句话介绍一下你自己。
没有完整 Qwen3 chat template。
正确:
使用:
Qwen3 tokenizer
+
apply_chat_template
+
固定采样参数
得到:
FP16:
我是AI助手,专注于帮助用户解决问题和提供支持。
W8A16:
我是AI助手,专注于帮助用户解决问题和提供支持。
W4A16:
Hello! I'm a language model...
虽然 W4A16 有轻微退化,但已经可以正常使用。
8. 最终部署状态
当前完成:
模型
Qwen3-0.6B
支持:
FP16
W8A16
W4A16
推理后端
完成:
TensorRT-LLM Server
接口:
POST /api/chat
兼容:
Ollama Client
硬件
平台:
NVIDIA Jetson Orin NX
环境:
JetPack 6.x
CUDA 12.x
TensorRT 10.x
TensorRT-LLM 0.12
9. 经验总结
1. TensorRT-LLM迁移不是简单换推理框架
真正流程:
HF模型
↓
模型结构适配
↓
权重转换
↓
TensorRT checkpoint
↓
Engine构建
↓
服务封装
任何一步错误都会导致:
- 输出重复
- 无意义文本
- 精度异常
2. 小模型量化也需要验证链路
不要看到:
quant_algo=W4A16
就认为量化成功。
必须验证:
输入一致
+
输出合理
+
权重结构正确
3. Qwen3 相比 Qwen2 最大变化不是参数,而是结构
主要包括:
- GQA
- q_norm/k_norm
- head_dim变化
- 新 chat template
这些都会影响 TensorRT-LLM 适配。
4. Edge AI 部署推荐架构
最终机器人系统:
Gateway
|
----------------
| |
ASR LLM
| |
Sherpa TensorRT-LLM
| |
TTS Qwen3
TensorRT-LLM 作为独立后端服务,可以和:
- ASR
- TTS
- VAD
- 声纹
- 人脸
保持解耦。
结语
这次迁移完成了从:
Ollama
到:
TensorRT-LLM
的完整替换,并完成:
- Qwen3 模型结构适配
- TensorRT engine 构建
- HTTP 服务封装
- W8A16/W4A16 量化验证
最终形成了一个适用于 Jetson Orin NX 的端侧 LLM 推理后端,为后续机器人 Agent、语音交互和多模态系统提供统一模型服务接口。

浙公网安备 33010602011771号