pytorch底層原理學習--JIT與torchscript

文章目錄

    • 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…