您的位置  > 互联网

端侧深度学习模型部署流程(Onnx)的相关部署介绍

深度学习模型部署简介

模型部署是指让训练好的深度学习模型在特定环境中运行的过程。 模型部署面临的困难:

由于这些困难,模型部署无法通过简单的环境配置和安装来完成。 目前有一个流行的模型部署管道:

为了使模型最终部署在一定的环境中,可以使用任何深度学习框架来定义网络结构并通过训练确定网络中的参数。 之后,模型的结构和参数将转换为仅描述网络结构的中间表示,并在中间表示上进行一些针对网络结构的优化。 最后,使用高性能的面向硬件的编程框架(例如CUDA)编写的能够高效执行深度学习网络中算子的推理引擎,将中间表示转换为特定的文件格式,并在相应的硬件上高效地运行模型平台。

那么,如果我们想在手机上运行我们的深度学习模型,我们需要做什么呢? 接下来我给大家介绍一下客户端深度学习的部署流程。 了解了基本概念后,你就可以尝试运行官方的demo实例,并根据自己的需求进行改进,这样就可以在手机上部署深度学习模型了~

设备端深度学习模型部署流程

主要技术路线是:用训练框架训练模型->将模型转换为ONNX格式->将ONNX格式转换为其他格式(NCNN、TNN、MNN的模型格式)->部署在相应的推理框架中。

客户端深度学习的应用可以分为以下几个阶段:

奥恩克斯

ONNX(Open)于2017年与微软联合发布,作为计算图标准描述的格式。 目前,在多家机构的联合维护下,ONNX已接入多种深度学习框架和多种推理引擎。 因此,ONNX被用作深度学习框架到推理引擎的桥梁,就像编译器的中间语言一样。 由于各个框架的兼容性不同,ONNX通常用来表示更容易部署的静态镜像。

其中,torch.onnx。 是将模型转换为 ONNX 格式的内置函数。 前三个参数是要转换的模型、模型的任意输入集以及导出的 ONNX 文件的文件名。

从模型到ONNX模型,提供了一种称为trace的模型转换方法:给定一组输入,然后实际执行模型,即记录这组输入对应的计算图并以ONNX格式保存。 。 该函数使用跟踪导出方法,该方法需要任何输入集才能运行模型。 测试图像是三通道大小,这里还构造了相同形状的随机张量。

ONNX算子集的版本。 ,分别是输入和输出的名称。代码运行成功,目录中会添加一个ONNX模型文件srcnn.onnx。

神经网络

ncnn是一个针对手机优化的高性能神经网络前向计算框架。 ncnn从设计之初就深入考虑了手机的部署和使用。 无第三方依赖,跨平台,手机CPU速度比目前已知的所有开源框架都快。 基于ncnn,开发者可以轻松地将深度学习算法移植到手机上高效执行,开发人工智能APP,让AI触手可及。 ncnn目前在很多腾讯应用中都有使用,比如:QQ、Qzone、微信、天天Ptu等。

部署实践 A. 将模型文件转换为 ONNX 文件

保存模型有两种方法:第一种方法只保存模型参数。 第二种方法保存完整的模型。

只保存模型参数:

print(model.().keys()) # 输出模型参数名称

# 将模型参数保存到路径“./data/.pkl”

torch.save(model.(), "./data/.pkl")

= Model() # 调用模型模型

.(torch.load("./data/.pkl")) # 加载模型参数

.(输入) # 使用

直接保存完整模型:

torch.save(model, './data/model.pkl') # 保存整个模型

= torch.load('./data/model.pkl') # 加载模型

目前大多数应用程序只是保存模型参数,使用时创建模型结构,然后加载模型。 一般我们下载的预训练模型都是只保存模型参数的文件。 此类模型文件不能直接用于推理。 模型结构需要重新创建和加载,然后保存和转换。 以下是将模型转换为 ONNX 的代码:您需要创建模型结构并加载模型,然后才能保存。

使用静态输入保存和转换模型:

# onnx 模型导入

奥恩克斯

火炬

torch.nn 为 nn

。 作为

类网络(nn.):

def(自身,):

………………

def(自身,x):

………………

X

模型=网络()

model.(torch.load('xxx.model', ='cpu'))

模型.eval()

=['输入']

=['']

# 指定输入大小

x = torch.randn(1, 3, 240, 320, =True)

torch.onnx.(model, x, 'best.onnx', =, =, ='True')

模型通过动态输入进行保存和转换:

# onnx 模型导入

奥恩克斯

火炬

torch.nn 为 nn

。作为

类网络(nn.):

def(自身,):

………………

def(自身,x):

………………

X

模型=网络()

model.(torch.load('xxx.model', ='cpu'))

模型.eval()

=['输入']

=['']

# 指定输入大小

x = torch.randn(1, 3, 240, 320, =True)

# 动态输入设置

= {'输入':{0:'',1:'',2:“”,3:'宽度'},

'': {0: '', 1: '', 2: "", 3: '宽度'}}

torch.onnx.(模型, x, '.onnx', =, =, ='True', =)

验证模型转换是否成功:

# 验证onnx模型

奥恩克斯

= onnx.load("best.onnx") # 加载onnx模型

onnx..() # 验证onnx模型是否导出成功

# 如果没有报错则导出成功。

# #测试onnx模型

numpy 作为 np

# 创建会话

# = .("best.onnx", =['r', ''])

= .("best.onnx", =[''])

x = np..randn(1, 3, 240, 320)

= {.()[0].name: x.(np.)}

= .run(无, )

# 如果没有报错则执行成功。

b.ONNX格式模型->设备端推理框架模型(NCNN格式)

(1)直接使用模型转换工具,输入ONNX文件,生成NCNN文件(.param & .bin)

#输入=onnx&=onnx

(2)使用代码进行转换

在将onnx转换为ncnn模型之前,需要对onnx模型进行简化,以避免不编译。

首先安装onnx-

点 onnx-

然后简化onnx模型

-m.onnx -sim.onnx

要将 onnx 转换为 ncnn,需要使用 ncnn/build/tools/。 您需要先安装ncnn。 ncnn方法已安装。您可以按照此链接进行安装。 我已经验证过了。 如果之前安装过,直接安装ncnn即可。 安装后,找到该文件的路径并输入以下命令。

./-sim.onnx.param.bin

生成的.bin和.param文件就是需要使用的NCNN模型文件。

C。 在项目中使用模型文件

强烈建议大家先跑一遍ncnn官方提供的几个端上部署示例,然后根据自己的需求进行改进。 以下是ncnn的使用示例:

搭建ncnn环境

下载NCNN压缩包,然后将压缩包内容解压到app/src/main/jni,然后修改app/src/main/jni/.txt中的路径。

我的.txt配置如下:

()

编辑(3.4.1)

设置(${}/ncnn---/${}/lib/cmake/ncnn)

(NCNN)

(一.cpp)

s(NCNN)

配置好ncnn后,就可以在端运行并推断深度学习模型文件了。 例如,配置完上述要求后,就可以运行ncnn官方给出的例子了。 下图是在上运行图像分类的示例:

下图是我自己根据官方示例改进部署镜像超分的例子:

左图为超分前的图像,右图为超分后的图像。