Full Stack Deep Learning:解構(gòu)深度學(xué)習(xí)項(xiàng)目落地過程的各個(gè)方面

極市導(dǎo)讀
?倘若你想了解深度學(xué)習(xí)項(xiàng)目的落地過程,這門來自Berkeley的課程 Full Stack Deep Learning 將非常適合你。它介紹了團(tuán)隊(duì)組織、框架工具、數(shù)據(jù)管理、測(cè)試上線等多個(gè)方面的內(nèi)容,并提供了大量進(jìn)階學(xué)習(xí)資源。
最近看了這個(gè)非常不錯(cuò)的來自Berkeley的課程Full Stack Deep Learning,介紹了實(shí)際深度學(xué)習(xí)項(xiàng)目落地過程中的各個(gè)方面,包括項(xiàng)目設(shè)定、團(tuán)隊(duì)組織、框架工具、數(shù)據(jù)管理、開發(fā)調(diào)優(yōu)實(shí)踐、測(cè)試與生產(chǎn)上線等。
這方面其它的經(jīng)典包括Google的兩篇paper:Hidden Technical Debt in Machine Learning Systems和The ML Test Score,Rules of Machine Learning,Andrew Ng的Machine Learning Yearning,Martin Fowler的CD4ML,以及Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow,Building Machine Learning Powered Applications,Building Machine Learning Pipelines 等優(yōu)秀書籍。
下面是這個(gè)課程的一些簡(jiǎn)單筆記。
Setting up Machine Learning Projects
Overview
Pieter Abbeel說,深度學(xué)習(xí)更像是一門藝術(shù),而不是科學(xué)。雖然目前深度學(xué)習(xí)很多方面缺乏堅(jiān)實(shí)的理論支撐,但并不妨礙在各個(gè)業(yè)務(wù)領(lǐng)域深度學(xué)習(xí)的應(yīng)用蓬勃發(fā)展。所以在探究深度學(xué)習(xí)理論原理的同時(shí),我們同樣可以在工程化的方向探索算法應(yīng)用如何借鑒軟件工程的思想,使得其應(yīng)用落地有跡可循,逐漸形成一系列的規(guī)范和最佳實(shí)踐。
算法項(xiàng)目很多還是沒有脫離研究性質(zhì),有數(shù)據(jù)表明,85%的AI項(xiàng)目會(huì)失敗。有各種可能原因:
技術(shù)可行性:基于數(shù)據(jù)統(tǒng)計(jì)學(xué)習(xí)構(gòu)建的模型,在實(shí)際使用中有很多限制。 項(xiàng)目范圍:對(duì)于AI技術(shù)有過高的期望,容易導(dǎo)致項(xiàng)目需求設(shè)定方面失去控制,最終難以達(dá)成。 目標(biāo)定義:對(duì)于是否成功交付的定義不明確,或者定義的目標(biāo)與實(shí)際業(yè)務(wù)沒有很好的掛鉤。 從實(shí)驗(yàn)室到生產(chǎn)環(huán)境:機(jī)器學(xué)習(xí)建模過程偏研究性質(zhì),沒有為實(shí)際業(yè)務(wù)落地做足夠的準(zhǔn)備。 組織變革:在技術(shù)和產(chǎn)品層面外,對(duì)于流程,組織都有一定要求,執(zhí)行推進(jìn)難度較大。
Lifecycle
整個(gè)機(jī)器學(xué)習(xí)的項(xiàng)目基本流程大家應(yīng)該都很熟悉,值得注意的是這個(gè)流程并不是線性關(guān)系,會(huì)反復(fù)迭代跳轉(zhuǎn)。所以遇到問題時(shí)不要把自己的思維局限在當(dāng)前這個(gè)點(diǎn)上,要把目光放到整個(gè)項(xiàng)目流程上來尋找機(jī)會(huì)點(diǎn)。
計(jì)劃立項(xiàng):明確需求和目標(biāo),項(xiàng)目資源的準(zhǔn)備,項(xiàng)目排期等
數(shù)據(jù)收集:數(shù)據(jù)系統(tǒng)和流程的梳理,訓(xùn)練數(shù)據(jù)的收集,數(shù)據(jù)質(zhì)量監(jiān)控
建模與調(diào)優(yōu):構(gòu)建baseline模型,嘗試使用SoTA模型,debug模型并迭代優(yōu)化
測(cè)試與部署:內(nèi)部/小范圍試點(diǎn),添加各類測(cè)試,監(jiān)控,部署上線,應(yīng)用推廣

另外還有跨項(xiàng)目的基礎(chǔ)架構(gòu),包括團(tuán)隊(duì)和組織,支持框架和工具(后續(xù)會(huì)介紹)。
Prioritizing
考慮項(xiàng)目影響力和可行性兩個(gè)維度。

項(xiàng)目影響力方面,參考《AI極簡(jiǎn)經(jīng)濟(jì)學(xué)》及Karpathy的一些觀點(diǎn):
可行性:
問題的難度,是否有成熟的技術(shù)和方案,對(duì)算力需求等??梢詮妮敵鰪?fù)雜度,可靠性需求和泛化需求等方面來評(píng)估。 準(zhǔn)確率的需求,模型給出錯(cuò)誤預(yù)測(cè)的代價(jià)有多高,預(yù)測(cè)準(zhǔn)確率對(duì)系統(tǒng)可用性影響有多大。準(zhǔn)確率越高,需要投入的調(diào)優(yōu)精力會(huì)越大,例如對(duì)rare case數(shù)據(jù)的需求。 數(shù)據(jù)的可用性,獲取數(shù)據(jù)的難度,數(shù)據(jù)量的需求,數(shù)據(jù)標(biāo)簽是否容易獲得。一般也是可行性方面最大的障礙。
Archetypes
在公司的各種業(yè)務(wù)場(chǎng)景中,如何找到適合使用機(jī)器學(xué)習(xí)來提效的機(jī)會(huì)點(diǎn)并構(gòu)建原型嘗試呢?有如下幾種模式可以參考:
現(xiàn)有流程的效果提升,例如從規(guī)則推薦,到模型推薦系統(tǒng)
模型是否能提升目前的效果 效果提升是否產(chǎn)生業(yè)務(wù)價(jià)值 是否能形成“數(shù)據(jù)飛輪” 人工流程的增強(qiáng)智能輔助,例如Email的自動(dòng)補(bǔ)全功能
智能系統(tǒng)需要達(dá)到什么程度才對(duì)人有幫助? 需要多少數(shù)據(jù)量達(dá)到這個(gè)智能程度? 人工流程的自動(dòng)化,例如自動(dòng)駕駛,智能客服
系統(tǒng)可接受的失敗率如何? 如何保證系統(tǒng)的失敗率不會(huì)超過界限? 訓(xùn)練數(shù)據(jù)是否能容易獲得?

已有流程的提升項(xiàng)目,需要提升impact,比如思考整個(gè)流程的優(yōu)化能否提升數(shù)據(jù)流的效率,不斷在這個(gè)任務(wù)上提升效果。而帶來的更多數(shù)據(jù),有機(jī)會(huì)給下游業(yè)務(wù)的優(yōu)化提升構(gòu)建更好的基礎(chǔ)。
人工流程的增強(qiáng)輔助,可以通過更好的產(chǎn)品設(shè)計(jì)以提升整體的可行性,盡早發(fā)布good enough的版本,獲取用戶反饋。比如友好的交互方式,讓用戶自己決定是否采納,對(duì)于模型的精度需求會(huì)有所降低。
人工流程的自動(dòng)化需要提升可行性,一方面是引入human-in-the-loop的思想,另一方面,控制項(xiàng)目scope適用范圍等。自動(dòng)駕駛方面有很多這類例子,例如需要人工關(guān)注的自動(dòng)駕駛,或者在特定環(huán)境中達(dá)到無需人類干預(yù)的狀態(tài)。
Metrics
對(duì)于算法來說,有一個(gè)唯一的可量化的優(yōu)化指標(biāo)是非常重要的。但現(xiàn)實(shí)業(yè)務(wù)場(chǎng)景中的需求往往有多個(gè)優(yōu)化目標(biāo),需要一些方法來綜合這些指標(biāo)由模型來進(jìn)行優(yōu)化。
簡(jiǎn)單的指標(biāo)加權(quán)平均。 把對(duì)模型輸出敏感度不高,或者較容易達(dá)到預(yù)期的指標(biāo),設(shè)置為threshold形式。 根據(jù)實(shí)際業(yè)務(wù)來設(shè)計(jì)更復(fù)雜的優(yōu)化指標(biāo),例如M5 competition里的復(fù)雜多層級(jí)指標(biāo)的加權(quán)。
需要不時(shí)的評(píng)估你的metrics,達(dá)成情況,與實(shí)際業(yè)務(wù)的聯(lián)系程度等,并根據(jù)實(shí)際情況來做出調(diào)整。
Baselines
模型基線的選擇很重要,可以幫助評(píng)估項(xiàng)目可行性和目標(biāo)設(shè)置。一般有兩種構(gòu)建baseline的方式:
外部基線:業(yè)務(wù)需求,公開研究的成果等 內(nèi)部基線:使用規(guī)則或簡(jiǎn)單模型,目前業(yè)務(wù)中的人工水平
Infrastructure and Tooling
Overview
算法應(yīng)用的理想狀態(tài)是,提供更多數(shù)據(jù),然后系統(tǒng)自動(dòng)訓(xùn)練提升模型效果。但實(shí)際上需要引入的系統(tǒng)組件和工具非常多,需要把各個(gè)環(huán)節(jié)的infra基礎(chǔ)打好,后續(xù)才有可能實(shí)現(xiàn)更高效率的一體化自動(dòng)化系統(tǒng)。

Software Engineering
語(yǔ)言選擇,基本沒有異議,Python。
IDE支持,VS Code和PyCharm都不錯(cuò),個(gè)人更喜歡后者。兩者都支持遠(yuǎn)程執(zhí)行和debug,很實(shí)用的功能。
Linters and Type Hints,Python還是挺需要各類代碼檢查和類型提示的支持的,可以預(yù)防很多問題,提升開發(fā)效率。
Jupyter Notebook,比較適合探索開發(fā)。Netflix把整個(gè)數(shù)據(jù)科學(xué)流程構(gòu)建在notebook之上,做了很復(fù)雜的二次開發(fā),作者覺得不值得。我個(gè)人一般也是notebook的draft后續(xù)會(huì)在IDE中重新組織編寫。Notebook原生的一些缺點(diǎn)有,難以版本管理,缺乏IDE支持,難以測(cè)試,執(zhí)行順序混亂,長(zhǎng)時(shí)間運(yùn)行任務(wù)支持差等。
Streamlit,一個(gè)快速構(gòu)建data app的工具,個(gè)人沒有用過。

Computing and GPUs
深度學(xué)習(xí)領(lǐng)域有很多進(jìn)展都得益于強(qiáng)大的計(jì)算能力,當(dāng)然除了“暴力美學(xué)”,如何利用少量資源來達(dá)到同樣的效果也是非常值得投入研究的。
GPU方面基本上也是沒有懸念,選NVIDIA。具體購(gòu)買建議方面,V100是目前server端最強(qiáng)大的選擇。Consumer card其實(shí)性價(jià)比很高,如1080Ti, 2080Ti等。Kepler,Maxwell架構(gòu)太老了,不建議選購(gòu)。
云服務(wù)方面建議選購(gòu)AWS或GCP,作者還黑了下Azure……另外Paperspace和Lambda Labs等也可以考慮。如果架構(gòu)設(shè)計(jì)上允許,spot instance會(huì)便宜很多。
目前最劃算的還是自己買GPU機(jī)器。從成本分析來看,5-10周的使用量以上,就是自建的成本更低了。云服務(wù)的優(yōu)勢(shì)主要在可擴(kuò)展性,運(yùn)維成本更低等。

Resource Management
需求:多個(gè)用戶,使用多臺(tái)機(jī)器,來運(yùn)行各自的workload。
最簡(jiǎn)單的解決方案,使用各類電子表格來登記管理。
用軟件管理的方式,如SLURM Workload Mananger。
現(xiàn)在比較流行的方案,用Docker + Kubernetes來管理環(huán)境和集群資源。以及在此基礎(chǔ)上提供更完善功能的Kubeflow,Polyaxon等。

Frameworks and Distributed Training
除非有特殊的理由,否則建議使用TensorFlow或PyTorch。這兩者的很多功能特性也在逐漸趨于一致,例如TF 2.0里把eager execution設(shè)置為默認(rèn)模式,使其更易于交互式開發(fā)。而PyTorch中也利用TorchScript增加對(duì)生產(chǎn)環(huán)境部署的支持度。另外fast.ai庫(kù)也非常值得一試。目前研究領(lǐng)域PyTorch更火,工業(yè)界TensorFlow/Keras應(yīng)用更多一些。
數(shù)據(jù)并行化是目前實(shí)踐中更常用的做法。模型并行更加復(fù)雜,只有單模型無法在單卡上保存時(shí)才會(huì)考慮。盡可能利用更多RAM的GPU來避免這種情況。
分布式訓(xùn)練可以考慮的一些庫(kù):Ray,Horovod等。
Experiment Management
知乎上Deep Learning效率神器問題下,很多回答都提到實(shí)驗(yàn)管理方面的工具。
這里提到的一些工具:Spreadsheet,TensorBoard,Losswise,Comet.ml,Weights and Biases,MLflow。
Hyperparameter Tuning
前面AutoML的文章里有提到很多具體的原理和技術(shù)。
這里提到的一些工具:Hyperopt(Hyperas),SigOpt,Ray Tune,Weights and Biases。
All-in-one Solutions
組合了上面提到的一系列的功能點(diǎn)的全功能軟件平臺(tái),提供包括模型開發(fā),分布式訓(xùn)練,實(shí)驗(yàn)記錄,模型版本,模型發(fā)布,模型監(jiān)控等功能的一站式服務(wù)。
舉例:FBLearner Flow,Michelangelo,TFX,Amazon SageMaker,Neptune,F(xiàn)loydHub,Paperspace,Determined AI,Domino Data Lab(進(jìn)入了Gartner DSML魔力四象限)。

Data Management
Overview
數(shù)據(jù)太重要了,為什么叫Data Scientist而不是Model Scientist是有原因的 :)
業(yè)界對(duì)這方面的重視也在快速提升,因?yàn)閷?shí)際工作中對(duì)于數(shù)據(jù)方面能做的空間和回報(bào)都非常大。研究領(lǐng)域受到benchmark等因素影響,往往只能使用相對(duì)固定的數(shù)據(jù)集來做模型方面的工作。

Sources
大多數(shù)的深度學(xué)習(xí)應(yīng)用都需要大量的訓(xùn)練數(shù)據(jù)。
可以使用公開數(shù)據(jù)集作為開始,然后通過產(chǎn)品構(gòu)建起data flywheel。
半監(jiān)督學(xué)習(xí)也是近期熱門方向,可以減輕給數(shù)據(jù)打標(biāo)的人工開銷。
數(shù)據(jù)增強(qiáng)在CV領(lǐng)域是一個(gè)非常普遍應(yīng)用的技術(shù),其它領(lǐng)域的應(yīng)用會(huì)困難些。對(duì)于表格數(shù)據(jù),可以隨機(jī)刪除一些cell來形成更多的數(shù)據(jù)。自然語(yǔ)言處理方面也有一些類似嘗試,例如替換近義詞,改變?cè)~語(yǔ)順序等。總體思路還是把一些領(lǐng)域知識(shí)通過變換,或者噪音的方式進(jìn)行添加,使得模型更加穩(wěn)定和通用。
生成數(shù)據(jù),CV領(lǐng)域的應(yīng)用比較多一些,比如可以在仿真場(chǎng)景中訓(xùn)練自動(dòng)駕駛系統(tǒng)。
Labeling
數(shù)據(jù)打標(biāo)方面,需要使用打標(biāo)工具,制定相應(yīng)規(guī)則來讓打標(biāo)人員來正確高效的進(jìn)行數(shù)據(jù)標(biāo)記。相比使用公司內(nèi)部人力,crowdsourcing和外包是更常見的方式。其中比較關(guān)鍵的是需要先自己做一些打標(biāo)工作,了解其中的復(fù)雜度,設(shè)計(jì)好規(guī)范和質(zhì)量檢查點(diǎn)。
打標(biāo)服務(wù)公司:FigureEight,Scale.ai
打標(biāo)軟件舉例:Hive,Prodigy等。除了用戶交互的便利性,還可以使用active learning等技術(shù)來提高效率。

Storage
數(shù)據(jù)存儲(chǔ)的各種形式:文件系統(tǒng),對(duì)象存儲(chǔ),數(shù)據(jù)庫(kù),data lake等。
Binary data一般會(huì)以object store形式存儲(chǔ)。
系統(tǒng)元數(shù)據(jù)以數(shù)據(jù)庫(kù)形式存儲(chǔ)較為常見。
非結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)在data lake中,到使用時(shí)再進(jìn)行后續(xù)處理。
訓(xùn)練時(shí)的數(shù)據(jù)讀寫一般會(huì)在文件系統(tǒng)中進(jìn)行,提供了較為完整的POSIX API。
對(duì)于結(jié)構(gòu)化數(shù)據(jù)的處理,SQL是最合適的方式。
Feature store在數(shù)據(jù)存儲(chǔ)上一層進(jìn)行了一些封裝,在原始數(shù)據(jù)基礎(chǔ)上做了transformation,后續(xù)在使用時(shí)可以直接進(jìn)行調(diào)用。Uber,airbnb等實(shí)踐了這個(gè)方案,而netflix反對(duì)這個(gè)想法,業(yè)界看起來還沒有較為統(tǒng)一的認(rèn)知。
Versioning
Level 0: 無版本管理。
Level 1: 用snapshot方式在訓(xùn)練時(shí)產(chǎn)生相應(yīng)的版本。
Level 2: 使用assets和代碼混合的方式進(jìn)行版本管理。大致的做法就是把數(shù)據(jù)相關(guān)的元信息也在代碼里進(jìn)行管理。
Level 3: 使用專門的管理工具來做數(shù)據(jù)版本管理,例如DVC,Pachyderm,Quill,Dolt等。
另外Delta Lake也是一個(gè)值得關(guān)注的框架。
Processing
工作流的編排和運(yùn)行。最簡(jiǎn)單的做法,使用makefile,但是有很多使用限制。在這方面使用最廣泛的框架是Apache Airflow。其它有很多專注在數(shù)據(jù)科學(xué)領(lǐng)域的框架,例如MLflow,metaflow等,為算法實(shí)驗(yàn),問題排查等提供了很多功能支持。
不要過度工程,使用簡(jiǎn)單的技術(shù)手段滿足目前的需求,當(dāng)碰到無法解決的復(fù)雜情況時(shí)再考慮引入其它工具框架。一旦引入框架,出現(xiàn)問題時(shí)不止要排查項(xiàng)目代碼,還需要排查工具框架層面的問題 :)

Machine Learning Teams
Overview
管理技術(shù)團(tuán)隊(duì)有很多挑戰(zhàn),對(duì)于機(jī)器學(xué)習(xí)組織,在技術(shù)團(tuán)隊(duì)困難的基礎(chǔ)上還引入了更多的挑戰(zhàn):
機(jī)器學(xué)習(xí)的人才昂貴且稀缺 機(jī)器學(xué)習(xí)團(tuán)隊(duì)的角色更加多樣化 機(jī)器學(xué)習(xí)項(xiàng)目往往難以制定明確的時(shí)間線,產(chǎn)出也有高度不確定性 機(jī)器學(xué)習(xí)領(lǐng)域變化迅速,且更容易積累技術(shù)債 作為新興方向,領(lǐng)導(dǎo)層往往不理解機(jī)器學(xué)習(xí)的運(yùn)作方式和特點(diǎn)
Roles
ML產(chǎn)品經(jīng)理:制定任務(wù)優(yōu)先級(jí),推進(jìn)項(xiàng)目進(jìn)展 DevOps工程師:部署和運(yùn)維線上系統(tǒng) 數(shù)據(jù)工程師:構(gòu)建data pipeline,數(shù)據(jù)存儲(chǔ)基礎(chǔ),相關(guān)監(jiān)控等 機(jī)器學(xué)習(xí)工程師:訓(xùn)練和部署模型 機(jī)器學(xué)習(xí)研究員:更面向未來的算法技術(shù)調(diào)研和前沿探索 數(shù)據(jù)科學(xué)家:一個(gè)非常廣義的職位,總體來說會(huì)更偏向算法,數(shù)據(jù)分析與業(yè)務(wù)連接部分

X軸是機(jī)器學(xué)習(xí)技術(shù)的需求,Y軸是計(jì)算機(jī)工程技術(shù)的需求,圓圈的大小表示溝通/技術(shù)協(xié)作能力的需求。
這個(gè)session的QA部分也有很多信息量。比如構(gòu)建機(jī)器學(xué)習(xí)組織的時(shí)候,優(yōu)先從哪種類型的角色開始。各個(gè)角色的職業(yè)發(fā)展等。
Team Structure
Ad-Hoc ML:沒有專職的ML工程師,以ad-hoc的方式來做一些基礎(chǔ)的機(jī)器學(xué)習(xí)應(yīng)用,很多中小型公司的做法。主要的問題是ML項(xiàng)目缺乏支持,也比較難招聘和留住相關(guān)人才。 ML R&D:在研發(fā)部門中融入機(jī)器學(xué)習(xí)相關(guān)職能崗位,是更大一些的能源,制造,電信行業(yè)公司的做法。主要問題,數(shù)據(jù)難以獲取,機(jī)器學(xué)習(xí)項(xiàng)目也很少實(shí)際上線產(chǎn)生價(jià)值,因此后續(xù)投入也比較少。 Embeded ML:在業(yè)務(wù)/產(chǎn)品部門中融入機(jī)器學(xué)習(xí)職能,大多數(shù)的軟件科技類公司,金融服務(wù)公司的做法。主要問題是比較難吸引和培養(yǎng)出top級(jí)別的人才。另外軟件工程的管理和發(fā)布節(jié)奏與機(jī)器學(xué)習(xí)項(xiàng)目的管理發(fā)布節(jié)奏容易有沖突。而且長(zhǎng)周期的項(xiàng)目難以發(fā)展。 Independent ML:有獨(dú)立的ML部門,直接匯報(bào)給CEO/CTO層級(jí),有一些大型的金融服務(wù)公司會(huì)使用這種做法。這種做法的問題是與業(yè)務(wù)部門的交流合作會(huì)有一些gap,需要業(yè)務(wù)方認(rèn)可和積極的合作,學(xué)習(xí)模型的使用方式,給出快速的反饋等。 ML-First:ML部門會(huì)專注于有挑戰(zhàn)的,長(zhǎng)周期投入的項(xiàng)目,而且在各個(gè)業(yè)務(wù)線也會(huì)有ML專家尋求算法快速落地,產(chǎn)生業(yè)務(wù)價(jià)值的機(jī)會(huì),一般超大型的科技公司或者專注于機(jī)器學(xué)習(xí)領(lǐng)域的創(chuàng)業(yè)公司會(huì)采用這種方式。主要挑戰(zhàn)是這個(gè)形式非常難達(dá)到,比如招聘足夠的人才,公司文化的轉(zhuǎn)變等。
Design choices:

QA里有個(gè)彩蛋,想做ML方面的話,讀數(shù)學(xué)博士還是計(jì)算機(jī)科學(xué)博士更好?講師毫不猶豫的回答:計(jì)算機(jī)科學(xué)。
Managing Projects
機(jī)器學(xué)習(xí)項(xiàng)目的管理太難了。
事先無法評(píng)估問題的難度 項(xiàng)目進(jìn)度往往是非線性的 Research和engineering之間的文化差異 管理層對(duì)機(jī)器學(xué)習(xí)的理解有限

上圖是一個(gè)kaggle比賽的例子,整個(gè)比賽中的效果提升大部分是在第一周達(dá)到的。
一些解決方案。使用概率性的方式來管理項(xiàng)目,令人震驚!

需要在項(xiàng)目過程中嘗試多組方案,每組方案預(yù)估成功概率,根據(jù)進(jìn)展及時(shí)調(diào)整。 評(píng)估組員產(chǎn)出時(shí),根據(jù)他們的輸入,例如做了哪些嘗試,得出什么結(jié)論。而不是直接用最終結(jié)果來評(píng)估。 先快速構(gòu)建起end-to-end的pipeline,再不斷迭代。Rules of ML中也強(qiáng)調(diào)了這點(diǎn)。 對(duì)于管理層,需要對(duì)他們進(jìn)行機(jī)器學(xué)習(xí)項(xiàng)目不確定性的教育。
Hiring
作為manager,需要明確招聘目標(biāo)的畫像,必需的技能點(diǎn)等。建議招聘對(duì)機(jī)器學(xué)習(xí)有興趣的軟件工程師。
里面還提到了不少招聘,建聯(lián)渠道,如何吸引ML人才等,例如:
明確公司的愿景和產(chǎn)品的潛在影響力 在工具鏈和基礎(chǔ)設(shè)施方面加大投入提升工作便捷度 構(gòu)建學(xué)習(xí)型組織氛圍 利用高人才密度來吸引更多的人才
另外對(duì)于招聘面試流程,以及求職方面的指導(dǎo),session中也給出了一些建議,可供參考。
Training and Debugging
Overview
模型開發(fā)優(yōu)化的過程中,80-90%的時(shí)間會(huì)花在debugging和tuning上,只有10-20%的時(shí)間在做implementation。
模型結(jié)果的復(fù)現(xiàn)很有難度,包括確保實(shí)現(xiàn)沒有bug,超參的選擇,數(shù)據(jù)的構(gòu)建,模型是否適合對(duì)應(yīng)的數(shù)據(jù)集等挑戰(zhàn)。
總體策略:

Start Simple
選擇從簡(jiǎn)單的網(wǎng)絡(luò)結(jié)構(gòu)開始
圖像問題:LeNet/ResNet 序列問題:LSTM/temporal convs 其它問題:fully-connected with one hidden layer 選擇常見的默認(rèn)超參
優(yōu)化器:adam with lr 3e-4 激活函數(shù):ReLU for MLP and conv nets,tanh for LSTM 參數(shù)初始化:He init for ReLU,Glorot for tanh 先不添加regularization和normalization 添加input normalization
簡(jiǎn)化問題
用少量數(shù)據(jù)/仿真數(shù)據(jù)來實(shí)驗(yàn) 使用固定數(shù)量的類別,input size等設(shè)置
Debug
5個(gè)最常見的bug:
tensor shape錯(cuò)誤 輸入的預(yù)處理不正確 Loss function的輸入錯(cuò)誤 沒有設(shè)置正確的train mode 數(shù)值處理問題導(dǎo)致出現(xiàn)inf/NaN,例如不正確的exp使用, divide by zero等
實(shí)現(xiàn)模型的3個(gè)建議:
從一個(gè)輕量級(jí)的實(shí)現(xiàn)開始,一般少于200行代碼 使用成熟庫(kù)中的默認(rèn)實(shí)現(xiàn),例如Keras中的自帶方法 后續(xù)再實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)pipeline
開發(fā)中的第一步,讓模型跑起來:
Shape mismatch或casting之類的問題,可以用ipdb, tfdb等方法來做斷點(diǎn)調(diào)試 Out-of-memory問題,可以逐個(gè)排除消耗內(nèi)存較大的操作來定位 其它問題,Google/StackOverflow驅(qū)動(dòng)開發(fā)……
第二步,在一個(gè)batch上過擬合:
Error不降反升,可能有地方符號(hào)用反了 Error爆炸,一般是數(shù)值處理問題,也可能是learning rate太大 Error震蕩,先降低learning rate,再看看是不是label跟數(shù)據(jù)沒對(duì)上,或者錯(cuò)誤的augmentation Error保持在一個(gè)中間狀態(tài)不下降,可以嘗試提高learning rate,移除regularization。后續(xù)還可以檢查一下loss function的實(shí)現(xiàn),以及數(shù)據(jù)pipeline的正確性
第三步,與已知結(jié)果比較:
例如與一個(gè)官方模型實(shí)現(xiàn)進(jìn)行比較,把相同的數(shù)據(jù)集用到你實(shí)現(xiàn)的模型上 也可以嘗試與非官方實(shí)現(xiàn)比較,不過很多github上的實(shí)現(xiàn)都有bug,要注意 或者直接與論文中提到的準(zhǔn)確率比較 最后,可以與簡(jiǎn)單的baseline比較,包括規(guī)則,簡(jiǎn)單模型等
Slides中有更多細(xì)節(jié),感覺總結(jié)的挺好。

Evaluate
使用經(jīng)典的bias variance decomposition來對(duì)模型進(jìn)行評(píng)估。

Improve
解決under-fitting問題
增加模型復(fù)雜度 降低regularization Error analysis 使用更復(fù)雜的架構(gòu) 超參調(diào)優(yōu) 添加特征
解決over-fitting問題
增加訓(xùn)練數(shù)據(jù) 添加normalization(當(dāng)前比regularization更流行) 數(shù)據(jù)增強(qiáng) 增強(qiáng)regularization Error analysis 使用更復(fù)雜的架構(gòu) 超參調(diào)優(yōu) Early-stopping 特征選擇 減少模型參數(shù)
解決distribution shift問題
分析test-validation error,進(jìn)而收集/生成更多訓(xùn)練數(shù)據(jù) 使用domain adaptation技術(shù)
Error analysis的時(shí)候,需要對(duì)各類錯(cuò)誤的優(yōu)先級(jí)進(jìn)行評(píng)估排序,這部分跟《Machine Learning Yearning》里內(nèi)容類似。
最后,可以考慮rebalance數(shù)據(jù)集。例如validation集上的表現(xiàn)明顯比test集好,可能需要考慮重新選擇一下validation/test集。
QA中提到,調(diào)優(yōu)RL算法的時(shí)候,random seed也應(yīng)該視為超參中的一部分 :)
Tune
不同的參數(shù)對(duì)模型效果的敏感度不同:
低敏感度:optimizer,batch size,non-linearity 中敏感度:參數(shù)初始化,模型深度,layer parameters,regularization 高敏感度:learning rate,learning rate schedule,loss function,layer size
參數(shù)優(yōu)化的方法:手動(dòng)調(diào)參,grid search,random search,coarse-to-fine search,貝葉斯優(yōu)化等。
Testing and Deployment
Project Structure

給出了項(xiàng)目結(jié)構(gòu)中不同類型的測(cè)試,與傳統(tǒng)的測(cè)試金字塔里的分類很不一樣。
ML Test Score
我的專欄文章中之前也寫過這兩篇經(jīng)典的論文,最近幾年好像也沒有見到新的相關(guān)文章出來。
CI/Testing
單元測(cè)試,集成測(cè)試,持續(xù)集成的一些基本概念,與軟件工程中基本一致。CD4ML中有更詳細(xì)的闡述。
一些工具介紹:CircleCI,Travis CI,Jenkins,Buildkite等。
Docker
簡(jiǎn)單介紹了Docker的使用場(chǎng)景,原理,使用方式等。后面簡(jiǎn)單提了下容器編排相關(guān)的工具,如kubernetes等。
有經(jīng)驗(yàn)的同學(xué)可以直接跳過。

Web Deployment
一般模型預(yù)測(cè)會(huì)以RESTful API的方式對(duì)外進(jìn)行服務(wù)。幾種部署方式:
在虛擬機(jī)上部署,通過添加intance來scale 在container上部署,通過k8s之類的編排軟件來scale 通過serverless的方式部署(AWS Lambda,Google Cloud Functions,Azure Functions),自動(dòng)擴(kuò)展,自帶負(fù)載均衡,監(jiān)控等服務(wù) 通過模型服務(wù)來部署(TF Serving,Model Server for MXNet,Clipper,Seldon或其它SaaS服務(wù))
如果使用CPU inference,一般會(huì)使用Docker部署或者serverless形式。
如果使用GPU inference,TF Serving,Ray Serve之類的模型服務(wù)中提供adaptive batching等功能會(huì)很有用。

Monitoring
這一節(jié)同樣參考《The ML Test Score》。
Serving systems, training pipelines, and input data,這幾塊都需要監(jiān)控。出問題時(shí)發(fā)出alarm,并記錄下來方便后續(xù)調(diào)查調(diào)優(yōu)。 所有可以被日志記錄的內(nèi)容,都可以被監(jiān)控,所以當(dāng)你設(shè)計(jì)info/warning/error log時(shí),同時(shí)考慮下是否要觸發(fā)監(jiān)控告警機(jī)制。 數(shù)據(jù)分布監(jiān)控方面的現(xiàn)成服務(wù)或方案比較少。 除了技術(shù)層面的監(jiān)控,對(duì)于業(yè)務(wù),終端用戶的監(jiān)控同樣非常重要。 Closing the Flywheel,一個(gè)需要思考的點(diǎn)。
Hardware/Mobile
在mobile上部署模型會(huì)遇到計(jì)算資源受限的問題,一般解決方法:減小模型大?。愃芃obileNet),quantizing weights,知識(shí)蒸餾(例如DistillBERT)等。
一些工具框架介紹:TensorFlow Lite,PyTorch Mobile,CoreML,MLKit,F(xiàn)ritzAI等。ONNX可以作為中間層,再部署到各種硬件平臺(tái)上。對(duì)于嵌入式系統(tǒng),最好的解決方案是NVIDIA for Embeded。
Research Areas
Pieter Abbeel介紹了few-shot learning,RL,imitation learning,domain randomization,NAS,unsupervised learning等幾個(gè)方面的話題,主要還是集中在他比較擅長(zhǎng)的強(qiáng)化學(xué)習(xí)和機(jī)器人應(yīng)用領(lǐng)域。不過沒看出跟課程主題之間的特別關(guān)系,可能主要是擴(kuò)展一下大家的視野,尤其是有些問題通過了解學(xué)術(shù)領(lǐng)域的解決思路,SoTA水平等,對(duì)于解決工業(yè)界的問題也有一定借鑒意義。另一方面是建立起兩者之間的連接,讓工業(yè)界的同學(xué)也大致了解如何follow學(xué)術(shù)界的一些研究思路和最新進(jìn)展,給出了一些參考建議。
Labs
一共有8個(gè)lab,感興趣的同學(xué)可以跟著一起深入了解實(shí)踐一下。
Guest Lectures
Where to go next
提供了非常多的學(xué)習(xí)資源。學(xué)完一個(gè),todo list上 又加了10個(gè)有沒有。
資源鏈接:https://course.fullstackdeeplearning.com/course-content/where-to-go-next
推薦閱讀
深度學(xué)習(xí)準(zhǔn)「研究僧」預(yù)習(xí)資料:圖靈獎(jiǎng)得主Yann LeCun《深度學(xué)習(xí)(Pytorch)》春季課程 一份來自賈揚(yáng)清的AI青年修煉指南:不存在算法工程師,調(diào)參俠沒有市場(chǎng) 追根溯源,算法崗面試「完整脈絡(luò)」梳理:手推公式、通用問題、常見算法

