在 Jetson AGX Orin 上部署 TensorRT Edge-LLM:Qwen3-8B-AWQ 实战记录
记录在 x86 CPU-only 主机上导出 Qwen3-8B-AWQ,并在 Jetson AGX Orin 上构建 TensorRT engine、运行 C++ 推理的完整实践与精度问题定位。
在 Jetson AGX Orin 上部署 TensorRT Edge-LLM:Qwen3-8B-AWQ 实战记录
摘要
本文记录一次完整的 TensorRT Edge-LLM 部署过程:在一台无 NVIDIA GPU 的 x86 Ubuntu 主机上完成 Qwen3-8B-AWQ 的 ONNX 导出,再将导出结果复制到 Jetson AGX Orin 64GB,在设备本机编译 TensorRT engine,并使用 TensorRT Edge-LLM C++ runtime 完成推理测试。
最终结果是:
- ONNX export 成功;
- Jetson AGX Orin 上的 TensorRT engine build 成功;
- C++ runtime 能够正常加载 engine 并执行生成;
- 但 V1、V2 两种 INT4 GEMM 插件都出现明显重复和退化,文本正确性未通过验收;
- 因此当前结果只能算“链路跑通”,不能算“模型部署成功”。
本文不讨论模型文件准备过程,只记录导出、构建、推理、性能和问题定位。
一、目标架构
本次采用的链路如下:
Qwen/Qwen3-8B-AWQ
│
▼
x86 Ubuntu CPU-only 主机
tensorrt-edgellm-export
│
▼
ONNX + external data + embedding
│
▼
Jetson AGX Orin 64GB
llm_build
│
▼
TensorRT engine
│
▼
TensorRT Edge-LLM C++ runtime
llm_inference / llm_bench
导出主机为 192.168.1.26,推理设备为 Jetson AGX Orin 192.168.1.30。
二、Jetson 环境核查
部署前没有假设 JetPack、CUDA 或 TensorRT 版本,而是直接检查设备环境。
cat /etc/nv_tegra_release
dpkg-query -W nvidia-jetpack nvidia-l4t-core 2>/dev/null
nvcc --version
dpkg -l | grep -Ei 'tensorrt|nvinfer'
python3 --version
cmake --version
gcc --version
git --version
free -h
df -h /
nvpmodel -q
sudo jetson_clocks --show
实际环境如下:
| 项目 | 版本或状态 |
|---|---|
| 设备 | NVIDIA Jetson AGX Orin Developer Kit 64GB |
| CPU 架构 | aarch64 |
| GPU 架构 | SM87 |
| JetPack | 6.2 |
| L4T | R36.4.3 |
| Ubuntu | 22.04.5 LTS |
| Kernel | 5.15.148-tegra |
| CUDA Toolkit | 12.6.11 |
| nvcc | 12.6.68 |
| TensorRT | 10.3.0.30 |
| Python | 3.10.12 |
| GCC | 11.4.0 |
| CMake | 3.22.1 |
| Git | 2.34.1 |
| Power mode | MAXN,mode 0 |
nvidia-smi |
可执行,但部分字段不适用于 Jetson |
| 推荐监控工具 | tegrastats |
Jetson 使用统一内存。nvidia-smi 不适合作为主要监控工具,应使用:
tegrastats --interval 1000
功耗模式检查:
nvpmodel -q
锁定最高频率用于性能测试:
sudo jetson_clocks
恢复动态频率:
sudo jetson_clocks --restore
本次首次性能测试处于 MAXN,但没有执行 jetson_clocks 锁频,因此性能数据不是最终极限数据。
三、TensorRT Edge-LLM 版本选择
本次使用 TensorRT Edge-LLM v0.10.0:
Release: v0.10.0
Commit: 71dd1bae032e70771265917ec74d3ff4cad07a10
选择依据:
- 当前 JetPack 6.2 使用 CUDA 12.6 和 TensorRT 10.3;
- Edge-LLM 官方安装文档提供了 JetPack 6.2+ Orin 的构建配置;
- Qwen3-8B-AWQ 在官方支持模型列表中;
- 没有升级 JetPack、CUDA 或 TensorRT;
- 没有切换到早期 TensorRT-LLM Jetson 分支。
官方参考:
四、x86 主机上的 ONNX export
TensorRT Edge-LLM 的 checkpoint-based exporter 可以在 CPU-only x86 Ubuntu 主机上运行。导出阶段不要求 NVIDIA GPU,但会占用较多内存,并且速度较慢。
进入 exporter 环境:
cd /home/wooley/TensorRT-Edge-LLM-export
source .venv/bin/activate
export HF_HUB_OFFLINE=1
export TMPDIR=/media/wooley/AGXINSTALL/tmp
mkdir -p "$TMPDIR"
4.1 默认 V2 export
默认使用 Int4GroupwiseGemmPluginV2:
set -o pipefail
tensorrt-edgellm-export \
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ \
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/onnx \
2>&1 | tee /media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/export.log
echo "export_status=${PIPESTATUS[0]}"
成功后,主要输出位于:
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/onnx/llm/
├── config.json
├── embedding.safetensors
├── model.onnx
├── model.onnx.data
├── processed_chat_template.json
├── tokenizer.json
└── tokenizer_config.json
其中:
model.onnx是图结构文件;model.onnx.data是 ONNX external data 权重文件;embedding.safetensors是 embedding 权重;- tokenizer 和 chat template 文件会被 runtime 使用。
4.2 V1 fallback export
TensorRT Edge-LLM v0.10.0 文档指出,V2 可能造成精度下降,可以使用 V1 作为 fallback。V1 和 V2 必须分别 export,并分别构建 engine。
OUT=/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/onnx_v1
test ! -e "$OUT" || {
echo "目录已存在,请使用新的输出目录"
exit 1
}
set -o pipefail
tensorrt-edgellm-export \
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ \
"$OUT" \
--int4-gemm-plugin-version 1 \
2>&1 | tee /media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/export_v1.log
echo "export_v1_status=${PIPESTATUS[0]}"
V1 的输出目录为:
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/onnx_v1/llm/
五、导出结果复制到 Jetson
runtime 不仅需要 ONNX 输出,还需要原始 checkpoint 目录中的部分文件。因此部署时保留完整模型目录,同时复制 ONNX 输出。
rsync -a --info=progress2 \
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/ \
wooley@192.168.1.30:/home/wooley/models/Qwen3-8B-AWQ/
V1 输出单独复制:
rsync -a --info=progress2 \
/media/wooley/AGXINSTALL/models/Qwen3-8B-AWQ/onnx_v1/ \
wooley@192.168.1.30:/home/wooley/models/Qwen3-8B-AWQ/onnx_v1/
六、Jetson 上构建 TensorRT Edge-LLM runtime
进入项目目录:
cd /home/wooley/TensorRT-Edge-LLM
6.1 准备 CuTe DSL artifact
AGX Orin 是 SM87,需要准备匹配 aarch64/sm_87 的 artifact。当前使用的 CuTe DSL 依赖包括:
nvidia-cutlass-dsl 4.6.1
cupy-cuda12x 12.3.0
cuda-python 13.3.1
生成命令:
python kernelSrcs/build_cutedsl.py \
--kernels fmha,int4_fp16_gemm \
--gpu_arch sm_87 \
--arch aarch64 \
--cuda-version 12.6 \
--jobs 4
生成结果:
cpp/kernels/cuteDSLArtifact/aarch64/sm_87/
6.2 CMake 配置
JetPack 6.2+ Orin 的配置如下:
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Release \
-DTRT_PACKAGE_DIR=/usr \
-DCMAKE_TOOLCHAIN_FILE=cmake/aarch64_linux_toolchain.cmake \
-DEMBEDDED_TARGET=jetson-orin \
-DCUDA_CTK_VERSION=12.6 \
-DENABLE_CUTE_DSL=ALL \
-DCUTE_DSL_ARTIFACT_TAG=sm_87
编译:
cmake --build build --parallel 8 \
2>&1 | tee logs/build_runtime.log
关键产物:
build/libNvInfer_edgellm_plugin.so.1.0
build/examples/llm/llm_build
build/examples/llm/llm_inference
build/examples/llm/llm_bench
build/examples/llm/llm_stream
运行前设置插件路径:
export PATH=/usr/local/cuda/bin:$PATH
export EDGELLM_PLUGIN_PATH=$PWD/build/libNvInfer_edgellm_plugin.so
6.3 常见小问题
如果使用 /usr/bin/time -v 记录峰值内存,而系统提示文件不存在,安装 time:
sudo apt-get update
sudo apt-get install -y time
七、构建 Qwen3-8B-AWQ engine
7.1 V2 engine
cd /home/wooley/TensorRT-Edge-LLM
export PATH=/usr/local/cuda/bin:$PATH
export EDGELLM_PLUGIN_PATH=$PWD/build/libNvInfer_edgellm_plugin.so
./build/examples/llm/llm_build \
--onnxDir /home/wooley/models/Qwen3-8B-AWQ/onnx/llm \
--engineDir /home/wooley/models/Qwen3-8B-AWQ/engine \
--maxBatchSize 1 \
--maxInputLen 4096 \
--maxKVCacheCapacity 8192 \
2>&1 | tee logs/qwen3_8b_engine_build.log
7.2 V1 engine
./build/examples/llm/llm_build \
--onnxDir /home/wooley/models/Qwen3-8B-AWQ/onnx_v1/llm \
--engineDir /home/wooley/models/Qwen3-8B-AWQ/engine_v1 \
--maxBatchSize 1 \
--maxInputLen 4096 \
--maxKVCacheCapacity 8192 \
2>&1 | tee logs/qwen3_8b_engine_v1_build.log
本次两个 engine 都能成功构建。V2 engine 加载时 TensorRT 报告的 engine 大小约为 4613 MiB,约 4.6 GiB。
八、推理测试
8.1 中文非思考模式
输入文件:
{
"batch_size": 1,
"temperature": 0.7,
"top_p": 0.8,
"top_k": 20,
"max_generate_length": 256,
"apply_chat_template": true,
"enable_thinking": false,
"requests": [
{
"messages": [
{
"role": "user",
"content": "请用简洁但专业的语言解释蒙特卡洛树搜索的基本原理,以及它为什么适合围棋程序。"
}
]
}
]
}
运行:
./build/examples/llm/llm_inference \
--engineDir /home/wooley/models/Qwen3-8B-AWQ/engine_v1 \
--checkpointDir /home/wooley/models/Qwen3-8B-AWQ \
--inputFile /home/wooley/models/Qwen3-8B-AWQ/input_cn.json \
--outputFile /home/wooley/models/Qwen3-8B-AWQ/output_cn_v1.json \
--warmup 1 \
--dumpProfile \
--profileOutputFile /home/wooley/models/Qwen3-8B-AWQ/profile_cn_v1.json \
--dumpOutput
8.2 英文非思考模式
使用相同 V1 engine 和相同采样参数测试英文 prompt:
./build/examples/llm/llm_inference \
--engineDir /home/wooley/models/Qwen3-8B-AWQ/engine_v1 \
--checkpointDir /home/wooley/models/Qwen3-8B-AWQ \
--inputFile /home/wooley/models/Qwen3-8B-AWQ/input_en_v1_sampling.json \
--outputFile /home/wooley/models/Qwen3-8B-AWQ/output_en_v1_sampling.json \
--warmup 1 \
--dumpProfile \
--dumpOutput
8.3 英文思考模式
./build/examples/llm/llm_inference \
--engineDir /home/wooley/models/Qwen3-8B-AWQ/engine_v1 \
--checkpointDir /home/wooley/models/Qwen3-8B-AWQ \
--inputFile /home/wooley/models/Qwen3-8B-AWQ/input_en_v1_thinking.json \
--outputFile /home/wooley/models/Qwen3-8B-AWQ/output_en_v1_thinking_512.json \
--warmup 1 \
--dumpOutput
九、V1 和 V2 的区别
两者都属于 W4A16 INT4 groupwise GEMM,group size 为 128,但权重布局和 kernel backend 不同。
| 项目 | V1 | V2 |
|---|---|---|
| 插件 | Int4GroupwiseGemmPlugin |
Int4GroupwiseGemmPluginV2 |
| 权重布局 | legacy AWQ-swizzled | CuTe DSL fragment-layout |
| kernel | 传统 CUDA C++ 路径 | AOT CuTe DSL GEMM/GEMV |
| 导出参数 | --int4-gemm-plugin-version 1 |
默认,或 version 2 |
| engine 是否兼容 | 不兼容 V2 | 不兼容 V1 |
| 处理方式 | 重新 export、重新 build | 重新 export、重新 build |
TensorRT Edge-LLM v0.10.0 的限制说明中指出,V2 可能造成精度下降,因此先构建 V1 作为对照。但本次 V1 仍然出现相同的输出退化,说明不能只把问题归因于 V2。
十、性能结果
V2 engine 的一次中文测试结果如下:
Power mode: MAXN
jetson_clocks: 未锁定最高频率
Batch size: 1
Input tokens: 35
Generated tokens: 256
Prefill time: 74.3449 ms
Prefill throughput: 470.8 tok/s
Decode time per token: 32.7620 ms
Decode throughput: 30.5 tok/s
Peak unified memory: 4758.35 MB
对应日志:
Processing complete: 1/1 batched requests successful
这说明:
- engine 能成功加载;
- TensorRT plugin 能成功初始化;
- prefill 和 decode CUDA 路径都能执行;
- 运行过程中没有 OOM 或 CUDA 崩溃;
- 但“runtime 成功返回”不代表“文本质量正确”。
由于当时没有锁定 jetson_clocks,上述 30.5 tok/s 只能作为当前配置下的实测值,不能作为 AGX Orin 的最终峰值性能。
十一、输出质量问题
V2 中文输出的典型表现是:前半句看起来正常,随后退化为大量重复字符:
蒙特卡洛树搜索是一种基于概率的启发式搜索算法,...
的的的的的的的的的的的的...
V1 中文也出现相同现象。
V1 英文非思考模式同样出现:
Monte Carlo Tree Search ...
and and and and and and ...
思考模式下,简单问题也会重复复述问题:
The user is asking what the capital of France is?
The user is asking what the capital of France is?
The user is asking what the capital of France is?
所有测试都具有以下特征:
finish_reason: max-length
而不是正常的 EOS 结束。
十二、问题定位结论
已经排除的因素:
- 不是中文编码问题;英文也会重复;
- 不是 V2 单独造成;V1 也失败;
- 不是单纯的
top_k=1贪心采样;使用temperature=0.7、top_p=0.8、top_k=20后仍然失败; - 不是 engine 无法加载;TensorRT engine 和 plugin 都能正常初始化;
- 不是显存不足;峰值统一内存约 4.76GB;
- 不是终端显示乱码;JSON 中的
output_text内容本身已经发生重复。
当前更可能的范围是:
- Qwen3 AWQ 权重重排或 INT4 scale/zero-point 处理;
- Qwen3 decode 阶段的 KV-cache 更新;
- Jetson SM87 上的 Qwen3/AWQ runtime 组合;
- TensorRT Edge-LLM v0.10.0 的 Qwen3 INT4 正确性问题。
“先生成一小段正常文字,再进入重复循环”尤其值得注意,这比单纯 tokenizer 或 UTF-8 问题更像是 decode、KV-cache 或量化 GEMM 路径在后续 token 上出现偏差。
十三、后续建议
在继续测试 14B 之前,建议先做一个精度 A/B 对照:
- 使用同一套 Jetson runtime 测试一个小型 FP16/BF16 Qwen3 模型;
- 如果 FP16/BF16 正常而 AWQ 失败,问题集中在 AWQ/INT4 路径;
- 如果 FP16/BF16 也失败,问题集中在 Qwen3 runtime 或 KV-cache 路径;
- 只有在 8B 输出正常后,再测试 Qwen3-14B-AWQ 和 Qwen2.5-Coder-14B-Instruct-AWQ。
后续模型应统一以下参数,便于横向比较:
batch size: 1
max input length: 4096
max KV cache capacity: 8192
temperature: 0.7
top_p: 0.8
top_k: 20
max generation length: 256 或 512
power mode: MAXN
十四、最终评价
本次 Qwen3-8B-AWQ 部署的最终状态:
| 项目 | 结果 |
|---|---|
| x86 CPU-only export | 成功 |
| Jetson runtime 编译 | 成功 |
| CuTe DSL SM87 artifact | 成功 |
| V2 engine build | 成功 |
| V1 engine build | 成功 |
| engine 加载 | 成功 |
| prefill/decode 执行 | 成功 |
| 中文输出 | 失败,严重重复 |
| 英文输出 | 失败,严重重复 |
| 思考模式 | 失败,重复复述且无法结束 |
| 长上下文测试 | 暂未进行 |
| 作为长期本地 LLM 方案 | 当前不建议 |
因此,本次验证证明了 TensorRT Edge-LLM 在 AGX Orin 上的安装、编译和 engine 执行链路可以工作,但尚未证明 Qwen3-8B-AWQ + Jetson AGX Orin + TensorRT Edge-LLM v0.10.0 组合具备可用的文本生成正确性。
Conversation
正在读取留言…