機(jī)器學(xué)習(xí)所需的工程量未來(lái)會(huì)大大減少
未來(lái),構(gòu)建 ML 產(chǎn)品將更加有趣,并且這些系統(tǒng)會(huì)工作得更好。隨著 ML 自動(dòng)化工具的不斷改進(jìn),數(shù)據(jù)科學(xué)家和 ML 工程師將把更多的時(shí)間花在構(gòu)建優(yōu)秀的模型上,而花在與生產(chǎn)級(jí) ML 系統(tǒng)相關(guān)的繁瑣但必要的任務(wù)上的時(shí)間會(huì)更少。
AI 是一個(gè)系統(tǒng)工程問(wèn)題。
構(gòu)建一個(gè)有用的機(jī)器學(xué)習(xí)產(chǎn)品需要?jiǎng)?chuàng)建大量的工程組件,其中只有一小部分涉及 ML 代碼。構(gòu)建生產(chǎn)級(jí) ML 系統(tǒng)涉及到很多工作,比如構(gòu)建數(shù)據(jù)管道、配置云資源和管理服務(wù)基礎(chǔ)設(shè)施。
傳統(tǒng)上,ML 的研究主要集中于創(chuàng)建更好的模型,推動(dòng)語(yǔ)言建模和圖像處理等領(lǐng)域前沿技術(shù)的發(fā)展。很少有人在系統(tǒng)層面關(guān)注設(shè)計(jì)和實(shí)現(xiàn)生產(chǎn)級(jí) ML 應(yīng)用程序的優(yōu)秀實(shí)踐。盡管得到的關(guān)注較少,但是 ML 系統(tǒng)層面的設(shè)計(jì)和工程挑戰(zhàn)仍然非常重要——創(chuàng)建有用的東西比構(gòu)建良好的模型需要的東西更多,它需要構(gòu)建良好的系統(tǒng)。
真實(shí)世界的
ML2015 年,谷歌的一個(gè)團(tuán)隊(duì)繪制了下面這幅圖:
它顯示了真實(shí)世界的 ML 系統(tǒng)中專門用于建模的代碼量(小黑框)與 ML 應(yīng)用程序的支撐設(shè)施和管道所需的代碼的比較。這張圖表并沒(méi)有多么令人驚訝。對(duì)于大多數(shù)項(xiàng)目來(lái)說(shuō),構(gòu)建一個(gè)生產(chǎn)系統(tǒng)所涉及到的大多數(shù)令人頭痛的問(wèn)題并不是來(lái)自典型的 ML 問(wèn)題,如過(guò)擬合或欠擬合,而是來(lái)自于在系統(tǒng)中構(gòu)建足夠的結(jié)構(gòu)以使模型可以按預(yù)期工作。
生產(chǎn)級(jí) ML 系統(tǒng)
構(gòu)建一個(gè)生產(chǎn)級(jí) ML 系統(tǒng)可以歸結(jié)為構(gòu)建一個(gè)工作流——從數(shù)據(jù)攝取到模型服務(wù)的一系列步驟,其中每個(gè)步驟前后串聯(lián),并且足夠健壯,可以在生產(chǎn)環(huán)境中運(yùn)行。
工作流從一些數(shù)據(jù)源開(kāi)始,包括創(chuàng)建模型端點(diǎn)所需的所有步驟——輸入數(shù)據(jù)預(yù)處理、特征工程、訓(xùn)練和評(píng)估模型、將模型推送到服務(wù)環(huán)境,以及在生產(chǎn)環(huán)境中持續(xù)監(jiān)控模型端點(diǎn)。
這個(gè)工作流中的 特征工程>訓(xùn)練>調(diào)優(yōu) 部分通常被認(rèn)為是機(jī)器學(xué)習(xí)的“藝術(shù)”。對(duì)于大多數(shù)問(wèn)題,特征設(shè)計(jì)、模型架構(gòu)構(gòu)建和超參數(shù)調(diào)整,都有許許多多的方法,以至于數(shù)據(jù)科學(xué)家 /ML 工程師只能依賴于直覺(jué)和實(shí)驗(yàn)的混合。建模過(guò)程也是機(jī)器學(xué)習(xí)的一個(gè)有趣部分。
建模與工程
在不同的應(yīng)用場(chǎng)景和問(wèn)題域中,這個(gè)建模過(guò)程都會(huì)有所不同。如果你訓(xùn)練一個(gè)模型在 Netflix 上推薦內(nèi)容,這個(gè)建模過(guò)程與你為客戶服務(wù)構(gòu)建聊天機(jī)器人會(huì)有很大的不同。不僅底層數(shù)據(jù)的格式會(huì)不同(稀疏矩陣 vs 文本),而且預(yù)處理、模型構(gòu)建和調(diào)優(yōu)步驟也會(huì)有很大的不同。但是,盡管建模過(guò)程在跨應(yīng)用場(chǎng)景和問(wèn)題域時(shí)基本上都是特有的,但工程上的挑戰(zhàn)很大程度上是相同的。
無(wú)論你將哪種類型的模型投入生產(chǎn),圍繞該模型構(gòu)建生產(chǎn)工作流的工程挑戰(zhàn)在很大程度上是相同的。
這些跨 ML 領(lǐng)域的工程挑戰(zhàn)的同質(zhì)性是一個(gè)巨大的機(jī)會(huì)。 在未來(lái)(大部分是現(xiàn)在),這些工程挑戰(zhàn)將在很大程度上實(shí)現(xiàn)自動(dòng)化。將 Jupyter Notebook 中創(chuàng)建的模型轉(zhuǎn)換成生產(chǎn)級(jí) ML 系統(tǒng)的過(guò)程將變得更加容易。不需要?jiǎng)?chuàng)建專門的基礎(chǔ)設(shè)施來(lái)解決這些挑戰(zhàn),數(shù)據(jù)科學(xué)家 /ML 工程師已經(jīng)使用的開(kāi)源框架和云服務(wù)將在底層自動(dòng)實(shí)現(xiàn)這些解決方案。
大規(guī)模數(shù)據(jù)攝取
所有生產(chǎn)級(jí) ML 工作流都從一個(gè)數(shù)據(jù)源開(kāi)始。通常,與數(shù)據(jù)來(lái)源相關(guān)的工程挑戰(zhàn)是圍繞大規(guī)模數(shù)據(jù)攝取展開(kāi)的——我們?nèi)绾螐母鞣N數(shù)據(jù)來(lái)源導(dǎo)入和預(yù)處理數(shù)據(jù)集,因?yàn)檫@些數(shù)據(jù)及太大,無(wú)法裝入內(nèi)存。
開(kāi)源機(jī)器學(xué)習(xí)框架通過(guò)開(kāi)發(fā)數(shù)據(jù)加載程序,在很大程度上解決了這個(gè)問(wèn)題。這些工具(包括 TensorFlow 的 tf.data API 和 PyTorch DataLoader 庫(kù))將數(shù)據(jù)分段加載到內(nèi)存中,并且?guī)缀蹩梢杂糜谌魏未笮〉臄?shù)據(jù)集。它們還提供動(dòng)態(tài)特征工程,并且可以擴(kuò)展到生產(chǎn)環(huán)境。
加速模型訓(xùn)練
ML 社區(qū)做了大量的工作來(lái)減少訓(xùn)練大型模型所需的時(shí)間。對(duì)于大型訓(xùn)練工作,通常會(huì)將訓(xùn)練工作分配給一組機(jī)器(訓(xùn)練集群)。還有一種常見(jiàn)的做法是使用專門的硬件(GPU 和現(xiàn)在的 TPU)來(lái)進(jìn)一步減少訓(xùn)練模型所需的時(shí)間。
傳統(tǒng)上,在多臺(tái)機(jī)器和設(shè)備上分配訓(xùn)練操作需要修改模型代碼,這并不簡(jiǎn)單。為了能真正獲得使用機(jī)器集群和專用硬件所帶來(lái)的效率提升,代碼必須針對(duì)每個(gè)訓(xùn)練步驟智能地分割矩陣操作并合并參數(shù)更新。
現(xiàn)代工具使這個(gè)過(guò)程變得更加容易。TensorFlow Estimator API 從根本上簡(jiǎn)化了將模型代碼配置為在分布式集群上進(jìn)行訓(xùn)練的過(guò)程。使用 Estimator API,設(shè)置 一個(gè)參數(shù) 就可以將訓(xùn)練圖自動(dòng)分布到多臺(tái)機(jī)器 / 設(shè)備上。
像 AI Platform Training 這樣的工具能夠提供隨需應(yīng)變的資源供應(yīng),實(shí)現(xiàn)分布式集群上的模型訓(xùn)練。可以使用 bash shell 命令 為訓(xùn)練作業(yè)提供多種機(jī)器和設(shè)備類型(高性能 CPU、GPU 設(shè)備、TPU)。
可移植、可擴(kuò)展、可重復(fù)的 ML 實(shí)驗(yàn)
創(chuàng)建一個(gè)既能實(shí)現(xiàn)快速原型設(shè)計(jì)又能夠標(biāo)準(zhǔn)化實(shí)驗(yàn)過(guò)程的環(huán)境會(huì)面臨一連串的工程挑戰(zhàn)。
如果沒(méi)有一個(gè)清晰的方法來(lái)重復(fù)過(guò)去的實(shí)驗(yàn),并將模型元數(shù)據(jù)(參數(shù)值)與觀察到的評(píng)估指標(biāo)關(guān)聯(lián)起來(lái),超參數(shù)調(diào)優(yōu)(更改模型參數(shù)的值以降低驗(yàn)證錯(cuò)誤)的過(guò)程就不可靠??焖俚透咝н\(yùn)行實(shí)驗(yàn)的能力需要分布式和硬件加速器支持下的大規(guī)模訓(xùn)練。此外,如果 ML 代碼不可移植,實(shí)驗(yàn)過(guò)程將變得不可管理——其他團(tuán)隊(duì)成員 / 涉眾無(wú)法復(fù)制實(shí)驗(yàn),并且隨著新數(shù)據(jù)的出現(xiàn),生產(chǎn)中的模型也無(wú)法重新訓(xùn)練。
就我個(gè)人而言,我在團(tuán)隊(duì)中 為 AI Hub 構(gòu)建容器,我們正在努力幫助解決這些挑戰(zhàn)。我們將 ML 算法(XGBoost、ResNet 等)的高性能實(shí)現(xiàn)構(gòu)建為 Docker 容器。容器提供了對(duì) AI 平臺(tái)的原生支持,并且會(huì)默認(rèn)保存模型元數(shù)據(jù),提供了一個(gè)可重復(fù)的過(guò)程來(lái)運(yùn)行實(shí)驗(yàn)。這些容器支持分布式訓(xùn)練,可以在 GPU 或 TPU 設(shè)備上運(yùn)行。它們還具有可移植性——只要安裝了 Docker,容器就可以在任何地方由任何人運(yùn)行。
服務(wù)基礎(chǔ)設(shè)施
生產(chǎn)級(jí) ML 系統(tǒng)兩端的規(guī)模都很大:大規(guī)模的數(shù)據(jù)攝取和模型訓(xùn)練,以及大規(guī)模的模型服務(wù)。一旦一個(gè)模型被訓(xùn)練過(guò),它就必須被導(dǎo)出到一個(gè)環(huán)境中,用來(lái)生成推斷。正如消費(fèi)者網(wǎng)站需要處理 Web 流量的巨大波動(dòng)一樣,模型端點(diǎn)也必須能夠處理預(yù)測(cè)請(qǐng)求的波動(dòng)。
像 AI Platform Prediction 這樣的云工具為模型服務(wù)提供了一個(gè)可擴(kuò)展的解決方案。云服務(wù)的彈性特性允許服務(wù)基礎(chǔ)設(shè)施根據(jù)預(yù)測(cè)請(qǐng)求的數(shù)量伸縮。這些環(huán)境還允許對(duì)模型進(jìn)行持續(xù)監(jiān)控,并且可以編寫測(cè)試過(guò)程來(lái)檢查模型在生產(chǎn)過(guò)程中的行為。
未來(lái)更好的 ML 系統(tǒng)
未來(lái),構(gòu)建 ML 產(chǎn)品將更加有趣,并且這些系統(tǒng)會(huì)工作得更好。隨著 ML 自動(dòng)化工具的不斷改進(jìn),數(shù)據(jù)科學(xué)家和 ML 工程師將把更多的時(shí)間花在構(gòu)建優(yōu)秀的模型上,而花在與生產(chǎn)級(jí) ML 系統(tǒng)相關(guān)的繁瑣但必要的任務(wù)上的時(shí)間會(huì)更少。