微軟Facebook聯手發布AI生態系統,推出 Open Neural Network Exchange(ONNX,開放神經網絡交換)格式,這是一個用于表示深度學習模型的標準,可使模型在不同框架之間進行轉移。ONNX是邁向開放生態系統的第一步,歐洲主要代理 德國服務器,AI開發人員可以輕松地在最先進的工具之間轉換,并選擇最適合他們的組合。但是,現在系統支持的框架只有Caffe2,PyTorch 和Cognitive Toolkit ,谷歌的TensorFlow并沒有被包含在內。在TensorFlow的市場份額迅猛增長的當下,兩家企業的聯手,似乎有特別的意味。
Facebook 和微軟宣布,推出 Open Neural Network Exchange(ONNX,開放神經網絡交換)格式,這是一個用于表示深度學習模型的標準,可使模型在不同框架之間進行轉移。ONNX是邁向開放生態系統的第一步,AI開發人員可以輕松地在最先進的工具之間轉換,并選擇最適合他們的組合。
在開發學習模型時,工程師和研究人員有許多AI框架可以選擇。在項目開始時,開發人員必須選擇對應一個框架的特征(features)。很多時候,在研發過程中進行實驗時選擇的 feature 與生產所需的 feature 是不一致的。許多組織都沒有很好的方法來消除這些操作模式之間的差距,只有采取一系列創造性的解決辦法來應對,例如要求研究人員在生產系統中工作或人工翻譯模型。
Facebook 與微軟一起開發了 ONNX,以彌合這一差距,讓AI開發人員可以選擇符合項目當前階段的框架,并隨著項目的發展輕松切換框架。Caffe2,PyTorch 和Cognitive Toolkit 將在9月份發布對 ONNX 的支持,這將允許在其中一個框架訓練的模型導出到另一個框架來進行推理。我們邀請社區加入這一努力,并在其生態系統中支持ONNX。實現不同框架之間的相互操作性,簡化從研究到生產的過程,將有助于提高AI社區創新的速度。
ONNX 在 Facebook 內部使用
ONNX 是 Facebook 深度學習方法的重要組成部分。在Facebook的AI團隊(FAIR和AML)中,我們不斷嘗試推動AI的前沿研究,開發更好的學習算法。當我們得到一個突破時,我們希望盡快在應用中提供更好的技術。通過ONNX,我們專注于將AI研究和產品實現更緊密地結合在一起,從而更快地進行創新和部署。
嘗試新模型的人們,特別是研究人員,希望在編寫神經網絡時擁有最大的靈活性和表現力——從動態神經網絡到支持梯度漸變(gradients of gradients),同時保持基本的ConvNet性能。研究人員也想實現快速迭代,這意味著他們需要優秀的交互式開發和調試工具。PyTorch旨在突破研究框架的局限,使研究人員免受平臺的限制,讓他們能夠比以前更容易地表達想法。
相反,產品流程每天都需要對大量新的數據進行訓練和推理,同時保持模型大部分不變。仔細優化產品的特定模型的代碼,例如通過量化和仔細編寫人工調整的代碼(hand-tuned code)之類的技巧節省資源。Caffe2已經在產品、移動和極端考慮性能的情況構建起來。Caffe2的內部靈活而且高度優化,所以我們可以利用技巧將更大更好的模型部署到性能不足的硬件中。
通過 ONNX,我們可以在這兩個方面獲得最優。我們現在可以從PyTorch導出許多常見神經網絡的模型,并將它們部署在Caffe2上。這是將最新的研究成果快速推向生產的第一步。在接下來的幾個月中,我們將加強ONNX,并對Caffe2和PyTorch進行改進,使其能夠更深入地互通。
怎么運行
為了實現ONNX支持,我們必須對PyTorch和Caffe2進行更改,并且在框架之間統一運算符。在Caffe2中,這個過程類似于添加一個翻譯器,因為Caffe2已經有一個內置的靜態圖。在PyTorch中,神經網絡是被定義為程序而不是顯式圖,因此這帶來了更大的挑戰。為了從程序中提取圖,我們開發了一個跟蹤器,東莞電信服務器 河南電信服務器,將運行時程序執行的操作記錄下來。跟蹤程序消除了復雜性,并使其更容易轉換為圖表示。
要了解它是如何工作的,看以下代碼:
x = y * 2
if someComplicatedFunction(): z = x + y
else: z = x * y
要直接導出此代碼,ONNX將不得不支持conditionals和某些復雜函數 someComplicatedFunction();實際上成了通用編程語言。然而,在許多深度學習模型中,someComplicatedFunction() 的結果在推理過程中總是相同的。例如,在PyTorch條件中,通常是對輸入張量的大小或尺寸進行的一些計算。在這些情況下,通過代碼的單一跟蹤將會更簡單,并且可以輕松地在ONNX中表示為:
#someComplicatedFunction() == True
x = y * 2 z = x + y