Model-Optimizer Torch 量化到 ONNX 导出实战:从 timm 视觉模型到 LLM/VLM 的完整部署链路
Model-Optimizer Torch 量化到 ONNX 导出实战:从 timm 视觉模型到 LLM/VLM 的完整部署链路
导读
本指南以 Model-Optimizer 仓库中 examples/torch_onnx 示例为核心,系统讲解将 PyTorch 模型量化(FP8、MXFP8、INT8、NVFP4、INT4_AWQ、AutoQuantize 混合精度)后导出为 ONNX 并最终部署到 TensorRT 的完整技术链路。阅读本文后,你将掌握:torch_quant_to_onnx.py 对 timm 视觉模型(ViT/Swin/ResNet)的一键量化与导出流程、Conv2d 在 TensorRT 下的量化格式自动降级规则、HF Embedding/Reranking 模型的 PTQ recipe 化导出、AutoQuantize 混合精度搜索的参数调优,以及面向边缘平台的 TensorRT-Edge-LLM 命令行管线。
1. 示例概览与定位
examples/torch_onnx/README.md 描述了两条互补的“Torch → ONNX”路径:
- 视觉模型:目录下的 torch_quant_to_onnx.py 直接完成 timm 模型的量化 + ONNX 导出;
- LLM 与 VLM:官方推荐配合 TensorRT-Edge-LLM 工具链(Jetson、DRIVE 等边缘平台)完成 ModelOpt 量化到优化 ONNX 导出的完整管线。
此外目录中还包含 hf_embedding_quant_to_onnx.py(实验性,精度尚未验证),用于将 HF 文本嵌入(embedding)与重排序(reranking)模型量化为 ONNX。两个脚本均以 Opset 20 导出 torch 模型,量化权重以 FP16 权重形式落地,ONNX 权重与模型本身以同一目录下的 .onnx_data 附属文件形式保存。
2. 环境准备
2.1 Docker 方案(推荐)
直接使用 TensorRT 官方 Docker 镜像(如 nvcr.io/nvidia/tensorrt:26.02-py3),并在容器内设置 cuDNN 相关环境变量:
export CUDNN_LIB_DIR=/usr/lib/x86_64-linux-gnu/
export LD_LIBRARY_PATH="${CUDNN_LIB_DIR}:${LD_LIBRARY_PATH}"
2.2 本地 pip 安装
从 PyPI 安装带 onnx 依赖的 Model Optimizer,并安装示例依赖:
pip install -U "nvidia-modelopt[onnx]"
pip install -r examples/torch_onnx/requirements.txt
requirements.txt 内容为:
datasets>=2.14.4
timm
torchvision
transformers
若需构建 TensorRT engine,请另行安装与 CUDA 匹配的 TensorRT。注意 torch_quant_to_onnx.py 依赖 examples/onnx_ptq 下的共享模块(脚本开头会将 onnx_ptq 目录加入 sys.path),因此需保持示例目录的完整目录结构。
3. 视觉模型量化与 ONNX 导出
3.1 脚本行为解析
torch_quant_to_onnx.py 的核心流程如下:
- 加载预训练 timm 模型(默认
vit_base_patch16_224,ViT-Base); - 使用 ModelOpt(
modelopt.torch.quantization as mtq)将模型量化为 FP8 / MXFP8 / INT8 / NVFP4 / INT4_AWQ / Auto; - 对含 Conv2d 层的模型(如 SwinTransformer)自动执行 Conv2d 量化格式覆盖,确保 TensorRT 兼容;
- 以 FP16 权重导出量化模型为 ONNX(调用 examples/onnx_ptq/download_example_onnx.py 中的
export_to_onnx); - 对 ONNX 模型做 TensorRT 兼容后处理;
- 可选
--trt_build直接用trtexec --stronglyTyped --builderOptimizationLevel=4构建 TensorRT engine。
3.2 命令行用法
python examples/torch_onnx/torch_quant_to_onnx.py \
--timm_model_name=<timm model name> \
--qformat=<fp8|mxfp8|int8|nvfp4|int4_awq|auto> \
--onnx_save_path=<path to save the exported ONNX model>
关键参数(源码 argparse 定义):
| 参数 | 默认值 | 说明 |
|---|---|---|
--timm_model_name |
vit_base_patch16_224 |
要量化的 timm 模型名 |
--qformat |
mxfp8 |
量化格式;仅在未提供 --recipe 时生效(官方标注为 deprecated,建议改用 --recipe) |
--recipe |
None |
PTQ 或 AutoQuantize recipe 的 YAML 路径或内置名;提供后具有最高优先级,--qformat 被忽略 |
--onnx_save_path |
必填 | ONNX 模型保存路径 |
--calibration_data_size |
512 |
校准图片数量,范围 [1-512] |
--batch_size |
1 |
校准与导出的 batch size |
--evaluate |
关闭 | 同时评估基线与量化后模型在 ImageNet 验证集上的 Top-1/Top-5 |
--eval_data_size |
None |
评估样本数;None 表示整个验证集 |
--auto_quantization_formats |
nvfp4_awq_lite fp8 |
Auto 模式候选量化格式 |
--effective_bits |
4.8 |
Auto 模式目标有效比特数约束 |
--num_score_steps |
128 |
Auto 模式灵敏度评分步数 |
--trt_build |
关闭 | 用 trtexec 构建 TensorRT engine |
--no_pretrained |
关闭 | 不加载预训练权重(随机权重测试用) |
--model_kwargs |
None |
额外模型参数 JSON,如 '{"depth": 1}' |
架构限制:卷积类架构(如 ResNet)仅支持 FP8 与 INT8。MXFP8、NVFP4、INT4_AWQ 与 AutoQuantize 均不支持,原因是 TensorRT 未提供对应卷积 kernel。脚本中 _validate_resnet_quantizers 会直接拒绝 ResNet 上除 per-tensor FP8/INT8 外的任何启用量化器(源码 examples/torch_onnx/torch_quant_to_onnx.py)。
3.3 Conv2d 量化覆盖规则
TensorRT 的卷积运算仅支持 FP8 与 INT8。脚本据此对含 Conv2d 的模型自动应用覆盖:
| Qformat | Conv2d 覆盖 | 原因 |
|---|---|---|
| FP8, INT8 | 无(天然兼容) | TensorRT 原生支持 |
| MXFP8, NVFP4 | Conv2d → FP8 | TRT Conv 限制 |
| INT4_AWQ | Conv2d → INT8 | TRT Conv 限制 |
源码中对应三组配置:_FP8_CONV_OVERRIDE(num_bits=(4, 3) 的权重/输入量化器)、_INT8_CONV_OVERRIDE(num_bits=8)、以及 _NEEDS_FP8_CONV_OVERRIDE/_NEEDS_INT8_CONV_OVERRIDE 两个集合驱动的 _prepare_auto_quantize_format。覆盖逻辑同时警告:这些覆盖仅让含个别 Conv2d 层的 Transformer 架构(如 Swin)可以导出,并不会让卷积类架构支持这些格式。
另有两点针对 TensorRT 的精细处理值得注意:
- FP8 MHA 覆盖(
_FP8_MHA_OVERRIDE):为nn.LayerNorm增加output_quantizer(num_bits=(4, 3)),让 TRT 能把共享的 Q/DQ 融合进下游 Q/K/V/FC 的注意力矩阵乘中;Softmax 输出的 Q/DQ 由 FP8 ONNX 导出器后处理统一插入(固定 1/448 scale,数据无关,无需校准)。 - 高秩输入量化器禁用(
_disable_high_rank_input_quantizers):TRT 的 MXFP8/NVFP4DynamicQuantize仅支持 2D/3D 输入,而 Swin 的norm1、downsample.norm、顶层norm输入是 4D。脚本通过一次带 forward hook 的前向传播在运行时探测并禁用这些量化器,从而兼容 ViT(同名norm是 3D)而无需硬编码架构路径(源码 examples/torch_onnx/torch_quant_to_onnx.py)。
3.4 ResNet 残差量化器与校准细节
当 recipe 显式启用 residual_quantizer 时,脚本通过自定义后转换插件 _add_resnet_residual_quantizers 在每个残差相加前的 shortcut 路径上插入默认禁用的 TensorQuantizer,使 FP8/INT8 recipe 能够在残差相加前对 shortcut 输入做量化。此外还包含一组工程化处理:
- 校准数据:默认使用
zh-plus/tiny-imagenet,load_calibration_data依据 timm 的resolve_model_data_config生成与模型精确匹配的预处理 transform(尊重--no_pretrained与--model_kwargs); - 死量化器清理(
_disable_dead_quantizers):SwinV2 在--no_pretrained下因 res-post-norm 方案将norm1/norm2权重零初始化,LayerNorm 输出恒为零,校准得到amax == 0;导出器scale = 448 / amax会除零崩溃,脚本会在导出前禁用这类量化器; - 低通道 FP8 Conv 输入量化器禁用(
_disable_low_channel_fp8_conv_input_quantizers):ResNet50 的conv1消费原始 RGB 输入(in_channels == 3),在 Blackwell(compute capability 12.0)上 TRT 找不到首层 Q→Conv 融合的 FP8/MXFP8/NVFP4 tactic,需禁用其输入量化器(Ada 8.9 有该 tactic)。
3.5 精度评估
对图像分类模型,使用 examples/onnx_ptq/evaluate.py 评估导出后的 ONNX:
python examples/onnx_ptq/evaluate.py \
--onnx_path=<path to the exported ONNX model> \
--imagenet_path=<HF dataset card or local path to the ImageNet dataset> \
--engine_precision=stronglyTyped \
--model_name=<timm model name>
该脚本默认从 Hugging Face 拉取 ILSVRC/imagenet-1k(gated 仓库,需要 HF access token);也支持本地 HF 镜像(含 data/validation* 分片)或含 val.txt + 扁平 validation/ 目录的本地 ImageNet 根目录。底层 evaluation.py 中的 evaluate 会输出 Top-1/Top-5 精度,seed=0 保证抽样可复现。评估 MXFP8/NVFP4 ONNX 模型需 TensorRT 10.11 或更高版本。
4. HF Embedding 与 Reranking 模型导出
实验性功能:此示例的精度尚未验证(源码
__doc__与 README 均明确标注)。
hf_embedding_quant_to_onnx.py 使用 PTQ recipe 将双向 Llama 编码器(如 nvidia/llama-nemotron-embed-1b-v2、nvidia/llama-nemotron-rerank-1b-v2)量化为 ONNX:
- Embedding 模型在编码器之上导出 mean pooling + L2 归一化 后的稠密向量(源码 EmbeddingModel);
- Reranking(序列分类)模型导出为 相关性 logits(源码 RerankModel);
- 两个图均以
input_ids、attention_mask为输入,batch/sequence 轴为动态维度(dynamic_axes声明为{0: "batch", 1: "seq"}); - 模型架构自动检测:
config.architectures含ForSequenceClassification即按 reranker 处理。
4.1 默认 recipe:NVFP4 + 投影输出量化
默认 recipe 为 modelopt_recipes/model_type/nemotron_llama/ptq/nvfp4_output_quant_proj.yaml,其设计动机是:若不量化投影层(q/k/v/o_proj、gate/up/down_proj)的输出,量化 GEMM 会输出 FP16 激活,FP8/FP4 engine 的激活显存反而可能不低于未量化的 FP16 engine;对投影输出加动态 NVFP4 量化器,可让层间激活全程保持低精度。该 recipe 还显式禁用了 reranker 的 *score* 评分头(保持高精度,同时规避 NVFP4 导出器无法打包 <a href="https://link.gitcode.com/i/69d325d860493c4930f0c1ca58e7ce1e" target="_blank">1, hidden] 权重的问题)。FP8 孪生 recipe [fp8_output_quant_proj.yaml 以同样思路处理 FP8 预设。
在 TensorRT 10.16 + RTX PRO 6000 Blackwell(strongly-typed engine、5 个动态 shape profile、最大 32×512)上,文档给出了激活显存对比:
| 模型 | FP16 | fp8 预设 |
fp8 recipe | nvfp4 预设 |
nvfp4 recipe |
|---|---|---|---|---|---|
| llama-nemotron-embed-1b-v2 | 1040 MiB | 1392 MiB | 1096 MiB | 1040 MiB | 516 MiB |
| llama-nemotron-rerank-1b-v2 | 1040 MiB | 1392 MiB | 1096 MiB | 520 MiB | 331 MiB |
可见单独使用 FP8/NVFP4 预设可能使激活显存上升,而叠加输出量化 recipe 后,NVFP4 下激活显存可降至 FP16 的一半左右。
4.2 使用方式
python examples/torch_onnx/hf_embedding_quant_to_onnx.py \
--model_path=nvidia/llama-nemotron-embed-1b-v2 \
--trust_remote_code \
--recipe=model_type/nemotron_llama/ptq/nvfp4_output_quant_proj \
--onnx_save_path=llama_nemotron_embed_nvfp4.onnx
# Reranking 变体(从模型架构自动检测)
python examples/torch_onnx/hf_embedding_quant_to_onnx.py \
--model_path=nvidia/llama-nemotron-rerank-1b-v2 \
--trust_remote_code \
--onnx_save_path=llama_nemotron_rerank_nvfp4.onnx
参数说明:--model_path 为 HF hub id 或本地路径(默认 nvidia/llama-nemotron-embed-1b-v2);--recipe 为 modelopt_recipes/ 下的路径或 recipe YAML 文件(默认即上述 NVFP4 recipe);--calibration_data_size 默认 64(脚本内置了 16 组问答对校准文本并按需循环扩充);--batch_size 默认 8;--trust_remote_code 允许仓库执行自定义 Python 代码。
源码层面有三个值得关注的导出细节:
- 双向 SDPA 注册(
register_bidirectional_sdpa):torch 默认 sdpa symbolic 会为 transformers 追踪出的动态is_causal标志发射 IsNaN/Where 守卫,阻碍 TRT 注意力融合;该函数将aten::scaled_dot_product_attention重写为纯 MatMul→Add→Softmax→MatMul 模式,并把is_causal固定为 False,同时保持注意力链统一精度、将 bool 掩码转为 0/−inf 常量; - 静态维度修复(
install_static_extent_fix):torch 将注意力输出 reshape 追踪为Reshape(Concat(B, S, -1)),而 TRTTRT_FP4DynamicQuantize要求最后(blocked)轴 extent 在建图时已知,导出后处理会把尾部-1重写为hidden_size常量; - 示例输入不等长:用不同长度的 query/passage 强制生成真实 attention mask,避免全 1 掩码被 transformers 丢弃而切换到导出 symbolic 不支持的 native GQA 路径。
4.3 用 trtexec 构建 engine
NVFP4 需要 Blackwell GPU(SM100+)与 TensorRT 10.11+。构建 strongly-typed、带动态 shape 的 engine:
trtexec --onnx=llama_nemotron_embed_nvfp4.onnx \
--stronglyTyped \
--saveEngine=llama_nemotron_embed_nvfp4.plan \
--minShapes=input_ids:1x2,attention_mask:1x2 \
--optShapes=input_ids:32x128,attention_mask:32x128 \
--maxShapes=input_ids:32x512,attention_mask:32x512
注意:导出的 .onnx 引用同目录下的附属权重文件 <name>.onnx_data,构建时两个文件必须同目录。如需查看所选 kernel 与各 profile 的激活显存,可追加 --profilingVerbosity=detailed --exportLayerInfo=<path>.json --verbose。
5. LLM/VLM 量化导出:TensorRT-Edge-LLM 管线
面向 Jetson、DRIVE 等边缘平台,官方推荐使用 TensorRT-Edge-LLM 完成“ModelOpt 量化 + 优化 ONNX 导出”的完整管线。
5.1 四阶段工作流
- Quantize(x86 主机 + GPU)—— 用 ModelOpt 降精度(FP8、INT4 AWQ、NVFP4)
- Export(x86 主机 + GPU)—— 量化模型转 ONNX
- Build(边缘设备)—— ONNX 编译为 TensorRT engine
- Inference(边缘设备)—— 运行编译后的 engine
5.2 安装
# 推荐使用 PyTorch Docker 镜像
docker pull nvcr.io/nvidia/pytorch:25.12-py3
docker run --gpus all -it --rm -v $(pwd):/workspace -w /workspace nvcr.io/nvidia/pytorch:25.12-py3 bash
# 克隆并安装 TensorRT-Edge-LLM
git clone https://github.com/NVIDIA/TensorRT-Edge-LLM.git
cd TensorRT-Edge-LLM
git submodule update --init --recursive
python3 -m venv venv
source venv/bin/activate
pip3 install .
# 验证安装
tensorrt-edgellm-quantize --help
tensorrt-edgellm-export --help
系统要求:x86-64 Linux(推荐 Ubuntu 22.04/24.04);NVIDIA GPU Compute Capability 8.0+(Ampere 及以上);CUDA 12.x/13.x、Python 3.10+;显存:≤3B 模型 16 GB、≤4B 模型 40 GB、≤8B 模型 80 GB。
5.3 CLI 工具族
| 工具 | 用途 |
|---|---|
tensorrt-edgellm-quantize |
用 ModelOpt 量化(FP8、INT4 AWQ、NVFP4);子命令 llm、draft |
tensorrt-edgellm-export |
将量化或 FP16/BF16 checkpoint 导出为 ONNX;自动检测 VLM 与音频组件 |
tensorrt-edgellm-insert-lora |
向已有 ONNX 模型插入 LoRA 模式 |
tensorrt-edgellm-process-lora |
处理 LoRA adapter 权重供运行时加载 |
5.4 LLM 示例
# Step 1: 用 ModelOpt 量化
tensorrt-edgellm-quantize llm \
--model_dir Qwen/Qwen2.5-3B-Instruct \
--quantization fp8 \
--output_dir quantized/qwen2.5-3b-fp8
# Step 2: 导出 ONNX
tensorrt-edgellm-export \
quantized/qwen2.5-3b-fp8 \
onnx_models/qwen2.5-3b
5.5 VLM 示例
# 量化(同时处理 LLM 与视觉组件)
tensorrt-edgellm-quantize llm \
--model_dir Qwen/Qwen2.5-VL-3B-Instruct \
--quantization fp8 \
--output_dir quantized/qwen2.5-vl-3b
# 导出(自动检测 VLM,LLM 与视觉编码器导出到独立子目录)
tensorrt-edgellm-export \
quantized/qwen2.5-vl-3b \
onnx_models/qwen2.5-vl-3b
5.6 EAGLE 投机解码示例
# 量化 base 模型
tensorrt-edgellm-quantize llm \
--model_dir meta-llama/Llama-3.1-8B-Instruct \
--quantization fp8 \
--output_dir quantized/llama3.1-8b-base
# 带 EAGLE 标志导出 base 模型
tensorrt-edgellm-export \
quantized/llama3.1-8b-base \
onnx_models/llama3.1-8b/base \
--eagle-base
# 量化 EAGLE draft 模型
tensorrt-edgellm-quantize draft \
--base_model_dir meta-llama/Llama-3.1-8B-Instruct \
--draft_model_dir EAGLE3-LLaMA3.1-Instruct-8B \
--quantization fp8 \
--output_dir quantized/llama3.1-8b-draft
# 导出 draft 模型
tensorrt-edgellm-export \
quantized/llama3.1-8b-draft \
onnx_models/llama3.1-8b/draft
5.7 可用量化方法
| 方法 | 说明 |
|---|---|
| FP8 | SM89+(Hopper、Ada)上精度/显存平衡最优 |
| INT4 AWQ | 仅权重量化;适合显存受限平台与低 batch 推理 |
| NVFP4 | 面向 Blackwell 与 Thor 的 4-bit 格式,权重与激活均可量化 |
| MXFP8 | 实验性;SM89+ 的 Microscaling FP8 |
| INT8 SmoothQuant | 实验性;INT8 权重+激活 SmoothQuant |
| INT4 GPTQ | 可直接从 Hugging Face Hub 加载,无需额外量化 |
5.8 支持模型与故障排查
完整支持矩阵以 TensorRT-Edge-LLM 官方支持页为准。README 中给出了已支持的 LLM(Llama-3/3.1/3.2、Qwen2/2.5/3 系列、DeepSeek-R1-Distill 系列)与 VLM(Qwen2-VL、Qwen2.5-VL、Qwen3-VL、InternVL3、Phi-4-multimodal),FP16/FP8/INT4/NVFP4 各格式均标注 ✅。
常见问题:
- GPU 显存不足:换更大显存 GPU(≤4B 用 40 GB、≤8B 用 80 GB),或尝试
--device cpu(精度支持有限); - 校准数据集问题:手动下载数据集,用
--calib_dataset ./path/to/dataset传本地路径; - 精度下降:改用 FP8 而非 INT4/NVFP4,或增大校准样本量。
6. AutoQuantize 混合精度(Auto 模式)
AutoQuantize recipe 通过逐层搜索最优量化格式实现混合精度,在满足有效比特数约束的前提下尽量平衡精度与压缩率——不同层按其敏感度分配不同格式(如 NVFP4、FP8)。
6.1 工作原理
- 敏感度分析(Sensitivity Analysis):基于梯度的逐层敏感度评分;
- 格式搜索(Format Search):在指定候选量化格式间逐层搜索;
- 约束优化(Constraint Optimization):寻找满足有效比特数约束、同时精度损失最小的格式分配。
源码层面,auto_quantize_model 调用 mtq.auto_quantize 时使用 method="gradient" 的梯度法搜索,前向步骤 forward_step 取 batch["image"],损失函数 loss_func 为 F.cross_entropy(output, batch["label"])(Auto 模式需要标签,load_calibration_data 以 with_labels=True 加载数据);搜索前还会将 inplace ReLU 改为非 inplace(inplace ReLU 在自定义 Function 产生的 view 上会触发 autograd 错误)。当通过 recipe 驱动时,_mtq_inputs_from_auto_quantize_config 会把解析后的 AutoQuantize 配置映射为 mtq.auto_quantize 的 constraints、quantization_formats、module_search_spaces 等输入。
6.2 关键参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--effective_bits |
4.8 | 全模型每权重目标平均比特数。数值越低压缩越多但精度可能下降;搜索算法在满足该约束下最小化精度损失。例如 4.8 表示平均每权重 4.8 bit(FP4 与 FP8 层混合) |
--num_score_steps |
128 | 计算逐层敏感度所用的前向/反向次数。数值越高估计越准但搜索越慢。推荐范围 64–256 |
--calibration_data_size |
512 | 用于敏感度评分与校准的校准样本数。Auto 模式因需计算损失而必须带标签 |
--auto_quantization_formats |
nvfp4_awq_lite fp8 |
候选量化格式(nvfp4_awq_lite、fp8、mxfp8、int8、int4_awq) |
6.3 使用示例
recipe 形式(推荐):
python examples/torch_onnx/torch_quant_to_onnx.py \
--timm_model_name=vit_base_patch16_224 \
--recipe=general/auto_quantize/nvfp4_fp8_at_5p4bits \
--calibration_data_size=512 \
--evaluate \
--onnx_save_path=vit_base_patch16_224.auto_quant.onnx
等效的 --qformat=auto 参数形式:
python examples/torch_onnx/torch_quant_to_onnx.py \
--timm_model_name=vit_base_patch16_224 \
--qformat=auto \
--auto_quantization_formats nvfp4_awq_lite fp8 \
--effective_bits=4.8 \
--num_score_steps=128 \
--calibration_data_size=512 \
--evaluate \
--onnx_save_path=vit_base_patch16_224.auto_quant.onnx
仓库 modelopt_recipes/general/auto_quantize 下还提供了多种现成 AutoQuantize recipe:nvfp4_fp8_at_5p4bits(上述示例用)、nvfp4_fp8_kl_div_at_5p4bits(KL 散度校准)、nvfp4_mse_fp8_at_6p0bits(MSE 校准、6.0 bits)、kv_fp8_nvfp4_cast_kl_div_at_5p4bits、w4a16_nvfp4_fp8_at_6p0bits-active_moe、w4a8_awq_beta_fp8_at_6p0bits,可按任务选择。注意 AutoQuantize 不支持 ResNet 等卷积模型(脚本会直接抛 ValueError)。
7. ONNX 导出支持的视觉模型一览
| 模型 | FP8 | INT8 | MXFP8 | NVFP4 | INT4_AWQ | Auto |
|---|---|---|---|---|---|---|
| vit_base_patch16_224 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| swin_tiny_patch4_window7_224 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| swinv2_tiny_window8_256 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| resnet50 | ✅ | ✅ | N/A | N/A | N/A | N/A |
其中 ResNet 的 MXFP8/NVFP4/INT4_AWQ/Auto 列均为 N/A,再次印证卷积架构的 TensorRT kernel 限制。
8. 量化格式技术背景
本示例覆盖的量化格式各有其硬件与算法定位:
- FP8:Hopper 与 Ada GPU(CUDA compute capability ≥ 8.9)支持。作为 8-bit 交换格式在精度与内存间取得平衡,是 SM89+ 硬件的默认选择。
- INT4 AWQ:INT4 仅权重量化 + 校准方法。对低 batch 推理尤其有效——此时延迟由权重加载时间主导而非计算时间;相比 FP8/INT8 可获更低延迟,相比 INT8 精度下降更小。
- NVFP4:Blackwell GPU 支持的 FP4 新格式之一,与其他 4-bit 方案相比精度表现好。NVFP4 可同时应用于权重与激活,相比 FP8 在 Blackwell 上有望带来数学吞吐提升以及内存占用、带宽的双重下降。
需要说明的是,格式的最终可用性同时受目标硬件与 TensorRT kernel 支持约束(如本文第 3.3 节所述),选择量化方案时应结合部署平台综合评估。
9. 相关资源
仓库内可继续深入的资料:
- examples/torch_onnx/torch_quant_to_onnx.py 与 examples/torch_onnx/hf_embedding_quant_to_onnx.py:两个示例脚本完整源码;
- examples/onnx_ptq:共享的 ONNX 导出(
download_example_onnx.py)、评估(evaluation.py、evaluate.py)与 TRT 运行(trt_runner.py)模块; - modelopt_recipes/model_type/nemotron_llama/ptq:Embedding/Reranking 的 NVFP4/FP8 输出量化 recipe;
- modelopt_recipes/general/auto_quantize:AutoQuantize 混合精度 recipe 集合;
- examples/benchmark.md:量化/导出相关基准;
- docs/source/reference/0_changelog.rst:版本更新说明。
若需在边缘平台(Jetson、DRIVE)部署 LLM/VLM,建议进一步阅读 TensorRT-Edge-LLM 的官方 Developer Guide 与其支持模型矩阵页。