写点什么

飞桨 x 昇腾生态适配方案:10_ONNX 转 OM

作者:小顺637
  • 2025-05-12
    北京
  • 本文字数:2808 字

    阅读完需:约 9 分钟

本章节介绍 ONNX 模型如何转化为 OM 模型,并在昇腾 AI 处理器上做离线推理。


昇腾张量编译器(Ascend Tensor Compiler,简称 ATC)是异构计算架构 CANN 体系下的模型转换工具, 它可以将开源框架的网络模型或 Ascend IR 定义的单算子描述文件(json 格式)转换为昇腾 AI 处理器支持的.om 格式离线模型。ATC 功能详见:https://www.hiascend.com/document/detail/zh/canncommercial/80RC2/devaids/auxiliarydevtool/atlasatc_16_0001.html

设置环境变量

ATC 工具内置在 cann-toolkit 中,因此使用时需设置 ascend-toolkit 环境变量:


source /usr/local/Ascend/ascend-toolkit/set_env.sh
复制代码

ONNX 转静态 OM

命令格式

atc --framework=5 --model=XXX --output=XXX \    --input_format=XXX --input_shape=model_input_name:model_input_shape \    --log=error --soc_version=Ascend${chip_name}
复制代码

参数说明

--framework : 5 代表 ONNX 模型--model : ONNX 模型文件路径与文件名--output : 输出的 OM 模型文件路径与文件名--input_format : 可以选 NCHW or ND--input_shape : 模型输入的 shape--log : log 日志有 debug/info/warning/error/null 级别--soc_version : 指定模型转换时昇腾 AI 处理器的版本(可通过 npu-smi info 命令查看处理器版本)特别说明:把 log 设置成 debug,然后配合 export ASCEND_GLOBAL_LOG_LEVEL=0 和 export ASCEND_SLOG_PRINT_TO_STDOUT=1 可以重定向具体日志,方便定位问题。

执行转换

atc --framework=5 --model=inference/det_onnx/model.onnx --output=inference/om/det \    --input_format=NCHW --input_shape=x:1,3,224,224 \    --log=error --soc_version=Ascend910B4
复制代码


转换成功:



输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:


inference/om/    └── det.om           # OM模型文件
复制代码

常见问题

命令行格式问题

报错信息:



解决方法:删除“=”后的空格。

input_shape 设置错误

报错信息:



解决方法:修改 input_shape 中的 input_name 改成 x(以模型实际的 input_name 为准)。

查看模型 input_shape

使用 ONNX 模型可视化工具(https://netron.app/)查看模型的input_shape,如下图所示:


  • 进入 netron 工具,加载 model.onnx 模型:

  • 点击“properties”


  • 查看模型 input_shape

  • INPUTS 参数说明:x:input_namep2o.DynamicDimension.0:批次大小,对应 NCHW 格式中 B,可设置动态 3:通道数 (排列方式 BGR) ,对应 NCHW 格式中 C,为固定值 p2o.DynamicDimension.1:图像高度,对应 NCHW 格式中 H,可设置动态 p2o.DynamicDimension.2:图像宽度,对应 NCHW 格式中 W,可设置动态

动态 BatchSize 转 OM

命令格式

atc --model=$HOME/module/resnet50.onnx  --framework=5  \    --output=$HOME/module/out/resnet50 --soc_version=<soc_version> \    --input_shape="input_name:-1,3,224,224"  --dynamic_batch_size="1,2,4,8" \    --log=error
复制代码


特定参数说明:dynamic_batch_size: 输入动态 BatchSize 的具体值

执行转换

atc --model=./inference/det_onnx/model.onnx  --framework=5 \    --output=./inference/om/dynamic_batch_size_det --soc_version=Ascend910B4 \    --input_shape="x:-1,3,256,256"  --dynamic_batch_size="1,2,4,8" \    --log=error
复制代码

输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:


inference/om/    └── dynamic_batch_size_det.om           # OM模型文件
复制代码


转换成功:



常见问题

input_shape 设置错误

错误命令:


atc --model=./inference/det_onnx/model.onnx  --framework=5 \    --output=./inference/om/dynamic_batch_size_det --soc_version=Ascend910B4 \    --input_shape="x:-1,3,-1,-1"  --dynamic_batch_size="1,2,4,8"  \    --log=error
复制代码


报错信息:



错误原因:动态 BatchSize 场景,除 BatchSize 外,其它参数不能设置为-1 解决方法:--input_shape 设置为:"x:-1,3,256,256"

动态分辨率转 OM

命令格式

atc --model=$HOME/module/resnet50.onnx  --framework=5 \    --output=$HOME/module/out/resnet50 --soc_version=<soc_version>  \    --input_shape="input_name:1,3,-1,-1"  --dynamic_image_size="224,224;448,448" \    --log=error
复制代码


特定参数说明:input_format : 选 NDdynamic_image_size : 输入动态分辨率的具体值

执行转换

atc --model=./inference/det_onnx/model.onnx  --framework=5 \    --output=./inference/om/dynamic_image_size_det --soc_version=Ascend910B4 \    --input_shape="x:1,3,-1,-1"  --dynamic_image_size="224,224;448,448" \    --log=error
复制代码


转换成功:



输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:


inference/om/    └── dynamic_image_size_det.om           # OM模型文件
复制代码

常见问题

input_shape 设置错误

错误命令:


atc --model=./inference/det_onnx/model.onnx  --framework=5 \    --output=./inference/om/dynamic_image_size_det --soc_version=Ascend910B4 \    --input_shape="x:-1,3,-1,-1"  --dynamic_image_size="224,224;448,448" \    --log=error
复制代码


报错信息:



错误原因:动态分辨率场景,除分辨率外,其它参数不能设置为-1 解决方法:--input_shape 设置为:"x:1,3,-1,-1"

动态维度转 OM

命令格式

atc --model=$HOME/module/resnet50.onnx --framework=5 \    --output=$HOME/module/out/resnet50 --soc_version=<soc_version>  \    --input_shape="input_name:-1,3,-1,-1" --dynamic_dims="1,224,224;8,448,448" \    --input_format=ND --log=error
复制代码


特定参数说明:input_format : 选 NDdynamic_dims : 输入动态维度的具体值

执行转换

atc --model=./inference/det_onnx/model.onnx  --framework=5 \    --output=./inference/om/dynamic_dims_det --soc_version=Ascend910B4 \    --input_shape="x:-1,3,-1,-1"  --dynamic_dims="1,224,224;8,448,448" \    --input_format=ND --log=error
复制代码


转换成功:



输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:inference/om/    └── dynamic_dims_det.om          # OM模型文件
复制代码

动态 shape 转 OM

命令格式

atc --framework=5 --model=XXX --output=XXX --input_format=ND \    --input_shape="input_name_0:1~10,32,208,208;input_name_1:16,64,100~208,100~208" \    --log=error --soc_version=Ascend${chip_name}
复制代码


特定参数说明:input_format : 选 NDinput_shape : 设置输入的动态 shape 范围

执行转换

atc --model=./inference/det_onnx/model.onnx  --framework=5 \    --output=./inference/om/dynamic_shape_det --soc_version=Ascend910B4 \    --input_shape="x:1~8,3,224~448,224~448" \    --input_format=ND --log=error
复制代码


转换成功:



输出结果

执行完毕后,OM 模型会被保存在 ./inference/om/路径下:


inference/om/    └── dynamic_shape_det_linux_aarch64.om          # OM模型文件
复制代码


用户头像

小顺637

关注

还未添加个人签名 2023-01-19 加入

还未添加个人简介

评论

发布
暂无评论
飞桨x昇腾生态适配方案:10_ONNX转OM_飞桨_小顺637_InfoQ写作社区