大家好。我叫Manav Dalal,今天我將講解如何通過新的ONNX導出器簡化模型導出流程。如果你還沒有聽說過ONNX,它是一種用于表示機器學習模型的開放格式。它定義了一套通用的運算符,機器學習和深度學習模型的基本原理,并提供了一個通用的文件格式,因此你可以保存并與各種工具一起使用,這樣你就可以在你喜歡的框架中進行開發而且不用太擔心與其相關的推理邏輯。
另一個很棒的地方是它真正解鎖了許多硬件優化,無論你是在處理網絡、NPU、GPU、CPU,還是其他任何設備,你都可以從ONNX訪問你的模型。這是一些可以導出onnx的合作伙伴:
簡單回顧一下自PyTorch 1.2以來的情況。我們使用torch.onnx.export API導出到Onnx模型。這個舊api有很多問題,通過Torch Script tracing(torch.jit.trace)可以在模型執行時生成靜態圖。雖然這樣可以工作,但靜態圖存在很多限制。如果您有控制流程如if語句和循環,它在處理這些內容時就會表現很差。此外,它也不能很好地處理 training 和 eval 之間的細微差別。它也無法處理真正動態的輸入。
現在,我們已經有了一些解決方案如torch.jit.script(比如對控制流問題的解決)Torch.jit.script本身是Python的一個子集,因此雖然有一對一的映射,但并非所有內容都有映射…因此,有時會忽略諸如原地操作之類的東西。
但接下來我們有了新的方式——Torch Dynamo。簡而言之,在2.0版本中,它被視為一種JIT編譯器,旨在加速未修改的PyTorch程序,從而實現可用性和性能的提升。它通過重寫Python字節碼,在FX圖中獲取PyTorch操作的部分,并使用它來獲得我們想要的所有這些巨大的性能提升。它也是Torch Compile、Torch Export的基礎引擎,
今天我要談論的是新的ONNX Exporter。我們推出的一個目前還在測試階段的新導出器。也許你們中的一些人已經使用過它,也可能有一些人還沒用過。今天我在這里希望能夠說服你們至少去試一試。它看起來有點類似于舊的API,但稍微復雜一些。你可以使用你的Torch.nn模塊以及與該模塊相關的參數進行導出(無論是位置參數還是關鍵字參數)。還有一個新的參數導出選項,你可以直接添加一些相對具體的參數。通過利用Dynamo來捕捉graph,我們可以更容易地生成與該圖形等效的ONNX,并且可以保留這些模型的動態特性。相對于以前的靜態圖,現在我們可以擁有動態圖,我們可以用它們來獲得一系列的好處。此外,onnx函數現在被用于封裝ATen運算符和nn.modules,這對于導出后的onnx轉換和lowering操作非常有用,可以去除復雜性,直接在onnx模型中保留更多語義和結構信息,這可以在許多常見的優化場景中用于子圖模式匹配。讓我給你展示一個的例子。
你可以在這里看到不同的圖表。左側是舊的靜態圖表,這是可以的,在導出模型時工作正常,并且在某種程度上也經過了優化。但是,在中間,你可以看到現在的torch dynamo圖表是什么樣的。有更多的信息,并且所有的操作符都被捕捉在函數中。這真的很有用,因為實際上它們內聯之后,你可以看到捕捉到了更多的信息。支持了許多數據類型。這是所有操作符支持的數據類型,而不僅僅是你用于導出模型的那個數據類型。這對于之后的優化非常有用。你只會得到更多的信息。
新的torch.onnx.dynamo導出API通過可選的ExportOptions支持配置。值得注意的屬性包括: .onnxregistry:配置ATen分解,指定ATen IR到onnx運算符的映射,并提供API來支持三種主要的自定義運算場景。 -處理不支持的ATen運算符(缺少的運算符)。 - custom operators 但是有已存在的onnx runtime support。 - custom operators 但是沒有已存在的onnx runtime support。 .fake context:torch.onnx.enablefakemode()的結果是一個上下文管理器,它啟用了導出大規模模型的虛擬模式輸入支持,這些模型通常會在使用TorchScript導出時內存溢出。 diagnostic options:導出器中深度融入了一個新的診斷系統,以提高調試能力和自助服務能力。 它返回一個ExportOutput對象,通過該對象可以進一步通過.model proto屬性進行推理或轉換,或者通過.save(path)方法直接將內存中的onnx模型序列化到磁盤以方便使用。
因此,讓我們談談我們開發的這個新API的亮點,希望你們能夠使用。正如我之前提到的,我們有可選的導出選項,并且你可以用它做很多事情。首先,有onnx注冊表,它允許你配置Aten分解,你可以為Onnx運算符預設AtenIR并進行映射,并提供API用于處理一些常見情況,比如處理不支持的A10運算符、具有現有OR支持的自定義運算符以及在Onnx運行時不支持的自定義運算符。因此,在前兩種情況下,你可以提供這些運算符,并在Onnx腳本中自己編寫它們(稍后會介紹)。這有點像一門語言,但是你基本上可以編寫這些語言或運算符,并指定它們如果不可用時應該如何編寫出來。在第三種情況下,你不僅可以編寫自定義運算符,還可以編寫所需注冊的ORT內核。
我們還有fake上下文,這要歸功于meta的虛假tensor。我們可以在不加載所有權重和運行模型的情況下導出模型。你知道,計算在如今是十分昂貴的,而且很難總是獲得足夠的計算資源來完成我們需要使用這些模型的任務,但是有了fake上下文,我們就能夠做到。我們可以在所需設備準備好可以使用的ONNX模型,而無需花費可能多達幾分鐘的時間導出該模型。我們知道之前在大型模型方面,特別是最近大家都在談論的LLAMA模型方面,使用Torch腳本導出器時會遇到問題。這是一個龐大的模型,是的,我們會遇到內存問題,但是有了fake上下文,你就不必遇到這些問題了。我們還注意到,以前的Torch腳本導出器在調試能力和自助能力方面并不好,因此,在現在有很多診斷和自助能力選項,所以當你遇到錯誤時(因為現在仍處于測試階段),很容易弄清楚該怎么做或如何解決這些錯誤。這是我們非常關注的問題,我們確實在意這個,現在,在你選擇的模型上運行導出之后,你會得到ExportOutput對象。這是一個存在于內存中的對象,你可以進行推理并通過獲取的模型 proto 屬性來進行操作。因此,你可以查看它,會有很好的選項來對他進行更改和性能更新。當然,你也可以像保存其他 Onnx 模型一樣將它保存到磁盤上,這個過程也非常簡單??傊?,效果非常好。OnnxScript 是我之前提到的用于實現新操作的方式。幾個月前,它作為一個開放的倉庫宣布出來。你可能已經讀過相關博客,也可能沒有。簡而言之,它是一種符合慣用方式的簡單方法來編寫ONNX函數。
根據我的經驗,在以前使用Onnx時,這實際上是一件很具挑戰性的事情。我知道,像編寫自己的運算符一樣,這是一種痛苦的過程。但現在它非常簡單明了。這是一個希望你能夠閱讀的函數操作符。如果你可以,你會發現代碼相當直觀。這要歸功于OnnxScript讓它變得非常容易。它非常簡單明了,易于操作,而且對于那些不太精通技術的人來說也很易懂。所以整個過程都很容易上手。如果你選擇,你也可以直接使用OnnxScript完全編寫Onnx模型。這取決于你。但是,就像今天的演講中的其他人提到的一樣,我們將直接與Torch.export進行集成,
另外一個我提到的事情是,Onnx轉換和優化工具將很快推出,以幫助利用這些模型。我們希望這個工具能被很多運行環境使用,謝謝。下列是一些參考資料:
Installrequiredpackages: pipinstalltorchonnxscriptonnxruntime ExportaPyTorchModeltoONNX: Documentation:aka.ms/pytorchtoonnx ExtendingtheONNXRegistry: Documentation:aka.ms/onnx/registry APIDocsforONNXDynamo: Documentation:aka.ms/onnx/dynamo IntroducingONNXScript: Blog:aka.ms/onnxscript/blog1 ONNX: Officialwebsite:aka.ms/onnx ONNXRuntime: Documentation:aka.ms/onnxruntime ONNXScript: Documentation:aka.ms/onnxscript
審核編輯:湯梓紅
-
cpu
+關注
關注
68文章
10904瀏覽量
213023 -
模型
+關注
關注
1文章
3313瀏覽量
49226 -
機器學習
+關注
關注
66文章
8439瀏覽量
133087
原文標題:《PytorchConference2023 翻譯系列》11-使用新的ONNX導出器簡化模型導出
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論