pytorch1.0 用torch script导出保存模型

python的易上手和pytorch的动态图特性,使得pytorch在学术研究中越来越受欢迎,但在生产环境,碍于python的GIL等特性,可能达不到高并发、低延迟的要求,存在需要用c++接口的情况。除了将模型导出为ONNX外,pytorch1.0给出了新的解决方案:pytorch 训练模型 - 通过torch script中间脚本保存模型 -- C++加载模型。最近工作需要尝试做了转换,总结一下步骤和遇到的坑。

用torch script把torch模型转成c++接口可读的模型有两种方式:trace && script. trace比script简单,但只适合结构固定的网络模型,即forward中没有控制流的情况,因为trace只会保存运行时实际走的路径。如果forward函数中有控制流,需要用script方式实现。

trace顾名思义,就是沿着数据运算的路径走一遍,官方例子:


import torch
def foo(x, y):
    return 2*x + y
traced_foo = torch.jit.trace(foo, (torch.rand(3), torch.rand(3)))

script稍复杂,主要改三处:

1. Model由之前继承 nn.Model 改为继承 torch.jit.ScriptModule

2. forward函数前加 @torch.jit.script_method

3. 其他需要调用的函数前加 @torch.jit.script

踩过的坑&&解决方法:

A. torch script默认函数或方法的参数都是Tensor类型的,如果不是需要说明,不然调用非Tensor参数时会报类型不符的编译错误。

python3可以直接:

def example_func(param_1: Tensor, param_2: int, param_3: List[int]):

python2需要用type注释:


def example_func(param_1, param_2, param_3):

#type: (Tensor, int, List[int]) -> Tensor

B. model的方法中orward加@torch.jit.script_method, __init__函数不用

C. 前面说过,torch scrip支持的函数是pytorch的子集,意味着有一部分函数不支持,例如: not boolean,pass, List的切片赋值,CPU和GPU切换的value.to( ), 需要想办法绕过去。看github上讨论区说新版好像已经支持not操作了,没有验证。

结论:pytorch 1.0目前的预览版还有比较多优化的空间,至少是在torch script支持的函数集合上,不建议使用,等稳定版发布再看看吧。

  

原创内容,转载请注明出处。

参考资料:

https://pytorch.org/docs/master/jit.html

https://pytorch.org/tutorials/beginner/deploy_seq2seq_hybrid_frontend_tutorial.html

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; line-height: 16.0px; font: 14.0px "Times New Roman"; color: #000000 }
span.s1 { }
span.s2 { font: 14.0px "Songti SC" }

原文地址:https://www.cnblogs.com/Arborday/p/9890999.html

时间: 2024-11-09 00:42:02

pytorch1.0 用torch script导出保存模型的相关文章

[Pytorch]Pytorch 保存模型与加载模型(转)

转自:知乎 目录: 保存模型与加载模型 冻结一部分参数,训练另一部分参数 采用不同的学习率进行训练 1.保存模型与加载 简单的保存与加载方法: # 保存整个网络 torch.save(net, PATH) # 保存网络中的参数, 速度快,占空间少 torch.save(net.state_dict(),PATH) #-------------------------------------------------- #针对上面一般的保存方法,加载的方法分别是: model_dict=torch.

使用Blender批量导出/转换模型

2.4版本的Blender API和2.5以上版本的API有很大的不同,这里只是提供了思路和2.4版本的导出方案. 先提供一个脚本,这个是由Blender调用的,用于转换Ogre的Mesh文件的脚本 import Blender import bpy import sys import os,glob sys.path.append(r"D:\Program Files\blender-2.49b-windows\.blender\scripts\torchlight"); sys.p

华为云EI ModelArts,从0到1开发训练AI模型,通过“极快”和“极简”实现普惠AI

华为云EI ModelArts,从0到1开发训练AI模型,通过"极快"和"极简"实现普惠AI现如今 AI 技术.概念火爆.落地应用更是繁多,但开发呢?是否困难?到底有多痛?据了解,大部分 AI 开发者的工作时间并不长,并且十有八九可能不是"科班出身".从编写的教材.录制的课程中就可以看出,所有的教学都不可避免地带有很强的的学术性,即便有意避免研究导向,仍然离产业界的需求相去甚远.并且随着新一波人工智能的热潮,人们发现手里的数据多了,电脑运算的更快

Tensorflow中保存模型时生成的各种文件区别和作用

假如我们得到了如下的checkpoints, 上面的文件主要可以分成三类:一种是在保存模型时生成的文件,一种是我们在使用tensorboard时生成的文件,还有一种就是plugins这个文件夹,这个是使用capture tpuprofile工具生成的,该工具可以跟踪TPU的计算过程,并对你的模型性能进行分析,这里就不想详细介绍了.本文主要介绍前面两种文件的作用: tensorboard文件 events.out.tfevents.*...: 保存的就是你的accuracy或者loss在不同时刻的

caffe使用ctrl-c不能保存模型

caffe使用Ctrl-c 不能保存模型: 是因为使用的是 tee输出日志 解决方法:kill -s SIGINT <proc_id> 或者使用 GLOG_log_dir=/path/to/log/dir $CAFFE_ROOT/bin/caffee.bin train -solver=/path/to/solver.prototxt 来输出日志

keras 保存模型

转自:https://blog.csdn.net/u010159842/article/details/54407745,感谢分享! 我们不推荐使用pickle或cPickle来保存Keras模型 你可以使用model.save(filepath)将Keras模型和权重保存在一个HDF5文件中,该文件将包含: 模型的结构,以便重构该模型 模型的权重 训练配置(损失函数,优化器等) 优化器的状态,以便于从上次训练中断的地方开始 使用keras.models.load_model(filepath)

利用PowerDesigner逆向工程导出PDM模型及生成文档

原文:利用PowerDesigner逆向工程导出PDM模型及生成文档 最近需要对老项目进行重构优化,由于项目都是好几年前的,相关设计资料很不全,最基本的数据库设计文档都没有,只能利用PowerDesigner逆向工程导出PDM模型及生成word文档:以下简单介绍导出模型操作步骤(以下演示操作是从SQL Server中导出) 第一步:  先打开 PowerDesigner 点击右上角文件按钮 第二步点击建立新模型,弹出new model对话框-点击physical Data Model 建立模型

用pytorch1.0搭建简单的神经网络:进行回归分析

搭建简单的神经网络:进行回归分析 import torch import torch.nn.functional as F # 包含激励函数 import matplotlib.pyplot as plt # 建立数据集 x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # x data (tensor), shape=(100, 1) y = x.pow(2) + 0.2*torch.rand(x.size()) # noisy y

Keras保存模型

保存模型 model.save_weights('model_weights.h5') 加载模型 先初始化模型 model.load_weights('model_weights.h5') 原文地址:https://www.cnblogs.com/rise0111/p/11621651.html