飞桨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

可看到推理结果一致。

目录
相关文章
|
机器学习/深度学习 人工智能 数据可视化
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
3182 0
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
|
机器学习/深度学习 并行计算 异构计算
NVIDIA CUDA/cuDNN历代版本下载地址
NVIDIA CUDA/cuDNN历代版本下载地址
5905 0
NVIDIA CUDA/cuDNN历代版本下载地址
|
JSON 数据格式 AI芯片
飞桨x昇腾生态适配方案:14_loop算子缺失(上):ONNX模型拆分
本文针对NPU不支持LOOP算子的问题,提出一种解决方案:将ONNX模型拆分为含LOOP算子和不含LOOP算子的子图,单独推理LOOP部分。通过构造包含LOOP算子的ONNX模型,将其转换为JSON格式提取子图,并对子图进行修改(如添加输入节点、删除无关节点)。最后,将JSON转回ONNX格式,完成模型切分与优化。此方法适用于关键路径上的LOOP算子,可有效解决离线推理中的兼容性问题。
1062 26
|
监控 NoSQL 数据可视化
Django+Celery 进阶:Flower可视化监控与排错
本文介绍了Celery命令行工具与图形监控工具的使用,涵盖查看Worker状态、任务信息及集成至Django项目的方法,同时提供Redis监控与常见问题排错方案。
1200 1
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
1059 0
|
API Python
飞桨x昇腾生态适配方案:13_API离线推理
ais_bench 提供了基于昇腾硬件的 Python API,用于离线模型(.om模型)推理。支持静态与动态API场景,如单个或多个OM模型推理。通过 `InferSession` 类加载模型并执行推理,可灵活处理输入输出形状转换。示例代码涵盖图片读取、形状调整、多模型串联推理及资源释放等操作,满足多样化推理需求。
1160 26
|
存储 算法
飞桨x昇腾生态适配方案:09_Paddle转ONNX
本节主要介绍如何将 PP-OCRv4 模型转化为 ONNX 模型,包括环境准备、模型下载、训练模型转 inference 模型及最终转为 ONNX 格式的过程。首先需安装 Paddle2ONNX 和 ONNXRuntime,接着下载并解压训练模型。通过 `export_model.py` 脚本将训练模型转化为 inference 模型,生成包含结构和参数的文件。最后使用 Paddle2ONNX 工具完成到 ONNX 格式的转换,并可选地使用 onnxslim 进行模型优化。各步骤均提供详细命令与参数说明,便于实际操作与部署。
1560 9
|
机器学习/深度学习 PyTorch 算法框架/工具
飞桨x昇腾生态适配方案:00_整体方案介绍
本文详细介绍PaddlePaddle与NPU的适配工作,涵盖训练与推理支持、性能优化及离线推理方案。PaddleCustomDevice作为适配层,支持主流模型(详见飞桨-昇腾模型列表),多数性能媲美V100,部分调优模型接近0.8*A800。硬件适配主要针对A2芯片,A1兼容但310系列建议离线推理。提供常用模型仓链接及整体方案导览,包括环境准备、算子适配、性能调优和Paddle转ONNX/OM等内容。
1159 0
|
PyTorch 编译器 算法框架/工具
NPU上如何使能pytorch图模式
本文介绍了PyTorch的`torch.compile`技术和TorchAir的相关内容。`torch.compile`通过将动态图转换为静态图并结合JIT编译,提升模型推理和训练效率。示例代码展示了如何使用`torch.compile`优化模型。TorchAir是昇腾为PyTorch提供的图模式扩展库,支持在昇腾设备上进行高效训练和推理。它基于Dynamo特性,将计算图转换为Ascend IR,并通过图引擎优化执行。文章还提供了TorchAir的使用示例及功能配置方法。
|
存储 文字识别 文件存储
飞桨x昇腾生态适配方案:03_模型训练迁移
本案例以PaddleOCRv4模型为例,详细介绍了将模型迁移到NPU的完整流程。迁移过程中需确保模型功能在新硬件上无误,重点关注偶发性错误及长时间运行时可能出现的问题,并通过日志辅助定位问题。文档涵盖环境搭建、数据集准备、模型配置、训练启动及常见问题排查等内容。例如,通过设置环境变量排查缺失算子,处理Paddle版本兼容性问题,以及解决进程残留等。适合希望将OCR模型部署到NPU的开发者参考。
787 0