編程達到什麼水平才能編寫出像caffe這樣的深度學習框架?
賈揚清的編程水平有多高,為什麼能寫出像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代碼就像一個精緻的藝術品,光憑手藝高超是不夠的,還需要對當時的視覺方面的深度學習有深刻的理解,對軟體工程有熟練的使用經驗才能設計出來。特別是具有通用性的軟體,因為通用,所以設計必須考慮一切可能,設計難度比個人自用提升十倍。
至於怎樣才能達到這樣的水平,天才+勤奮+正確的方向。
打了這麼多字,從設計角度談了我個人的部分看法,還有大部分沒有提到。總之堪稱經典。
一個完備的庫或者框架,需要的遠遠超出單純的「編程水平」這個範疇。
- 你得精擅於對應的業務邏輯。要是不懂機器學習,怎麼可能寫出機器學習的框架?
- 機器學習涉及大量的高性能計算,你得有相應的底層編程的知識,比如內存對齊、SIMD調用、顯卡計算。
- 需要有大局觀,正確處理系統中各個組件的拆分、耦合方式。
需求是創造之母。你想幹什麼事,發現沒有順手的工具,就自己造一個。
即使自己沒有需求,至少要認識有需求的人,這樣纔有反饋。
如果實在要為了造輪子而造輪子,那就開個公司,然後顧產品經理。。。
大神如何提升編程水平,外人的猜測無非是關乎天賦、勤奮和熱情(比如用寫博士畢業論文的時間來寫 Caffe,而導師認為 Caffe 應該獲得更高的優先順序),但具體的方法還是大神本人分享更加可靠。這裡不做猜測。
至於 Caffe 的成功,離不開如下三個層面:
- 對機器學習演算法和需求的理解
賈大神本來是想用深度學習解決心理學問題的,寫 Caffe 的初衷是讓演算法用得更 6,將其開源是為了讓研究人員玩深度學習更 6。所以說大神懂演算法,知道實現需要什麼樣的能力。
在Caffe之前,深度學習領域缺少一個完全公開所有的代碼、演算法和各種細節的框架,導致很多的研究人員和博士生(例如我)需要一次又一次重複實現相同的演算法,這不好。我覺得作為一個科研人員,還是需要有開放的胸懷來幫助整個社區的發展,所謂不忘初心,方得始終。
- 良好的設計和開發模式
賈大神在框架開發上會強化 Caffe 受大家長期熱愛的特點,比如穩定的模型架構、合理的設備抽象等,比如 Caffe2 出於性能考慮不做對動態圖的支持。
Caffe2的任務就是提供最佳的性能,而如果想要極端靈活的計算,請選擇PyTorch。
另外就是開源的模式,讓大家都能使用,都能反饋,都能貢獻,所以軟體有生命力。
- 紮實的基本功
深度學習系統涉及演算法結構,也涉及高性能計算,需要解決的問題比較多,大神見多時光,掌握的知識多,可以更從容地為問題選擇解決辦法。比如:
我個人覺得在研究生階段,特別是機器學習的研究生階段,學一點實際的編程語言(比如C++和Python)是很有幫助的,我以前大部分程序都在Matlab下實現,但是改用C++和Python以後,發現Matlab下很難實現的很多優化,比如說多GPU,多個機器的通信等等,可以非常容易地實現出來,於是就不再用Matlab了(聽起來有點廣告嫌疑…)。
參考:
Caffe作者賈揚清,教你如何打造優秀的深度學習架構 | 雷鋒網?www.leiphone.comCaffe2正式發布!新框架有何不同?賈揚清親自解答?www.sohu.com賈揚清:希望Caffe成為深度學習領域的Hadoop-CSDN.NET?www.csdn.net編程的技巧需要數年的訓練,這包括編程基本功、紮實的計算機體系結構知識、多線程及網路通訊、內存管理、高性能數據操作等等。然後參與過一些底層工具框架的開發,對架構設計駕馭到一定程度之後,應該是可以寫出類似的工具庫的。
好的工具設計,應該說還是非常耗費心神的,打磨的時間相當長,從開始寫代碼到成型幾個月十幾個月都很常見。寫出好的代碼不是件容易的事情。
另外業務領域的知識特別重要,你需要非常清晰的理解,科學計算、深度神經網路的結構及訓練過程,並且有足夠的實踐經驗,這樣才能對需求理解非常充分。對業務理解不到位,很可能寫出很多沒用的冗餘代碼。
推薦閱讀: