工程架構能力對於作好機器學習重要嗎?

摘要: 作好機器學習到底對工程架構能力有要求嗎?看看技術大牛如何說?

工程架構能力對於作好機器學習到底重要嗎?可能不少技術人員對於這個問題都有一些本身的見解。中國科學院計算技術研究所嚴林在知乎上分享了他對於中國問題的見解,本文轉發已被受權。在面試中,多多少少會問一些機器學習方向候選人工程架構方面的問題。很多作機器學習的候選人表示,我是作算法的,不須要了解這些工程架構的問題,甚至有表示,瞭解工程架構就是浪費作算法的時間。我認爲,這種想法有些片面和狹隘。從我這幾年一些淺薄的經驗來看,工程架構能力對於機器學習從業者,不只重要,並且是必備能力之一。面試

clipboard.png

計算機科學是一門實驗科學,無論多麼厲害的算法,都是須要落地到應用的。一個好的機器學習算法,更是離不開好的工程實現。算法

舉個例子,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/questio...異步

另外三年前,我也整理過一個分佈式論文的列表,雖然時間長了點,但仍可參考一二。分佈式

https://www.zhihu.com/questio...工具

有了必定的理論基礎以後,就應該動手實驗一下了,這裏仍是要推薦MIT 6.824這門課,裏邊的lab很是不錯,過一遍絕對收益頗多。而後,能夠嘗試把一些經常使用的算法,好比LR,嘗試作成一個分佈式的版本,嘗試解決中間遇到的問題;在換個大一點數據集上測試一下,看看有沒有一些新問題。若是這些都解決的不錯的話,祝賀你,趕忙到實際工做中去提升業務吧。學習

工程和算法,是一對親密的兄弟,不少時候,看似算法的問題,抽絲剝繭後發現,本質實際上是一個工程問題。人工智能最近兩年異常火爆,各類實際應用層出不窮,但願有志於此的同窗,工程和算法,兩手都要抓,兩手都要硬。一家之言,寥寥數語,不知所言。

本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索