賈揚清的編程水平有多高,為什麼能寫出像caffe這麼厲害的框架?他是怎麼提升自己的編程水平的?


--------幾天後的補充:我在前年深入研究過caffe代碼,主要因我對編程感興趣,也打算做出類似的框架。我大量參考了caffe,用c#開發了我自己玩的框架,本來只是一時興趣,沒想到收穫特別。可以說caffe讓我重新認識了深度學習,相當於從原子角度去理解宏觀物質的變化,感謝caffe。

------錯誤糾正:由於對發展歷史的不瞭解,最初寫的幾點出現了幾處錯誤,被諸位高手指出來:1.caffe不是第一個框架;2.當時cudnn沒推出來。

--------以下是原來的回答:

caffe的代碼很經典,賈揚清很厲害,更厲害的是他是第一個編出通用深度學習框架的。首創的難處是一切全靠自己,沒有經驗可參照,這不但要求開發者編程能力極強,還要求他的思想超前,力壓羣雄,否則機會不會是他的。

從caffe看所需知識和技能,主要是:

1.高性能計算。這個當時時機已成熟,nvidia已經推出cuda和cudnn,只要調用就可以,並非最難。-----後來補充:如果當時沒推出cudnn,那麼每一個層計算都要用cuda加速,工作量和難度大增,同時運算效率要比cudnn低許多,還帶來調試的困難。

2.存儲和序列化設計。他為了減輕設計工作量,以及提高模型的通用性,也使用了谷歌的協議代碼,還用了開源的內存資料庫。裡面的難度是模型格式的設計和規劃,這不是代碼或編程的難度,是軟體工程上的難度,沒有一定的開發經驗是無法設計的,而一旦決定之後是極難更改的。

3.線程調度。這點比較小巧,對編程高手不算什麼難度,賈大神應該是輕鬆搞定。

4.網路機制的設計。如何傳遞數據,空間效率時間效率問題,以及如何在顯卡和內存傳遞數據。這個設計上並不複雜,他設計了blob來作為基本存儲方式。

5.網路預處理,即初始化部分。這是最難的地方之一,一個是包容性,要包容各種類型的層。另一個是整體性,它是層計算、模型解釋(把文本描述轉化為數據結構)、過程式控制制的紐帶,非常難以設計。我估計賈大神在net類中花了不少精力,修改試驗了不少辦法。

6.層註冊。非常巧妙的設計,既與上面的谷歌開源協議有關,又與網路計算方式有關,使得許多代碼變得清晰明瞭。

7.太多了,不寫了。總體感覺caffe代碼就像一個精緻的藝術品,光憑手藝高超是不夠的,還需要對當時的視覺方面的深度學習有深刻的理解,對軟體工程有熟練的使用經驗才能設計出來。特別是具有通用性的軟體,因為通用,所以設計必須考慮一切可能,設計難度比個人自用提升十倍。

至於怎樣才能達到這樣的水平,天才+勤奮+正確的方向。

打了這麼多字,從設計角度談了我個人的部分看法,還有大部分沒有提到。總之堪稱經典。


一個完備的庫或者框架,需要的遠遠超出單純的「編程水平」這個範疇。

  1. 你得精擅於對應的業務邏輯。要是不懂機器學習,怎麼可能寫出機器學習的框架?
  2. 機器學習涉及大量的高性能計算,你得有相應的底層編程的知識,比如內存對齊、SIMD調用、顯卡計算。
  3. 需要有大局觀,正確處理系統中各個組件的拆分、耦合方式。


需求是創造之母。你想幹什麼事,發現沒有順手的工具,就自己造一個。

即使自己沒有需求,至少要認識有需求的人,這樣纔有反饋。

如果實在要為了造輪子而造輪子,那就開個公司,然後顧產品經理。。。


大神如何提升編程水平,外人的猜測無非是關乎天賦、勤奮和熱情(比如用寫博士畢業論文的時間來寫 Caffe,而導師認為 Caffe 應該獲得更高的優先順序),但具體的方法還是大神本人分享更加可靠。這裡不做猜測。

至於 Caffe 的成功,離不開如下三個層面:

  • 對機器學習演算法和需求的理解

賈大神本來是想用深度學習解決心理學問題的,寫 Caffe 的初衷是讓演算法用得更 6,將其開源是為了讓研究人員玩深度學習更 6。所以說大神懂演算法,知道實現需要什麼樣的能力。

在Caffe之前,深度學習領域缺少一個完全公開所有的代碼、演算法和各種細節的框架,導致很多的研究人員和博士生(例如我)需要一次又一次重複實現相同的演算法,這不好。我覺得作為一個科研人員,還是需要有開放的胸懷來幫助整個社區的發展,所謂不忘初心,方得始終。

  • 良好的設計和開發模式

賈大神在框架開發上會強化 Caffe 受大家長期熱愛的特點,比如穩定的模型架構、合理的設備抽象等,比如 Caffe2 出於性能考慮不做對動態圖的支持。

Caffe2的任務就是提供最佳的性能,而如果想要極端靈活的計算,請選擇PyTorch。

另外就是開源的模式,讓大家都能使用,都能反饋,都能貢獻,所以軟體有生命力。

  • 紮實的基本功

深度學習系統涉及演算法結構,也涉及高性能計算,需要解決的問題比較多,大神見多時光,掌握的知識多,可以更從容地為問題選擇解決辦法。比如:

我個人覺得在研究生階段,特別是機器學習的研究生階段,學一點實際的編程語言(比如C++和Python)是很有幫助的,我以前大部分程序都在Matlab下實現,但是改用C++和Python以後,發現Matlab下很難實現的很多優化,比如說多GPU,多個機器的通信等等,可以非常容易地實現出來,於是就不再用Matlab了(聽起來有點廣告嫌疑…)。

參考:

Caffe作者賈揚清,教你如何打造優秀的深度學習架構 | 雷鋒網?

www.leiphone.com圖標Caffe2正式發布!新框架有何不同?賈揚清親自解答?

www.sohu.com圖標賈揚清:希望Caffe成為深度學習領域的Hadoop-CSDN.NET?

www.csdn.net


編程的技巧需要數年的訓練,這包括編程基本功、紮實的計算機體系結構知識、多線程及網路通訊、內存管理、高性能數據操作等等。然後參與過一些底層工具框架的開發,對架構設計駕馭到一定程度之後,應該是可以寫出類似的工具庫的。

好的工具設計,應該說還是非常耗費心神的,打磨的時間相當長,從開始寫代碼到成型幾個月十幾個月都很常見。寫出好的代碼不是件容易的事情。

另外業務領域的知識特別重要,你需要非常清晰的理解,科學計算、深度神經網路的結構及訓練過程,並且有足夠的實踐經驗,這樣才能對需求理解非常充分。對業務理解不到位,很可能寫出很多沒用的冗餘代碼。


推薦閱讀:
查看原文 >>
相關文章