如何欣賞一個(gè)深度學(xué)習(xí)框架?
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
作者:袁進(jìn)輝? 轉(zhuǎn)載自:視學(xué)算法
https://zhuanlan.zhihu.com/p/117269565
本文已由原作者授權(quán),不得擅自二次轉(zhuǎn)載
3月份,國內(nèi)有多個(gè)深度學(xué)習(xí)框架開源,OneFlow也在為開源做最后的準(zhǔn)備,2020是深度學(xué)習(xí)框架領(lǐng)域非常熱鬧的一年。一個(gè)框架好與不好,是有很多維度去看待的,使用者和框架開發(fā)者的關(guān)注點(diǎn)可能就不一樣。
對(duì)于絕大部分框架用戶來說,不會(huì)深度入到框架內(nèi)部實(shí)現(xiàn)中去,反而使用體驗(yàn)是第一位的,文檔和案例是否齊全,能否按照README就可以非常容易完成初體驗(yàn)。
而對(duì)于框架開發(fā)者來說,就是另一種心態(tài)。如果他正在框架研發(fā),看到一個(gè)新框架,首先是去看,自己的獨(dú)門秘技在這個(gè)新框架中是怎么解決的,是否已經(jīng)實(shí)現(xiàn)了,實(shí)現(xiàn)的是否高明;然后馬上去看,對(duì)方有沒有什么獨(dú)門功法可供自己學(xué)習(xí)的。
當(dāng)然,對(duì)于框架的成功來說,從用戶角度去看絕對(duì)是最重要的,框架開發(fā)者做抉擇時(shí),用戶需求應(yīng)高于技術(shù)審美。在這篇文章中,我重點(diǎn)從框架開發(fā)者角度來分享一些我個(gè)人在技術(shù)上的關(guān)注點(diǎn)。先討論如何從總體上評(píng)估一個(gè)框架,然后再分具體課題來深入框架內(nèi)部細(xì)節(jié)。
深度學(xué)習(xí)框架發(fā)展到今天,有些功能已經(jīng)變成常規(guī)需求了,譬如易用,高效,完備(算子、模型、配套工具鏈、文檔、案例),一個(gè)新的框架在這些方面應(yīng)該沒有明顯的短板。一個(gè)后出現(xiàn)的框架要追求成功,僅僅沒有短板還不夠,還必須有長板,獨(dú)門功法,有超越于其它框架的地方,或者其它框架根本做不到,或者很難做到,只有這樣,才有可能先從細(xì)分市場(chǎng)切開一個(gè)小口,進(jìn)而站穩(wěn)腳本。
創(chuàng)新點(diǎn)是我首先關(guān)注的問題??蚣荛_發(fā)者自身作為技術(shù)極客,對(duì)創(chuàng)新這一點(diǎn)極為珍視,如果沒有思路上的突破,僅僅是按老路重新造個(gè)輪子來說,是引發(fā)不了技術(shù)高手的興趣的,這是小同行非常關(guān)心的一個(gè)問題:這個(gè)新的框架給框架類產(chǎn)品帶來了什么增量,也就是創(chuàng)新的部分。同時(shí),創(chuàng)新對(duì)框架成功也至關(guān)重要。Caffe和Theano是框架的鼻祖,分別都貢獻(xiàn)了一些最原始的思路。TensorFlow和MXNet都以更高的工程質(zhì)量(工業(yè)級(jí))把計(jì)算圖抽象推向一個(gè)新高度,二者相對(duì)于Caffe而言主要是引入了計(jì)算圖抽象,相對(duì)于Theano而言,主要是高質(zhì)量C++實(shí)現(xiàn)帶來效率和擴(kuò)展性。PyTorch則成功引入了Eager執(zhí)行的模式, 而且實(shí)現(xiàn)了Python的無縫銜接(嚴(yán)格來說Chainer是最早推行這個(gè)思路的框架,被PyTorch發(fā)揚(yáng)光大)。國產(chǎn)深度學(xué)習(xí)框架要?dú)⒊鲋貒蟮乃悸穭?chuàng)新絕對(duì)是首要因素。微創(chuàng)新不足以改變格局,而且還容易被學(xué)習(xí)和抄襲。
工程質(zhì)量是我關(guān)注的第二個(gè)問題。工程質(zhì)量不過關(guān),不會(huì)走的很遠(yuǎn)。有時(shí)能看到一些對(duì)項(xiàng)目評(píng)價(jià),“學(xué)生作品”還是“工業(yè)級(jí)代碼”,這是有一定根據(jù)的??梢詮亩鄠€(gè)層次來考察,從大到小,譬如設(shè)計(jì),架構(gòu),模塊,模式,抽象,直至微觀的某個(gè)算法實(shí)現(xiàn),講究恰到好處,尤其注意不要over engineering,增之一分則太肥,減之一分則太瘦;也可以從代碼美觀角度來看,譬如google style,clang-format,cpplint等工具的使用;還有一個(gè)考察角度是,這份代碼基礎(chǔ)是否適合大規(guī)模協(xié)作開發(fā),代碼量雖然很大,高質(zhì)量代碼仍是非常容易被理解的,以及代碼基礎(chǔ)是否引入了一些約束規(guī)范,譬如防御式編程,能防范一些低級(jí)錯(cuò)誤。代碼實(shí)現(xiàn)是程序員思想的體現(xiàn),寫出漂亮代碼的前提是,要有一個(gè)清澈的大腦和對(duì)問題本質(zhì)的深入思考。
和深度學(xué)習(xí)框架相關(guān)的一些具體技術(shù)實(shí)現(xiàn)是我關(guān)注的第三個(gè)問題。包含的問題有:
(1)深度學(xué)習(xí)框架都使用了數(shù)據(jù)流抽象(Eager模式是控制流),我會(huì)看看這個(gè)框架是怎么支撐這個(gè)抽象的,算子,圖,流等怎么實(shí)現(xiàn)的,怎么定義算子,怎么實(shí)現(xiàn)多數(shù)據(jù)類型、多設(shè)備的Kernel,計(jì)算圖是怎么實(shí)現(xiàn)的等等。
(2)計(jì)算圖通過底層引擎來執(zhí)行,一般的原理是,給定一個(gè)計(jì)算圖,按照數(shù)據(jù)依賴拓?fù)浔闅v,這是最基本的實(shí)現(xiàn),如果底層設(shè)備是CPU,那么執(zhí)行引擎就是線程池,需要關(guān)注Dispatcher和線程池如何交互的,如果底層設(shè)備是GPU, Dispatcher和底層設(shè)備是如何交互的,因?yàn)镚PU自身特點(diǎn),對(duì)stream, event的運(yùn)用是關(guān)鍵。
(3)內(nèi)存是怎么管理的,靜態(tài)圖引擎可以做很多內(nèi)存管理的技術(shù),模型推理基本是靜態(tài)圖,因此Inference framework對(duì)靜態(tài)內(nèi)存管理體驗(yàn)是最深的,不需要為每個(gè)blob單獨(dú)去做內(nèi)存分配,可以為整個(gè)圖分配一塊內(nèi)存;動(dòng)態(tài)圖的內(nèi)存管理怎么做,垃圾回收,生命周期管理等等也是很復(fù)雜的問題;亞線性內(nèi)存分配,以及微軟的Zero也屬于內(nèi)存優(yōu)化技術(shù)之列。
(4)接口易用性問題,動(dòng)態(tài)圖和靜態(tài)圖運(yùn)行方式的支持,實(shí)際上主要涉及c++和python交互的問題。
(5)單設(shè)備代碼編譯優(yōu)化問題,主要涉及設(shè)備無關(guān)的圖優(yōu)化,業(yè)界既有專門做這項(xiàng)工作的編譯器,譬如Glow, XLA,TVM Relay,一些深度學(xué)習(xí)框架也包含了此類優(yōu)化,譬如Paddle, MegEngine。
(6)設(shè)備相關(guān)代碼優(yōu)化的解決辦法,即代碼生成,TVM, Jittor, PlaidML屬于此列。
(7)對(duì)分布式并行的解決思路,譬如對(duì)數(shù)據(jù)并行,模型并行,流水并行的支持;即使單純看數(shù)據(jù)并行,也有一系列辦法,譬如PS,Ring allreduce, double tree allreduce,業(yè)界的實(shí)現(xiàn)包含NCCL, 字節(jié)跳動(dòng)的BytePS,微軟的DeepSpeed等。
(8)其它待補(bǔ)充。
如果既有大的思路創(chuàng)新,也在以上各方面都做的很棒,那就很接近技術(shù)上的完美了。
好消息!?
小白學(xué)視覺知識(shí)星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

