深度學習模型轉換技術
目前的轉換技術在設計思路上主要存在兩種差異,一種是直接將模型從現有框架轉換為適合目標框架使用的格式,我們在這稱此技術為直接轉換技術;另外一種是針對深度學習設計一種開放式的檔案規範,而主流深度學習框架最終都能實現對這種規範標準的支援,這種技術的代表是開放式神經網路切換框架——onnx技術。
2.1 直接轉換技術
轉換器實現模型檔案轉換的基本原理涉及一下幾步:
讀取載入a框架生成的模型檔案,讀取並識別模型網路中的張量資料的型別/格式、運算單元的型別和引數、計算圖的結構和命名規範,以及它們之間的其他關聯資訊。
將第一步識別得到的模型結構和模型引數資訊翻譯成b框架支援的**格式,比如b框架指pytorch時,relu啟用層(運算單元)這一資訊可翻譯為torch.nn.relu()。當然,運算單元較為複雜時(特別是帶較多引數的情況),可在轉換器中封裝乙個對應的運算單元轉換函式來實現b框架的運算單元骨架。
在b框架下儲存模型,即可得到b框架支援的模型檔案。
轉換器如能將現有模型檔案直接轉換為生產環境支援的格式,這在操作上會給使用者帶來很大的便利。但因市面上存在的深度學習框架眾多(超過10種),目前還沒有一種轉換器能夠實現所有模型檔案之間的轉換。我在這列出部分可實現不同框架遷移的模型轉換器,如圖7所示。更完整的列表請參考:
可以看出,目前既有機構,也有個人開發一些特定場景的模型轉換器。其中最有名的模型轉換器當屬微軟於2023年開源的mmdnn框架。下面我將多花點篇幅來介紹這個框架。
圖7 不同模型檔案的轉換器
mmdnn實質上是一套用於轉換、視覺化深度神經網路模型的綜合性解決方案。mmdnn中的「mm」代表模型管理,「dnn」的意思是深度神經網路,它能夠通過中間表徵格式讓訓練模型在caffe、keras、mxnet、tensorflow、cntk、pytorch和coreml等深度學習框架之間轉換(如圖8所示),幫助開發者實現模型在不同框架之間的互動。mmdnn主要有以下特徵:
模型檔案轉換器,不同的框架間轉換dnn模型
模型**片段生成器,生成適合不同框架的**
模型視覺化,dnn網路結構和框架引數視覺化
模型相容性測試(正在進行中)
圖8 mmdnn系統目前支援的深度學習框架
需要強調的是,強如背靠微軟的mmdnn轉換器,也僅支援部分模型的轉換,具體原因我們在3.3節有作較為詳細闡述。mmdnn在一些imagenet模型上有做測試(如圖9所示),但官方沒有提及nlp專案上的測試情況。閱讀一些模型轉換器文件列出的運算單元支援表發現, mmdnn尚不支援一些較新的運算單元,比如prelu、bottleneck、batchnormalization等,而諸如bilstm、mask等自然語言常用的operators更是缺乏,可以推斷,僅僅依靠mmdnn的原始骨架,只能完成小部分的模型轉換。
圖9 mmdnn在一些imagenet模型上測試的結果
圖10 onnx支援的框架和轉換器
2.2.2 onnx結構規範
(此部分內容大部分直譯官方文件:
模型結構的主要目的是將元資料(meta data)與圖形(graph)相關聯,圖形包含所有可執行元素。首先,讀取模型檔案時需使用元資料,實現提供所需的資訊,以確定它是否能夠執行模型、生成日誌訊息、錯誤報告等功能。此外元資料對工具很有用,例如ide和模型庫,它需要它來告知使用者給定模型的目的和特徵。
每個model具有以下元件:
2.2.2.1 onnx運算單元集
每個模型必須明確命名運算單元,命名方式依賴於運算單元的功能。運算單元集定義可用的操作符、版本和狀態。所有模型都隱式匯入預設的onnx運算單元集。
運算單元集的屬性:
2.2.2.2 onnx運算單元
運算單元定義的屬性:
2.2.2.3 onnx序列化圖(graph)
序列化圖由一組元資料字段(metadata),模型引數列表(a list of model parameters,)和計算節點列表組成(a list of computation nodes)。每個計算資料流圖被構造為拓撲排序的節點列表,這些節點形成圖形,其必須是無迴圈的。 每個節點代表對運算單元的呼叫。 每個節點具有零個或多個輸入以及乙個或多個輸出。
圖表具有以下屬性:
每個圖形必須定義其輸入和輸出的名稱和型別,它們被指定為「值資訊」結構,具有以下屬性:
2.2.2.4 圖的命名規範
所有名稱必須遵守c識別符號語法規則。節點,輸入,輸出,初始化器和屬性的名稱被組織到多個命名空間中。在命名空間內,每個給定圖形的每個名稱必須是唯一的。
2.2.2.5 標準化資料型別
資料型別存在兩種官方的onnx變體,兩者在支援的資料型別和支援的運算單元中存在區別。對於支援的資料型別,onnx定義只識別張量作為輸入和輸出型別。而經典的機器學習擴充套件——onnx-ml,還可識別序列和maps。對於計算圖graph和節點node的輸入和輸出、計算圖的初始化,onnx支援 原始數字、字串和布林型別,但必須用作張量的元素。
張量元素型別:
其他規範如input / output data types、attribute types等都在官網上有申明,這裡就不再羅列了。
2.2.3 onnx支援的運算單元(operator)
onnx擁有非常明確的、嚴格的神經網路框架標準,並且擁有非常詳細的官方文件。此外,它還支援非常多的運算單元,而且還在高頻地增加新的operators。目前官網列出的operators已達134種,具體名單請參考:
2.2.4 新增operator
onnx支援使用者新增operator,以解決特殊場景特殊模型的轉換,並給出新增operator的規範步驟:
深度學習baseline模型 深度學習模型訓練流程
工作中訓練了很多的深度學習模型,目前到了上公升到方 的角度來看了。日常工作中有的人可能已經在遵循方 做事,可能自己沒有注意,有的人可能沒有遵循方 在做事,雖然可能最後的結果差不多,但花費的時間和精力應該會差別很大,當然這是我自己的感受。我們不必完全按照方 來做,但基本流程跟方 應該一致。下面的具體步...
深度學習模型
深度學習常用方法 深度置信網路 dbn 概率生成模型,生成資料 卷積神經網路 cnn 判別模型,處理二維圖 卷積深度置信網路 cdbn 兩者的結合 迴圈神經網路 rnn 與時間序列有關的 對抗神經網路 gan 兩個網路的零和遊戲,乙個網路用來判別,乙個網路用來生成 自動編碼器 vae 生成模型 深度...
深度學習模型儲存 深度學習分布式模型
背景 隨著各大企業和研究機構在pytorch tensorflow keras mxnet等深度學習框架上面訓練模型越來越多,專案的資料和計算能力需求急劇增加。在大部分的情況下,模型是可以在單個或多個gpu平台的伺服器上執行的,但隨著資料集的增加和訓練時間的增長,有些訓練需要耗費數天甚至數週的時間,...