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

news2025/8/11 16:39:52

  • 模型部署
    • 一、Pytorch 模型部署
      • 1. 模型保存
        • 1.1. 使用torch.save()保存
        • 1.2. 使用[torch.jit.save()](https://pytorch.org/docs/stable/generated/torch.jit.save.html)保存
      • 2. 模型部署 or 模型编译
        • 2.1. TorchScript部署
        • 2.2. TensorRT部署
        • 2.3. TVM部署
        • 2.4. Laser部署

模型部署

一、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)

img

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

img

这类编译器的通用设计体系结构主要包含两部分:编译器前端和编译器后端。 中间表示(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 编译器框架进行转换时所采取的步骤。

A High Level View of TVM

  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

2.4. Laser部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 GD32 标准库移植SFUD

本次移植是在官方源码的基础上进行移植的 本次介绍的两个软件包SFUD/FAL都与FLASH有关,并且都可以独立使用或者结合在一起使用,两个软件包都对操作系统无依赖,可以使用裸机移植,也很方便移植到各种系统。 这两个软件包的作者都是…

Java JDK安装与配置

Java JDK安装与配置 JDK下载 下载地址:JDK下载 最上方是JDK最新版,往下滑将看到最常用的稳定版本:JDK8 选择版本 勾上选框,点击下载 登录Oracle账号: 没有账号可注册或网上寻找账号,建议自行注册登录成功…

我应该是懂居家办公的吧?

近期的广州疫情十分严峻,海珠区,公司那边的地铁停了。 于是成为了一个【天选居家人】。 天河这边还好一点,起码可以下楼做核酸,买菜,拿快递,出入凭24h核酸。 有人说:以前在公司工作总盼望居家办…

Win10配置IIS与 C#/.net项目的发布与IIS部署

1、IIS配置安装 已经安装IIS的可以跳过 在左下搜索框搜索 “启用或关闭windows功能” 点开,勾选如下图所示勾选框后,点击“确定”后进行安装。 安装完成。在搜索框搜索输入IIS,如图,打开IIS应用。 打开后如图所示 2、在VS中打包…

详解c++----类和对象(二)

目录标题前言为什么会有默认成员函数有哪些默认成员函数构造函数和析构函数为什么会有这两个函数构造函数的简介构造函数的调用构造函数的重载构造函数的缺省参数析构函数的简介析构函数的特性析构函数的例子重回构造函数第一点第二点究竟什么是默认构造函数默认构造函数所带来…

Wnt 信号通路

Wnt 信号通路是一种古老的、进化上保守的通路。其中,Wnt 蛋白属于分泌的糖蛋白,可与卷曲蛋白 (Frizzled) 家族的受体,如与脂蛋白受体相关的蛋白 5/6 (LRP5/6),Ror2 和 Ryk 相互作用,导致各种细胞内信号传导级联激活&am…

【创建小程序】微信如何创建小程序?

说起我们日常所使用的微信,大家一定也会联想到微信小程序。微信小程序跟微信一样拥有着很高的使用频率,而且微信小程序也成为了很多企业商家除了网站APP以外的必备轻应用。那么在微信如何创建小程序呢?下面给大家简单说说。 一、准备好小程序…

如何优雅地校验后端接口数据,不做前端背锅侠

背景 最近新接手了一批项目,还没来得及接新需求,一大堆bug就接踵而至,仔细一看,应该返回数组的字段返回了 null,或者没有返回,甚至返回了字符串 "null"??? 这…

【BOOST C++ 13 并行编程】(5) Boost.Atomic

一、说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量。它们被称为原子变量,因为所有访问都是原子的。 Boost.Atomic 用于多线程程序,当在一个线程中访问变量不应被访问相同变量的另一个线程中断时。如果没有 boost::atomic&#…

Windows取证——隐藏用户

前言: 实验环境:Windows server 2019 实验目的:了解Windows隐藏账户的工作原理,有针对性地对隐藏账户进行应急处置。 目录 前言: 一、隐藏用户的建立 二、查看隐藏用户 法一:计算机管理本地用户和组查看…

Java集合(复习)

Java中的集合 Java中的集合概述Collection 接口中常用的方法Iterator 迭代器forEach 增强for循环Collection子接口之一:List 接口ArrayList 源码分析LinkedLIst 源码分析Vector 源码分析List 接口常用的方法Collection 子接口之二: Set 接口HashSetLinke…

OnlineJudge平台(负载均衡)

文章目录1.所用技术与开发环境2.项目宏观结构3.compiler服务设计4. 基于MVC结构的oj服务设计5. 前端页面设计6 安装指南升级 gcc安装 jsoncpp安装 cpp-httplib安装boost库安装与测试 ctemplate使用Ace在线编辑器(直接复制粘贴即可)在线OJ样例题目MySQL 建…

SVN的基本使用

文章目录1.什么是SVN?2.SVN跟Git比,有什么优势?3.SVN的主要应用4.SVN仓库(SVN的服务端)5.SVN客户端6.SVN的基本操作6.1 代码检出 checkout6.2添加文件 add6.3提交代码 commit6.4 更新代码 update7.撤销和恢复7.1 撤销本地修改7.2 撤销已提交内容7.3 恢复…

第一章《初学者问题大集合》第5节:Java开发环境的搭建

上一小节阐述了Java程序运行的过程和原理,但那都一些理论,并没有真正的实战操作。此时读者们肯定想知道:从哪里才能搞到一个编译器和那个传说中能让Java程序得以运行的虚拟机呢?有了虚拟机,又怎样才能让Java程序在电脑…

[附源码]计算机毕业设计JAVA广州中小学学校信息管理系统

[附源码]计算机毕业设计JAVA广州中小学学校信息管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: S…

ASEMI代理艾赛斯IXFK32N100P,车规级MOS管IXFK32N100P

编辑-Z 艾赛斯车规级MOS管IXFK32N100P参数: 型号:IXFK32N100P 漏极-源极电压(VDS):1000V 连续漏电流(ID):32A 功耗(PD):960W 工作结温度&am…

一文带你快速了解【内部类】

1. 什么是内部类? 在一个类 A 中,又定义了一个类 B ,此时这个类 B 就是内部类,而类 A 则是外部类!内部类也是一种封装得表现 public class A{class B{} }我们看上面代码,此时 A 就是外部类,B …

美团外卖搜索基于Elasticsearch的优化实践

美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-Based Service(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-Length Encoding(RLE)设计了一款高效的倒排索引结构,使检索…

蚂蚁集团最新业绩出炉:净利润同比下降63%,连续三个季度下滑

11月17日,阿里巴巴集团(简称“阿里”,HK:09988、NYSE:BABA)公布2023财年第二季度(对应自然年2022年第三季度)业绩。财报显示,阿里巴巴2022年第三季度的收入为人民币2071.76亿元(约合…

用 Python 编写 Chrome 扩展赚美刀,通过使用 PyScript 非常轻松(教程含源码)

有很多文章介绍了用于将 Python 代码直接嵌入 HTML的PyScript的出现,但直到现在,在Python中创建浏览器扩展一直是一扇紧闭的门。 我很幸运地获得了PyScript 的工程经理的帮助,并最终弄清楚了如何将 Python 脚本作为 Chrome 扩展运行,并在弹出框中显示输出(参见上面的屏幕…