AI開(kāi)發(fā)面臨碎片化 深度學(xué)習(xí)框架要統(tǒng)一
人工智能繁榮發(fā)展的背后是各大廠商暗戰(zhàn)的開(kāi)始,大家都在為了爭(zhēng)搶開(kāi)發(fā)者推出各自的深度學(xué)習(xí)開(kāi)發(fā)框架,而隨著應(yīng)用在不同場(chǎng)景下的關(guān)聯(lián)性越來(lái)越強(qiáng),碎片化的框架也對(duì)開(kāi)發(fā)人員造成了困擾,開(kāi)發(fā)框架需要統(tǒng)一。
AI開(kāi)發(fā)面臨碎片化 深度學(xué)習(xí)框架要統(tǒng)一(圖片來(lái)自FactorDaily)
深度學(xué)習(xí)的優(yōu)勢(shì)在于,利用非監(jiān)督式或半監(jiān)督式的特征學(xué)習(xí)、分層特征提取高效算法去替代傳統(tǒng)的人工獲取特征。為此,微軟、谷歌、亞馬遜等IT巨頭都在圍繞深度學(xué)習(xí)投資項(xiàng)目、開(kāi)發(fā)框架工具,CNTK、TensorFlow、MXNet背后均有著這些企業(yè)的力挺。除此之外,Caffe、Torch、Theano也是比較流行的開(kāi)發(fā)框架。
對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),使用這些框架的特性和功能各有不同,應(yīng)用場(chǎng)景也可能是算機(jī)視覺(jué)、語(yǔ)音識(shí)別、自然語(yǔ)言處理與生物信息學(xué)等等。以TensorFlow來(lái)說(shuō),使用者不再需要通過(guò)反向傳播求解梯度,這點(diǎn)和Theano類似,而且在設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)時(shí),也不用耗費(fèi)過(guò)多精力去寫C++或者CUDA代碼。
在使用過(guò)程中,C++在線上部署的復(fù)雜度方面有所降低,而且讓手機(jī)、平板、穿戴設(shè)備等對(duì)處理資源占用密集的終端可以運(yùn)行更為復(fù)雜的模型,要知道相比之下Python的資源損耗還處在相對(duì)較高的水平。借此,開(kāi)發(fā)者就能在硬件性能相對(duì)足夠的機(jī)器中,即使是用Python也可以獲得在低延遲狀態(tài)下、嵌入式環(huán)境中使用C++的能力。當(dāng)然TensorFlow也有其問(wèn)題,比如異類設(shè)備之間的通信優(yōu)化仍需完善。
Theano可以說(shuō)是最古老的同類庫(kù)之一,也是最初深度學(xué)習(xí)的主導(dǎo)標(biāo)準(zhǔn)之一,其流行程度可以讓用戶在上面找到各種常見(jiàn)問(wèn)題,包括如何去存儲(chǔ)、運(yùn)行訓(xùn)練模型,在單GPU方面執(zhí)行效率也算是還不錯(cuò)的水平。而且基于Theano,也衍生出了大量的深度學(xué)習(xí)庫(kù),像Keras對(duì)神經(jīng)網(wǎng)絡(luò)的抽象就可以對(duì)執(zhí)行后端隨意切換。
不過(guò)考慮到Theano缺乏底層C++的接口,導(dǎo)致部署起來(lái)并不方便,在工業(yè)生產(chǎn)環(huán)境的應(yīng)用幾乎鮮有。因此,很多人都是將其視為研究工具,而不是最終的產(chǎn)品,在CPU上的低性能也有這方面的阻礙。所以這種框架更像是一個(gè)原始語(yǔ)言,如果直接用其設(shè)計(jì)神經(jīng)網(wǎng)絡(luò),或者去讀它的輸出信息,對(duì)開(kāi)發(fā)者是畢竟痛苦的事情。
此外,Caffe、Deeplearning4J等也有著各自的問(wèn)題,這里就不一一贅述了。由此也引申出了開(kāi)發(fā)者到底該如何選擇深度學(xué)習(xí)的開(kāi)發(fā)平臺(tái)?這里列出了幾個(gè)考察點(diǎn):首先,多數(shù)公司的AI架構(gòu)不是從0起步,對(duì)既有編程平臺(tái)的整合難度不能忽視;其次,對(duì)機(jī)器學(xué)習(xí)軟件包和數(shù)據(jù)處理的難度也要尋求兼容;再有,二次開(kāi)發(fā)能力同樣關(guān)鍵,有了分布式、多GPU的優(yōu)化能力,如何在其他平臺(tái)上發(fā)揮作用,這是要思考的事情。
通過(guò)對(duì)比主流的幾款深度學(xué)習(xí)開(kāi)發(fā)框架,可以看到底層語(yǔ)言用C++(Caffe、MXNet、CNTK、TensorFlow)和C(Torch)的占有大多數(shù),這也是當(dāng)前來(lái)看最有效率的,像Python則是有望成為下一代的平臺(tái)語(yǔ)言,這也是像微軟在CNTK 2.0中所努力的方向。
從生態(tài)的角度來(lái)看,各家的框架多少還存在著分戰(zhàn)隊(duì)的情況。開(kāi)發(fā)者需要在各自的平臺(tái)上做各自的開(kāi)發(fā),而且這些框架在更新時(shí)并不是統(tǒng)一的,也就是說(shuō)開(kāi)發(fā)者在一個(gè)框架上開(kāi)發(fā)的神經(jīng)網(wǎng)絡(luò)模型,并不能直接在另一個(gè)框架上用。要想讓二者實(shí)現(xiàn)兼容,開(kāi)發(fā)者需要花費(fèi)很大的精力去自行解決。
為了解決這一問(wèn)題,需要微軟、谷歌這樣掌握開(kāi)發(fā)者“主權(quán)”的企業(yè)站出來(lái),借助兼容框架去統(tǒng)一開(kāi)發(fā)者的使用體驗(yàn),ONNX(開(kāi)放神經(jīng)網(wǎng)絡(luò)交換)就是在這個(gè)思路下成立的,這是由微軟共同發(fā)起的一個(gè)項(xiàng)目,參與者有Facebook、AWS這樣的軟件廠商,也有AMD、ARM、華為、IBM、英特爾、高通這樣的產(chǎn)業(yè)參與者。比如說(shuō)有了ONNX,開(kāi)發(fā)者可以把在PyTorch訓(xùn)練的模型直接放到Caffe2上推理。
幾乎每隔2-4個(gè)月就會(huì)有ONNX的升級(jí),例如其中會(huì)新增一些運(yùn)算符幫助用戶創(chuàng)建新的模型。事實(shí)上,現(xiàn)在微軟的主流產(chǎn)品Bing、廣告和Office,還有視覺(jué)服務(wù),基本上后臺(tái)都在用ONNX。在此基礎(chǔ)之上,微軟還發(fā)布了ONNX Runtime,插件式的執(zhí)行者界面意味著ONNX Runtime可以快速適應(yīng)軟件和硬件的改進(jìn)。執(zhí)行者界面是硬件加速器向ONNX Runtime報(bào)告其性能的標(biāo)準(zhǔn)方式。英特爾、英偉達(dá)都在將ONNX Runtime整合到他們的硬件加速器中,目前,英特爾的MKL-DNN、nGraph編譯器以及英偉達(dá)優(yōu)化的TensorRT推理引擎都已完成整合。
就在ONNX吸納更多開(kāi)源框架的過(guò)程中,也并不是所有廠商的態(tài)度都那么趨同,像TensorFlow對(duì)ONNX的興趣就沒(méi)有那么明朗。事實(shí)上,微軟也寫了從TensorFlow到ONNX的轉(zhuǎn)化器,通過(guò)這樣的一種轉(zhuǎn)化的功能,可以實(shí)際上將很多TensorFlow下面的這些模型轉(zhuǎn)移到ONNX來(lái)。除此之外,ONNX還支持一些非常高級(jí)別、或者說(shuō)特別的運(yùn)算符,比如LSTM,這些運(yùn)算符主要是用來(lái)支持一些語(yǔ)音和語(yǔ)言方面的功能。
如果想在AI領(lǐng)域當(dāng)中獲得成功,就必須將硬件和軟件都結(jié)合起來(lái),因此需要ONNX這樣的橋梁,過(guò)去不同的接口和界面為開(kāi)發(fā)者帶來(lái)了很大的困惑,而ONNX這可以使硬件和應(yīng)用有機(jī)結(jié)合起來(lái),在云端、本地、邊緣等任意一個(gè)環(huán)境實(shí)現(xiàn)部署。由此來(lái)看AI開(kāi)發(fā)框架統(tǒng)一勢(shì)在必行。