如何欣賞一個深度學習框架?

點擊上方“視學算法”,選擇加"星標"或“置頂”

重磅乾貨,第一時間送達

者:袁進輝

https://zhuanlan.zhihu.com/p/117269565

本文已由原作者授權,不得擅自二次轉載

3月份,國內有多個深度學習框架開源,OneFlow也在爲開源做最後的準備,2020是深度學習框架領域非常熱鬧的一年。一個框架好與不好,是有很多維度去看待的,使用者和框架開發者的關注點可能就不一樣。

對於絕大部分框架用戶來說,不會深度入到框架內部實現中去,反而使用體驗是第一位的,文檔和案例是否齊全,能否按照README就可以非常容易完成初體驗。

而對於框架開發者來說,就是另一種心態。如果他正在框架研發,看到一個新框架,首先是去看,自己的獨門祕技在這個新框架中是怎麼解決的,是否已經實現了,實現的是否高明;然後馬上去看,對方有沒有什麼獨門功法可供自己學習的。

當然,對於框架的成功來說,從用戶角度去看絕對是最重要的,框架開發者做抉擇時,用戶需求應高於技術審美。在這篇文章中,我重點從框架開發者角度來分享一些我個人在技術上的關注點。先討論如何從總體上評估一個框架,然後再分具體課題來深入框架內部細節。

深度學習框架發展到今天,有些功能已經變成常規需求了,譬如易用,高效,完備(算子、模型、配套工具鏈、文檔、案例),一個新的框架在這些方面應該沒有明顯的短板。一個後出現的框架要追求成功,僅僅沒有短板還不夠,還必須有長板,獨門功法,有超越於其它框架的地方,或者其它框架根本做不到,或者很難做到,只有這樣,纔有可能先從細分市場切開一個小口,進而站穩腳本。

創新點是我首先關注的問題。框架開發者自身作爲技術極客,對創新這一點極爲珍視,如果沒有思路上的突破,僅僅是按老路重新造個輪子來說,是引發不了技術高手的興趣的,這是小同行非常關心的一個問題:這個新的框架給框架類產品帶來了什麼增量,也就是創新的部分。同時,創新對框架成功也至關重要。Caffe和Theano是框架的鼻祖,分別都貢獻了一些最原始的思路。TensorFlow和MXNet都以更高的工程質量(工業級)把計算圖抽象推向一個新高度,二者相對於Caffe而言主要是引入了計算圖抽象,相對於Theano而言,主要是高質量C++實現帶來效率和擴展性。PyTorch則成功引入了Eager執行的模式, 而且實現了Python的無縫銜接(嚴格來說Chainer是最早推行這個思路的框架,被PyTorch發揚光大)。國產深度學習框架要殺出重圍,大的思路創新絕對是首要因素。微創新不足以改變格局,而且還容易被學習和抄襲。

工程質量是我關注的第二個問題。工程質量不過關,不會走的很遠。有時能看到一些對項目評價,“學生作品”還是“工業級代碼”,這是有一定根據的。可以從多個層次來考察,從大到小,譬如設計,架構,模塊,模式,抽象,直至微觀的某個算法實現,講究恰到好處,尤其注意不要over engineering,增之一分則太肥,減之一分則太瘦;也可以從代碼美觀角度來看,譬如google style,clang-format,cpplint等工具的使用;還有一個考察角度是,這份代碼基礎是否適合大規模協作開發,代碼量雖然很大,高質量代碼仍是非常容易被理解的,以及代碼基礎是否引入了一些約束規範,譬如防禦式編程,能防範一些低級錯誤。代碼實現是程序員思想的體現,寫出漂亮代碼的前提是,要有一個清澈的大腦和對問題本質的深入思考。

和深度學習框架相關的一些具體技術實現是我關注的第三個問題。包含的問題有:

(1)深度學習框架都使用了數據流抽象(Eager模式是控制流),我會看看這個框架是怎麼支撐這個抽象的,算子,圖,流等怎麼實現的,怎麼定義算子,怎麼實現多數據類型、多設備的Kernel,計算圖是怎麼實現的等等。

(2)計算圖通過底層引擎來執行,一般的原理是,給定一個計算圖,按照數據依賴拓撲遍歷,這是最基本的實現,如果底層設備是CPU,那麼執行引擎就是線程池,需要關注Dispatcher和線程池如何交互的,如果底層設備是GPU, Dispatcher和底層設備是如何交互的,因爲GPU自身特點,對stream, event的運用是關鍵。

(3)內存是怎麼管理的,靜態圖引擎可以做很多內存管理的技術,模型推理基本是靜態圖,因此Inference framework對靜態內存管理體驗是最深的,不需要爲每個blob單獨去做內存分配,可以爲整個圖分配一塊內存;動態圖的內存管理怎麼做,垃圾回收,生命週期管理等等也是很複雜的問題;亞線性內存分配,以及微軟的Zero也屬於內存優化技術之列。

(4)接口易用性問題,動態圖和靜態圖運行方式的支持,實際上主要涉及c++和python交互的問題。

(5)單設備代碼編譯優化問題,主要涉及設備無關的圖優化,業界既有專門做這項工作的編譯器,譬如Glow, XLA,TVM Relay,一些深度學習框架也包含了此類優化,譬如Paddle, MegEngine。

(6)設備相關代碼優化的解決辦法,即代碼生成,TVM, Jittor, PlaidML屬於此列。

(7)對分佈式並行的解決思路,譬如對數據並行,模型並行,流水並行的支持;即使單純看數據並行,也有一系列辦法,譬如PS,Ring allreduce, double tree allreduce,業界的實現包含NCCL, 字節跳動的BytePS,微軟的DeepSpeed等。

(8)其它待補充。

如果既有大的思路創新,也在以上各方面都做的很棒,那就很接近技術上的完美了。

麻煩給我一個在看!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章