在僅是學(xué)術(shù)圈里的計算機科學(xué)家和專門研究實驗室的研究興趣幾十年后,深度學(xué)習(xí)已經(jīng)廣泛地出現(xiàn)在現(xiàn)實世界的產(chǎn)品里。這一轉(zhuǎn)變帶來了多個令人激動的深度學(xué)習(xí)框架的出現(xiàn)。這些框架或是專注于支持快速原型化,或是專注于能大規(guī)模地高效開發(fā)部署應(yīng)用。對產(chǎn)品開發(fā)人員而言,如果是想對一個(深度學(xué)習(xí)的)想法先進行試驗而后再增強它,并最終能開發(fā)部署上線,一個單一的且統(tǒng)一支持這兩種過程的框架將會是有幫助的。
作為一個在2015年發(fā)布的開源的深度學(xué)習(xí)框架,Apache MXNet就是想要取得這樣的目標。我最近和亞馬遜的首席科學(xué)家Mu Li有了一次交談。作為MXNet的最初作者之一,Li還是《Parameter Server》(參數(shù)服務(wù)器)論文的第一作者,而參數(shù)服務(wù)器是讓MXNet擁有隨著處理能力增加而線性擴展能力的核心。他帶著我探索了MXNet框架的起源,以及他對“混合型”神經(jīng)網(wǎng)絡(luò)模式的看法。這種模式可以對一個項目從早期原型階段到后期大規(guī)模部署階段都支持。
MXNet是從計算機科學(xué)里面兩個典型的相反的目標中產(chǎn)生的:易用性和高性能。在深度學(xué)習(xí)里,聲明式的架構(gòu)可以帶來高性能:開發(fā)人員在高層次上指定一個神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),而由框架去實現(xiàn)低層次的原生的任務(wù)來用最有效的方法構(gòu)造網(wǎng)絡(luò)。
這種方式的缺點是這些聲明式的框架要求開發(fā)人員在最開始就要了解和指定神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),即它的計算圖。這就使得迭代會比較慢,給進行試驗帶來困難。對于一個特定的問題來找到最好的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)通常是(可討論)深度學(xué)習(xí)工程師的主要任務(wù)。在某些情況下,比如長短期記憶網(wǎng)絡(luò)(LSTM),神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)依賴于控制命令(那些循環(huán)和判斷命令),而這些命令是在數(shù)據(jù)真正進入網(wǎng)絡(luò)前無法進行評估的。因此開發(fā)人員就需要使用由框架提供的相同功能的語句,這就意味著擺弄很多低層代碼的活了。
聲明式的框架對于那些慣于使用試錯方法的開發(fā)人員而言可能也是反直覺的。這也是對深度學(xué)習(xí)的興趣暴增后出現(xiàn)的一個主要問題。因為很多深度學(xué)習(xí)的新手并沒有受過系統(tǒng)化的符號型線性代數(shù)的培訓(xùn),而是希望能通過主動的試驗來進行自學(xué)。
不過深度學(xué)習(xí)社區(qū)已經(jīng)通過引入一些命令式的框架(比如知名的PyTorch和Chainer)來響應(yīng)這種需求。這些框架可以一行一行地執(zhí)行代碼來讓開發(fā)人員使用復(fù)雜的控制命令去程序化和動態(tài)地改變神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。而這種模式的缺陷則是性能比較差。如果開發(fā)人員不能在運行網(wǎng)絡(luò)前指定網(wǎng)絡(luò)的整體結(jié)構(gòu),那么框架就沒法針對指定的硬件加速器(比如GPU)來預(yù)編譯網(wǎng)絡(luò)以獲得最佳性能。
Li說:“(命令式框架)的問題是很難對它做優(yōu)化,因為你永遠不知道下一條語句是什么。你沒法知道內(nèi)存里存放的結(jié)果是否會被再次使用,因此就很難獲得好的性能。不過這種模式的本意就是給那些想把代碼組裝到一起來搞快速原型化的人用的”。現(xiàn)在的結(jié)果就是深度學(xué)習(xí)的實現(xiàn)有時候會在預(yù)研階段使用命令式框架,而在開發(fā)生產(chǎn)階段使用聲明式框架。Li用Facebook作為一個例子。PyTorch和Caffe2(一個聲明式的框架)在Facebook都被使用。它用前者來進行探索,而用后者做產(chǎn)品開發(fā)。
Li和MXNet的開發(fā)團隊則采用了一個混合的方法。即用命令式編程來支持做試驗和原型化,隨后在進行大規(guī)模產(chǎn)品化時,無縫地把一些關(guān)鍵部分用聲明式模塊進行重構(gòu)?!拔覀兿M麨橛脩籼峁┮粋€單一的接口。你可以用命令式代碼開始,當想部署時,你可以混合化它們?!?,Li說。
在未來的幾年,開發(fā)人員會有更多的機會來在所有設(shè)備上運行快速的神經(jīng)網(wǎng)絡(luò)。今日的研究人員依賴于裝備GPU的電腦或是云服務(wù)來加速神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。目前NVIDIA的GPU完全主導(dǎo)了深度學(xué)習(xí)的硬件領(lǐng)域,不僅僅是因為它的速度快,還因為CUDA(GPU的編程接口)和cuDNN(NVIDIA的深度學(xué)習(xí)庫)被深度學(xué)習(xí)框架廣泛地支持。這些框架通過編譯神經(jīng)網(wǎng)絡(luò)的代碼來使用cuDNN的提供的函數(shù),從而讓神經(jīng)網(wǎng)絡(luò)能在NVIDIA的GPU上高效地運行。
研究人員預(yù)見,在未來神經(jīng)網(wǎng)絡(luò)會在“邊緣”設(shè)備(如手機和嵌入式系統(tǒng))上進行推斷和訓(xùn)練這兩個動作。這可能會面對大量的設(shè)備,從高端的手機到低配的IoT(物聯(lián)網(wǎng))設(shè)備(還請別忘了那些老舊的設(shè)備,很多現(xiàn)在在用的設(shè)備會在未來的十年里依然被使用)。在這些設(shè)備上,神經(jīng)網(wǎng)絡(luò)沒法依賴高端的GPU了。相反,他們可能要使用專門設(shè)計定制的現(xiàn)場可編程門陣列(FPGA)或是專用集成電路(ASIC),甚至是使用目前就存在的數(shù)字信號處理器(DSP)。
這意味著隨著不同設(shè)備的大量出現(xiàn),深度學(xué)習(xí)框架都需要去支持它們。框架的作者不可能為每種可用的加速器去寫擴展;相反,他們需要關(guān)注于通用的編譯器,讓它能識別任何加速器硬件,并編譯神經(jīng)網(wǎng)絡(luò)來高效地運行在它們上面。
在下個月或差不多的時間,MXNet會發(fā)布它的通用編譯器,允許開發(fā)人員在任何加速器(從高端的GPU到便宜的DSP以及手機上的專用處理器)上開發(fā)運行神經(jīng)網(wǎng)絡(luò)。Li說這個編譯器初始會對早期的用戶進行開源。
本文是O’Reilly和Amazon的合作的部分產(chǎn)物。請查看我們的編輯獨立聲明。
Jon Bruner
Jon Bruner負責O'Reilly在硬件、物聯(lián)網(wǎng)、制造業(yè)和電子行業(yè)的出版物。他一直和Joi Ito一起作為O'Reilly Solid大會的內(nèi)容主席。這個大會關(guān)注于軟件和物理世界間的溝通與交互。 在加入O'Reilly之前他是《福布斯》雜志的數(shù)據(jù)編輯。在《福布斯》他結(jié)合寫作和編程來報道很多主題,從哥倫比亞河上的大壩到美國國內(nèi)移民。他在芝加哥大學(xué)學(xué)習(xí)數(shù)學(xué)和經(jīng)濟學(xué),并定居在舊金山。在那里你可能偶爾會看到他表演管風琴。

