




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
干貨:算法工程師技術路線圖
工程師能力層級概覽
對于不同級別的算法工程師技能要求,我們大致可以分成以下幾個層
級:
?初級:可以在一些指導和協助下獨立完成開發任務。具體到算法
方面,需要你對于工具框架,建模技術,業務特性等方面有一定
的了解,可以獨立實現一些算法項目上的需求。
?中級:可以基本獨立完成一個項目的開發與交付。在初級工程師
的基礎上,對于深入了解技術原理的要求會更高,并且能夠應對
項目中各種復雜多變的挑戰,對于已有技術和工具進行改造適
配。在整體工程化交付方面,對于代碼質量,架構設計,甚至項
目管理方面的要求會開始顯現。另外從業務出發來評估技術選型
和方案也變得尤為重要。
?高級:可以獨立負責一條產品線的運作。在中級工程師的基礎
上,需要更廣闊的技術視野與開拓創新能力,定義整個產品線的
前進方向。解決問題已經不是關鍵,更重要的是提出和定義問
題,能夠打造出在業界具有領先性和差異性的產品,為公司創造
更大的價值。
事實上對于不同層級的工程師,非技術部分的要求都有一定占比。本
文主要聚焦在技術路線圖上,對于其他方面的學習進階路線不會做覆
蓋。
編程能力
Python:
Python是算法工程師日常工作中最常用的語言,應該作為必須掌握
的一門技術。大致的學習路線如下:
?學習掌握Python的基本語法,可以通過各類入門教程來看,個
人推薦《LearnPythontheHardWay》o
■自我考核:能夠讀懂大多數的內部項目及一些開源項目代碼的
基本模塊,例如pandas,sklearn等。
?學習Python的編程風格,建議學習觀遠內部的Python代碼規
范。
■自我考核:編寫的代碼符合編碼規范,能夠通過各類lint檢
查。
?Python進階,這方面有一本非常著名的書《FluentPython》,
深入介紹了Python內部的很多工作原理,讀完之后對于各類疑
難問題的理解排查,以及語言高級特性的應用方面會很有幫助。
另外動態語言元編程這塊,《Ruby元編程》也是一本非常值得推
薦的書。
■自我考核:能夠讀懂一些復雜的Python項目,例如
sqlalchemy中就大量使用了元編程技巧。在實際工程項目
中,能夠找到一些應用高級技巧的點進行實踐,例如基于
Cython的性能優化等。
?領域應用,Python的應用相當廣泛,在各個領域深入下去都有很
多可以學習的內容,比如Web開發,爬蟲,運維工具,數據處
理,機器學習等。這塊主要就看大家各自的興趣來做自由選擇
了,個人推薦熟悉了解一下Pythonweb開發,測試開發相關的
內容,開拓視野。
■自我考核:以Web開發和測試開發為例,嘗試寫一個簡單的
modelservinghttp服務,并編寫相應的自動化測試。
Scala/Java:
Java目前是企業級開發中最常用的軟件,包括在大數據領域,也是應
用最廣泛的語言,例如當年的Hadoop生態基本都是基于Java開發
的。
Scala由于其函數式編程的特性,在做數據處理方面提供了非常方便
的API,也因為Spark等項目的火熱,形成了一定的流行度。在進行
企業級的軟件開發,高性能,大規模數據處理等方面,JVM上的這兩
門語言有很大的實用價值,值得學習。
順帶一提,Scala本身是一門非常有意思的語言,其中函數式編程的
思想與設計模式又是非常大的一塊內容,對于拓寬視野,陶冶情操都
是挺不錯的選擇。
考慮到算法工程師的工作內容屬性,這邊給出一個Scala的學習路
線:
?學習掌握Scala的基本語法,開發環境配置,項目編譯運行等基
礎知識。這里推薦Coursera上MartinOdersky的課程,《快
學Scala》或《ProgramminginScala》兩本書也可以搭配著瀏
覽參考。
■自我考核:能使用Scala來實現一些簡單算法問題,例如
DFS/BFS。或者使用Scala來處理一些日常數據工作,例如
讀取日志文件,提取一些關鍵信息等。
?學習使用Scala來開發Spark應用,推薦edX上的《BigData
AnalyticsUsingSpark》或者Coursera上的《BigData
AnalyticswithScalaandSpark》,另外有些相關書籍也可以
參考,比如《Spark快速大數據分析》等。
■自我考核:能夠使用Spark的ScalaAPI來進行大規模的數
據分析及處理,完成lagfeature之類的特征工程處理。
?JVM的原理學習,Scala/Java都是JVM上運行的優秀語言,其
背后是一個非常大的生態,包括在Web,Android,數據基礎架
構等方面有廣泛的應用。JVM相比Python虛擬機,發展更加成
熟,有一套非常完善的JDK工具鏈及衍生的各類項目,便于開發
者debug,調優應用。這方面推薦學習周志明的《深入理解Java
虛擬機》。
■自我考核:理解JVMGC原理,能通過JDK中相關工具或者
優秀的第三方工具如arthas等,排查分析Spark數據應用的
資源使用情況,GCprofiling,hotmethodprofiling等,
進而進行參數優化。
?計算機語言理論。ProgrammingLanguage作為計算機科學的
一個重要分支,包含了很多值得深入研究的主題,例如類型論,
程序分析,泛型,元編程,DSL,編譯原理等。這方面的很多話
題,在機器學習方面也有很多實際應用,比如TVM這類工作,涉
及到大量編譯原理的應用,知乎大佬"藍色”也作為這個領域的
專家在從事深度學習框架相關的工作。llvm,clang作者Chris
Lattner也加入Google主導了SwiftforTensorflow等工作。
Scala作為一門學術范非常強的語言,擁有極佳的FP,元編程等
能力支持,強大的類型系統包括自動推理,泛型等等高級語言特
性,相對來說是一門非常"值得"學習的新語言,也是一個進入
PL領域深入學習的"gatewaydrug":)對這個方面有興趣的同
學,可以考慮閱讀《Scala函數式編程》,《冒號課堂》,以及
Coursera上《ProgrammingLanguages》也是一門非常好的
課程。另外只想做科普級了解的同學,也可以讀一讀著名的《黑
客與畫家》感受一下。
C/C++/Rust
當前流行的算法框架,例如TensorFlow,PyTorch,LightGBM等,
底層都是基于C++為主要語言進行實現的。但是C++本身過于復
雜,使用場景也比較有限制,建議只需要達到能夠讀懂一些基礎的
C++代碼邏輯即可。
在系統級開發領域,目前有一門新語言逐漸崛起,連續幾年被
Stackoverflow投票評選為程序員最喜愛的語言:Rust。從設計理
念和一些業界應用(例如TiKV)來看還是非常不錯的,但是我也沒
有深入學習了解過,就不做具體推薦了。
這方面建議的學習內容包括經典的《TheCProgramming
Language》以及Rust官方的:gitkuh.cow\/rustru
?自我考核:能夠讀懂LightUBM里對于tweedieloss的相關定義代
碼。
操作系統
基本概念:
我們所編寫的算法應用,都是通過操作系統的環境運行在物理硬件之
上的。在實際運作過程中,會碰到不少相關的問題,例如為什么程序
報了資源不足的錯誤,為什么notebook在瀏覽器里打不開,為什么
進程hang住了沒有響應等等,都需要一些操作系統的知識來幫助理
解和分析問題,最終排查解決。
操作系統涵蓋的內容比較多,建議一開始只需要了解一些主要概念
(例如硬件結構,CPU調度,進程,線程,內存管理,文件系統,
10,網絡等),對于整體圖景有一些感覺即可。后續碰到了實際問
題,可以再在各個部分深入學習展開。
優秀的學習資料也有很多,基本都是大部頭,重點推薦《深入理解計
算機系統》,《OperatingSystems:ThreeEasyPieces》,以及
《現代操作系統》。
?自我考核:能夠基本明確運行一個模型訓練任務過程中,底層使
用到的硬件,操作系統組件,及其交互運作的方式是如何的。
Linux基礎:
平時工作中最常用的兩個操作系統CentOS和macOS,都是
Unix/Linux系的,因此學習掌握相關的基礎知識非常重要。一些必
須掌握的知識點包括:Shell與命令行工具,軟件包管理,用戶及權
限,系統進程管理,文件系統基礎等。
這方面的入門學習資料推薦《鳥哥的Linux私房菜》,基本涵蓋了
Linux系統管理員需要掌握知識的方方面面。進階可以閱讀《Unix環
境高級編程》,對于各種系統調用的講解非常深入,可以為后續性能
調優等高級應用打下基礎。
?自我考核:開發一個shell小工具,實現一些日常工作需求,例如
定時自動清理數據文件夾中超過一定年齡的數據文件,自動清理
內存占用較大且運行時間較久的jupyternotebook進程等。
深入應用:
工作中碰到的疑難問題排查,性能分析與優化,系統運維及穩定性工
程等方面,都需要較為深入的計算機體系和操作系統知識,感興趣的
同學可以針對性的進行深入學習。
以性能優化為例,可以學習經典的《性能之巔》,了解其中的原理及
高級工具鏈。像其中的系統調用追蹤(strace),動態追蹤(systemtap,
DTrace,perf,eBPF)等技術,對于操作系統相關的問題排查都會很有
幫助。
?自我考核:能夠分析定位出LightGBM訓練過程中的性能瓶頸,
精確到函數調用甚至代碼行號的級別。
軟件工程
算法與數據結構:
暫時先把這塊放到軟件工程模塊下。這里指的算法是計算機科學中的
經典算法,例如遞歸,排序,搜索,動態規劃等,有別于我們常說的
機器學習算法。
這塊的學習資料網上有非常多,個人當年是通過普林斯頓的算法課(需
要有Java基礎)入門,后來又上了斯坦福的算法分析與設計,開拓了
一些視野。
書籍方面推薦新手從《算法圖解》入門,然后可以考慮閱讀Jeff
Erickson的《Algorithms》,或者選擇上面提到的網課。另外像
《編程珠磯》,《編程之美》等也可以參閱,里面有不少問題的巧妙
解法。
除了從書本中學習,還可以直接去LeetCode等網站進行實戰操作進
行練習提高。
?自我考核:能夠設計相關的數據結構,實現一個類似airflow中
點擊任意節點向后運行的功能。
代碼規范:
從初級程序員到中高級程序員,其中比較大的一個差異就是代碼編寫
習慣上,從一開始寫計算機能理解,能夠運行成功的代碼,逐漸演化
到寫人能夠理解,易于修改與維護的代碼。
在這條學習路徑上,首先需要建立起這方面的意識,然后需要在實戰
中反復思考和打磨自己的代碼,評判和學習其它優秀的項目代碼,才
能逐漸精進。
推薦的學習書籍有《編寫可讀代碼的藝術》,一本非常短小精悍的入
門書籍,后續可以再慢慢閱讀那些經典大部頭,例如《Clean
Code》,《CodeComplete》,《ThePragmatic
Programmer》等。這方面Python也有一本比較針對性的書籍
《EffectivePython》,值得一讀。
?自我考核:審視自己寫的項目代碼,能發現并修正至少三處不符
合最佳編碼實踐的問題。
設計模式:
在代碼架構方面,設計模式是一個重要的話題,對于日常工作中出現
的許多典型場景,給出了一些解決方案的"套路"。這方面最著名的
書當屬GoF的《設計模式》,不過個人并不十分推薦,尤其是以
Python作為主要工作語言的話,其中很大部分的設計模式可能并不
需要。入門可以瀏覽一下這個網站掌握一些基本概念:
「cfacton'八ggunx.c八/dcsi,后續可以考慮閱讀《Clean
Architecture》,《重構》等相關數據,理解掌握在優化代碼架構過
程中思考的核心點,并加以運用。Python相關的設計模式應用,還
可以參考《PythoninPractice》o
?自我考核:在項目中,找到一處可以應用設計模式的地方,進行
重構改進。
質量保障:
對于需要實際上線運行的軟件工程,質量保障是非常重要的一個環
節,能夠確保整個產品按照期望的方式進行運作。在機器學習項目
中,由于引入了數據這個因素,相比傳統的軟件測試會有更高的難
度,也是業界還在摸索前進的方向。
建議可以先閱讀《單元測試的藝術》或《Google軟件測試之道》,
大致理解軟件測試的一些基本概念和運作方式,在此基礎上可以進一
步閱讀MartinFowler對于機器學習領域提出的CD4ML中相關的測
試環節,學習sklearn,LightGBM等開源庫的測試開發方式,掌握
機器學習相關的質量保障技術能力。
?自我考核:在項目中,實現基礎的數據輸入測試,預測輸出測
試。
項目管理:
軟件工程推進過程中,項目管理相關的技能方法與工具運用也非常的
關鍵。其中各種研發流程與規范,例如敏捷開發,設計評審,代碼評
審,版本管控,任務看板管理等,都是實際項目推進中非常重要的知
識技能點。
這方面推薦學習一本經典的軟件工程教材《構建之法》,了解軟件項
目管理的方方面面。進一步來說廣義的項目管理上的很多知識點也是
后續深入學習的方向,可以參考極客時間上的課程《項目管理實戰20
講》。
?自我考核:在某個負責項目中運用項目管理方法,完成一個實際
的需求評估,項目規劃,設計與評審,開發執行,項目上線,監
控維護流程,并對整個過程做復盤總結。
高級話題:
軟件工程師在技能方向成長的一條路線就是成為軟件架構師,在這個
方向上對于技能點會有非常高的綜合性要求,其中也有不少高級話題
需要深入學習和了解,例如技術選型與系統架構設計,架構設計原則
與模式,寬廣的研發知識視野,高性能,高可用,可擴展性,安全性
等等。
有興趣的同學可以了解一下極客時間的《從0開始學架構》這門課,
逐漸培養這方面的視野與能力。
另外如《微服務架構設計模式》還有領域驅動設計方面的一系列書籍
也值得參考學習。
?自我考核:設計一個算法項目Docker鏡像自動打包系統。
算法基礎
數據分析:
數學基礎:
在進行算法建模時,深入了解數據情況,做各類探索性分析,統計建
模等工作非常重要,這方面對一些數學基礎知識有一定的要求,例如
概率論,統計學等。這方面除了經典的數學教材,也可以參考更程序
員向的《統計思維》,《貝葉斯方法》,《程序員的數學2》等書
籍。
?自我考核:理解實際項目中的數據分布情況,并使用統計建模手段,推斷預測值
的置信區間。
可視化:
在進行數據分析時,可視化是一個非常重要的手段,有助于我們快速
理解數據情況,發掘數據規律,并排查異常點。對于各種不同類型的
數據,會對應不同的可視化最佳實踐,如選擇不同的圖表類型,板式
設計,分析思路編排,人機交互方式等等。
另一方面,可視化與數據報告也是我們與不同角色人群溝通數據
insights的一個重要途徑,需要從業務角度出發去思考可視化與溝通
方式。
這方面可以參考《StorytellingwithData》,《TheVisual
DisplayofQuantitativeInformation^等經典數據,同時也需要培
養自己的商業背景sense,提升溝通能力。
?自我考核:對內溝通方面,能使用可視化技術,分析模型的bad
case情況,并確定優化改進方向。對外溝通方面,能獨立完成項
目的數據分析溝通報告。
誤差分析與調優:
在做算法模型調優改進中,需要從數據分析的基礎上出發來決定實驗
方向,這么做有幾個好處:
?從分析出發指導調優更有方向性,而不是憑經驗加個特征,改個
參數碰運氣。哪怕是業務方提供的信息,也最好是有數據分析為
前提再做嘗試,而不是當成一個既定事實。
?由分析發現的根源問題,對于結果驗證也更有幫助。尤其在預測
的數據量極大情況下,加一個單一特征很可能總體只有千分位準
確率的提升,無法確定是天然波動還是真實的提升。但如果有分
析的前提,那么我們可以有針對性的看對于這個已知問題,我們
的調優策略是否生效,而不是只看一個總體準確率。
?對于問題的徹底排查解決也更有幫助,有時候結果沒有提升,不
一定是特征沒用,也可能是特征代碼有bug之類的問題。帶著數
據分析的目標去看為什么這個特征沒有效果,是模型沒學到還是
特征沒有區分度等,有沒有改進方案,對于我們評判調優嘗試是
否成功的原因也更能徹查到底。
?數據分析會幫助我們發現一些額外的問題點,比如銷量數據清洗
處理是不是有問題,是不是業務本身有異常,需要剔除數據等。
這方面在業界有一些關于誤差分析的探索研究,不過大多數都是基于
分類問題的,例如《IdentifyingUnknownUnknownsinthe
OpenWorld》,《ACharacterizationofPredictionErrors》
等??梢栽诹私膺@些研究的基礎上,結合具體的業務情況,深入思考
總結誤差分析的思路與方法論。
?自我考核:在項目中形成一套可以重復使用的誤差分析方案,能
夠快速從預測輸出中定位到目前模型最重要的誤差類別,并一定
程度上尋找到根本原因。
機器學習基礎
傳統機器學習:
這塊大家應該都非常熟悉了,初階的學習路線可以參考周志華老師的
《機器學習》,涵蓋了機器學習基礎,常用機器學習方法,和一些進
階話題如學習理論,強化學習等。
如果希望深化理論基礎,可以參考經典的《PRML》,《ESL》和
《統計學習方法》。在實戰中,需要綜合業務知識,算法原理,及數
據分析等手段,逐漸積累形成建模調優的方法論,提高整體實驗迭代
的效率和成功率。
?自我考核:結合實際業務和機器學習理論知識,挖掘項目中算法
表現不夠好的問題,并通過算法改造進行提升或解決。
深度學習:
近些年興起的深度學習,已經成為機器學習領域一個非常重要的分
支,在各個應用方向發揮了很大的作用。相對于傳統機器學習,對于
特征工程要求的降低成了其核心優勢。
另一方面,深度學習對于大數據量,大規模算力的應用能力很強,也
一定程度上提升了整體的產出效果。由于理論方面的研究稍顯落后,
深度學習在實際應用中對于使用者的經驗技能要求相對比較高,需要
有大量的實戰經驗才能達到比較理想的效果。
這方面的學習資料推薦Keras作者的《DeepLearningwith
Python》,以及《Hands-onMachineLearningwithScikit-
LearnandTensorFlow》,而在理論方面推薦著名的“花書"
《DeepLearning》o
在學習理論原理的基礎上,尤其要注意在實際算法應用中,能夠通過
觀察各種指標與數據分析,找到提升模型的操作改進方向。
?自我考核:能夠在實際項目中,使用深度學習模型,達到接近甚
至超過傳統GBDT模型的精確度效果,或者通過ensemble,
embedding特征方式,提升已有模型的精度。
領域建模:
目前我們的業務領域在時間序列預測,自然語言處理,推薦等方面,
其它類似圖像,搜索,廣告等領域也都有各自的一些領域建模方法。
在時間序列領域,包括了傳統時序模型,如ARIMA,Prophet,機器
學習模型,如劃動窗口特征構建方法結合LightGBM,及深度學習模
型,例如LSTM,seq2seq,transformer等。
這方面可以參考Kaggle上相關比賽的方案分享,以及Amazon,
Uber,天貓等有類似業務場景公司的分享資料。其它領域也是類似,
通過了解歷史技術演進,相關比賽,業界的方案分享與開源項目,會
議論文來逐漸掌握學習建模方法,結合實際業務進行實踐嘗試,積累
起更加體系性的個人知識技能。
?自我考核:在項目中復現一個Kaggle獲勝方案,檢驗其效果,
分析模型表現背后的原因,并嘗試進行改進。
算法框架
數據處理框架:
在項目實施過程中,會需要各類復雜的數據處理操作,因此熟練掌握
此類框架就顯得尤為重要。
目前行業的標準基本上會參照PandasDataFrame的定義,在數據
量較大的情況下,也有許多類似的框架,如Spark,Dask,
Modin,Mars等支持分布式運行的DataFrame,以及cuDF,
Vaex等提升單機性能的改進實現。
這方面經典的書籍可以參考WesMcKinney的《PythonforData
Analysis》,在掌握基礎數據操作的基礎上,可以進而了解窗口函
數,向量化性能優化等高級話題。
另外SQL也可以做非常復雜的數據處理工作,有不少公司例如阿里會
以SQL為主來構建數據處理流程,感興趣的同學也可以學習一下
SQL中各種高級計算的使用及優化方法。
?自我考核:在已有項目中,能把至少三個使用叩ply方法的
pandas處理修改成向量化運行,并測試性能提升。使用
windowfunction或其它方案來實現lag特征,減少join次
數。
機器學習框架:
機器學習方面的新框架層出不窮,一方面我們需要掌握經典框架的使
用方式,理解其模塊構成,接口規范的設計,一定程度上來說其它新
框架也都需要遵循這些業界標準框架的模塊與接口定義。
另一方面對于新框架或特定領域框架,我們需要掌握快速評估,上手
使用,并且做一定改造適配的能力。一些比較經典的框架有:
?通用機器學習:scikit-learn,SparkML,LightGBM
?通用深度學習:Keras/TensorFlow,PyTorch
?特征工程:tsfresh,Featuretools,Feast
?AutoML:hyperopt,SMAC3,nni,autogluon
?可解釋機器學習:shap,aix360,eli5,interpret
?異常檢測:pyod,egads
?可視化:pyecharts,seaborn
?數據質量:cerberus,pandas_profiling,Deequ
?時間序列:fbprophet,sktime,pyts
?大規模機器學習:Horovod,BigDL,mmlspark
?Pipeline:MLflow,metaflow,KubeFlow,Hopsworks
一般的學習路徑主要是閱讀這些框架的官方文檔和tutorial,在自己
的項目中進行嘗試使用。對于一些核心接口,也可以閱讀一下相關的
源代碼,深入理解其背后的原理。
?自我考核:在LightGBM框架下,實現一個自定義的損失函數,并跑通訓練與
預測流程。
其它框架:
其它比較常見且與算法工程師日常工作會有一些聯系的有Web框
架,爬蟲框架等,最具有代表性的當屬和這兩者背后
Flaskscrapyo
各自又是很大一塊領域,尤其web開發更是保羅萬象。
感興趣的同學還可以了解一下一些新興的基于Python3的框架,例
如FastAPI,其背后借鑒的許多現代框架的思想設計,包括數據驗
證,序列化,自動文檔,異步高性能等,開拓一下知識面。
?自我考核:實現一個簡單的modelservinghttp服務。
算法工程交叉
大規模算法運行:
分布式訓練:
在很多項目中,數據量達到十億級以上的情況下,單機訓練會難以支
撐。因此分布式訓練也是實際工程落地中非常重要的一個主題。
分布式訓練涉及到多機的通訊協同方式,優化算法的改造,數據及模
型的并行與聚合,以及框架的選擇和運維等話題,具體可以參考《分
布式機器學習》。
另外對于分布式系統,也可以參閱《數據密集型應用系統設計》這本
神作,了解其背后原理。
?自我考核:能夠在多機上進行億級數據的GBDT模型訓練與預
測。
高性能計算:
在做大規模的數據訓練與推理時,近些年涌現出許多高性能計算優化
的方法,例如從硬件方面,有各種超線程技術,向量化指令集,
GPGPU,TPU的應用等,從軟件方面,有針對數值計算場景的
OpenBLAS,有自動并行化的OpenMP,有各種codegen,JIT技
術下的運行時優化等。
這方面可以學習的方向也很多,從基礎的并行編程,編譯原理及優化
的知識開始,到CUDA,OpenMP的應用(例如Nvidia的
cuDNN,還有LightGBM中也用至I」了OpenMP),Codegen,JIT
等技術在Spark,TVM等項目中的使用等,建議有深度性能優化需
求時可以往這些方向做調研和學習。
?自我考核:能夠通過LLVMJIT來優化實現Sparkwindow
function的執行性能。
模型加速領域:
這個方向分兩個部分,一塊是模型訓練方面,能夠做到加速,例如使
用大batchsize,遷移學習,持續的在線/增量學習等手段,另一塊
在模型預測方面,也有很多加速需求,比如模型參數量優化,模型壓
縮,混合精度,知識蒸儲等技術手段,都是為了做到更高性能,更低
資源消耗的模型預測推理。
這方面業界有各個方向的文章和技術實現可以參考,比如經典的
《TrainingImageNetin1Hour》,MobileNet,TensorRT,二
值網絡等。
?自我考核:在典型的銷量預測場景中實現增量訓練與預測。
MLops
編排調度:
包含各類pipeline的編排與調度能力的支持,包括數據pipeline,
訓練pipeline和servingpipeline等。這方面比較常用的框架工具
有Airflow,DolphinScheduler,Cadence等,需要掌握其基本的
工作原理和使用方式,并能夠應用于離線實驗與線上運行。
?自我考核:使用Airflow完成一個標準的項目pipeline搭建與運
行。
數據集成:
相對于傳統的DevOps,機器學習項目最大的區別在于數據方面的依
賴會更加顯著與重要。
這方面的話題包括數據血緣,數據質量保障,數據版本控制等,有各
類工具可以借鑒使用,例如數據版本管理方面的DVC,數據質量方面
的TFXDataValidation,Cerberus,Deequ等。
在方法論層面,《TheMLTestScore》中給出了不少數據相關的具
體測試方法,值得參考學習。
?自我考核:在項目中實現輸入數據的分布測試,特征工程測試及
特征重要性準入測試。
實驗管理:
這部分也是ML項目的獨特之處,在開發過程中有大量的實驗及相應
的結果輸出需要記錄,以指導后續調整優化的方向,并選擇最優結果
來進行上線部署。
這方面可以參考的項目有MLflow,fitlog,wandb等。當然對于單
獨的項目來說,可能onlineExcel就能滿足需求了:
?自我考核:在實際項目中實行一套標準的實驗記錄手段,并能從
中找出各類實驗嘗試帶來的精度提升的top5分別是哪些操作。
Serving:
目前我們的serving大多數是離線batch預計算的形式,所以主要依
賴的技術手段是各類離線inference的方法,例如直接使用model
predict接口,使用mmlspark等做大規模并行inference等。
如果涉及到在線serving,情況會更加復雜,例如在線pipeline的運
行,實時特征獲取,lowlatency/highthroughput的serving服
務等,可以參考TFServing,MLe叩,H20,PredictionlO,
PMML/PFA/ONNX等開發標準模型格式等。
?自我考核:部署一個實時預測服務,能夠根據用戶輸入產生相應
的預測結果。
CI/CD:
軟件工程中的持續集成,持續部署已經成為一種標準實踐,在算法項
目中,額外引入了數據這個維度的復雜性,帶來了一些新的挑戰。
在這個方向上,幾個主要話題包括自動化測試,pipeline打包部署,
持續監控運維等,可以參考MartinFowler關于CD4ML的文章。工
具系統層面,可以學習傳統的Jenkins,也有一些新選擇例如
Circled,GoCD,VerCD(Uber)等。
?自我考核:通過Jenkins實現pipeline自動測試,打包,上線流
程。
系統監控:
在整個項目上線后,需要對系統的各個環節進行監控,并對各種異常
情況作出響應。
例如輸入數據的監控,判別測試數據與訓練數據的分布是否有偏移,
整個運行pipeline的監控,判別是否有運行失敗拋出異常的情況,
對于預測輸出的監控,確保沒有異常的預測輸出值,也包括對于系統
計算資源等方面的監控,確保不會因為資源不足導致業務受到影響
等。
在監控信息收集,基礎上,還需要配套一系列的自動告警通知,日志
追蹤排查等。這方面的工具框架包括TFdatavalidation這類專門針
對算法項目的新產品,也有elasicsearch+kibana這類傳統產品。
?自我考核:將三個項目中做過的問題排查改造成常規監控手段,
支持自動的問題發現,告警通知,如有可能,提供自動化或半自
動化的問題排查解決方案。
MLOps系統:
MLOps整體是一個比較大的話題,在這方面有很多產品和系統設計
方面的實踐可以參考學習。
例如Uber的Michelangelo系列文章,Facebook的FBLearner,
neptune.ai,dataiku,domino等,雖然沒有開源,但是其背后的
很多設計理念,演進思考,白皮書等都非常值得我們學習。
在開源界也有很多可以參考的項目,例如MLflow,Kubeflow,
Metaflow,TFX等,可以學習他們的設計理念,Roadmap,以及實
現細節等。
?自我考核:總結各個MLOps產品的功能模塊矩陣對比,能夠根
據項目需求來進行產品選型與使用。
工程深入方向
數據庫:
數據庫原理:
在平時工作中,我們有大量的場景需要用到數據庫。從客戶數據的對
接,數據集的管理和使用,到各種業務系統的數據表設計及優化等,
都需要對數據庫的運作原理,適用場景,運維使用,性能優化等方面
有一定的了解。
常見的需要掌握的概念有OLTPvsOLAP,事務,索引,隔離級別,
ACID與CAP理論,數據同步,數據分片,SQL語法,ORM等。
從底層原理看,會涉及到數據,索引,及日志等存儲引擎方面,以及
各種計算查詢引擎,包括分布式系統的設計與實現。這方面推薦的學
習資料有《數據庫系統內幕》及《數據密集型應用系統設計》。
?自我考核:能夠理解SQL執行計劃,并能夠根據執行計劃來做索
引或查詢調優。
關系型數據庫:
目前常用的關系型數據庫主要是MySQL和PostgreSQL,主要需要
掌握的是日常的一些SQL操作,例如DML(增刪改查),DDL(創
建表,修改索引等),DCL(權限相關)。
在此基礎上還可以進一步了解一些如數據類型,高級計算,存儲引
擎,部署運維,范式概念與表結構設計等方面的話題。對于高級話題
這塊,推薦《高性能MySQL》與《高可用MySQL》。
?自我考核:在MySQL中設計相關表結構,存儲實際項目中的一
系列中間數據集。
NoSQL數據庫:
常用的NoSQL數據庫有幾類,KV存儲(Redis),文檔數據庫
(MongoDB),Wide-column存儲(Cassandra,HBase)以及
圖數據庫(Neo4j)。
在目前我們的算法項目中,比較有可能會用到的主要是Redis這類
KV存儲(也可能把Cassandra之類當泛KV來用),或者更新一點
的類似DeltaLake的存儲系統。
建議學習了解一下這類KV存儲,以及分布式數據庫的常見操作方
式,以及基礎的運維排查,性能優化方法。
?自我考核:考慮一個線上模型服務的場景,用戶輸入作為基礎特
征,使用類似Redis的KV系統,實現實時獲取其它特征,并進
行模型預測。
云計算
基礎架構:
IT系統總體的發展趨勢在往云計算方向演進,即使是自建的基礎設
施,也會采用云計算的一套構建方式,讓開發者不用過多的關注底層
計算存儲資源的部署運維。
對于應用開發者來說,需要了解一些基礎架構方面的知識,例如各類
虛擬化及容器技術,配置管理,容器編排等,便于在日常工作中使用
相關技術來管理和發布應用。
從工具層面看,Docker與k8s等技術發展速度較快,主要還是根據
官方文檔來學習為主。浙大之前出版的《Docker-容器與容器云》
一書中有一些更深入的話題的探討,另外《KubernetesinAction》
中也值得一讀。
從方法論層面看,^InfrastructureasCode》和《SiteReiliability
Engineering》是兩本非常不錯的學習資料。與算法應用結合的虛擬
化,運維,持續集成等都是比較新的領域,需要我們探索出一條可行
路線。
?自我考核:對于已有的算法項目,總結制定一套開發,測試,發
布,運維的標準流程,且盡可能自動化執行。
分布式存儲:
前些年最流行的分布式存儲是脫胎于Google經典的GFS論文實現
的HDFS,不過隨著硬件技術的發展,計算存儲分離思想的逐漸興
起,不但靈活性更高,成本更低,且各自架構的復雜度也大大降低
了。
因此目前更建議學習簡單的objectstore形式的分布式存儲,例如
s3,minio等。在此基礎上的一些存儲系統,例如DeltaLake,提
供了事務,高效的upsert,timetravel等功能,也值得關注與學
習。原理方面,還是推薦《數據密集型應用設計》這本。
?自我考核:在項目中實現不同機器能夠訪問同一個S3路徑的文
件,并進行正常的數據讀寫,模型文件讀寫等功能。
分布式計算:
大數據時代的分布式計算的鼻祖來自于Google經典的MapReduce
論文,后續在Hadoop系統中做了開源實現,在前幾年是非?;馃岬?/p>
一項技術。
目前業界的主流是Spark和Flink,前者在批處理計算中處于霸者地
位,后者是流處理領域的領先者。目前我們的業務應用中,Spark是
比較常用的分布式計算引擎,其基本操作相關內容比較簡單,參考官
方文檔或者《Spark快速大數據分析》即可。
后續的主要難點會有大數據量下的問題排查與性能調優,執行復雜計
算或與Python相關UDF的交互配合方式等。這方面需要對Spark
的系統架構,內部原理有一定了解,例如master,worker,
driver,executor等之間的關系,lazyevaluation,DAG的
lineage與stage概念,shuffle優化,wholestagecodegen等技
術細節。
這方面暫時沒有找到比較好的資料,主要還是依賴實際問題解決的經
驗積累。
?自我考核:用Spark來實現項目中的特征工程,并在一定數據量
情況下取得比單機Pandas更好的性能效果。
其它話題:
其它云服務基礎設施還包括分布式數據庫,消息隊列,zk/raft分布
式協作系統,虛擬網絡,負載均衡等。這些話題離算法應用方面會比
較遠一些,基本上達到遇到需求時會使用的能力即可,在這里不做展
開。
算法深入方向
AutoML:
超參優化:
自動化機器學習中比較傳統的一塊是超參數優化,進而可以推廣到整
個pipeline的超參優化,包括數據預處理,特征工程,特征選擇,
模型選擇,模型調優,后處理等部分。
目前業界應用比較廣泛的技術手段主要是隨機搜索,貝葉斯優化,進
化算法,Hyperband/BOHB等,在特征工程方面有Featuretools,
tsfresh,AutoCrossing等自動化特征工程工具。
學術界有一些進一步的探索研究,包括multi-fidelity優化,多任務
優化,HPO結合ensemblelearning,pipelineplanning,data
diff自動數據分布探測等方面。可以參考auto^上的各類參考
資料與書籍進行學習了解。
主要難點包括automl算法的泛化能力,scalability,整體pipeline
組合的搜索與生成,針對不同學習算法的自動優化手段等。
?自我考核:了解超參優化的基礎概念,能夠在項目中應用框架工
具來實現模型超參的貝葉斯優化流程。
元學習:
Metalearning是近年來非?;钴S的一個新興領域,其主要思路是希
望能通過元學習模型方法,去積累建模調優的先驗知識,跨任務推斷
模型效果并warmstart新的訓練任務,或者指導學習算法來進行更
高效的具體任務的訓練過程。
這方面在工業界的主要應用基本上集中在建模調優先驗知識的積累方
面,比如通過一系列公開數據集搜索尋找出表現較好的起始參數,用
于指導在新任務上做超參優化的起始搜索點。
學術研究中除了configurationspace的研究,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工藝方案評審意見(3篇)
- 公司員工醫療管理制度
- 公園特許經營招商方案(3篇)
- 軍品生產現場管理制度
- 縣級電力營銷管理制度
- 單位獨立運行管理制度
- 公司計件員工管理制度
- 地下遺址改造方案(3篇)
- 廣電播出變更管理制度
- DB62T 4485-2021 葡萄抗寒性評價規范
- 消毒產品加工合同范本
- 重慶市藻渡水庫工程環境影響報告書-上報
- 福建省寧德市2023-2024學年八年級下學期期末考試語文試題
- QCT457-2023救護車技術規范
- 整形美容科發展規劃書
- 國際談判與國際公文寫作-知到答案、智慧樹答案
- 抑郁障礙課件
- 半月板損傷的保養與治療
- GB/T 144-2024原木檢驗
- 交流與傳承-東西文化中碰撞中的藝術嬗變
- 絲綢行業市場分析
評論
0/150
提交評論