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