飞桨x昇腾生态适配方案:15_loop算子缺失(下):for循环替换loop

简介: 本章节基于上一内容,将ONNX模型拆分为loop算子部分与非loop算子部分,分别转换为OM模型。通过使用for循环替换loop算子的计算逻辑,构造子图执行流程,并编写OM模型推理脚本进行验证。同时,编写ONNX模型推理脚本对比两者推理结果,确保一致性。实验结果表明,拆分后的OM模型与原始ONNX模型推理结果一致,证明方案可行。

接上一章节内容,将ONNX模型拆分成loop算子部分和非loop算子部分后,分别转换成OM模型,并用for循环替换loop算子计算逻辑,比较OM模型和ONNX模型的推理结果是否一致,验证结果如果一致则证明该方案有效。

onnx模型转om

loop算子前面的图-A

atc --model=./mode_loop_input2_i_cond.onnx  --framework=5 \
    --output=./mode_loop_input2_i_cond --soc_version=Ascend910B2 \
    --input_shape="input1:1~8,16~32,16~32;input2:1~8,16~32,16~32" \
    --input_format=ND --log=error

01.png

loop算子子图-B

atc --model=./mode_loop_input2_i_cond.onnx  --framework=5 \
    --output=./mode_loop_input2_i_cond --soc_version=Ascend910B2 \
    --input_shape="x.13:1~8,16~32,16~32;input2:1~8,16~32,16~32" \
    --input_format=ND --log=error

02.png

构造子图执行逻辑

for循环实现loop计算逻辑

output1=before_loop.infer(input)
for 循环:
    output2=子图执行(output1(首次)/output2(后续))
output3=after_loop.infer(outout2)

编写om模型推理脚本

根据以上逻辑编写本例for循环:

# 文件名:loop.py
import numpy as np
from ais_bench.infer.interface import InferSession

# Load the model
model_path0 = './model_dest_linux_x86_64.om'
model_path1 = './mode_loop_input2_i_cond_linux_x86_64.om'

# input
device_id = 0
session0 = InferSession(device_id, model_path0)
session1 = InferSession(device_id, model_path1)
# 假设 batch 大小为 4
batch = 4

# 生成 input1 和 input2
# input1 = np.random.randn(batch, 16, 32).astype(np.float32)
# input2 = np.random.randn(batch, 16, 32).astype(np.float32)

# print("input1 的形状:", input1.shape)
# print("input2 的形状:", input2.shape)

# 生成全 1 的 input1
input1 = np.ones((batch, 16, 32), dtype=np.float32)

# 生成全 2 的 input2
input2 = np.full((batch, 16, 32), 2, dtype=np.float32)

print("input1 的形状:", input1.shape)
print("input2 的形状:", input2.shape)
print("input1 的前几个元素:", input1[0, 0, :5])
print("input2 的前几个元素:", input2[0, 0, :5])

input = [input1, input2]
#
output0 = session0.infer(input, mode='dymshape')
input3 = output0[0]
cnts = output0[1]
# print("input3", input3)
# print("cnts", cnts)

for i in range(cnts):
    inputs = [input3, input2]
    outputs = session1.infer(inputs,mode='dymshape')
    input3 = outputs[0]
    # print(input3)
print("outputs", outputs)

执行python3 loop.py:
03.png

验证拆分om与原图onnx结果

编写onnx模型推理脚本

# 文件名:tensor_generation.py
import numpy as np
import onnxruntime as ort

# 假设 batch 大小为 4
batch = 4

# 生成随机的 input1 和 input2
input1 = np.random.randn(batch, 16, 32).astype(np.float32)
input2 = np.random.randn(batch, 16, 32).astype(np.float32)

# 加载 ONNX 模型
model_path = './model.onnx'  # 替换为你的 ONNX 模型文件路径
session = ort.InferenceSession(model_path)

# 获取输入名称
input_names = [input.name for input in session.get_inputs()]

# 准备输入字典
if len(input_names) == 2:
    inputs = {input_names[0]: input1, input_names[1]: input2}
elif len(input_names) == 1:
    # 如果模型只有一个输入,这里假设使用 input1
    inputs = {input_names[0]: input1}
else:
    raise ValueError(f"模型输入数量为 {len(input_names)},不支持,请检查模型。")

# 进行推理
outputs = session.run(None, inputs)

# 输出结果
print("推理结果:", outputs)
for i, output in enumerate(outputs):
    print(f"输出 {i} 的形状: {output.shape}")

执行tensor_generation.py
04.png

可看到推理结果一致。

目录
相关文章
|
5月前
|
JSON 数据格式 AI芯片
飞桨x昇腾生态适配方案:14_loop算子缺失(上):ONNX模型拆分
本文针对NPU不支持LOOP算子的问题,提出一种解决方案:将ONNX模型拆分为含LOOP算子和不含LOOP算子的子图,单独推理LOOP部分。通过构造包含LOOP算子的ONNX模型,将其转换为JSON格式提取子图,并对子图进行修改(如添加输入节点、删除无关节点)。最后,将JSON转回ONNX格式,完成模型切分与优化。此方法适用于关键路径上的LOOP算子,可有效解决离线推理中的兼容性问题。
292 26
|
机器学习/深度学习 监控 算法
yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
|
2月前
|
机器学习/深度学习 编解码 人工智能
面壁开源多模态新旗舰MiniCPM-V 4.5,8B 性能超越 72B,高刷视频理解又准又快
今天,面壁智能正式开源 8B 参数的面壁小钢炮 MiniCPM-V 4.5 多模态旗舰模型,成为行业首个具备“高刷”视频理解能力的多模态模型,看得准、看得快,看得长!高刷视频理解、长视频理解、OCR、文档解析能力同级 SOTA,且性能超过 Qwen2.5-VL 72B,堪称最强端侧多模态模型。
280 9
|
4月前
|
IDE Java 数据库连接
解决Java环境中无法识别org.mybatis.spring.annotation.MapperScan的问题。
祝你好运,在这场MyBatis的魔法冒险中获得胜利!记住,魔法书(官方文档)永远是你最好的朋友。
289 18
|
10月前
|
人工智能 自然语言处理 API
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
Mathtutor on Groq 是一款基于 Groq 架构的 AI 数学辅导工具,支持语音输入数学问题,实时计算并渲染解题过程,适用于代数、微积分等领域的学习和教学辅助。
725 5
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
|
5月前
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
301 26
|
5月前
|
数据采集 Web App开发 数据挖掘
飞桨x昇腾生态适配方案:07_性能数据分析
本文介绍了性能调优的全流程,包括分析、定位与优化。通过 profiling 工具采集算子级性能数据,定位计算与调度通信瓶颈。针对计算时间过长问题,可通过升级算子或提交工单解决;调度优化则关注重复编译,关闭在线编译或使用 aclnn 算子可提升效率。数据采集使用 paddlepaddle 的 profiler 工具,结合 msprof 解析生成的性能数据,重点分析 op_statistic_*.csv 和 op_summary_*.csv 文件,通过关键字段(如 Ratio、Total Time、Task Duration 和 Task Wait Time)量化性能瓶颈并实施优化策略。
165 10
|
5月前
|
文字识别 算法 API
飞桨x昇腾生态适配方案:04_模型精度对齐
本文详细介绍了模型在不同硬件(如GPU与NPU)间迁移时的精度对齐方法,包括前向和反向对齐的具体步骤。前向对齐通过模块化对比计算结果(如平均值、最大最小值等),确保误差在合理范围内;反向对齐则聚焦于梯度差异,利用二分法定位问题算子。同时,文章结合PPHGNet_small和MultiHead等具体模块代码,说明了如何打印输出并分析中间结果。此外,还探讨了私有格式、梯度异常及特殊shape等可能影响精度的因素,并提出相应解决策略。整体流程清晰,为跨硬件模型迁移提供了实用指导。
144 10
|
5月前
|
编解码 人工智能 JSON
飞桨x昇腾生态适配方案:10_ONNX转OM
本章节主要介绍如何将ONNX模型转化为昇腾AI处理器支持的OM模型,并进行离线推理。通过昇腾张量编译器(ATC),可实现静态OM、动态BatchSize、动态分辨率、动态维度及动态shape等多种模型转换。文中详细说明了ATC工具的使用方法、参数配置、命令格式以及常见问题解决方法,同时提供了具体示例和可视化工具辅助输入参数确认,帮助用户高效完成模型转换与部署。
597 0
|
5月前
|
编解码 人工智能 API
飞桨x昇腾生态适配方案:12_动态OM推理
本文介绍了基于Ascend AI平台的OM模型动态推理方法,包括动态BatchSize、动态分辨率、动态维度及动态Shape四种场景,支持固定模式与自动设置模式。通过`ais_bench`工具实现推理,提供示例命令及输出结果说明,并解决常见问题(如环境变量未设置、输入与模型不匹配等)。此外,还提供了API推理指南及参考链接,帮助用户深入了解ONNX离线推理流程、性能优化案例及工具使用方法。
241 0