來源:北大青鳥總部 2023年04月18日 10:21
人工智能的飛躍式發(fā)展與機(jī)器學(xué)習(xí)算法的進(jìn)步緊密相連,而深度學(xué)習(xí)則是實(shí)現(xiàn)機(jī)器學(xué)習(xí)的核心技術(shù)。開展深度學(xué)習(xí)相關(guān)項(xiàng)目,選擇合適的深度學(xué)習(xí)框架是相當(dāng)重要的,合適的深度學(xué)習(xí)框架可以節(jié)省很多重復(fù)的工作。
值得注意的是,當(dāng)前并沒有完美的深度學(xué)習(xí)框架,因此從眾多主流的深度學(xué)習(xí)框架中選擇適合自身項(xiàng)目的框架并非易事。為助力大家選擇合適的框架,本文在回顧近十種常見框架的基礎(chǔ)上,聚焦當(dāng)前受眾最廣、熱度最高的兩種深度學(xué)習(xí)框架TensorFlow和PyTorch。讓大家對這種深度學(xué)習(xí)框架有一個全面清晰地了解。
技術(shù)應(yīng)用的普及與技術(shù)的高效實(shí)現(xiàn)密不可分,深度學(xué)習(xí)框架通過將深度學(xué)習(xí)算法模塊化封裝,能夠?qū)崿F(xiàn)訓(xùn)練、測試、調(diào)優(yōu)模型的快速搭建,為技術(shù)應(yīng)用的預(yù)測與落地的決策提供有力支持。當(dāng)前人工智能生態(tài)的朝氣蓬勃與深度學(xué)習(xí)框架的百家齊放,可謂相輔相成,相互成就。
當(dāng)前流行的深度學(xué)習(xí)框架主要包括TensorFlow、PyTorch、Keras、PaddlePaddle、CNTK、MXNet、DeepLearning4J、Theano、Chainer等,具體如下表所示。
TensorFlow的前身是2011年GoogleBrain內(nèi)部孵化項(xiàng)目DistBelief,這是一個為深度神經(jīng)網(wǎng)絡(luò)構(gòu)建的機(jī)器學(xué)習(xí)系統(tǒng)。經(jīng)過Google內(nèi)部的錘煉后,在2015年11月9日,以ApacheLicense2.0的開源協(xié)議對外發(fā)布了TensorFlow,并于2017年2月發(fā)布了1.0.0版本,這標(biāo)志著TensorFlow穩(wěn)定版的誕生。2018年9月TensorFlow1.2版本發(fā)布,將Keras融入TensorFlow,作為TensorFlow的高級API,這也標(biāo)志著TensorFlow在面向數(shù)百萬新用戶開源的道路上邁出重要的一步。2019年9月正式發(fā)布TensorFlow2.0 版本,緊接著在11月,公布了TensorFlow2.1 的RC版本,兼容之前的流行庫,并還引入了眾多新庫,使得TensorFlow的功能空前強(qiáng)大。
相比較而言,PyTorch則比較年輕。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch,并于2018年5月正式公布PyTorch1.0 版本,這個新的框架將PyTorch0.4 與賈揚(yáng)清的Caffe2合并,并整合ONNX格式,讓開發(fā)者可以無縫地將AI模型從研究轉(zhuǎn)到生產(chǎn),而無需處理遷移。最新版PyTorch1.3 于2019年10月上線,更新增加了很多的新特性,包括無縫移動設(shè)備部署、量化模型以加速推斷、前端改進(jìn)(如對張量進(jìn)行命名和創(chuàng)建更干凈的代碼)等,PyTorch官方同時還開源了很多新工具和庫,使得PyTorch的眾多功能向TensorFlow趨同,同時保有自身原有特性,競爭力得到極大增強(qiáng)。
一個良好的深度學(xué)習(xí)框架應(yīng)該具備優(yōu)化的性能、易于理解的框架與編碼、良好的社區(qū)支持、并行化的進(jìn)程以及自動計(jì)算梯度等特征,TensorFlow和PyTorch在這些方面都有良好的表現(xiàn),為了更為細(xì)致地比較兩者之間的差異優(yōu)勢,下面將對最新版TensorFlow2.0 版本和PyTorch1.3 版本先從運(yùn)行機(jī)制、訓(xùn)練模式、可視化情況、生產(chǎn)部署等方面進(jìn)行差異比較,然后再通過細(xì)化特征進(jìn)行定性比較,最后歸類對應(yīng)適用場景的建議。
運(yùn)行機(jī)制
兩個框架都是使用張量進(jìn)行運(yùn)算,并將任意一個模型看成是有向非循環(huán)圖(DAG),但TensorFlow遵循“數(shù)據(jù)即代碼,代碼即數(shù)據(jù)”的理念,當(dāng)在TensorFlow中運(yùn)行代碼時,DAG是以靜態(tài)方式定義的,若需要實(shí)現(xiàn)動態(tài)DAG,則需要借助TensorFlowFold 庫;而PyTorch屬于更Python化的框架,動態(tài)DAG是內(nèi)置的,可以隨時定義、隨時更改、隨時執(zhí)行節(jié)點(diǎn),并且沒有特殊的會話接口或占位符,相當(dāng)靈活。此外,在調(diào)試方面,由于PyTorch中的計(jì)算圖是在運(yùn)行的時候定義的,因此使用者可以使用任何一個喜歡的調(diào)試工具,比如PDB、IPDB、PyCharm調(diào)試器或者原始的print語句;而TensorFlow并不能這樣,它需要借助特殊的調(diào)試工具tfdbg才能進(jìn)行調(diào)試。
訓(xùn)練模式
在分布式訓(xùn)練中,TensorFlow和PyTorch的一個主要差異特點(diǎn)是數(shù)據(jù)并行化,用TensorFlow時,使用者必須手動編寫代碼,并微調(diào)要在特定設(shè)備上運(yùn)行的每個操作,以實(shí)現(xiàn)分布式訓(xùn)練;而PyTorch則是利用異步執(zhí)行的本地支持來實(shí)現(xiàn)的,其自身在分布式訓(xùn)練是比較欠缺的。
可視化情況
在可視化方面,TensorFlow內(nèi)置的TensorBoard庫非常強(qiáng)大,能夠顯示模型圖,繪制標(biāo)量變量,實(shí)現(xiàn)圖像、嵌入可視化,甚至是播放音頻等功能;反觀PyTorch的可視化情況,則顯得有點(diǎn)差強(qiáng)人意,開發(fā)者可以使用Visdom,但是Visdom提供的功能很簡單且有限,可視化效果遠(yuǎn)遠(yuǎn)比不上TensorBoard。
生產(chǎn)部署
對于生產(chǎn)部署而言,TensorFlow具有絕對優(yōu)勢,其可直接使用TensorFlowServing 在TensorFlow中部署模型,而PyTorch沒有提供任何用于在網(wǎng)絡(luò)上直接部署模型的框架,需要使用Flask或者另一種替代方法來基于模型編寫一個RESTAPI。
細(xì)化特征比較
為了更好地對比TensorFlow和PyTorch兩框架之間的區(qū)別與聯(lián)系,通過官網(wǎng)內(nèi)容、論壇反饋、自身實(shí)踐等多方面資源的整理,得出如表3所示的對比結(jié)果。
6.適用場景建議
當(dāng)需要擁有豐富的入門資源、開發(fā)大型生產(chǎn)模型、可視化要求較高、大規(guī)模分布式模型訓(xùn)練時,TensorFlow或許是當(dāng)前最好的選擇;而如果想要快速上手、對于功能性需求不苛刻、追求良好的開發(fā)和調(diào)試體驗(yàn)、擅長Python化的工具時,PyTorch或許是值得花時間嘗試的框架。總體而言,TensorFlow在保持原有優(yōu)勢的同時進(jìn)一步融合包括Keras在內(nèi)的優(yōu)質(zhì)資源,極大增強(qiáng)其易用性與可調(diào)試性,而PyTorch雖然年輕,但增長的勢頭猛烈,并通過融合Caffe2來進(jìn)一步強(qiáng)化自身優(yōu)勢。兩者都在保留原有優(yōu)勢的同時,努力補(bǔ)齊自身短板,這使得在某種程度上兩者有融合的趨勢,未來哪一種框架更具優(yōu)勢,現(xiàn)在定論必定過早,因此,在選擇框架時,可參照上述內(nèi)容,并結(jié)合項(xiàng)目的時效、成本、維護(hù)等多方面綜合考量后再決定。
當(dāng)前并沒有完美的深度學(xué)習(xí)框架,因此從眾多主流的深度學(xué)習(xí)框架中選擇適合自身項(xiàng)目的框架并非易事。通過從運(yùn)行機(jī)制、訓(xùn)練模式、可視化情況、生產(chǎn)部署以及一些細(xì)化特征的比較,我們可以發(fā)現(xiàn),TensorFlow整體而言比較成熟、穩(wěn)定且偏重于工業(yè)領(lǐng)域,適用于中大型項(xiàng)目,而較為年輕的PyTorch憑借其易用性在研究領(lǐng)域嶄露頭角,發(fā)展勢頭很猛,但仍需時日才能與TensorFlow全面抗?fàn)帲谥行⌒晚?xiàng)目中選擇PyTorch作為新的嘗試,或許會是一種很好的選擇。