Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >将Pytorch模型移植到C++详细教程(附代码演练)

将Pytorch模型移植到C++详细教程(附代码演练)

作者头像
磐创AI
发布于 2023-08-29 00:19:50
发布于 2023-08-29 00:19:50
2.3K03
代码可运行
举报
运行总次数:3
代码可运行

说明

在本文中,我们将看到如何将Pytorch模型移植到C++中。Pytorch通常用于研究和制作新模型以及系统的原型。该框架很灵活,因此易于使用。主要的问题是我们如何将Pytorch模型移植到更适合的格式C++中,以便在生产中使用。

我们将研究不同的管道,如何将PyTrac模型移植到C++中,并使用更合适的格式应用到生产中。

1) TorchScript脚本

2) 开放式神经网络交换

3) TFLite(Tensorflow Lite)

TorchScript脚本

TorchScript是PyTorch模型(nn.Module的子类)的中间表示,可以在高性能环境(例如C ++)中运行。它有助于创建可序列化和可优化的模型。在Python中训练这些模型之后,它们可以在Python或C++中独立运行。因此,可以使用Python轻松地在PyTorch中训练模型,然后通过torchscript将模型导出到无法使用Python的生产环境中。它基本上提供了一个工具来捕获模型的定义。

跟踪模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DummyCell(torch.nn.Module):    def __init__(self):        super(DummyCell, self).__init__()        self.linear = torch.nn.Linear(4, 4)    def forward(self, x):        out = self.linear(x)        return out
dummy_cell = DummyCell()x =  torch.rand(2, 4)traced_cell = torch.jit.trace(dummy_cell, (x))
# Print Traced Graphprint(traced_cell.graph)
# Print Traced Codeprint(traced_cell.code)

在这里,torchscript调用了模块,将执行的操作记录到称为图的中间表示中。traced_cell.graph提供了一个非常低级的表示,并且图形中的大部分信息最终对用户没有用处。traced_cell.code 提供了更多的python语法解释代码。

上述代码的输出(traced_cell.graph和traced_cell.code) :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
graph(%self.1 : __torch__.DummyCell,      %input : Float(2, 4, strides=[4, 1], requires_grad=0, device=cpu)):  %16 : __torch__.torch.nn.modules.linear.Linear = prim::GetAttr[name="linear"](%self.1)  %18 : Tensor = prim::CallMethod[name="forward"](%16, %input)  return (%18)def forward(self,    input: Tensor) -> Tensor:  return (self.linear).forward(input, )
TorchScript的优点

1) TorchScript代码可以在自己的解释器中调用。所保存的图形也可以在C++中加载用于生产。

2) TorchScript为我们提供了一种表示,在这种表示中,我们可以对代码进行编译器优化,以提供更高效的执行。

ONNX(开放式神经网络交换)

ONNX是一种开放格式,用于表示机器学习模型。ONNX定义了一组通用的操作符、机器学习和深度学习模型的构建块以及一种通用的文件格式,使AI开发人员能够将模型与各种框架、工具、运行时和编译器一起使用。它定义了一个可扩展的计算图模型,以及内置操作符和标准数据类型的定义。

可以使用以下代码将上述DummyCell模型导出到onnx:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
torch.onnx.export(dummy_cell, x, "dummy_model.onnx", export_params=True, verbose=True)

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
graph(%input : Float(2, 4, strides=[4, 1], requires_grad=0, device=cpu),      %linear.weight : Float(4, 4, strides=[4, 1], requires_grad=1, device=cpu),      %linear.bias : Float(4, strides=[1], requires_grad=1, device=cpu)):  %3 : Float(2, 4, strides=[4, 1], requires_grad=1, device=cpu) = onnx::Gemm[alpha=1., beta=1., transB=1](%input, %linear.weight, %linear.bias)  return (%3)

它将模型保存到文件名“dummy_model.onnx“中,可以使用python模块onnx加载该模型。为了在python中进行推理,可以使用ONNX运行时。ONNX运行时是一个针对ONNX模型的以性能为中心的引擎,它可以跨多个平台和硬件高效地进行推断。查看此处了解有关性能的更多详细信息。

https://cloudblogs.microsoft.com/opensource/2019/05/22/onnx-runtime-machine-learning-inferencing-0-4-release/

C++中的推理

为了从C++中执行ONNX模型,首先,我们必须使用tract库在Rust中编写推理代码。现在,我们有了用于推断ONNX模型的rust库。我们现在可以使用cbindgen将rust库导出为公共C头文件。

tract:https://github.com/sonos/tract

cbindgen:https://github.com/eqrion/cbindgen

现在,此头文件以及从Rust生成的共享库或静态库可以包含在C ++中以推断ONNX模型。在从rust生成共享库的同时,我们还可以根据不同的硬件提供许多优化标志。Rust也可以轻松实现针对不同硬件类型的交叉编译。

Tensorflow Lite

Tensorflow Lite是一个用于设备上推理的开源深度学习框架。它是一套帮助开发人员在移动、嵌入式和物联网设备上运行Tensorflow模型的工具。它使在设备上的机器学习推理具有低延迟和小二进制大小。它有两个主要组成部分:

1) Tensorflow Lite解释器:它在许多不同的硬件类型上运行特别优化的模型,包括移动电话、嵌入式Linux设备和微控制器

2) Tensorflow Lite转换器:它将Tensorflow模型转换为一种有效的形式,供解释器使用。

将PyTorch模型转换为TensorFlow lite的主管道如下:

1) 构建PyTorch模型

2) 以ONNX格式导模型

3) 将ONNX模型转换为Tensorflow(使用ONNX tf)

在这里,我们可以使用以下命令将ONNX模型转换为TensorFlow protobuf模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!onnx-tf convert -i "dummy_model.onnx" -o  'dummy_model_tensorflow'

4) 将Tensorflow模型转换为Tensorflow Lite(tflite)

TFLITE模型(Tensorflow Lite模型)现在可以在C++中使用。这里请参考如何在C++中对TFLITE模型进行推理。

https://www.tensorflow.org/lite/guide/inference#load_and_run_a_model_in_c

尾注

我希望你觉得这篇文章有用。我们试图简单地解释一下,我们可以用不同的方式将PyTorch训练过的模型部署到生产中。

参考文献

1)TorchScript简介:https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html

2)在C++ 中加载TorchScript模型:https://pytorch.org/tutorials/advanced/cpp_export.html

3)将Pytorch模型导出到ONNX:https://pytorch.org/tutorials/advanced/super_resolution_with_onnxruntime.html

4)Rust中的Tract神经网络推理工具包:https://github.com/sonos/tract

5)在C++中的TfLite模型上运行推理:https://www.tensorflow.org/lite/guide/inference#load_and_run_a_model_in_c

6)Colab - 在Android设备上进行Pytorch训练的模型:https://colab.research.google.com/drive/1MwFVErmqU9Z6cTDWLoTvLgrAEBRZUEsA

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch 2.2 中文官方教程(三)
介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 || 模型理解
ApacheCN_飞龙
2024/02/05
4370
PyTorch 2.2 中文官方教程(三)
编写高效的PyTorch代码技巧(上)
原文:https://github.com/vahidk/EffectivePyTorch
kbsc13
2020/05/08
8100
.NET 平台上的开源模型训练与推理进展
电子书仓库:https://github.com/whuanle/cs_pytorch
痴者工良
2025/04/11
840
.NET 平台上的开源模型训练与推理进展
轻松学Pytorch之torchscript使用!
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 TorchScript介绍 TorchScript是PyTorch模型推理部署的中间表示,可以在高性能环境libtorch(C ++)中直接加载,实现模型推理,而无需Pytorch训练框架依赖。torch.jit是torchscript Python语言包支持,支持pytorch模型快速,高效,无缝对接到libtorch运行时,实现高效推理。它是Pytorch中除了训练部分之外,开发者最需要掌握的Pytorch框架开发
OpenCV学堂
2022/05/12
2.9K0
轻松学Pytorch之torchscript使用!
在C++平台上部署PyTorch模型流程+踩坑实录
本文主要讲解如何将pytorch的模型部署到c++平台上的模型流程,按顺序分为四大块详细说明了模型转换、保存序列化模型、C ++中加载序列化的PyTorch模型以及执行Script Module。
小白学视觉
2022/02/10
1.8K0
TorchScript 系列解读(一):初识 TorchScript
小伙伴们好呀,不久前我们推出了模型部署入门系列教程,受到了大家的一致好评,也收到了很多小伙伴的催更,后续教程正在准备中,将在不久后跟大家见面,敬请期待哦~
OpenMMLab 官方账号
2022/04/09
8950
TorchScript 系列解读(一):初识 TorchScript
PyTorch学习 Datawhale
Pytorchtask·1——PyTorch的基本概念1. 什么是PyTorch,为什么选择PyTorch2. 配置Python环境3. 准备Python管理器4. Pytroch的安装5.PyTorch基础概念6. 通用代码实现流程(实现一个深度学习的代码流程)
用户7886150
2020/12/29
4230
PyTorch 1.4最新版放出:支持Python2的最后一版,支持分布式模型并行、Java程序、移动端等多项新功能
紧接着 TensorFlow 更新到 2.1 版之后,PyTorch 在今天也更新到了 1.4 版本。
机器之心
2020/02/14
6120
实践torch.fx第一篇——基于Pytorch的模型优化量化神器
今天聊一下比较重要的torch.fx,也趁着这次机会把之前的torch.fx笔记整理下,笔记大概拆成三份,分别对应三篇:
老潘
2023/10/19
1K0
实践torch.fx第一篇——基于Pytorch的模型优化量化神器
PyTorch2.0发布
动态图改进:PyTorch 2.0仍然支持动态图(eager mode),并在此基础上进行了改进。除了提高性能外,还加入了对Dynamic Shapes的支持,可以动态变更输入数据的形状,以及对Distributed的扩展支持。
疯狂的KK
2023/03/21
1.1K0
TorchScript | 目标检测部署实战
TorchScript 软件栈可以将 Python 代码转换成 C++ 代码。TorchScript 软件栈包括两部分:TorchScript(Python)和 LibTorch(C++)。TorchScript 负责将 Python 代码转成一个模型文件,LibTorch 负责解析运行这个模型文件
iResearch666
2023/11/22
4890
TorchScript | 目标检测部署实战
浅谈机器学习模型推理性能优化
在机器学习领域,清晰明了的数据预处理和表现优异的模型往往是数据科学家关注的重点,而实际生产中如何让模型落地、工程化也同样值得关注,工程化机器学习模型避不开的一个难点就是模型的推理(Inference / Serving)性能优化。
ThoughtWorks
2021/01/08
1.3K0
TorchScript 解读:jit 中的 subgraph rewriter
小伙伴们好呀,TorchScript 解读系列教程又来啦~在解读(一)中,我们带领大家初步了解了 TorchScript;在解读(二)中,我们介绍 TorchScript 通过 trace 来记录数据流的生成方式,同时分享使用该机制实现的 ONNX 导出过程。接下来,就让我们进入今天的正题吧~
OpenMMLab 官方账号
2022/05/25
5770
TorchScript 解读:jit 中的 subgraph rewriter
Pytorch的基本介绍及模型训练流程
PyTorch是一个很著名的支持GPU加速和自动求导的深度学习框架,在最近几年收到学术界的热捧,主要是因为其动态图机制符合思维逻辑,方便调试,适合于需要将想法迅速实现的研究者。PyTorch是Torch7团队开发的。Torch是一个开源科学计算框架,可以追溯到2002年纽约大学的项目。Torch的核心在于在构建深度神经网络及其优化和训练,为图像,语音,视频处理以及大规模机器学习问题提供快速高效的计算方案。为了追求更高的速度,灵活性和可扩展性,Torch采用Lua作为它的开发语言,但lua语言的受众比较局限。为了满足当今业界里Python先行(Python First)的原则,PyTorch应运而生,由Facebook人工智能研究员(FAIR)于2017年在GitHub上开源。顾名思义,PyTorch使用python作为开发语言,近年来和tensorflow, keras, caffe等热门框架一起,成为深度学习开发的主流平台之一。
Here_SDUT
2022/09/19
1.8K0
Pytorch的基本介绍及模型训练流程
PyTorch 2.2 中文官方教程(九)
在本教程中,我们将使用 Flask 部署 PyTorch 模型,并为模型推理暴露一个 REST API。特别是,我们将部署一个预训练的 DenseNet 121 模型来检测图像。
ApacheCN_飞龙
2024/02/05
9870
PyTorch 2.2 中文官方教程(九)
PyTorch 人工智能基础知识:6~8
生成对抗网络(GAN)是一种机器学习技术,其中同时训练两种模型:一种专门用于创建伪造数据,另一种专门用于区分真实数据和伪造数据。 真实数据。 术语生成反映了以下事实:这些神经网络用于创建新数据,而术语对抗来自以下事实:两个模型相互竞争,从而提高了生成的数据的质量。
ApacheCN_飞龙
2023/04/27
7520
PyTorch 2.2 中文官方教程(十一)
PyTorch C++ 前端是 PyTorch 机器学习框架的纯 C++ 接口。虽然 PyTorch 的主要接口自然是 Python,但这个 Python API 坐落在一个庞大的 C++ 代码库之上,提供了基础数据结构和功能,如张量和自动微分。C++ 前端暴露了一个纯 C++11 API,扩展了这个底层 C++ 代码库,提供了用于机器学习训练和推断所需的工具。这包括一个内置的常见神经网络建模组件集合;一个 API 用于扩展此集合以添加自定义模块;一个流行的优化算法库,如随机梯度下降;一个并行数据加载器,具有定义和加载数据集的 API;序列化例程等。
ApacheCN_飞龙
2024/02/05
9750
PyTorch 2.2 中文官方教程(十一)
【深度学习】基于web端和C++的两种深度学习模型部署方式
本文对深度学习两种模型部署方式进行总结和梳理。一种是基于web服务端的模型部署,一种是基于C++软件集成的方式进行部署。
黄博的机器学习圈子
2020/08/24
3.4K0
【深度学习】基于web端和C++的两种深度学习模型部署方式
学懂 ONNX,PyTorch 模型部署再也不怕!
知道你们在催更,这不,模型部署入门系列教程来啦~在前二期的教程中,我们带领大家成功部署了第一个模型,解决了一些在模型部署中可能会碰到的困难。今天开始,我们将由浅入深地介绍 ONNX 相关的知识。ONNX 是目前模型部署中最重要的中间表示之一。学懂了 ONNX 的技术细节,就能规避大量的模型部署问题。
OpenMMLab 官方账号
2022/05/25
13.8K0
学懂 ONNX,PyTorch 模型部署再也不怕!
Pytorch 1.2.0 来了!
此次升级有超过1900个commit,包括在JIT、ONNX、分布式、性能以及前端等方面的大量改进。
新智元
2019/08/15
2.3K0
Pytorch 1.2.0 来了!
相关推荐
PyTorch 2.2 中文官方教程(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验