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

简介: 本章节主要介绍如何将ONNX模型转化为昇腾AI处理器支持的OM模型,并进行离线推理。通过昇腾张量编译器(ATC),可实现静态OM、动态BatchSize、动态分辨率、动态维度及动态shape等多种模型转换。文中详细说明了ATC工具的使用方法、参数配置、命令格式以及常见问题解决方法,同时提供了具体示例和可视化工具辅助输入参数确认,帮助用户高效完成模型转换与部署。

本章节介绍 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

转换成功:
01_ONNX转静态OM.png

输出结果

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

inference/om/
    └── det.om           # OM模型文件

常见问题

命令行格式问题

报错信息:
02_命令行格式问题.png

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

input_shape设置错误

报错信息:
03_input_name设置错误.png

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

查看模型input_shape

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

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

  • 点击“properties”
    05_点击“properties”.png

  • 查看模型input_shape

06_查看模型input_shape.png

INPUTS参数说明:
x:input_name
p2o.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模型文件

转换成功:
07_动态BatchSize转OM.png

常见问题

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

报错信息:
08_非BatchSize参数设为-1.png

错误原因:动态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 : 选ND
dynamic_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

转换成功:
09_动态分辨率转OM.png

输出结果

执行完毕后,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

报错信息:
10_非分辨率参数设为-1.png

错误原因:动态分辨率场景,除分辨率外,其它参数不能设置为-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 : 选ND
dynamic_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

转换成功:
11_动态维度转OM.png

输出结果

执行完毕后,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 : 选ND
input_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

转换成功:
12_动态shape转OM.png

输出结果

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

inference/om/
    └── dynamic_shape_det_linux_aarch64.om          # OM模型文件
目录
相关文章
|
9月前
|
负载均衡 Docker Python
vLLM-Ascend 安装部署与环境配置指南
vLLM-Ascend 是 vLLM 项目专为华为昇腾 NPU 设计的硬件插件,支持主流大模型与多模态架构,提供高性能推理能力。项目结构清晰,涵盖核心算子、工具脚本与容器化部署方案,兼容单/多节点环境,助力高效构建昇腾上的 AI 推理服务。
4498 1
|
人工智能 测试技术 API
飞桨x昇腾生态适配方案:11_静态OM推理
昇腾AI推理工具`ais_bench`基于ACL开发,支持命令行快速推理与性能测试(吞吐率、时延等),并提供相关API。用户需下载适配环境的`aclruntime`和`ais_bench`的whl包后通过pip安装。设置环境变量后,可通过多种场景使用工具:纯推理(默认输入全0数据)、调试模式(获取详细参数与耗时信息)、文件/文件夹输入(指定Numpy文件或目录)、以及多Device并行推理。例如,BERT模型需按顺序传入三个文件夹对应其输入参数。工具输出包括吞吐率、耗时等关键指标,助力高效模型性能评估。
2507 0
|
编解码 人工智能 API
飞桨x昇腾生态适配方案:12_动态OM推理
本文介绍了基于Ascend AI平台的OM模型动态推理方法,包括动态BatchSize、动态分辨率、动态维度及动态Shape四种场景,支持固定模式与自动设置模式。通过`ais_bench`工具实现推理,提供示例命令及输出结果说明,并解决常见问题(如环境变量未设置、输入与模型不匹配等)。此外,还提供了API推理指南及参考链接,帮助用户深入了解ONNX离线推理流程、性能优化案例及工具使用方法。
1687 0
vllm+vllm-ascend本地部署QwQ-32B
本指南介绍如何下载、安装和启动基于Ascend的vLLM模型。首先,可通过华为镜像或Hugging Face下载预训练模型;其次,安装vllm-ascend,支持通过基础镜像(如`quay.io/ascend/vllm-ascend:v0.7.3-dev`)或源码编译方式完成;最后,使用OpenAI兼容接口启动模型,例如运行`vllm serve`命令,设置模型路径、并行规模等参数。适用于大模型推理场景,需注意显存需求(如QwQ-32B需70G以上)。
5386 17
|
9月前
|
开发工具 开发者 AI芯片
昇腾 Triton-Ascend 开源实战:架构解析、环境搭建与配置速查
本文深度解析Triton-Ascend开源项目,涵盖源码结构、编译流程与环境部署,重点针对Ascend 910B硬件提供从CANN安装到算子开发的保姆级指南,并详解Autotune调优策略与性能分析工具,助力开发者高效构建高性能AI算子。
1169 0
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
1079 26
|
JSON 数据格式 AI芯片
飞桨x昇腾生态适配方案:14_loop算子缺失(上):ONNX模型拆分
本文针对NPU不支持LOOP算子的问题,提出一种解决方案:将ONNX模型拆分为含LOOP算子和不含LOOP算子的子图,单独推理LOOP部分。通过构造包含LOOP算子的ONNX模型,将其转换为JSON格式提取子图,并对子图进行修改(如添加输入节点、删除无关节点)。最后,将JSON转回ONNX格式,完成模型切分与优化。此方法适用于关键路径上的LOOP算子,可有效解决离线推理中的兼容性问题。
1022 26
|
并行计算 开发工具 git
NPU上运行onnxruntime
在Ascend环境下使用onnxruntime推理时,若安装了GPU版本的onnxruntime(`onnxruntime-gpu`),可能会因缺少CUDA组件报错。正确做法是卸载`onnxruntime-gpu`,并根据官方文档适配NPU,通过源码构建支持CANN的onnxruntime whl包。具体步骤为克隆onnxruntime源码,使用`--use_cann`参数构建,并安装生成的whl包。最后,配置CANNExecutionProvider进行推理。
2681 10
|
缓存 PyTorch 算法框架/工具
离线推理精度问题分析
传统模型迁移到昇腾设备上出现了精度问题,介绍精度问题的定位方法和解决方案,重点介绍了精度问题的定位定界方法。
离线推理精度问题分析
|
存储 算法
飞桨x昇腾生态适配方案:09_Paddle转ONNX
本节主要介绍如何将 PP-OCRv4 模型转化为 ONNX 模型,包括环境准备、模型下载、训练模型转 inference 模型及最终转为 ONNX 格式的过程。首先需安装 Paddle2ONNX 和 ONNXRuntime,接着下载并解压训练模型。通过 `export_model.py` 脚本将训练模型转化为 inference 模型,生成包含结构和参数的文件。最后使用 Paddle2ONNX 工具完成到 ONNX 格式的转换,并可选地使用 onnxslim 进行模型优化。各步骤均提供详细命令与参数说明,便于实际操作与部署。
1472 9

热门文章

最新文章