工程架構能力對於做好機器學習重要嗎
來自專欄我是程序員42 人贊了文章
摘要:做好機器學習到底對工程架構能力有要求嗎?看看技術大牛如何說?
工程架構能力對於做好機器學習到底重要嗎?可能很多技術人員對於這個問題都有一些自己的看法。中國科學院計算技術研究所嚴林在知乎上分享了他對於中國問題的看法,本文轉發已被授權。在面試中,多多少少會問一些機器學習方向候選人工程架構方面的問題。不少做機器學習的候選人表示,我是做演算法的,不需要了解這些工程架構的問題,甚至有表示,了解工程架構就是浪費做演算法的時間。我認為,這種想法有些片面和狹隘。從我這幾年一些淺薄的經驗來看,工程架構能力對於機器學習從業者,不僅重要,而且是必備能力之一。
計算機科學是一門實驗科學,不管多麼厲害的演算法,都是需要落地到應用的。一個好的機器學習演算法,更是離不開好的工程實現。
舉個例子,FFM演算法在各種Kaggle比賽中大放異彩,我們來想想在不借用開源工具的情況下,怎麼實現它。首先,核心計算邏輯,本質是不同特徵的分成不同field的向量做乘法,那麼怎麼實現最高效?採用for循環肯定不是一個最優解法,這裡就需要知道工程實現上的SIMD了;選哪一種SIMD,首先得知道手上的伺服器支持哪一種,這裡假設sse和avx都支持,那sse和avx除了數據流位寬有區別,還有什麼其他區別嗎,同一個語義可能有兩種實現選哪一種等等,都離不開工程實現上的理解。假如這部分已經解決了,但是並行度還是不夠,希望利用現代CPU多核並行的優勢,那麼是使用openmp還是自己搞一個線程池,發現使用多線程之後,加速比並不理想,那該怎麼排查,是數據上的false sharing還是cache miss不符合預期,如果是如何調整數據,如何做預取,這些都是需要工程思考的。這還沒有完,這僅僅是計算,如果並行度足夠了,但是發現數據放不進內存(通常都是這樣),從磁碟讀取的速度還跟不上訓練,那怎麼實現非同步磁碟預取,怎麼進行更多地優化,都跟實現緊密相關,因為你不僅需要知道代碼怎麼寫最高效,還需要知道硬碟(HDD和SSD)的特性,對症下藥;就算模型訓練好了,怎麼樣把模型dump下來放到線上去,線上去的服務與訓練邏輯相比沒有了梯度更新,可以做的更快嗎;流式更新發現很有幫助,怎麼做?這些問題的解決無一不需要對工程的深入了解和掌握。
可能有同學會說,那麼多開源的工具,我只需要拿過來會用就行。事實上真會這麼容易嗎?未必!開源的工具,往往是從通用的角度出發,沒有針對特定的業務進行適配,那如何結合自己的業務場景和服務架構做整合,這也是演算法人員必須要考慮的一個問題。在實際工作中,開源工具往往不能完全滿足自己的需求,需要再在現有的代碼做一些開發,那麼至少需要了解面對的開源工具的工程架構設計,才能獲得一個靠譜的解決方案。以上面說到的FFM舉個例子,相信不少同學都聽過甚至用過開源實現libffm,現在業務上數據太大(比如1PB),單機搞不定,需要擴展到分散式環境中去,參數也要通過parameter server來存儲,這些都是libffm不支持的,那怎麼實現呢?首先,從分散式機器學習架構上講,先確定數據並行還是模型並行,再層級分解問題,到數據通信、parameter server數據組織和並行訓練,包括其中一些關鍵的設計,比如這個分散式演算法使用哪種一致性模型,無一不需要了解工程架構。即便就是單機能夠搞定,那麼serving部分的服務往往也是需要自己實現的。以XGBoost為例,訓練好了模型,調用XGBoost預估,如果在多線程場景下,至少需要知道XGBoost這部分code是不是可重入的,如果不是怎麼改進,更需要工程基礎了。很多時候,使用開源的工具,其成本並不比自己開發一個低多少。
事實上,一個優秀的演算法人員,首先必須是一個優秀的工程實現人員。我一直認為,一個演算法人員的工程能力,決定了做演算法的天花板。工程是演算法的基礎,基礎不夠紮實,怎麼登高遠望呢?大明宮含元殿能夠俯瞰京師長安,那是光地基就有15米呀。大家所熟悉的這個領域的各種大牛,不僅僅是演算法厲害,工程能力也是了得的。Google Brain的Jeff Dean,這個只要是搞CS的,相信都聽過,架構背景自不用多說,Google內部一系列基礎的Infrastructure都是他參與的,比如BigTable等等;也正是有這樣的工程能力,Google內部的演算法迭代能力一直都非常強悍,『天下演算法,唯快不破』,人家不僅是聰明,還快!同樣的時間,一般人只能做一次迭代,但人家能夠迭代五次,探索空間是一般人的五倍,做出來的演算法自然很優秀,所以當GNMT出來的時候,大家很震撼,意料之外情理之中嘛,也很有Google的風格:工程真強!這樣的case還很多,PS-lite的作者李沐,XGBoost的作者陳天奇,Caffe的作者賈揚清等等。
演算法人員任何加強自己的工程架構能力?多寫代碼只是基本,最重要的是心態和意識。也就是說,要主動意識到工程的重要性。有了這個心態和意識,就會主動的去關注留意相關的知識,獲取相關的信息,自發的學習,事半功倍。在這裡,推薦看過的馬超同學的一個回答,個人覺得不錯。
https://www.zhihu.com/question/23645117/answer/124708083
另外三年前,我也整理過一個分散式論文的列表,雖然時間長了點,但仍可參考一二。
https://www.zhihu.com/question/30026369
有了一定的理論基礎之後,就應該動手實驗一下了,這裡還是要推薦MIT 6.824這門課,裡邊的lab非常不錯,過一遍絕對收益頗多。然後,可以嘗試把一些常用的演算法,比如LR,嘗試做成一個分散式的版本,嘗試解決中間遇到的問題;在換個大一點數據集上測試一下,看看有沒有一些新問題。如果這些都解決的不錯的話,祝賀你,趕緊到實際工作中去提高業務吧。
工程和演算法,是一對親密的兄弟,很多時候,看似演算法的問題,抽絲剝繭後發現,本質其實是一個工程問題。人工智慧最近兩年異常火爆,各種實際應用層出不窮,希望有志於此的同學,工程和演算法,兩手都要抓,兩手都要硬。一家之言,寥寥數語,不知所言。
本文作者:【方向】
原文鏈接
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
本文為雲棲社區原創內容,未經允許不得轉載。
推薦閱讀:
※七政四餘洞微大限演算法簡總
※第十一章 K-Means(K均值)演算法模型實現(中)
※動態連通性問題(並查集)
※什麼是大O表示法
※小彩神選號技巧必出兩碼的演算法