Bootstrap

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子,ONNX内部没有,那么需要自己去实现。

1.1 配置环境

安装ONNX

pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple

安装推理引擎ONNX Runtime

 pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

以及其他包,pytorch,matplotlib,numpy,pandas,pillow,opencv-python,tqdm 等

1.2 将模型导出为ONNX格式

# Author:SiZhen
# Create: 2024/7/15
# Description: 
import onnx
import onnxruntime as ort
import torch
from model import resnet34 #导入模型
#print(onnx.__version__)
#print(ort.__version__)

device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')

model = resnet34().to(device)
model = model.eval().to(device)

x = torch.randn(16,3,224,224).to(device)
output = model(x)
print(output.shape)
with torch.no_grad():
    torch.onnx.export(
        model, #要转换的模型
        x, #模型的任意一组输入
        'resNet34.onnx', #导出的ONNX文件名
        opset_version=11, #ONNX算子集版本
        input_names=['input'], #输入Tensor的名称 (自己起名字)
        output_names=['output'] #输出Tensor的名称 (自己起名字)
    )

或者用我们自己的模型:

# Author:SiZhen
# Create: 2024/7/15
# Description:
import onnx
import onnxruntime as ort
import torch
from model import resnet34 #导入模型
#print(onnx.__version__)
#print(ort.__version__)

device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')

#model = resnet34().to(device)
model = torch.load('./resNet34.pth')
model = model.eval().to(device)

x = torch.randn(16,3,224,224).to(device)
output = model(x)
print(output.shape)

#生成ONNX格式模型权重文件
with torch.no_grad():
    torch.onnx.export(
        model, #要转换的模型
        x, #模型的任意一组输入
        'resNet34.onnx', #导出的ONNX文件名
        opset_version=11, #ONNX算子集版本
        input_names=['input'], #输入Tensor的名称 (自己起名字)
        output_names=['output'] #输出Tensor的名称 (自己起名字)
    )


#验证模型导出成功
import onnx

#读取 ONNX模型
onnx_model = onnx.load('resNet34.onnx')

#检查模型格式是否正确
onnx.checker.check_model(onnx_model)
print('无错误')

#以可读的形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))

 运行结果出现一个ONNX格式的权重文件:

1.3 验证ONNX模型导出成功

#验证模型导出成功
import onnx

#读取 ONNX模型
onnx_model = onnx.load('resNet34.onnx')

#检查模型格式是否正确
onnx.checker.check_model(onnx_model)
print('无错误')

以可读的形式打印计算图:

#以可读的形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))

用netron可视化onnx模型:

1.4 torch.onnx.export()的原理:

三篇详细讲解的博客:

链接1:https://zhuanlan.zhihu.com/p/477743341

链接2:https://zhuanlan.zhihu.com/p/479290520

链接3:https://zhuanlan.zhihu.com/p/498425043

NPU是什么

NPU,全称为Neural Processing Unit,即神经网络处理单元,是一种专门为加速人工智能(AI)任务,特别是深度学习和机器学习算法而设计的专用计算芯片。随着AI技术的迅速发展,传统的中央处理器(CPU)和图形处理器(GPU)在处理复杂的神经网络模型时逐渐显得力不从心,特别是在移动设备和边缘计算场景中,对低功耗和高效能的需求日益增长,NPU因此应运而生。

NPU的特点与优势:

  1. 高度优化的架构:NPU的硬件架构针对神经网络中的大规模并行计算进行了特别优化,拥有大量简单但高效的计算核心,可以同时处理大量数据和执行复杂的矩阵运算,这对于诸如卷积神经网络(CNN)、循环神经网络(RNN)等深度学习模型尤为重要。

  2. 低功耗:相比CPU和GPU,NPU在处理相同AI任务时通常具有更低的能耗。这是因为其设计目标之一就是在保持高性能的同时减少能量消耗,这对于电池驱动的设备如智能手机、可穿戴设备尤为重要。

  3. 高速处理能力:NPU能够显著加快深度学习算法的运行速度,提升实时性,这对于需要即时反馈的应用场景,如语音识别、图像识别、自然语言处理等,至关重要。

  4. 集成与定制化:NPU往往被集成到系统级芯片(SoC)中,与CPU、GPU等其他组件紧密协作,为特定的AI应用场景提供定制化的解决方案。这种集成设计可以减少数据在不同组件间传输的时间,进一步提高效率。

  5. 机器学习推理与训练:NPU不仅适用于推理任务(即使用训练好的模型进行预测),在一些高端的NPU设计中,也支持或专门用于模型训练,尽管通常规模较小的训练任务或模型微调更为常见。

应用场景:

  • 智能手机:提升拍照质量,实现即时的图像识别、场景识别、人脸解锁等功能。
  • 自动驾驶:处理传感器数据,实现环境感知、物体识别和决策制定。
  • 物联网设备:在智能家居、智能安防等场景中,进行本地数据分析,减少云端依赖,保护隐私。
  • 医疗健康:辅助诊断,实时分析医疗影像资料。
  • 边缘计算:在靠近数据源的位置处理数据,减少延迟,提高数据处理效率。

结论:

NPU代表了AI时代硬件发展的新方向,它的出现使得终端设备能够更高效、低耗地执行复杂的AI任务,推动了AI技术在日常生活中的广泛应用,同时也预示着未来计算设备将更加智能化和个性化。随着技术的不断进步,NPU的功能和应用范围预计将持续扩大,成为连接物理世界和智能世界的桥梁。

ONNX格式是什么

ONNX(Open Neural Network Exchange)是一种开放的神经网络交换格式,旨在促进不同深度学习框架之间的模型互操作性。它是由微软、亚马逊、Facebook、IBM等科技巨头共同发起和支持的项目,目的是简化和标准化机器学习模型的转移流程,使其能够在不同的平台和工具之间无缝迁移。

ONNX的核心特点和优势:

  1. 兼容性广泛:ONNX提供了一个统一的标准,使得模型可以从一个框架训练后,轻松转换到另一个框架进行推理,支持的框架包括但不限于PyTorch、TensorFlow、MXNet、Caffe2、Scikit-learn等。

  2. 中间表示格式:ONNX定义了一种中间层表示,这是一种平台无关的模型描述方式。这意味着模型可以在不损失精度的情况下,从原始训练框架转换为ONNX格式,进而部署到支持ONNX的推理引擎中。

  3. 模型组成

    • Graph:ONNX模型的核心是一个计算图(Graph),它描述了模型的计算流程,包括输入、输出以及中间的计算节点。
    • Node:计算图中的每个节点(Node)代表一个特定的操作,如卷积、ReLU激活函数、矩阵乘法等。
    • Tensor:模型中的数据通过张量(Tensor)的形式表示,这些张量是多维数组,用作节点的输入和输出。
  4. 算子丰富性与模拟:为了增强兼容性,ONNX不断扩展其算子库,以支持更多的模型类型和复杂操作。对于一些不直接支持的复杂算子,ONNX会尝试通过一系列基本算子的组合来模拟这些操作,确保模型转换的成功率。

  5. 性能优化:虽然ONNX本身不直接提供推理引擎,但它被设计为可以与多种高性能推理引擎集成,如TensorRT、OpenVINO等,这些引擎可以针对特定硬件(如GPU、NPU)进行优化,从而提升模型推理的速度和效率。

  6. 社区支持与工具:ONNX拥有活跃的开发者社区,提供了丰富的工具链,包括模型转换工具(如PyTorch的torch.onnx.export)、验证工具、可视化工具等,便于模型的转换、检查和调试。

应用场景:

  • 模型迁移:研究者和开发者可以在不同框架间快速切换,比较不同框架下的模型性能。
  • 部署灵活性:模型可以部署到云服务、边缘设备或移动设备上,适应不同的硬件环境。
  • 模型服务化:企业和服务提供商可以利用ONNX格式将模型整合进其产品中,便于维护和更新。

综上所述,ONNX通过提供一个统一的模型表述方式,降低了模型在不同框架和平台间迁移的障碍,促进了AI技术的普及和应用。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;