文章目录

    • 0 目的
    • 1 TorchScript
      • 1.1 语言特性的限定性
      • 1.2 设计目的:模型表达的专注性
    • 2pytorch JIT(Just-in-time compilation)
      • 2.1pytorch JIT定义
      • 2.1pytorch JIT整个过程:
        • 1. 前端转换层:生成静态计算图
        • 2. 中间表示层(IR):静态计算图
        • 3. 优化与编译层
        • 4. 执行层
    • 3与pt文件的关系
      • 3.1核心概念定义与层级关系
      • 3.2pt文件构成与pth差异

0 目的

在部署时候需要静态图,静态图在pytorch中也称为Script mode。为了script模式下的计算图表达与优化,引入

两个工具torchscript和pytorch JIT,一个工具将pytroch动态图转为静态图,另一个工具进行静态图优化。


1 TorchScript

TorchScript是Python静态子集。TorchScript和完整Python语言之间最大的区别在于,TorchScript只支持表达神经网络模型所需的一小部分静态类型。TorchScript可以看成一种新的编程语言,设计的目的是为了脱离pytorch,python环境,作为python和其他语言(如c++)的一种中间桥接工具,方便部署。将pytorch写的模型转换成TorchScript语言后的代码,称为中间表示(IR),也称为TorchScript IR,之前在计算图中讨论过,模型可以用计算图(有向无环图)表示,因此TorchScript IR也就是计算图的中间表示。

1.1 语言特性的限定性

  • 静态类型约束
    TorchScript 仅支持 Python 中与神经网络模型表达直接相关的有限类型(如 TensorTupleintList 等),而舍弃了动态类型(如 typing.Any)和复杂控制流。
    示例:变量必须声明单一静态类型,禁止运行时类型变更。
  • 语法子集化
    仅保留 if/for 等基础控制语句,且需符合静态图编译要求(如循环次数需在编译时可推断)。其他 Python 特性(如动态类继承、反射)被排除。

1.2 设计目的:模型表达的专注性

TorchScript 的语法设计聚焦于高效描述神经网络计算图,而非通用编程。这使其成为:

  • 模型序列化载体:脱离 Python 环境后仍可完整表示计算逻辑。
  • 编译器友好格式:静态类型便于优化器分析数据依赖与内存布局。

2pytorch JIT(Just-in-time compilation)

2.1pytorch JIT定义

JIT编译器在模型运行时(而非训练时)对代码进行即时编译与优化。在pytorch中JIT编译器它不会将编译的过程一口气完成,而是先对代码进行一些处理,存储成某种序列化表示(比如计算图);然后在实际的运行时环境中,通过 profiling 的方式,进行针对环境的优化并执行代码。

在这里插入图片描述

pytorch JIT就是为了解决部署而诞生的工具。包括代码的追踪及解析、中间表示的生成、模型优化、序列化等各种功能,可以说是覆盖了模型部署的方方面面。一方面使用TorchScript 作为python代码的另一种表现形式,一方面对TorchScript IR进行优化。

其核心目标包括:

  • 性能提升:通过算子融合、内存复用等优化手段加速推理(部分场景性能提升50%)。
  • 部署解耦:脱离Python依赖,支持C++/移动端等非Python环境。
  • 硬件适配:针对不同后端(CPU/GPU/TPU)生成优化机器码。

2.1pytorch JIT整个过程:

在这里插入图片描述

TorchScript与PyTorch JIT的依赖关系

  • TorchScript是JIT的前提
    动态图模型必须首先转换为TorchScript IR,才能被JIT编译器优化。
  • JIT赋予TorchScript执行能力
    TorchScript IR需通过JIT编译为机器码,否则仅为静态数据结构。
1. 前端转换层:生成静态计算图
转换方式原理适用场景
Tracing记录示例输入下的张量操作轨迹,生成IR(无法捕获分支/循环)无控制流的简单模型(如CNN)
Scripting解析Python源码,直接编译为TorchScript(支持条件分支)含动态逻辑的模型(如RNN)
  • 1. 追踪模式(Tracing)

  • 原理
    输入示例数据(如dummy_input),记录模型前向传播的算子调用序列 → 生成线性计算图

    dummy_input = torch.rand(1, 3, 224, 224)
    jit_model = torch.jit.trace(model, dummy_input)  # 生成IR
    
  • 局限性
    无法捕获条件分支(如if x>0)或循环(如for i in range(n)),仅适合无控制流模型

  • 2. 脚本模式(Scripting)

  • 原理
    直接解析Python源码 → 词法分析(Lexer)→ 语法树(AST)→ 语义分析 → 生成带控制流的IR

    class DynamicModel(nn.Module):def forward(self, x):if x.sum() > 0: return x * 2  # 分支逻辑可被保留else: return x / 2
    jit_model = torch.jit.script(DynamicModel())  # 直接编译源码
    
2. 中间表示层(IR):静态计算图

IR数据结构

基于有向无环图(DAG,这个词在计算图中出现过):

  • Graph:顶级容器,表示一个函数(如forward()
  • Block:基本块(Basic Block),包含有序的Node序列
  • Node:算子节点(如aten::conv2d),含输入/输出Value
  • Value:数据流边,具有静态类型(如Tensor/int
  • 属性(Attributes) :存储常量(如权重张量)
表示算子
输入/输出
管理节点集合
Graph
Node
Block
Value
Operator
Tensor
  • 数据结构:,包含Graph(函数)、Node(算子)、Value(数据流)。
  • 关键特性
    • 类型静态化:所有变量需明确定义类型(如Tensor/int),舍弃Python动态类型。
    • 控制流显式化:将if/for转换为图节点(如prim::If)。
3. 优化与编译层
  • 图优化(Graph Optimization)
    • 算子融合:合并相邻算子(如conv2d + relu → conv2d_relu),减少内核启动开销。
    • 常量折叠:预计算静态表达式(如a=2; b=3; c=a*bc=6)。
  • 硬件后端适配
    • NVFuser:默认GPU优化器,针对NVIDIA显卡生成高效CUDA核。
    • CPU优化:利用OpenMP加速并行计算。
4. 执行层
  • 轻量级解释器:执行优化后的IR,无全局锁(GIL),支持多线程并发。
  • 运行时剖析(Profiling) :动态收集执行数据,反馈至编译器迭代优化(如热点代码重编译)。

3与pt文件的关系

将jit编译优化后的模型进行保存,下一步就可以在C++上进行部署了。

序列化(Serialization) 是将程序中的对象(如模型参数、计算图、张量等)转换为可存储或传输的标准化格式(如字节流、文件)的过程,而 反序列化(Deserialization) 则是将存储的格式还原为内存中的对象。因此保存模型的save函数执行的就是序列化。

torch.jit.save('model.pt')

3.1核心概念定义与层级关系

PyTorch JIT保存的.pt文件、PyTorch JIT编译器与TorchScript三者构成模型部署的核心技术栈,其关系可通过以下分层架构与技术流程详解:

组件本质角色定位
TorchScriptPython的静态类型子集(IR中间表示)模型表达层:定义可编译的模型结构
PyTorch JIT运行时编译器(Just-In-Time Compiler)优化执行层:将IR编译为高效机器码
.pt文件TorchScript模块的序列化格式(ZIP归档)持久化层:存储模型结构与参数

三者关系可概括为:
**TorchScript提供标准化模型表示 → PyTorch JIT进行运行时优化编译 → .pt文件实现跨平台持久化

3.2pt文件构成与pth差异

  • 文件结构(ZIP归档格式):

    model.pt
    ├── code/         # 优化后的TorchScript IR(计算图)
    ├── data.pkl      # 模型权重(张量数据)
    ├── constants.pkl # 嵌入的常量(如超参数)
    └── version       # 格式版本号
    
  • 序列化方法

    # 保存到磁盘文件
    torch.jit.save(traced_model, "model.pt")  # 或 traced_model.save("model.pt")# 保存到内存缓冲区(适用于网络传输)
    buffer = io.BytesIO()
    torch.jit.save(traced_model, buffer)
    

pt文件 vs 普通PyTorch模型文件

特性JIT生成的.pt文件torch.save()保存的.pth文件
内容完整计算图 + 参数 + 优化后的IR仅参数(state_dict)或Python类引用
可移植性脱离Python环境(支持C++/移动端)依赖原始Python模型类定义
执行引擎JIT编译器优化后的本地代码Python解释器执行
反编译风险代码以IR存储,难以还原原始Python逻辑可直接查看模型类代码

PyTorch JIT保存的.pt文件、PyTorch JIT编译器与TorchScript,三者协同构成PyTorch生产部署的核心基础设施,覆盖从研发到落地的完整生命周期。

参考

[1](TorchScript — PyTorch 2.7 documentation)

[3](PyTorch JIT and TorchScript. A path to production for PyTorch models | by Abhishek Sharma | TDS Archive | Medium)

[4]((8 封私信 / 5 条消息) TorchScript 解读(一):初识 TorchScript - 知乎)

[5]((8 封私信 / 5 条消息) PyTorch系列「一」PyTorch JIT —— trace/ script的代码组织和优化方法 - 知乎)

[6](PyTorch JIT | Chenglu’s Log)

[7](PyTorch Architecture | harleyszhang/llm_note | DeepWiki)

[8](TorchScript for Deployment — PyTorch Tutorials 2.7.0+cu126 documentation)

[9](Loading a TorchScript Model in C++ — PyTorch Tutorials 2.7.0+cu126 documentation)

[10](Introduction to TorchScript — PyTorch Tutorials 2.7.0+cu126 documentation)

[11]((8 封私信 / 5 条消息) 什么是torch.jit - 知乎)

[12]((8 封私信 / 5 条消息) 一文带你使用即时编译(JIT)提高 PyTorch 模型推理性能! - 知乎)

[13](TorchScript 解读(二):Torch jit tracer 实现解析 - OpenMMLab的文章 - 知乎
https://zhuanlan.zhihu.com/p/489090393)

[14](Pytorch代码部署:总结使用JIT将PyTorch模型转换为TorchScript格式踩过的那些坑 - Ta没有名字的文章 - 知乎
https://zhuanlan.zhihu.com/p/662228796)

[15](TorchScript JIT & IR - 灵丹的文章 - 知乎
https://zhuanlan.zhihu.com/p/543952666)

[16](TorchScript的简介 - PyTorch官方教程中文版)
《深度学习编译器设计第五章:中间表示》
《PRINCIPLED OPTIMIZATION OF DYNAMIC NEURAL NETWORKS》. JARED ROESCH

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu+Nginx+php+SQLite3+typecho手动搭建个人博客

零.Ubuntu环境 一.安装nginx 使用以下指令进行nginx web服务器安装: apt-get install nginx 如果提示找不到安装包,也可以更新一下系统的apt环境包: sudo apt update 安装完成后,可以使用以下指令查看nginx是否处于激活状态&#…

网络协议概念与应用层

1.概念 1.1 例子 点外卖 上述这个过程,就是自定义协议 自定义协议,具体的方式也是非常灵活的 2.几种开发中更常见的格式 2.1xml 上古时期的组织数据的格式 通过标签来组织数据 xml的优势:让数据的可读性变得更好了 劣势:标签写起来繁琐,传输的时候也占用更多网络带宽 2.2…

pytorch学习—7.处理多维特征的输入

2. 线性模型 3.梯度下降算法 4.反向传播(用pytorch算梯度) 5.用pytorch实现线性回归 6.logistic回归 7.处理多维特征的输入_哔哩哔哩_bilibili 7.1代码复现: import numpy as np import torch import matplotlib.pyplot as plt# 1. 获取数据集 xy_data = np.lo

AI助手“智普清言”《三元》(Python)诗解

文本逻辑解清晰,诗意对应技法轻。 笔记模板由python脚本于2025-07-01 06:54:55创建,本篇笔记适合喜欢python三元语句的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Pytho…

本地RAG实战:用Spring AI+Ollama+DeepSeek+ChromaDB增强文档问答

本文手把手教你在本地部署RAG系统: 用 Spring AI 整合 Ollama(运行DeepSeek中文模型)ChromaDB 存储本地文档(PDF/TXT)向量Java程序实现:文档解析 → 语义检索 → 增强生成 最终效果:模型回答更准…

Python 数据分析:DataFrame,生成,用字典创建 DataFrame ,键值对数量不一样怎么办?

目录 1 示例代码2 欢迎纠错3 论文写作/Python 学习智能体------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右S…

Java 并发编程的 CAS(Compare and Swap)是什么?

CAS(Compare and Swap,比较并交换) 并非 Java 语言特有的概念,而是现代计算机硬件提供的一条核心原子指令。在 Java 并发编程中,它扮演着“幕后英雄”的角色,是构建高性能、无锁并发工具(如原子…

【UnityAssetBundle】AssetBundle打包

AssetBundle生成AB包资源文件方式: Unity编辑器开发,自定义打包工具;官方提供好的打包工具,Asset Bundle Browser 打包 选择一个资源,new一个压缩包名称或选择一个压缩包名称 点击Window->AssetBundle Browser&…

Hush Puppies大中华区鞋类业务移交品牌方继续经营

据悉,随着百丽集团运营的暇步士(Hush Puppies)大中华区鞋类授权的到期,暇步士(Hush Puppies)鞋类业务已开始运营权移交。其中线上渠道授权于2025年6月30日正式到期,线下渠道将于2025年12月31日前…

解释LLM怎么预测下一个词语的

解释LLM怎么预测下一个词语的 通过上文词的向量进行映射 在Transformer架构的大语言模型(如GPT系列、BERT等)中,词语会先被转化为词向量。在预测下一个词时,模型会基于之前所有词的向量表示(并非仅仅上一个词,但上一个词的向量是重要信息来源之一)进行计算。 以GPT-2…

DAY 49 CBAM注意力

目录 DAY 49 CBAM注意力1.通道注意力模块复习2.空间注意力模块3.CBAM的定义作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 DAY 49 CBAM注意力 1.通道注意力模块复习 2.空间注意力模块 3.CBAM的定义 import torch import torch.nn …

【网络】Linux 内核优化实战 - net.ipv4.conf.all.rp_filter

目录 net.ipv4.conf.all.rp_filter 参数详解一、参数基本概念二、参数取值及含义三、反向路径过滤的工作原理四、配置示例与注意事项五、与其他参数的关联六、总结 net.ipv4.conf.all.rp_filter 参数详解 一、参数基本概念 net.ipv4.conf.all.rp_filter 是 Linux 内核中用于控…

ElementUI el-select多选下拉框,回显数据后无法重新选择和修改

问题 ElementUI el-select多选下拉框,回显数据后无法重新选择和修改,点击选择和删除都没有反应,页面也没有报错 方案一 网上搜出来的基本上都是这个解决办法,但是我设置后没有生效,还是无法选择和修改 原因 下拉框数…

计算机视觉的新浪潮:扩散模型(Diffusion Models)技术剖析与应用前景

近年来,扩散模型(Diffusion Models, DMs)迅速崛起,成为计算机视觉领域最令人瞩目的生成模型之一。从生成高质量图像到风格迁移、图像修复,再到文本驱动图像生成(如 DALLE 2、Stable Diffusion、Midjourney&…

「Java流程控制」跳转语句

今天来聊聊Java里的两个重要跳转语句——break和continue。它们就像马路上的交通信号灯,能够控制程序执行的流向。 break和continue break和continue在循环中的作用,特别像快递分拣中心的工作场景: break:就像发现一个破损包裹,直接停止当前分拣流程,把它扔进异常品处理…

R1-Searcher使用强化学习增强语言模型解决问题的搜索能力

R1-Searcher:Incentivizing the Search Capability in LLMs via Reinforcement Learning 2025.3 https://github.com/RUCAIBox/R1-Searcher 针对的问题: 现有大型推理模型在时间敏感或知识密集型问题上通常仅使用模型内部知识,导致回答不准…

C++中的虚函数与纯虚函数

文章目录 虚函数 (Virtual Function)纯虚函数 (Pure Virtual Function)主要区别实际应用示例 C中的虚函数和纯虚函数是实现多态性的重要机制。 虚函数 (Virtual Function) 虚函数是在基类中用virtual关键字声明的函数,它允许派生类重写(override)该函数的实现。当…

(LeetCode 每日一题) 3330. 找到初始输入字符串 I (字符串)

题目:3330. 找到初始输入字符串 I 思路:字符串,时间复杂度0(n)。 默认没有输错的情况ans1,而输错的情况,只会出现在连续相等字符串,假设这段字符串长度为ct,那么可能的情况为ct-1。累计这些和到…

Deep semi-supervised learning for medical image segmentation: A review

概述 医学图像分割的重要性:它是计算机辅助诊断(CAD)的关键部分,能帮助医生定位病变、评估治疗效果,减轻医生工作量。 深度学习技术的应用:U-Net等网络在医学图像分割中表现优异,近期大型视觉语…

[云上玩转Qwen3系列之四]PAI-LangStudio x AI搜索开放平台 x ElasticSearch: 构建AI Search RAG全栈应用

本文详细介绍了如何使用 PAI-LangStudio 和 Qwen3 构建基于AI搜索开放平台 x ElasticSearch 的 AI Search RAG 智能检索应用。该应用通过使用 AI 搜索开放平台、ElasticSearch 全文检索向量检索引擎的混合检索技术配合阿里云最新发布的 Qwen3 推理模型编排在一个 Agentic Workf…