[模型部署]:深度学习模型部署(已更Pytorch篇)

这篇具有很好参考价值的文章主要介绍了[模型部署]:深度学习模型部署(已更Pytorch篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型部署

一、Pytorch 模型部署

1. 模型保存

1.1. 使用torch.save()保存
  1. 保存和加载state_dict,即只保存模型参数

    保存:

    torch.save(model.state_dict(), SAVE_PATH)
    

    加载:

    model = ModelClass(*args, **kwargs)
    model.load_state_dict(torch.load(SAVE_PATH))
    model.eval()
    
  2. 保存完整的模型文件

    保存:

    torch.save(model, SAVE_PATH)
    

    加载:

    model = torch.load(SAVE_PATH)
    model.eval()
    
  3. 保存模型并恢复训练状态,断点重训

    # 保存
    state = {
        'epoch': epoch,
        'state_dict': model.state_dict(),
        'optimizer': optimizer.state_dict(),
        ...
    }
    torch.save(state, filepath)
    # 模型与参数加载
    model.load_state_dict(state['state_dict'])
    optimizer.load_state_dict(state['optimizer'])
    
1.2. 使用torch.jit.save()保存

用于保存编译过后的模型,跨平台使用,模型中只能使用pytorch的函数,可以使用被加载到C ++ API torch::jit::load(filename) 或与Python的API torch.jit.load

torch.jit.save支持保存script类型和trace类型的模为TorchScript,其中script为全量模型,trace为仅保存运行过的路径。

什么是JIT?TorchScript?

JIT(just-in-time compilation,即时编译)模式选择了构建well-defined IR的方式。这样带来的好处有:

  • 将python runtime和计算图(model graph)解耦
  • 获得C++相比带GIL的Python的收益
  • 获得整个程序,拿到全局信息,来进行优化
  • 将易于调试的模式和易于部署/优化的模式进行切分(算法调参和算法部署各司其职)

TorchScript是JIT模式的具体形式,是一种从PyTorch代码创建可序列化和可优化模型的方法。任何TorchScript程序都可以从Python进程中保存,并加载到没有Python依赖的进程中。

trace和script的区别?

1、trace只记录走过的tensor和对tensor的操作,不会记录任何控制流信息,如if条件句和循环。因为没有记录控制流的另外的路,也没办法对其进行优化。好处是trace深度嵌入python语言,复用了所有python的语法,在计算流中记录数据流。

2、script会去理解所有的code,真正像一个编译器一样去进行lexer、parser、Semantic analusis的分析「也就是词法分析语法分析句法分析,形成AST树,最后再将AST树线性化」。script相当于一个嵌入在Python/Pytorch的DSL,其语法只是pytorch语法的子集,这意味着存在一些op和语法script不支持,这样在编译的时候就会遇到问题。此外,script的编译优化方式更像是CPU上的传统编译优化,重点对于图进行硬件无关优化,并对IF、loop这样的statement进行优化。

【Pytorch部署】TorchScript

PyTorch系列「一」PyTorch JIT —— trace/ script的代码组织和优化方法

2. 模型部署 or 模型编译

什么是模型编译?深度学习编译器?

传统的编译器是以高层语言作为输入,避免直接去写汇编,机器码;而深度学习编译器作用相仿,其输入是高度抽象的计算图,输出包括CPU或者GPU等硬件平台是哪个的底层代码和执行引擎,即深度学习编译器将不同框架描述的深度学习模型为某个硬件平台生成优化的代码。AOT(ahead-of-time compliation)

pytorch部署模型,深度学习,深度学习,pytorch,python

深度学习编译器普遍采用的设计架构:

pytorch部署模型,深度学习,深度学习,pytorch,python

这类编译器的通用设计体系结构主要包含两部分:编译器前端和编译器后端。 中间表示(IR)横贯前端和后端。 通常IR是程序的抽象,用于程序优化。 具体而言,深度学习模型在编译器中转换为多级IR,其中高级IR驻留在前端,而低级IR驻留在后端。 基于高级IR,编译器前端负责独立于硬件的转换和优化。 基于低级IR,编译器后端负责特定于硬件的优化、代码生成和编译。

2.1. TorchScript部署

参见上文

2.2. TensorRT部署

tensorrt 部署 pth:

  1. 使用pytorch训练得到pt文件;
  2. 将pt文件转换为onnx中间件;
  3. 使用onnxsim.simplify对转换后的onnx进行简化;
  4. 解析onnx文件构建trt推理引擎;cd tensorrt_path/bin && ./trtexec --onnx=*.onnx --saveEngine=*.trt
    1. 导出网络定义以及相关权重;
    2. 解析网络定义以及相关权重;
    3. 根据显卡算子构造出最优执行计划;
    4. 将执行计划序列化存储;
    5. 反序列化执行计划;
    6. 进行推理

pytorch中使用TensorRT

2.3. TVM部署

模型在使用 TVM 编译器框架进行转换时所采取的步骤。

pytorch部署模型,深度学习,深度学习,pytorch,python

  1. 从TensorflowPyTorchOnnx等框架导入模型。

    TVM 导入层是从其他框架(如 Tensorflow、PyTorch 或 ONNX)导入模型,如果在将模型导入 TVM 时遇到问题,想尝试将其转换为 ONNX(更适配)。

  2. 将导入的模型翻译成TVM 的高级模型语言Relay

    已导入 TVM 的模型在 Relay 中表示。Relay 是模型的中间表示 (Intermediate representation, IR)。支持:

    • 传统数据流表示
    • Functional-style scoping, let-binding which makes it a fully featured differentiable language
    • 允许混合两种编程风格的能力

    Relay 应用图级优化传递来优化模型。

  3. Lower到Tensor expression(TE) 表示。

    Lower是指将高级表示转换为低级表示。在应用高级优化后,Relay 运行 FuseOps pass 将模型划分为许多小子图,并将子图降低为 TE 表示。张量表达式 (TE) 是一种用于描述张量计算的domain-specific语言。TE 还提供了几个schedule来指定low-level loop优化,例如tiling、vectorization、parallelization、unrolling和fusion。为了帮助将Relay representation转换为 TE represention的过程,TVM 包括一个张量运算符清单 (Tensor Operator Inventory, TOPI),它具有预定义的常用张量运算符模板(例如,conv2d、转置)。

  4. 使用auto-tuning模块AutoTVMAutoScheduler搜索最佳schedule。

    schedule为 TE 中定义的运算符或子图指定的低级循环进行优化。auto-tuning模块搜索最佳schedule并将其与cost model和on-device measurement进行比较。TVM 中有两个auto-tuning模块。

    • AutoTVM:基于模板的自动调整模块。它运行搜索算法来找到最佳值。对于常用的算子,TOPI 中已经提供了模板。
    • AutoScheduler(又名 Ansor):一个无模板的自动调整模块。它不需要预定义的schedule模板。相反,它通过分析计算定义自动生成搜索空间。然后它在生成的搜索空间中搜索最佳schedule。
  5. 选择模型编译的最佳配置。

    调优后,自动调优模块会生成JSON格式的调优记录。此步骤为每个子图选择最佳schedule。

  6. Lower to Tensor Intermediate Representation (TIR),TVM 的低级中间表示。

    在根据调整步骤选择最佳配置后,每个 TE 子图都降低到 TIR 并通过低级优化通道进行优化。接下来,将优化后的 TIR 降低到硬件平台的目标编译器。这是生成可部署到生产中的优化模型的最终代码生成阶段。TVM 支持多种不同的编译器后端,包括:

    • LLVM,它可以针对任意微处理器架构,包括标准 x86 和 ARM 处理器、AMDGPU 和 NVPTX 代码生成,以及 LLVM 支持的任何其他平台。
    • 专用编译器,例如 NVCC,NVIDIA 的编译器。
    • 嵌入式和专用目标,通过 TVM 的Bring Your Own Codegen (BYOC) 框架实现。
  7. 编译成机器代码。

    在此过程结束时,特定于编译器的生成代码可以lower为机器代码。

    TVM 可以将模型编译为可链接的对象模块,然后使用轻量级 TVM runtime 提供的 C API 来动态加载模型然后运行,以及使用其他语言(如 Python 和 Rust)的接口。TVM 还可以构建捆绑部署,其中runtime与模型结合在一个包中。

使用tvmc的python API文章来源地址https://www.toymoban.com/news/detail-633415.html

  • TVM 实战练习:
    [模型部署]:TVM模型部署实战
2.4. Laser部署

到了这里,关于[模型部署]:深度学习模型部署(已更Pytorch篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyTorch各种损失函数解析:深度学习模型优化的关键(2)

    目录 详解pytorch中各种Loss functions mse_loss 用途 用法 使用技巧 注意事项 参数 数学理论公式 代码演示  margin_ranking_loss 用途 用法 使用技巧 注意事项 参数 数学理论公式  代码演示 multilabel_margin_loss 用途 用法 使用技巧 注意事项 参数 数学理论公式 代码演示 multilabel_soft_margin_

    2024年01月19日
    浏览(51)
  • 【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

    大家好,今天和各位分享一下多智能体深度强化学习算法 ippo,并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得:https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 多智能体的情形相比于单智能体更加复杂,因为 每个智能体在和环境交互的同时也在和其他

    2024年02月03日
    浏览(36)
  • 【深度强化学习】(1) DQN 模型解析,附Pytorch完整代码

    大家好,今天和各位讲解一下深度强化学习中的基础模型 DQN,配合 OpenAI 的 gym 环境,训练模型完成一个小游戏,完整代码可以从我的 GitHub 中获得: https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model DQN(Deep Q Network) 算法由 DeepMind 团队提出,是深度神经网络和 Q-Learning 算

    2023年04月08日
    浏览(33)
  • 【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

    大家好,今天和各位分享一下深度强化学习中的 近端策略优化算法 (proximal policy optimization, PPO ),并借助 OpenAI 的 gym 环境完成一个小案例,完整代码可以从我的 GitHub 中获得: https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model PPO 算法之所以被提出,根本原因在于 Polic

    2023年04月08日
    浏览(37)
  • PyTorch深度学习实战 | 高斯混合模型聚类原理分析

    为理解高斯混合模型解决聚类问题的原理,本实例采用三个一元高斯函数混合构成原始数据,再采用GMM来聚类。 1) 数据 三个一元高斯组件函数可以采用均值和协方差表示如表1所示: ▍表1 三个一元高斯组件函数的均值和协方差 每个高斯组件函数分配不同的权重,其中1号组

    2024年02月01日
    浏览(38)
  • 深度学习必备书籍——《Python深度学习 基于Pytorch》

    作为一名机器学习|深度学习的博主,想和大家分享几本 深度学习 的书籍,让大家更快的入手深度学习,成为AI达人!今天给大家介绍的是: 《Python深度学习 基于Pytorch》 在人工智能时代,如何尽快掌握人工智能的核心—深度学习呢?相信这是每个欲进入此领域的人面临的主

    2023年04月09日
    浏览(78)
  • 《Python深度学习基于Pytorch》学习笔记

    有需要这本书的pdf资源的可以联系我~ 这本书不是偏向于非常详细的教你很多函数怎么用,更多的是交个基本使用,主要是后面的深度学习相关的内容。 1.Numpy提供两种基本的对象:ndarray(n维数组对象)(用于储存多维数据)和ufunc(通用函数对象,用于处理不同的数据)。

    2024年02月09日
    浏览(29)
  • 《动手学深度学习 Pytorch版》 8.3 语言模型和数据集

    依靠在 8.1 节中对序列模型的分析,可以在单词级别对文本数据进行词元化。基本概率规则如下: P ( x 1 , x 2 , … , x T ) = ∏ t = 1 T P ( x t ∣ x 1 , … , x t − 1 ) P(x_1,x_2,dots,x_T)=prod^T_{t=1}P(x_t|x_1,dots,x_{t-1}) P ( x 1 ​ , x 2 ​ , … , x T ​ ) = t = 1 ∏ T ​ P ( x t ​ ∣ x 1 ​ , … , x t −

    2024年02月07日
    浏览(28)
  • 使用PyTorch解决多分类问题:构建、训练和评估深度学习模型

    💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互

    2024年02月07日
    浏览(34)
  • PyTorch深度学习实战(1)——神经网络与模型训练过程详解

    人工神经网络 ( Artificial Neural Network , ANN ) 是一种监督学习算法,其灵感来自人类大脑的运作方式。类似于人脑中神经元连接和激活的方式,神经网络接受输入,通过某些函数在网络中进行传递,导致某些后续神经元被激活,从而产生输出。函数越复杂,网络对于输入的数据拟

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包