尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何对 ONNX 模型做节点级混合精度控制:Model Optimizer AutoCast 完整指南

如何对 ONNX 模型做节点级混合精度控制:Model Optimizer AutoCast 完整指南 如何对 ONNX 模型做节点级混合精度控制Model Optimizer AutoCast 完整指南【免费下载链接】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 在 Model OptimizerNVIDIA 统一模型优化库中ONNX AutoCast工具可以把 FP32 的 ONNX 模型智能转换为 FP32-FP16 或 FP32-BF16 的混合精度模型它对计算图中每个节点单独判断精度敏感度把敏感节点保留在 FP32其余节点降为 FP16/BF16 并自动注入 Cast 算子从而在不牺牲精度的前提下获得推理加速。为什么 ONNX 模型需要混合精度而不是全量转换把整个模型从 FP32 一刀切到 FP16 往往会导致精度骤降——FP16 的精度随数据幅值增大而变差幅值 512 时末位有效位 ULP 已达 0.51024 时更是 1.0。AutoCast 的思路是逐节点决策只把安全的节点转成低精度把危险的节点留在 FP32。AutoCast 转换流程4 个阶段一次看懂整个转换由 convert.py 中的convert_to_mixed_precision()函数驱动分为四个阶段阶段做什么关键模块① 加载与净化加载 ONNX 模型做图净化、opset 版本校验BF16 需 ≥22FP16 需 ≥13graphsanitizer.py② 节点分类逐个节点分析输入/输出张量幅值、算子类型、节点名判定是否保留 FP32nodeclassifier.py③ 精度转换将合格节点转为低精度自动插入 Cast 算子、替换初始化器并做类型推断precisionconverter.py④ 校验导出通过 onnx.checker 校验、检查输入输出名匹配与类型一致性后保存—节点分类的 6 条规则核心机制分类逻辑在 NodeClassifier 中以规则链实现命中任意一条排除规则节点就保留 FP32I/O 幅值规则IORangeRule节点输入或输出的绝对值超过data_max默认 512→ 保留 FP32初始化器幅值规则InitializerRangeRule权重值超过init_max默认 65504即 FP16 最大可表示值避免溢出→ 保留 FP32归约深度规则DepthOfReductionRule大矩阵乘、大卷积核等归约深度超过max_depth_of_reduction的节点 → 保留 FP32累加步数越多精度损失越危险节点名正则规则--nodes_to_exclude .*attn.*可按名称把注意力节点保留在 FP32算子类型规则--op_types_to_exclude Resize可整体拦截某类敏感算子自定义规则继承NodeRuleBase即可注入自己的分类逻辑。此外还支持nodes_to_include/op_types_to_include反向强制把某类节点转为低精度。校准数据让分类决策更靠谱分类需要知道每个张量的真实幅值分布这就是 ReferenceRunner 的职责它用 ONNXRuntime 跑一遍参考推理采集所有中间张量的统计量支持单批 NPZ、多批 NPZ 目录、Polygraphy JSON 三种格式多批统计会聚合成更鲁棒的 absmax/min/max。不提供校准数据时工具会用随机输入估算——生产环境建议提供真实校准数据。快速上手命令与参数最简转换一条命令即可python -m modelopt.onnx.autocast --onnx_path model.onnx常用进阶用法# 转 BF16收紧幅值阈值并强制保留 Resize 算子在 FP32 python -m modelopt.onnx.autocast --onnx_path model.onnx \ --low_precision_type bf16 --data_max 256 --op_types_to_exclude Resize # 限制归约深度保护大 GEMM/卷积 python -m modelopt.onnx.autocast --onnx_path model.onnx --max_depth_of_reduction 1024常用参数速查完整 CLI 定义见main.py参数默认作用-tfp16目标低精度fp16或bf16--data_max512节点 I/O 幅值阈值超过则保留 FP32--init_max65504初始化器幅值阈值超过则保留 FP32--max_depth_of_reduction∞归约深度上限控制大矩阵乘/卷积精度--keep_io_types关保留模型输入/输出类型不变--calibration_data无校准数据路径提升分类准确性--opset13/22目标 opsetBF16 需 ≥22Python API 侧调用同一入口from modelopt.onnx.autocast import convert_to_mixed_precision官方文档见 docs/source/guides/8_autocast.rst。混合精度的实际收益低精度与精度的平衡低精度转换的价值在于更小的模型体积 更快的推理 更低的显存占用同时借助节点级控制把精度损失压到可接受范围。下面这张低精度量化模型的生成效果对比直观展示了精度转换后输出质量的保持情况对于更复杂的 LLM 场景Model Optimizer 还内置了自动量化AutoQuantize等进阶能力可自动搜索每个算子的最优有效比特数详见 autoquantize.rst。限制与最佳实践不支持已量化模型AutoCast 目前只处理纯 FP32 模型含 Q/DQ 的量化模型请用 convert_to_f16 接口BF16 兼容性并非所有算子都支持 BF16工具会自动升级 opset 到 22TensorRT 也未必支持所有 BF16 模型大模型内存超过 2GB 的模型可能遇到内存问题可用--init_conversion_max_bytes限制编译期转换的初始化器大小超出的改为运行时 Cast调参顺序先用默认阈值 → 用 INFO/DEBUG 日志观察节点转换比例 → 再针对性调整data_max或用节点名/算子名规则微调。小结Model Optimizer 的 ONNX AutoCast 通过图净化 → 规则化节点分类 → 自动 Cast 注入 → 校验导出四阶段流水线把混合精度转换从玄学调参变成了可控的工程流程——节点级精度控制正是它在精度与性能之间取得平衡的关键。【免费下载链接】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),仅供参考
返回列表