有个团队把PyTorch模型转成ONNX后用ATC编译编译出来的OM模型推理结果跟原始模型差了0.5%。排查了三天最后发现是ATC编译时默认开了INT8量化而他们没有提供校准数据量化参数是从随机采样推导的——精度自然不行。ATCAscend Tensor Compiler是昇腾CANN的离线模型编译器负责把训练框架导出的模型转换成NPU能直接执行的OMOffline Model格式。它做的事情远不止格式转换——里面包含了算子融合、图优化、精度选择、Tiling策略等大量优化。1. ATC在CANN工具链中的位置运行环境ATC 编译器核心 (Ascend Tensor Compiler)训练框架层torch.onnx.exporttf2onnx导出IR① Parser② GE 图优化③ TE 算子编译④ 代码生成加载分配内存/执行返回结果PyTorchONNXTensorFlowMindSpore内部流程Frontend IR融合/常量折叠/死代码消除Kernel选择/TilingOM文件ACL RuntimeNPU执行应用层ATCATC的输入ONNX / Caffe / MindSpore / TFATC的输出OM文件.om 编译日志 优化报告2. 最基本的ATC命令atc--modelresnet50.onnx\--framework5\--outputresnet50\--socVersionAscend910\--output_typeFP16参数详解--model: 输入模型文件路径ONNX/Caffe/MindSpore。--framework: 框架类型0Caffe,3TF,5ONNX,0MindSpore IR。--output: 输出文件名不加.om后缀自动加。--socVersion: NPU型号Ascend310: 端侧NPUAscend310P: 升级版端侧Ascend910: 云侧训练/推理Ascend910B: 升级版云侧--output_type: 输出精度FP32/FP16/INT8这个参数影响所有算子的计算精度。3. 完整的ATC编译参数生产级配置atc\--modelresnet50.onnx\--framework5\--outputresnet50_fp16\--socVersionAscend910\--output_typeFP16\--input_shapeactual_input_1:1,3,224,224\--input_formatNCHW\--dynamic_batch_size1,2,4,8,16\--dynamic_image_size224,224;448,448\--logerror\--insert_op_confpreprocess.cfg\--keep_dtypeAdd:fp32;Softmax:fp32\--fusion_switch_filefusion.cfg\--precision_modeallow_mix_precision\--op_select_implmodehigh_performance\--optypelist_for_implmodeGelu,LayerNorm,Softmax\--buffer_optimizel2_optimize\--enable_small_channel1\--compress_weight_confcompress.cfg\--out_nodesMobilenetV2/Predictions/Reshape_1:0\--disable_reuse_memory0\--online_infer_mode1★ 每个参数的作用详解表参数作用说明--input_shape指定输入shape。格式“name:d1,d2,d3”。ONNX模型有时shape不确定必须指定。--input_format输入数据格式。NCHW / NHWC / NC1HWC0。NHWC会自动转成NC1HWC0。--dynamic_batch_size动态batch多batch共用一个OM。1,2,4,8,16表示支持这些batch size推理时可以切换不需要重新编译。--dynamic_image_size动态分辨率检测模型常用。224,224;448,448支持两种分辨率。--insert_op_confAIPP预处理配置。在OM里嵌入图像预处理归一化等推理时不需要在外部做预处理。--keep_dtype指定某些算子保持特定精度。例如Add:fp32→ Add算子用FP32防止混合精度出问题。--precision_mode精度模式。force_fp16: 强制FP16allow_mix_precision: 允许自动混合must_keep_origin_dtype: 保持原精度--op_select_implmode算子实现选择模式。high_performance: 选最快的kernelhigh_precision: 选精度最高的kernel--buffer_optimize内存优化策略。l2_optimize: 利用L2 Cacheoff: 不优化--enable_small_channel小通道优化。当通道数16时启用特殊优化对MobileNet这类小通道模型很重要。--compress_weight_conf权重压缩配置。可以把FP32权重压缩成INT8/INT4。--out_nodes指定输出节点。多输出模型时需要指定节点名来自ONNX图的输出tensor名。--disable_reuse_memory禁用内存复用。0: 开启复用省显存1: 禁用复用调试用4. AIPP嵌入式预处理配置AIPPAI Pre-Processing配置文件可以将图像预处理直接编译进OM推理时不需要外部做。# preprocess.cfg aipp_op { aipp_mode: static # static编译时确定dynamic运行时确定 related_input_rank: 0 # 作用于第0个输入 # ★ 颜色空间转换 color_space: RGB_TO_YUV_420 # 或者不转换保持RGB # ★ 归一化减均值、除以标准差 mean_chn_0: 123.675 mean_chn_1: 116.28 mean_chn_2: 103.53 min_chn_0: 58.395 min_chn_1: 57.12 min_chn_2: 57.375 # 实际操作output (input - mean) / std # ★ Resize输入图片大小不固定时 resize: true resize_output_w: 224 resize_output_h: 224 # ★ Padding padding: true padding_top: 0 padding_left: 0 padding_right: 0 padding_bottom: 0 padding_value: 0 # ★ Crop (可选) crop: false load_start_pos_w: 0 load_start_pos_h: 0 crop_size_w: 224 crop_size_h: 224 }通过合理使用上述参数和配置可以确保从ONNX到OM的转换过程中模型精度损失最小化同时充分利用NPU的硬件特性如AIPP、动态Shape、内存复用等以获得最佳推理性能。
CANN ATC模型编译器深度解析:ONNX到OM的编译全流程与黑盒参数详解
有个团队把PyTorch模型转成ONNX后用ATC编译编译出来的OM模型推理结果跟原始模型差了0.5%。排查了三天最后发现是ATC编译时默认开了INT8量化而他们没有提供校准数据量化参数是从随机采样推导的——精度自然不行。ATCAscend Tensor Compiler是昇腾CANN的离线模型编译器负责把训练框架导出的模型转换成NPU能直接执行的OMOffline Model格式。它做的事情远不止格式转换——里面包含了算子融合、图优化、精度选择、Tiling策略等大量优化。1. ATC在CANN工具链中的位置运行环境ATC 编译器核心 (Ascend Tensor Compiler)训练框架层torch.onnx.exporttf2onnx导出IR① Parser② GE 图优化③ TE 算子编译④ 代码生成加载分配内存/执行返回结果PyTorchONNXTensorFlowMindSpore内部流程Frontend IR融合/常量折叠/死代码消除Kernel选择/TilingOM文件ACL RuntimeNPU执行应用层ATCATC的输入ONNX / Caffe / MindSpore / TFATC的输出OM文件.om 编译日志 优化报告2. 最基本的ATC命令atc--modelresnet50.onnx\--framework5\--outputresnet50\--socVersionAscend910\--output_typeFP16参数详解--model: 输入模型文件路径ONNX/Caffe/MindSpore。--framework: 框架类型0Caffe,3TF,5ONNX,0MindSpore IR。--output: 输出文件名不加.om后缀自动加。--socVersion: NPU型号Ascend310: 端侧NPUAscend310P: 升级版端侧Ascend910: 云侧训练/推理Ascend910B: 升级版云侧--output_type: 输出精度FP32/FP16/INT8这个参数影响所有算子的计算精度。3. 完整的ATC编译参数生产级配置atc\--modelresnet50.onnx\--framework5\--outputresnet50_fp16\--socVersionAscend910\--output_typeFP16\--input_shapeactual_input_1:1,3,224,224\--input_formatNCHW\--dynamic_batch_size1,2,4,8,16\--dynamic_image_size224,224;448,448\--logerror\--insert_op_confpreprocess.cfg\--keep_dtypeAdd:fp32;Softmax:fp32\--fusion_switch_filefusion.cfg\--precision_modeallow_mix_precision\--op_select_implmodehigh_performance\--optypelist_for_implmodeGelu,LayerNorm,Softmax\--buffer_optimizel2_optimize\--enable_small_channel1\--compress_weight_confcompress.cfg\--out_nodesMobilenetV2/Predictions/Reshape_1:0\--disable_reuse_memory0\--online_infer_mode1★ 每个参数的作用详解表参数作用说明--input_shape指定输入shape。格式“name:d1,d2,d3”。ONNX模型有时shape不确定必须指定。--input_format输入数据格式。NCHW / NHWC / NC1HWC0。NHWC会自动转成NC1HWC0。--dynamic_batch_size动态batch多batch共用一个OM。1,2,4,8,16表示支持这些batch size推理时可以切换不需要重新编译。--dynamic_image_size动态分辨率检测模型常用。224,224;448,448支持两种分辨率。--insert_op_confAIPP预处理配置。在OM里嵌入图像预处理归一化等推理时不需要在外部做预处理。--keep_dtype指定某些算子保持特定精度。例如Add:fp32→ Add算子用FP32防止混合精度出问题。--precision_mode精度模式。force_fp16: 强制FP16allow_mix_precision: 允许自动混合must_keep_origin_dtype: 保持原精度--op_select_implmode算子实现选择模式。high_performance: 选最快的kernelhigh_precision: 选精度最高的kernel--buffer_optimize内存优化策略。l2_optimize: 利用L2 Cacheoff: 不优化--enable_small_channel小通道优化。当通道数16时启用特殊优化对MobileNet这类小通道模型很重要。--compress_weight_conf权重压缩配置。可以把FP32权重压缩成INT8/INT4。--out_nodes指定输出节点。多输出模型时需要指定节点名来自ONNX图的输出tensor名。--disable_reuse_memory禁用内存复用。0: 开启复用省显存1: 禁用复用调试用4. AIPP嵌入式预处理配置AIPPAI Pre-Processing配置文件可以将图像预处理直接编译进OM推理时不需要外部做。# preprocess.cfg aipp_op { aipp_mode: static # static编译时确定dynamic运行时确定 related_input_rank: 0 # 作用于第0个输入 # ★ 颜色空间转换 color_space: RGB_TO_YUV_420 # 或者不转换保持RGB # ★ 归一化减均值、除以标准差 mean_chn_0: 123.675 mean_chn_1: 116.28 mean_chn_2: 103.53 min_chn_0: 58.395 min_chn_1: 57.12 min_chn_2: 57.375 # 实际操作output (input - mean) / std # ★ Resize输入图片大小不固定时 resize: true resize_output_w: 224 resize_output_h: 224 # ★ Padding padding: true padding_top: 0 padding_left: 0 padding_right: 0 padding_bottom: 0 padding_value: 0 # ★ Crop (可选) crop: false load_start_pos_w: 0 load_start_pos_h: 0 crop_size_w: 224 crop_size_h: 224 }通过合理使用上述参数和配置可以确保从ONNX到OM的转换过程中模型精度损失最小化同时充分利用NPU的硬件特性如AIPP、动态Shape、内存复用等以获得最佳推理性能。