PyTorch JIT與TorchScript

PyTorch JIT與TorchScript

轉自:https://zhuanlan.zhihu.com/p/370455320

如果搜索 PyTorch JIT,找到的將會是「TorchScript」的文檔,那么什么是 JIT 呢?JIT 和 TorchScript 又有什么聯系?

文章只會關注概念的部分,如果關注細節或實現部分,文章最后有一個完整的 Demo 可供參考。


什么是 JIT

首先要知道 JIT 是一種概念,全稱是 Just In Time Compilation,中文譯為「即時編譯」,是一種程序優化的方法,一種常見的使用場景是「正則表達式」。例如,在 Python 中使用正則表達式:

prog = re.compile(pattern)
result = prog.match(string)

result = re.match(pattern, string)

上面兩個例子是直接從 Python 官方文檔中摘出來的 ,并且從文檔中可知,兩種寫法從結果上來說是「等價」的。但注意第一種寫法種,會先對正則表達式進行 compile,然后再進行使用。如果繼續閱讀 Python 的文檔,可以找到下面這段話:

using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.

也就是說,如果多次使用到某一個正則表達式,則建議先對其進行 compile,然后再通過 compile 之后得到的對象來做正則匹配。而這個 compile 的過程,就可以理解為 JIT(即時編譯)。

在深度學習中 JIT 的思想更是隨處可見,最明顯的例子就是 Keras 框架的 model.compile,TensorFlow 中的 Graph 也是一種 JIT,雖然他沒有顯示調用編譯方法。

那 PyTorch 呢?PyTorch 從面世以來一直以「易用性」著稱,最貼合原生 Python 的開發方式,這得益于 PyTorch 的「動態圖」結構。我們可以在 PyTorch 的模型前向中加任何 Python 的流程控制語句,甚至是下斷點單步跟進都不會有任何問題,但是如果是 TensorFlow,則需要使用 tf.cond 等 TensorFlow 自己開發的流程控制,誰更簡單一目了然。那么為什么 PyTorch 還需要引入 JIT 呢?


TorchScript

動態圖模型通過犧牲一些高級特性來換取易用性,那到底 JIT 有哪些特性,在什么情況下不得不用到 JIT 呢?下面主要通過介紹 TorchScript(PyTorch 的 JIT 實現)來分析 JIT 到底帶來了哪些好處。

  1. 模型部署

PyTorch 的 1.0 版本發布的最核心的兩個新特性就是 JIT 和 C++ API,這兩個特性一起發布不是沒有道理的,JIT 是 Python 和 C++ 的橋梁,我們可以使用 Python 訓練模型,然后通過 JIT 將模型轉為語言無關的模塊,從而讓 C++ 可以非常方便得調用,從此「使用 Python 訓練模型,使用 C++ 將模型部署到生產環境」對 PyTorch 來說成為了一件很容易的事。而因為使用了 C++,我們現在幾乎可以把 PyTorch 模型部署到任意平臺和設備上:樹莓派、iOS、Android 等等…

  1. 性能提升

既然是為部署生產所提供的特性,那免不了在性能上面做了極大的優化,如果推斷的場景對性能要求高,則可以考慮將模型(torch.nn.Module)轉換為 TorchScript Module,再進行推斷。

  1. 模型可視化

TensorFlow 或 Keras 對模型可視化工具(TensorBoard等)非常友好,因為本身就是靜態圖的編程模型,在模型定義好后整個模型的結構和正向邏輯就已經清楚了;但 PyTorch 本身是不支持的,所以 PyTorch 模型在可視化上一直表現得不好,但 JIT 改善了這一情況。現在可以使用 JIT 的 trace 功能來得到 PyTorch 模型針對某一輸入的正向邏輯,通過正向邏輯可以得到模型大致的結構,但如果在 forward 方法中有很多條件控制語句,這依然不是一個好的方法,所以 PyTorch JIT 還提供了 Scripting 的方式,這兩種方式在下文中將詳細介紹。


TorchScript Module 的兩種生成方式

1. 編碼(Scripting)

可以直接使用 TorchScript Language 來定義一個 PyTorch JIT Module,然后用 torch.jit.script 來將他轉換成 TorchScript Module 并保存成文件。而 TorchScript Language 本身也是 Python 代碼,所以可以直接寫在 Python 文件中。

使用 TorchScript Language 就如同使用 TensorFlow 一樣,需要前定義好完整的圖。對于 TensorFlow 我們知道不能直接使用 Python 中的 if 等語句來做條件控制,而是需要用 tf.cond,但對于 TorchScript 我們依然能夠直接使用 if 和 for 等條件控制語句,所以即使是在靜態圖上,PyTorch 依然秉承了「易用」的特性。TorchScript Language 是靜態類型的 Python 子集,靜態類型也是用了 Python 3 的 typing 模塊來實現,所以寫 TorchScript Language 的體驗也跟 Python 一模一樣,只是某些 Python 特性無法使用(因為是子集),可以通過 TorchScript Language Reference 來查看和原生 Python 的異同。

理論上,使用 Scripting 的方式定義的 TorchScript Module 對模型可視化工具非常友好,因為已經提前定義了整個圖結構。

2. 追蹤(Tracing)

使用 TorchScript Module 的更簡單的辦法是使用 Tracing,Tracing 可以直接將 PyTorch 模型(torch.nn.Module)轉換成 TorchScript Module。「追蹤」顧名思義,就是需要提供一個「輸入」來讓模型 forward 一遍,以通過該輸入的流轉路徑,獲得圖的結構。這種方式對于 forward 邏輯簡單的模型來說非常實用,但如果 forward 里面本身夾雜了很多流程控制語句,則可能會有問題,因為同一個輸入不可能遍歷到所有的邏輯分枝。

此外,還可以混合使用上面兩種方式。

一個完整的例子

我簡單寫了一個簡單的 MNIST demo,從使用 Python 訓練到用 JIT 將 Python 模型轉換為 TorchScript Module,然后用 C++ 加載 TorchScript Module 做推斷的完整的過程:

https://github.com/louis-she/torchscript-mnist

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DVWA Cross Site Request Forgery (CSRF) -------WP

CSRF: 介紹 CSRF跨站點請求偽造(Cross—Site Request Forgery),跟XSS攻擊一樣,存在巨大的危害性,你可以這樣來理解: 攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來說這個請求是完全合法的&…

PyTorch C++ API libtorch 簡介

PyTorch C API libtorch 簡介 翻譯自 PyTorch 官方文檔:https://pytorch.org/cppdocs/index.html#acknowledgements 整體劃分 根據 PyTorch 官方文檔 的介紹,PyTorch的C API可以粗略分為以下五個部分: ATen:基礎的張量和數學計…

DVWA upload

LOW medium high impossible

安裝 PyTorch C++ API libtorch 及一個最小例子

安裝 PyTorch C API libtorch 及一個最小例子 翻譯自:https://pytorch.org/cppdocs/installing.html 我們提供依賴 PyTorch 所需的所有頭文件、庫和 CMake 配置文件的二進制分發版。我們將此發行版稱為 LibTorch,您可以在我們的網站上下載包含最新 Lib…

ImageNet 1K 類別名與索引的對應關系

ImageNet 1K 類別名與索引的對應關系 轉自:http://befree2008.github.io/2018/10/05/20181005_ImageNet1000%E5%88%86%E7%B1%BB%E5%90%8D%E7%A7%B0%E5%92%8C%E7%BC%96%E5%8F%B7/ ImageNet 2012 1000個類名稱和編號。ILSVRC2012_img_train.tar 這個文件解壓出來都是…

sqlilab--writeup (5~6) 布爾盲注

1.# 和 – (有個空格)表示注釋,可以使它們后面的語句不被執行。在url中,如果是get請求**(記住是get請求,也就是我們在瀏覽器中輸入的url)** ,解釋執行的時候,url中#號是用來指導瀏覽器動作的&am…

PyTorch導出JIT模型并用C++ API libtorch調用

PyTorch導出JIT模型并用C API libtorch調用 本文將介紹如何將一個 PyTorch 模型導出為 JIT 模型并用 PyTorch 的 CAPI libtorch運行這個模型。 Step1:導出模型 首先我們進行第一步,用 Python API 來導出模型,由于本文的重點是在后面的部署…

sqli-lab--writeup(7~10)文件輸出,時間布爾盲注

前置知識點: 1、outfile是將檢索到的數據,保存到服務器的文件內: 格式:select * into outfile “文件地址” 示例: mysql> select * into outfile ‘f:/mysql/test/one’ from teacher_class; 2、文件是自動創建…

樹莓派4B (aarch64) 安裝PyTorch 1.8 的可行方案

樹莓派4B (aarch64) 安裝PyTorch 1.8 的可行方案 最終可行方案 試了一堆方案(源碼編譯、Fast.ai的安裝文件等)之后,終于找到一個可行的方案。是在 PyTorch 官方討論社區的一個帖子中找到的,在回復中一個大佬給出了自己在2021年1…

sqli-lab———writeup(11~17)

less11 用戶名提交單引號顯示sql語法錯誤,故存在sql注入 根據單引號報錯,在用戶名和密碼任意行輸入 萬能密碼:‘ or 11# 輸入后username語句為:SELECT username, password FROM users WHERE username or 11; 雙引號 password語…

深入理解Python中的全局解釋鎖GIL

深入理解Python中的全局解釋鎖GIL 轉自:https://zhuanlan.zhihu.com/p/75780308 注:本文為蝸牛學院資深講師卿淳俊老師原創,首發自公眾號https://mp.weixin.qq.com/s/TBiqbSCsjIbNIk8ATky-tg,如需轉載請私聊我處獲得授權并注明出處…

sqli-lab————Writeup(18~20)各種頭部注入

less18 基于錯誤的用戶代理,頭部POST注入 admin admin 登入成功(進不去重置數據庫) 顯示如下 有user agent參數,可能存在注入點 顯示版本號: 爆庫:User-Agent:and extractvalue(1,concat(0x7e,(select …

Python GIL

轉自:https://blog.csdn.net/weixin_41594007/article/details/79485847 Python GIL 在進行GIL講解之前,我們可以先回顧一下并行和并發的區別: 并行:多個CPU同時執行多個任務,就好像有兩個程序,這兩個程序…

sqli-lab——Writeup21~38(各種過濾繞過WAF和)

Less-21 Cookie Injection- Error Based- complex - string ( 基于錯誤的復雜的字符型Cookie注入) base64編碼,單引號,報錯型,cookie型注入。 本關和less-20相似,只是cookie的uname值經過base64編碼了。 登錄后頁面:…

Libtorch報錯:terminate called after throwing an instance of ‘c10::Error‘ what():isTensor()INTERNAL ASS

Libtorch報錯:terminate called after throwing an instance of ‘c10::Error’ what(): isTensor() INTERNAL ASSERT FAILED 報錯 問題出現在筆者想要將 yolov5 通過 PyTorch 的 C 接口 Libtorch 部署到樹莓派上。 完整報錯信息: terminate called …

sqli-lab——Writeup(38~over)堆疊等......

知識點: 1.堆疊注入原理(stacked injection) 在SQL中,分號(;)是用來表示一條sql語句的結束。試想一下我們在 ; 結束一個sql語句后繼續構造下一條語句,會不會一起執行?因此這個想法…

mysql常規使用(建立,增刪改查,視圖索引)

目錄 1.數據庫建立 2.增刪改查 3.視圖建立: 1.數據庫建立 mysql> mysql> show databases; ----------------------------------- | Database | ----------------------------------- | information_schema | | ch…

php操作mysql數據庫

phpmyadmin phpadmin是一個mysql圖形化管理工具,是一款實用php開發的mysql苦戶端軟件,基于web跨平臺的管理系統,支持簡體中文,官網:www.phpmyadmin.net可以下載免費最新版。提供圖形化操作界面,完成對mysq…

C:C++ 函數返回多個參數

C/C 函數返回多個參數 轉自:https://blog.csdn.net/onlyou2030/article/details/48174461 筆者是 Python 入門的,一直很困惑 C/C 中函數如何返回多個參數。 如果一個函數需要返回多個參數,可以采用以下兩種方法: 傳引用或指針…

sql預編譯

一.數據庫預編譯起源: 數據庫接受sql語句,需要解析和制定執行,中間需要花費一段時間. 有時候同一語句可能會多次執行, 那么就會造成資源的浪費 如何減少編譯執行的時間 ? 就有了預編譯,預編譯是將這類語句提前用占位符替代,一次編譯,多次執行. 預編譯后的執行代碼會被緩存下來…