ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

QDQ图解构:Model Optimizer如何向ONNX计算图精准插入量化节点

QDQ图解构:Model Optimizer如何向ONNX计算图精准插入量化节点 QDQ图解构Model Optimizer如何向ONNX计算图精准插入量化节点【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址: https://gitcode.com/GitHub_Trending/te/Model-OptimizerModel Optimizer 是 NVIDIA 推出的统一深度学习模型优化库提供量化Quantization、蒸馏、剪枝、NAS 等 SOTA 压缩技术。其中ONNX 量化功能可以在一行调用中完成后训练量化PTQ读取原始 ONNX 模型与校准数据自动在 ONNX 计算图中精准插入QDQ 量化节点生成可直接编译为 TensorRT 引擎的高性能量化模型。本文将图解构这套 QDQ 插入机制——它如何选节点、定 scale、插 Q/DQ、再清理图结构。什么是 QDQ 节点为什么 TensorRT 需要它 QDQ Quantize-Dequantize量化-反量化节点对是 ONNX 标准算子节点作用输入 → 输出QQuantizeLinear把高精度浮点张量按 scale 压成 int8/uint4 等低精度fp32/fp16 → int8DQDequantizeLinear把低精度张量按 scale 还原回浮点int8 → fp32/fp16单独看Q→DQ 似乎量化了又还原做了无用功。这正是TensorRT Explicit Quantization显式量化的核心技巧TensorRT 编译器识别 QDQ 标记将中间的浮点层自动融合为 int8 内核从而获得⚡ 更小的权重体积int8 权重体积约为 fp16 的一半int4 则只有 1/4 低精度 Tensor Core 内核带来的推理加速 混合精度能力QDQ 没覆盖的层仍按高精度运行精度损失可控对扩散模型、视觉模型这类 INT8 敏感负载Model Optimizer 的 QDQ 图策略对 ViT 等结构有更好的支持。量化后模型的生成质量通常肉眼难辨差异例如下面这张 SDXL 模型 INT8 量化后的生成图与全精度版本几乎一致 官方说明ModelOpt 生成的 ONNX 遵循 TensorRT 的 QDQ 规则要获得真实加速需要用trtexec将其编译为 TensorRT 引擎。参考 ONNX Quantization 指南。一行 PTQ调用 Model Optimizer 的 ONNX 量化 API整个后训练量化的入口是 quantize.py 中的quantize()函数用法非常简单import modelopt.onnx.quantization as moq moq.quantize( onnx_pathmodel.onnx, calibration_datacalib_data, # npz/npy 校准数据 output_pathquant.onnx, quantize_modeint8, # 支持 int8 / int4 / fp8 autotuneTrue, # 可选自动搜索最优 QDQ 布局 )不同量化模式默认覆盖的算子类型如下来自 quantize.py 的模块文档模式默认量化的算子INT8Add、AveragePool、BatchNormalization、Clip、Conv、ConvTranspose、Gemm、GlobalAveragePool、MatMul、MaxPool、MulINT4Gemm、MatMulFP8Conv、Gemm、MatMul可见设计取向优先量化线性算子Conv/MatMul/Gemm因为它们收益最大INT4/FP8 则更保守集中在权重上。校准数据用.npz/.npy文件不提供时工具会用随机输入兜底。命令行方式同样开箱即用python -m modelopt.onnx.quantization --onnx ... --calib-data ...。QDQ 插入五部曲从图解析到节点落地 拿到模型后QDQ 节点的落点才决定性能上限。Model Optimizer 的 ONNX 量化是白盒设计插入流程可分为五步① 图解析与拓扑排序工具用onnx-graphsurgeon导入模型并做拓扑排序int8.py后续所有选择与改写都在这张统一的中间图上完成。如果检测到图里已有 QDQ 节点会直接跳过避免重复量化。② 选点可量化节点识别是真正的精准所在这一步是 Model Optimizer 与无脑给每个算子加 QDQ方案的最大区别核心逻辑在 int8.py 的_find_nodes_to_quantize()与 partitioning.pyCASK 可融合分区TensorRT 的融合算子CASK会把 Conv激活Add 等吞成一个整体。工具先找出这些分区再判断 Q/DQ 应该插在分区的哪个边界上——插错位置会导致融合失效、加速归零。MHA / LayerNorm 模式识别对 MultiHeadAttention、LayerNormalization 等敏感子图做模式匹配find_mha_partitions、find_layer_norm_partitions把容易掉精度的张量排除在量化之外。Conv→LayerNorm 特判qdq_graph.py 的find_conv_to_layernorm_nodes()专门检测 Conv 输出直接喂给 LayerNorm 的链路在其输出插入 Q/DQ 以激活更快的 INT8 内核。GEMV 排除MatMul 的 m 或 n 为 1 时无法利用 Tensor Core插 Q/DQ 反而拖慢性能这类节点会被自动排除除非启用 Autotune由运行时实测决定。部分可量化算子如某些 Add 只有部分输入能被 TensorRT 量化工具会在后处理阶段把这些多余的 QDQ 从图中删掉remove_partial_input_qdq。③ 校准为每个张量定一个 scale选定节点后工具跑校准数据集默认entropy方法统计每个待量化张量的激活分布得出scale缩放因子/ zero-point。这一步决定了量化误差大小——QDQ 算子的 scale 常量就来自这里。④ 落笔真正写入 Q/DQ 节点节点插入的实现在 qdq_utils.py三个关键函数各司其职函数职责insert_dq_nodes给权重插 DQ权重离线量化成 int8 初始值图中只挂一个 DQ 节点还原权重在推理时恒为量化态省掉 Qinsert_qdq_nodes给激活插完整 QDQ 对Q 把浮点激活压成 int8DQ 再还原给下游insert_pre_quant_scale_nodes插入 PreQuantScale当同一张量被多个 Q 消费时用一次 scale 乘法保证各 Q 的量化基准一致注意权重侧只 DQ 不 Q的优化权重是静态的工具直接把初始值换成 int8 整数数组make_gs_quantized_weight运行时零开销。⑤ 后处理让图对 TensorRT 更友好插入完成后还有一轮收尾删掉图输入的 DQ 和图输出的 Qremove_input_dq_and_output_q模型 IO 保持原始精度避免部署框架不兼容冗余 Cast 清理graph_rewrites.py 合并无意义的 Cast 节点混合精度标记被排除的敏感层保持 fp16/fp32形成 QDQ 覆盖的量化岛 高精度回路的混合精度图。Autotune让 Q/DQ 位置搜出来而不是写死 ⚙️默认策略依赖一套为 TensorRT 精心设计的启发式规则但对非常规图自研算子、复杂残差结构启发式未必最优。Model Optimizer 提供Autotuneautotune/ 目录思路是把Q/DQ 插在哪变成搜索问题枚举候选插入点insertion_points.py对每个候选区域生成不同 QDQ 布局的变体图用 TensorRT EP 实际编译测速以延迟为指标挑选最优布局benchmark.py。代价是校准耗时增加收益是量化图的性能上限更高。这种搜索式量化思想在模型层面的延伸就是 AutoQuantize在混合精度下权衡 MMLU 等任务指标与有效比特数用更少的平均比特维持精度例如 Qwen3.5 系列在 MMLU 上的有效比特-精度曲线部署与验证trtexec 一键编译生成的quant.onnx交给 TensorRT 即可两条命令对比 fp16 与量化版性能# 编译量化引擎自动启用 INT8/低精度内核 trtexec --onnxquant.onnx --saveEnginequant.engine --best # 基线fp16 引擎 trtexec --onnxoriginal.onnx --saveEnginefp16.engine --fp16对比输出中的 Latency / Throughput 就能看到 QDQ 量化带来的加速。更多真实模型BEVFormer、PETR、VoVNet 等视觉/BEV 模型的完整脚本可参考 examples/onnx_ptq/ 目录其中 quantize_vovnet.py 是很好的最小示例Autotune 用法见 autotune/README.md。如果 INT8 精度还不够QDQ 插入的是后训练量化路线。若进一步压到 W4A4 等极低比特纯 PTQ 精度可能不足Model Optimizer 的量化感知训练QAD可以在训练过程中持续校正量化误差——下图中 W4A4 配置的 QAD 训练损失随步数稳定下降验证了该路线的收敛性QAD 实践可参考 量化感知训练指南。资源导航 想做什么去哪里看 ONNX 量化的官方流程与参数docs/source/guides/_onnx_quantization.rst阅读量化总入口quantize()modelopt/onnx/quantization/quantize.py理解 Q/DQ 节点构造与插入qdq_utils.py、qdq_graph.py理解 CASK 分区与节点选择策略partitioning.py、int8.py调参 Autotune 搜索modelopt/onnx/quantization/autotune/跑一个真实 ONNX 模型examples/onnx_ptq/一句话总结Model Optimizer 的 ONNX 量化 用 graphsurgeon 精读计算图 → 按 TensorRT 融合规则选点 → 校准定 scale → 权重挂 DQ、激活挂 QDQ → 清理收尾最终交出一份编译器看得懂、内核跑得动的量化 ONNX。【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址: https://gitcode.com/GitHub_Trending/te/Model-Optimizer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表