[实践记录]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

目标:

  1. 保持原有 Ollama 风格接口
  2. 替换底层推理框架
  3. 支持流式输出
  4. 支持后续量化部署

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、语音交互和多模态系统提供统一模型服务接口。

 
 
 
 
posted @ 2026-07-13 13:53  阿基米德的澡盆  阅读(28)  评论(0)    收藏  举报