機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)_第1頁(yè)
機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)_第2頁(yè)
機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)_第3頁(yè)
機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)_第4頁(yè)
機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)_第5頁(yè)
已閱讀5頁(yè),還剩237頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

\h機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)目錄\h第1章入門(mén)\h1.1為什么要用機(jī)器學(xué)習(xí)流水線\h1.2什么時(shí)候考慮使用機(jī)器學(xué)習(xí)流水線\h1.3機(jī)器學(xué)習(xí)流水線步驟概述\h1.3.1數(shù)據(jù)讀取和版本控制\h1.3.2數(shù)據(jù)校驗(yàn)\h1.3.3數(shù)據(jù)預(yù)處理\h1.3.4模型訓(xùn)練和模型調(diào)優(yōu)\h1.3.5模型分析\h1.3.6模型版本控制\h1.3.7模型部署\h1.3.8反饋循環(huán)\h1.3.9數(shù)據(jù)隱私\h1.4流水線編排\h1.4.1為什么使用流水線編排工具\(yùn)h1.4.2有向無(wú)環(huán)圖\h1.5示例項(xiàng)目\h1.5.1項(xiàng)目結(jié)構(gòu)\h1.5.2機(jī)器學(xué)習(xí)模型\h1.5.3示例項(xiàng)目的目標(biāo)\h1.6小結(jié)\h第2章TensorFlowExtended入門(mén)\h2.1什么是TFX\h2.2安裝TFX\h2.3TFX組件概述\h2.4什么是機(jī)器學(xué)習(xí)元數(shù)據(jù)\h2.5交互式流水線\h2.6TFX的替代品\h2.7ApacheBeam簡(jiǎn)介\h2.7.1安裝\h2.7.2基本數(shù)據(jù)流水線\h2.7.3執(zhí)行流水線\h2.8小結(jié)\h第3章數(shù)據(jù)讀取\h3.1數(shù)據(jù)讀取的概念\h3.1.1讀取本地?cái)?shù)據(jù)文件\h3.1.2讀取遠(yuǎn)程數(shù)據(jù)文件\h3.1.3直接從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)\h3.2數(shù)據(jù)準(zhǔn)備\h3.2.1拆分?jǐn)?shù)據(jù)集\h3.2.2跨越數(shù)據(jù)集\h3.2.3對(duì)數(shù)據(jù)集進(jìn)行版本控制\h3.3數(shù)據(jù)讀取策略\h3.3.1結(jié)構(gòu)化數(shù)據(jù)\h3.3.2自然語(yǔ)言處理中的文本數(shù)據(jù)\h3.3.3用于計(jì)算機(jī)視覺(jué)問(wèn)題的圖像數(shù)據(jù)\h3.4小結(jié)\h第4章數(shù)據(jù)校驗(yàn)\h4.1為什么要進(jìn)行數(shù)據(jù)校驗(yàn)\h4.2TFDV\h4.2.1安裝\h4.2.2根據(jù)數(shù)據(jù)生成統(tǒng)計(jì)信息\h4.2.3從數(shù)據(jù)生成模式\h4.3識(shí)別數(shù)據(jù)中的問(wèn)題\h4.3.1比較數(shù)據(jù)集\h4.3.2更新模式\h4.3.3數(shù)據(jù)偏斜和漂移\h4.3.4存在偏差的數(shù)據(jù)集\h4.3.5在TFDV中切分?jǐn)?shù)據(jù)\h4.4使用GCP處理大型數(shù)據(jù)集\h4.5將TFDV集成到機(jī)器學(xué)習(xí)流水線中\(zhòng)h4.6小結(jié)\h第5章數(shù)據(jù)預(yù)處理\h5.1為什么要進(jìn)行數(shù)據(jù)預(yù)處理\h5.1.1在整個(gè)數(shù)據(jù)集的上下文中預(yù)處理數(shù)據(jù)\h5.1.2擴(kuò)展預(yù)處理步驟\h5.1.3避免訓(xùn)練-服務(wù)偏斜\h5.1.4將預(yù)處理步驟和機(jī)器學(xué)習(xí)模型作為一個(gè)工件進(jìn)行部署\h5.1.5檢查流水線中的預(yù)處理結(jié)果\h5.2使用TFT做數(shù)據(jù)預(yù)處理\h5.2.1安裝\h5.2.2預(yù)處理策略\h5.2.3最佳實(shí)踐\h5.2.4TFT函數(shù)\h5.2.5TFT的獨(dú)立執(zhí)行\(zhòng)h5.2.6將TFT集成到機(jī)器學(xué)習(xí)流水線中\(zhòng)h5.3小結(jié)\h第6章模型訓(xùn)練\h6.1定義示例項(xiàng)目的模型\h6.2TFXTrainer組件\h6.2.1run_fn()函數(shù)\h6.2.2運(yùn)行Trainer組件\h6.2.3其他關(guān)于Trainer組件的注意事項(xiàng)\h6.3在交互式流水線中使用TensorBoard\h6.4分布策略\h6.5模型調(diào)整\h6.5.1超參數(shù)調(diào)整的策略\h6.5.2TFX流水線中的超參數(shù)調(diào)整\h6.6小結(jié)\h第7章模型分析和模型驗(yàn)證\h7.1如何分析模型\h7.1.1分類指標(biāo)\h7.1.2回歸指標(biāo)\h7.2TensorFlow模型分析\h7.2.1用TFMA分析單個(gè)模型\h7.2.2用TFMA分析多個(gè)模型\h7.3模型公平性分析\h7.3.1用TFMA劃分模型預(yù)測(cè)\h7.3.2用公平性指標(biāo)檢查決策閾值\h7.3.3詳解假設(shè)分析工具\(yùn)h7.4模型可解釋性\h7.4.1使用WIT生成模型解釋\h7.4.2其他模型解釋方法\h7.5用TFX進(jìn)行分析和驗(yàn)證\h7.5.1ResolverNode\h7.5.2Evaluator組件\h7.5.3用Evaluator組件進(jìn)行驗(yàn)證\h7.5.4TFXPusher組件\h7.6小結(jié)\h第8章用TensorFlowServing部署模型\h8.1簡(jiǎn)單的模型服務(wù)器\h8.2基于PythonAPI部署模型的缺點(diǎn)\h8.2.1缺少代碼隔離\h8.2.2缺少模型版本控制\h8.2.3低效的模型推算\h8.3TensorFlowServing\h8.4TensorFlowServing架構(gòu)概述\h8.5為T(mén)ensorFlowServing導(dǎo)出模型\h8.6模型簽名\h簽名方法\h8.7查看導(dǎo)出的模型\h8.7.1查看模型\h8.7.2測(cè)試模型\h8.8設(shè)置TensorFlowServing\h8.8.1Docker安裝\h8.8.2原生Ubuntu安裝\h8.8.3從源碼編譯TensorFlowServing\h8.9配置TensorFlow服務(wù)器\h8.9.1單一模型配置\h8.9.2多模型配置\h8.10REST與gRPC\h8.10.1REST\h8.10.2gRPC\h8.11用模型服務(wù)器預(yù)測(cè)\h8.11.1用REST獲得模型預(yù)測(cè)\h8.11.2通過(guò)gRPC使用TensorFlowServing\h8.12用TensorFlowServing進(jìn)行模型A/B測(cè)試\h8.13從模型服務(wù)器獲取模型元數(shù)據(jù)\h8.13.1使用REST請(qǐng)求模型元數(shù)據(jù)\h8.13.2使用gRPC請(qǐng)求模型元數(shù)據(jù)\h8.14批量推算請(qǐng)求\h8.15配置批量預(yù)測(cè)\h8.16其他TensorFlowServing優(yōu)化方法\h8.17TensorFlowServing的替代品\h8.17.1BentoML\h8.17.2Seldon\h8.17.3GraphPipe\h8.17.4SimpleTensorFlowServing\h8.17.5MLflow\h8.17.6RayServe\h8.18在云端部署\h8.18.1用例\h8.18.2在GCP上進(jìn)行示例部署\h8.19使用TFX流水線進(jìn)行模型部署\h8.20小結(jié)\h第9章使用TensorFlowServing進(jìn)行進(jìn)階模型部署\h9.1解耦部署環(huán)節(jié)\h9.1.1工作流概述\h9.1.2優(yōu)化遠(yuǎn)程模型加載\h9.2為部署模型進(jìn)行優(yōu)化\h9.2.1量化\h9.2.2剪枝\h9.2.3蒸餾\h9.3在TensorFlowServing中使用TensorRT\h9.4TFLite\h9.4.1用TFLite優(yōu)化模型的步驟\h9.4.2使用TensorFlowServing實(shí)例部署TFLite模型\h9.5監(jiān)測(cè)TensorFlowServing實(shí)例\h9.5.1設(shè)置Prometheus\h9.5.2TensorFlowServing配置\h9.6使用TensorFlowServing和Kubernetes進(jìn)行簡(jiǎn)單的擴(kuò)容\h9.7小結(jié)\h第10章TensorFlowExtended的高級(jí)功能\h10.1流水線的高級(jí)功能\h10.1.1同時(shí)訓(xùn)練多個(gè)模型\h10.1.2導(dǎo)出TFLite模型\h10.1.3熱啟動(dòng)模型訓(xùn)練\h10.2人工審核\h10.2.1創(chuàng)建Slack組件\h10.2.2如何使用Slack組件\h10.3TFX自定義組件\h10.3.1自定義組件的應(yīng)用場(chǎng)景\h10.3.2從零創(chuàng)建自定義組件\h10.3.3復(fù)用現(xiàn)有組件\h10.4小結(jié)\h第11章流水線第一部分:ApacheBeam和ApacheAirflow\h11.1選擇哪種編排工具\(yùn)h11.1.1ApacheBeam\h11.1.2ApacheAirflow\h11.1.3KubeflowPipelines\h11.1.4AIPlatform上的KubeflowPipelines\h11.2將交互式TFX流水線轉(zhuǎn)換為生產(chǎn)流水線\h11.3Beam和Airflow的簡(jiǎn)單交互式流水線轉(zhuǎn)換\h11.4ApacheBeam簡(jiǎn)介\h11.5使用ApacheBeam編排TFX流水線\h11.6ApacheAirflow簡(jiǎn)介\h11.6.1安裝和初始設(shè)置\h11.6.2基本Airflow示例\h11.7使用ApacheAirflow編排TFX流水線\h11.7.1流水線設(shè)置\h11.7.2運(yùn)行流水線\h11.8小結(jié)\h第12章流水線第二部分:KubeflowPipelines\h12.1KubeflowPipelines概述\h12.1.1安裝和初始設(shè)置\h12.1.2訪問(wèn)已安裝的KubeflowPipelines\h12.2使用KubeflowPipelines編排TFX流水線\h12.2.1流水線設(shè)置\h12.2.2運(yùn)行流水線\h12.2.3KubeflowPipelines的有用功能\h12.3基于GoogleCloudAIPlatform的流水線\h12.3.1流水線設(shè)置\h12.3.2TFX流水線設(shè)置\h12.3.3運(yùn)行流水線\h12.4小結(jié)\h第13章反饋循環(huán)\h13.1顯式反饋和隱式反饋\h13.1.1數(shù)據(jù)飛輪\h13.1.2現(xiàn)實(shí)世界中的反饋循環(huán)\h13.2收集反饋的設(shè)計(jì)模式\h13.2.1用戶根據(jù)預(yù)測(cè)采取了某些措施\h13.2.2用戶對(duì)預(yù)測(cè)的質(zhì)量進(jìn)行評(píng)分\h13.2.3用戶糾正預(yù)測(cè)\h13.2.4眾包打標(biāo)\h13.2.5專家打標(biāo)\h13.2.6自動(dòng)產(chǎn)生反饋\h13.3如何跟蹤反饋循環(huán)\h13.3.1跟蹤顯式反饋\h13.3.2跟蹤隱式反饋\h13.4小結(jié)\h第14章機(jī)器學(xué)習(xí)的數(shù)據(jù)隱私\h14.1數(shù)據(jù)隱私問(wèn)題\h14.1.1為什么關(guān)心數(shù)據(jù)隱私\h14.1.2最簡(jiǎn)單的加強(qiáng)隱私保護(hù)的方法\h14.1.3哪些數(shù)據(jù)需要保密\h14.2差分隱私\h14.2.1局部差分隱私和全局差分隱私\h14.2.2epsilon、delta和隱私預(yù)算\h14.2.3機(jī)器學(xué)習(xí)的差分隱私\h14.3TensorFlowPrivacy\h14.3.1使用差分隱私優(yōu)化器進(jìn)行訓(xùn)練\h14.3.2計(jì)算epsilon\h14.4聯(lián)邦學(xué)習(xí)\hTensorFlow中的聯(lián)邦學(xué)習(xí)\h14.5加密機(jī)器學(xué)習(xí)\h14.5.1加密模型訓(xùn)練\h14.5.2將訓(xùn)練好的模型轉(zhuǎn)換為加密的預(yù)測(cè)服務(wù)\h14.6其他數(shù)據(jù)保密方法\h14.7小結(jié)\h第15章流水線的未來(lái)和下一步\h15.1模型實(shí)驗(yàn)跟蹤\h15.2關(guān)于模型發(fā)布管理的思考\h15.3未來(lái)的流水線能力\h15.4TFX與其他機(jī)器學(xué)習(xí)框架\h15.5測(cè)試機(jī)器學(xué)習(xí)模型\h15.6用于機(jī)器學(xué)習(xí)的CI/CD系統(tǒng)\h15.7機(jī)器學(xué)習(xí)工程社區(qū)\h15.8小結(jié)\h附錄A機(jī)器學(xué)習(xí)基礎(chǔ)架構(gòu)簡(jiǎn)介\hA.1什么是容器\hA.2Docker簡(jiǎn)介\hA.2.1Docker鏡像簡(jiǎn)介\hA.2.2構(gòu)建第一個(gè)Docker鏡像\hA.2.3深入研究DockerCLI\hA.3Kubernetes簡(jiǎn)介\hA.3.1Kubernetes的一些概念定義\hA.3.2Minikube和kubectl入門(mén)\hA.3.3使用KubernetesCLI進(jìn)行交互\hA.3.4定義Kubernetes資源\hA.4將應(yīng)用部署到Kubernetes\h附錄B在GoogleCloud上設(shè)置Kubernetes集群\hB.1開(kāi)始之前\hB.2GoogleCloud上的Kubernetes\hB.2.1選擇GoogleCloud項(xiàng)目\hB.2.2設(shè)置GoogleCloud項(xiàng)目\hB.2.3創(chuàng)建Kubernetes集群\hB.2.4使用kubectl訪問(wèn)Kubernetes集群\hB.2.5在Kubectl中使用Kubernetes集群\hB.3KubeflowPipelines的持久卷設(shè)置\h附錄C操作KubeflowPipelines的技巧\hC.1自定義TFX鏡像\hC.2通過(guò)持久卷交換數(shù)據(jù)\hC.3TFX命令行界面\hC.3.1TFX及其依賴項(xiàng)\hC.3.2TFX模板\hC.3.3使用TFXCLI發(fā)布流水線注:原文檔電子版(非掃描),需要的請(qǐng)下載本文檔后留言謝謝。第1章入門(mén)本章將介紹機(jī)器學(xué)習(xí)流水線并給出框架性的構(gòu)建步驟。我們將講解如何將機(jī)器學(xué)習(xí)模型從一個(gè)小實(shí)驗(yàn)轉(zhuǎn)變成健壯的工業(yè)級(jí)生產(chǎn)系統(tǒng)。同時(shí),本章也將介紹一個(gè)貫穿全書(shū)的示例項(xiàng)目,通過(guò)這一項(xiàng)目來(lái)演示本書(shū)要介紹的各個(gè)準(zhǔn)則。1.1為什么要用機(jī)器學(xué)習(xí)流水線機(jī)器學(xué)習(xí)流水線的關(guān)鍵性優(yōu)勢(shì)建立在模型生命周期的自動(dòng)化上。當(dāng)有新的訓(xùn)練數(shù)據(jù)可用時(shí),一個(gè)包含數(shù)據(jù)校驗(yàn)、預(yù)處理、模型訓(xùn)練、分析和部署的工作流就會(huì)被觸發(fā)。我們觀察到有許多數(shù)據(jù)科學(xué)團(tuán)隊(duì)手動(dòng)做這些工作,不僅費(fèi)時(shí)費(fèi)力而且容易出錯(cuò)。下面來(lái)看看使用機(jī)器學(xué)習(xí)流水線的一些具體的好處。只需專注于新模型而不用維護(hù)既有模型自動(dòng)化的機(jī)器學(xué)習(xí)流水線將數(shù)據(jù)科學(xué)家從煩瑣的模型維護(hù)任務(wù)中解放出來(lái)。我們觀察到很多數(shù)據(jù)科學(xué)家將精力花在了更新之前已經(jīng)開(kāi)發(fā)完成的模型上。他們會(huì)手動(dòng)運(yùn)行腳本去預(yù)處理訓(xùn)練數(shù)據(jù)、使用一次性的部署腳本或者手動(dòng)微調(diào)模型。自動(dòng)化的流水線可以讓數(shù)據(jù)科學(xué)家專注于開(kāi)發(fā)新模型,這是他們最喜歡做的事。最終,這將帶來(lái)更高的工作滿意度,并在激烈的人才市場(chǎng)中保持較低的人才流失率。預(yù)防bug的產(chǎn)生自動(dòng)化流水線可以預(yù)防bug的產(chǎn)生。正如在后續(xù)章節(jié)中將看到的,新創(chuàng)建的模型會(huì)受到版本化數(shù)據(jù)的約束,預(yù)處理步驟也會(huì)受到已開(kāi)發(fā)模型的約束。這意味著如果有新的數(shù)據(jù),那么將生成新的模型。如果預(yù)處理步驟更新了,那么從原始數(shù)據(jù)經(jīng)過(guò)預(yù)處理得到的訓(xùn)練數(shù)據(jù)將變得無(wú)效,因此還是需要生成一個(gè)新的模型。在手動(dòng)機(jī)器學(xué)習(xí)工作流中,一個(gè)常見(jiàn)的bug來(lái)源是在模型訓(xùn)練完成后對(duì)預(yù)處理步驟的變更。在這種情況下,和模型一起部署的預(yù)處理步驟將和模型訓(xùn)練時(shí)的預(yù)處理步驟不一致。這些bug可能很難發(fā)現(xiàn)和調(diào)試,因?yàn)殡m然預(yù)處理步驟不一致,但依舊可以進(jìn)行推算,只是最后的推算結(jié)果不正確。通過(guò)使用自動(dòng)化的工作流,可以有效地預(yù)防這種錯(cuò)誤。有用的記錄文檔實(shí)驗(yàn)記錄和模型發(fā)布管理單元將生成一份記錄模型變化的記錄文檔。實(shí)驗(yàn)將記錄模型的超參數(shù)的變化、所使用的數(shù)據(jù)集和模型的性能指標(biāo)(比如損失值或者準(zhǔn)確率)。模型發(fā)布管理單元將追蹤哪一個(gè)模型最終被選用并部署。記錄文檔在數(shù)據(jù)科學(xué)團(tuán)隊(duì)需要重新創(chuàng)建模型或追蹤模型性能時(shí)特別有用。標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化的機(jī)器學(xué)習(xí)流水線可以改善數(shù)據(jù)科學(xué)團(tuán)隊(duì)的體驗(yàn)。受益于標(biāo)準(zhǔn)化的設(shè)置,數(shù)據(jù)科學(xué)家可以很快上手或者進(jìn)行跨團(tuán)隊(duì)合作,找到相同的開(kāi)發(fā)環(huán)境。這會(huì)提高效率并縮短新項(xiàng)目的啟動(dòng)時(shí)間。另外,這也能夠降低人才流失率。流水線對(duì)團(tuán)隊(duì)的影響自動(dòng)化機(jī)器學(xué)習(xí)流水線將對(duì)數(shù)據(jù)科學(xué)團(tuán)隊(duì)產(chǎn)生3個(gè)關(guān)鍵性的影響:擁有更多的時(shí)間去開(kāi)發(fā)具有創(chuàng)新性的模型;簡(jiǎn)化了更新已有模型的流程;縮短了在復(fù)現(xiàn)模型上所用的時(shí)間。所有這些方面都將降低數(shù)據(jù)科學(xué)項(xiàng)目的成本。不僅如此,自動(dòng)化機(jī)器學(xué)習(xí)流水線還會(huì)帶來(lái)如下好處。幫助檢測(cè)數(shù)據(jù)集或者訓(xùn)練模型中的潛在偏見(jiàn)。發(fā)現(xiàn)偏見(jiàn)問(wèn)題可以避免使用模型的人們受到傷害,比如亞馬遜的基于機(jī)器學(xué)習(xí)的簡(jiǎn)歷篩選器就被發(fā)現(xiàn)存在對(duì)女性不利的偏見(jiàn)。創(chuàng)建記錄文檔(通過(guò)實(shí)驗(yàn)記錄和模型發(fā)布管理單元?jiǎng)?chuàng)建)將有助于解決數(shù)據(jù)保護(hù)法律[比如歐盟的《通用數(shù)據(jù)保護(hù)條例》(GeneralDataProtectionRegulation,GDPR)]產(chǎn)生的一些問(wèn)題??梢詾閿?shù)據(jù)科學(xué)家節(jié)約更多的開(kāi)發(fā)時(shí)間并提高他們的工作滿意度。1.2什么時(shí)候考慮使用機(jī)器學(xué)習(xí)流水線雖然機(jī)器學(xué)習(xí)流水線具有多種優(yōu)勢(shì),但并不是所有的數(shù)據(jù)科學(xué)項(xiàng)目都需要使用流水線。有時(shí)候數(shù)據(jù)科學(xué)家只是想實(shí)驗(yàn)一個(gè)新的模型、研究一種新的模型架構(gòu)或者復(fù)現(xiàn)最近的學(xué)術(shù)成果。在這些情況下,流水線并不是很有用。然而,只要模型已經(jīng)有了用戶(比如,已經(jīng)在一個(gè)應(yīng)用中使用),它就需要持續(xù)地更新和微調(diào)。在這些情況下,我們又回到了之前討論過(guò)的場(chǎng)景:持續(xù)更新模型和減輕數(shù)據(jù)科學(xué)家在這些任務(wù)上的負(fù)擔(dān)。隨著機(jī)器學(xué)習(xí)項(xiàng)目的增長(zhǎng),流水線變得越來(lái)越重要。如果數(shù)據(jù)集或資源需求很大,我們所討論的這些方法就可以輕易地隨著基礎(chǔ)架構(gòu)擴(kuò)展。如果可重復(fù)性很重要,那么它可以通過(guò)機(jī)器學(xué)習(xí)流水線的自動(dòng)性和審計(jì)日志來(lái)實(shí)現(xiàn)。1.3機(jī)器學(xué)習(xí)流水線步驟概述機(jī)器學(xué)習(xí)流水線開(kāi)始于對(duì)新訓(xùn)練數(shù)據(jù)的獲取,結(jié)束于接收關(guān)于新模型性能表現(xiàn)如何的某種反饋。這種反饋既可以是產(chǎn)品性能指標(biāo),也可以是來(lái)自用戶的反饋。機(jī)器學(xué)習(xí)流水線包含多個(gè)步驟,比如數(shù)據(jù)預(yù)處理、模型訓(xùn)練和模型分析,當(dāng)然還包含不可或缺的模型部署步驟。可以想象,手動(dòng)執(zhí)行這些步驟將是多么麻煩且容易出錯(cuò)。本書(shū)將介紹使機(jī)器學(xué)習(xí)流水線自動(dòng)化的工具和解決方案。如圖1-1所示,整條流水線實(shí)際上就是一個(gè)無(wú)限循環(huán)。由于可以持續(xù)地收集數(shù)據(jù),因此機(jī)器學(xué)習(xí)模型也能被持續(xù)地更新。生成更多的數(shù)據(jù)通常意味著可以獲得更好的模型。因?yàn)閿?shù)據(jù)不斷地流入,所以流程自動(dòng)化變得異常關(guān)鍵。在真實(shí)世界的應(yīng)用環(huán)境中,你總是想頻繁地重新訓(xùn)練你的模型。如果不這樣做,在多數(shù)情況下模型的準(zhǔn)確率將慢慢降低,因?yàn)槟P陀?xùn)練時(shí)的數(shù)據(jù)和推算時(shí)的數(shù)據(jù)在分布上已經(jīng)存在差異。如果重新訓(xùn)練模型的過(guò)程是手動(dòng)的,那么就需要數(shù)據(jù)科學(xué)家或機(jī)器學(xué)習(xí)工程師手動(dòng)校驗(yàn)新的訓(xùn)練數(shù)據(jù)或分析更新后的模型。因此,他們就沒(méi)有時(shí)間為完全不同的業(yè)務(wù)問(wèn)題開(kāi)發(fā)新的模型了。圖1-1:模型的生命周期一條機(jī)器學(xué)習(xí)流水線通常包含以下幾個(gè)步驟。1.3.1數(shù)據(jù)讀取和版本控制數(shù)據(jù)讀?。▍⒁?jiàn)第3章)是每一條機(jī)器學(xué)習(xí)流水線的開(kāi)始。在這一步驟中,我們將數(shù)據(jù)處理成后續(xù)組件能夠讀取的格式。數(shù)據(jù)讀取步驟不會(huì)執(zhí)行任何特征工程(其會(huì)在數(shù)據(jù)校驗(yàn)步驟后進(jìn)行)。這也是進(jìn)行輸入數(shù)據(jù)版本控制的最佳時(shí)機(jī),在流水線末端訓(xùn)練得到的模型將和這個(gè)數(shù)據(jù)快照聯(lián)系在一起。1.3.2數(shù)據(jù)校驗(yàn)在訓(xùn)練新的模型版本前,需要校驗(yàn)新的數(shù)據(jù)。數(shù)據(jù)校驗(yàn)(參見(jiàn)第4章)將專注于如何檢查新的數(shù)據(jù)在統(tǒng)計(jì)意義上是否滿足期望(比如范圍、類別數(shù)量和類別分布)。如果數(shù)據(jù)校驗(yàn)工具檢測(cè)到異常的情況,它會(huì)警示數(shù)據(jù)科學(xué)家。如果你在訓(xùn)練一個(gè)二分類模型,那么你的訓(xùn)練數(shù)據(jù)應(yīng)該包含50%的X類樣本和50%的Y類樣本。如果新數(shù)據(jù)的類別劃分比例發(fā)生了變化,比如說(shuō)兩個(gè)類別的比例為70∶30,那么數(shù)據(jù)校驗(yàn)工具將發(fā)出警示。如果模型在這樣一個(gè)嚴(yán)重不均衡的訓(xùn)練集上訓(xùn)練,并且數(shù)據(jù)科學(xué)家并沒(méi)有采取措施去調(diào)整模型的損失函數(shù)或者采用過(guò)采樣/欠采樣的方案去調(diào)整分類X和分類Y,那么模型的預(yù)測(cè)結(jié)果可能會(huì)偏向樣本數(shù)量更多的類別。常見(jiàn)的數(shù)據(jù)校驗(yàn)工具還允許你比較不同的數(shù)據(jù)集。如果你有一個(gè)包含優(yōu)勢(shì)分類的數(shù)據(jù)集,并想將這個(gè)數(shù)據(jù)集分成訓(xùn)練集和校驗(yàn)集,那么你需要確認(rèn)兩個(gè)數(shù)據(jù)集間的分類分布情況大體相同。數(shù)據(jù)校驗(yàn)工具允許你比較不同的數(shù)據(jù)集并找出其中的異常部分。如果數(shù)據(jù)校驗(yàn)發(fā)現(xiàn)了異常,那么流水線將停止處理并會(huì)向數(shù)據(jù)科學(xué)家發(fā)出警告。如果發(fā)現(xiàn)數(shù)據(jù)分布出現(xiàn)漂移,那么數(shù)據(jù)科學(xué)家或機(jī)器學(xué)習(xí)工程師可以改變每個(gè)類別的抽樣方式(比如,從每個(gè)類別中抽取相同數(shù)量的樣本),或者改變模型的損失函數(shù),開(kāi)始構(gòu)建新的模型流水線并重啟生命周期。1.3.3數(shù)據(jù)預(yù)處理新收集的數(shù)據(jù)通常無(wú)法直接用于機(jī)器學(xué)習(xí)模型的訓(xùn)練。在絕大多數(shù)情況下,數(shù)據(jù)需要經(jīng)過(guò)預(yù)處理才能用于訓(xùn)練。標(biāo)簽往往需要先轉(zhuǎn)換成one-hot向量或者multi-hot向量1。這一過(guò)程同樣適用于模型的輸入數(shù)據(jù)。如果訓(xùn)練文本模型,那么需要將文本中的字符轉(zhuǎn)換成索引或者將文本標(biāo)記轉(zhuǎn)換成詞向量。因?yàn)轭A(yù)處理過(guò)程只需要在訓(xùn)練模型前執(zhí)行一次,而無(wú)須在每輪訓(xùn)練中重復(fù)執(zhí)行,所以將預(yù)處理過(guò)程放在模型訓(xùn)練前獨(dú)立運(yùn)行很合理。1在將結(jié)果同時(shí)分成多個(gè)類別的監(jiān)督分類問(wèn)題中,需要將類別轉(zhuǎn)換成如(0,1,0)這種one-hot向量,或者將一個(gè)類別列表轉(zhuǎn)換成如(1,1,0)這種multi-hot向量。數(shù)據(jù)預(yù)處理工具的種類繁多,從簡(jiǎn)單的Python腳本到復(fù)雜的圖模型都有。大部分?jǐn)?shù)據(jù)科學(xué)家很關(guān)心所選工具的處理能力,但預(yù)處理步驟的改動(dòng)和已處理數(shù)據(jù)之間的雙向連接同樣重要。這意味著如果有人改動(dòng)了預(yù)處理步驟(比如,在one-hot向量轉(zhuǎn)換中增加了額外的標(biāo)簽),那么之前的訓(xùn)練數(shù)據(jù)應(yīng)該無(wú)效并會(huì)強(qiáng)制更新整條流水線。第5章將進(jìn)一步描述數(shù)據(jù)預(yù)處理步驟。1.3.4模型訓(xùn)練和模型調(diào)優(yōu)模型訓(xùn)練(參見(jiàn)第6章)是機(jī)器學(xué)習(xí)流水線的核心。這一步驟將訓(xùn)練模型讀取輸入并以盡可能低的誤差預(yù)測(cè)輸出。隨著模型(尤其是那些使用大規(guī)模訓(xùn)練數(shù)據(jù)集的模型)的增大,這一步驟將很快變得越來(lái)越難以管理。對(duì)于計(jì)算而言,由于單機(jī)內(nèi)存通常是有限的,因此高效的分布式模型訓(xùn)練將成為關(guān)鍵。因?yàn)榭梢垣@得顯著的性能提升和提供競(jìng)爭(zhēng)優(yōu)勢(shì),所以模型調(diào)優(yōu)近年來(lái)獲得了極大的關(guān)注。根據(jù)機(jī)器學(xué)習(xí)項(xiàng)目的不同,可以選擇在考慮使用機(jī)器學(xué)習(xí)流水線之前調(diào)優(yōu)或者將之作為流水線的一部分。得益于優(yōu)秀的底層架構(gòu),本書(shū)介紹的流水線是可以擴(kuò)展的,模型可以大規(guī)模地并行或順序啟動(dòng)。這樣一來(lái),便可以為最終的生產(chǎn)模型找出最優(yōu)的模型超參數(shù)。1.3.5模型分析通常情況下,使用準(zhǔn)確率或者損失值來(lái)確定最優(yōu)的模型參數(shù)集。但當(dāng)模型的最終版本確定后,進(jìn)行深度模型性能分析(參見(jiàn)第7章)將非常有用。這可能包括計(jì)算其他指標(biāo),比如精度、召回率和曲線下面積(areaunderthecurve,AUC),或在一個(gè)更大的數(shù)據(jù)集(而不是訓(xùn)練時(shí)用的校驗(yàn)集)上計(jì)算性能。進(jìn)行深度模型性能分析的另一個(gè)原因是要檢查模型預(yù)測(cè)的公平性。對(duì)數(shù)據(jù)集進(jìn)行分組并對(duì)每組數(shù)據(jù)獨(dú)立評(píng)估后才能分析出模型在組間的不同表現(xiàn)。通過(guò)調(diào)查模型對(duì)訓(xùn)練中所用特征的依賴,可以解釋改變單個(gè)訓(xùn)練樣本的特征將如何影響模型的預(yù)測(cè)結(jié)果。與模型調(diào)優(yōu)以及最終選擇最優(yōu)模型的步驟一樣,這一步驟也需要數(shù)據(jù)科學(xué)家參與。然而,后面將演示如何將整個(gè)分析自動(dòng)化,僅在最后審核時(shí)才需要人參與。這一自動(dòng)化過(guò)程使模型分析變得統(tǒng)一且具有可比較性。1.3.6模型版本控制模型版本控制和驗(yàn)證的目的是追蹤哪種模型、哪個(gè)超參數(shù)集以及數(shù)據(jù)集將被選擇作為下一個(gè)要部署的版本。軟件工程中的語(yǔ)義化版本控制要求使用者在其API中做出具有不兼容性的改變或者在重大特性發(fā)布時(shí)增加主版本號(hào),否則就增加次版本號(hào)。模型發(fā)布管理還有另外一個(gè)自由度:數(shù)據(jù)集。在一些情況下,無(wú)須改變模型參數(shù)或者模型架構(gòu),僅通過(guò)大幅增加或者提供更好的數(shù)據(jù)集就可以顯著提升模型性能。這種性能提升是否意味著需要增加模型主版本號(hào)呢?對(duì)于上述問(wèn)題,不同的數(shù)據(jù)科學(xué)團(tuán)隊(duì)可能有不同的答案,但記錄新版模型的所有輸入(超參數(shù)、數(shù)據(jù)集、模型架構(gòu))并將其作為版本發(fā)布的一部分是非常必要的。1.3.7模型部署在完成模型的訓(xùn)練、調(diào)優(yōu)和分析后,就到了收獲成果的黃金時(shí)刻。不過(guò),因?yàn)橛刑嗟哪P褪峭ㄟ^(guò)一次性實(shí)現(xiàn)工具2完成的部署,所以模型更新成了一個(gè)容易出錯(cuò)的過(guò)程。2比如臨時(shí)寫(xiě)的腳本等?!g者注使用現(xiàn)代模型服務(wù)器,無(wú)須編寫(xiě)Web應(yīng)用代碼就可以部署模型。通常情況下,模型服務(wù)器會(huì)提供多種API,比如描述性狀態(tài)遷移(REST)或者遠(yuǎn)程過(guò)程調(diào)用(RPC)等協(xié)議,并支持同時(shí)運(yùn)行相同模型的多個(gè)不同版本。同時(shí)運(yùn)行多個(gè)模型版本有助于對(duì)模型做A/B測(cè)試,并針對(duì)如何改善模型提供很有價(jià)值的反饋。在模型服務(wù)器的幫助下,可以直接更新模型版本,而無(wú)須重新部署應(yīng)用。這可以縮短應(yīng)用的停機(jī)時(shí)間并減少應(yīng)用開(kāi)發(fā)團(tuán)隊(duì)和機(jī)器學(xué)習(xí)團(tuán)隊(duì)間的溝通。第8章和第9章將詳細(xì)介紹模型部署。1.3.8反饋循環(huán)機(jī)器學(xué)習(xí)流水線的最后一步常被人忘記,但它對(duì)于數(shù)據(jù)科學(xué)項(xiàng)目的成功至關(guān)重要。這個(gè)流程需要閉環(huán),從而在評(píng)估新部署模型的有效性和性能時(shí)得到有價(jià)值的信息。在一些場(chǎng)景中,還能獲得新的訓(xùn)練數(shù)據(jù),以用于擴(kuò)充數(shù)據(jù)集和更新模型。這個(gè)過(guò)程既可以有人參與,也可以全程自動(dòng)。詳細(xì)信息參見(jiàn)第13章。除去需要人參與的兩個(gè)步驟(模型分析和模型反饋),整條流水線都可以自動(dòng)化。這樣一來(lái),數(shù)據(jù)科學(xué)家就能夠?qū)W⒂谛履P烷_(kāi)發(fā),而不是更新和維護(hù)現(xiàn)有的模型。1.3.9數(shù)據(jù)隱私在撰寫(xiě)本書(shū)時(shí),數(shù)據(jù)隱私還未納入標(biāo)準(zhǔn)的機(jī)器學(xué)習(xí)流水線。隨著消費(fèi)者越來(lái)越關(guān)心自己的數(shù)據(jù)如何被使用以及限制個(gè)人數(shù)據(jù)使用的法律法規(guī)的出臺(tái),數(shù)據(jù)隱私越來(lái)越引起人們重視。在這種趨勢(shì)下,隱私保護(hù)方法終將加入構(gòu)建機(jī)器學(xué)習(xí)流水線的工具中。第14章將討論為機(jī)器學(xué)習(xí)模型增強(qiáng)隱私性的幾種方法。差分隱私:通過(guò)數(shù)學(xué)方法保證模型的預(yù)測(cè)結(jié)果不會(huì)暴露用戶數(shù)據(jù)。聯(lián)邦學(xué)習(xí):原始數(shù)據(jù)只在本地被使用,不會(huì)上傳到云端或分享給其他設(shè)備。加密機(jī)器學(xué)習(xí):整個(gè)訓(xùn)練過(guò)程全部在加密的空間中進(jìn)行,或者訓(xùn)練數(shù)據(jù)是加密的。1.4流水線編排前面描述的所有機(jī)器學(xué)習(xí)流水線組件都需要有序執(zhí)行或者說(shuō)編排,這樣眾多組件才能按照正確的順序運(yùn)行。組件的輸入數(shù)據(jù)必須在組件執(zhí)行前就通過(guò)計(jì)算得到。對(duì)這些步驟的編排是通過(guò)諸如ApacheBeam、ApacheAirflow(參見(jiàn)第11章)或Kubernetes基礎(chǔ)架構(gòu)中的KubeflowPipelines等工具(參見(jiàn)第12章)來(lái)完成的。數(shù)據(jù)流水線工具在不同的機(jī)器學(xué)習(xí)流水線步驟間協(xié)調(diào),如TensorFlowMLMetadataStore的流水線工件倉(cāng)庫(kù)會(huì)捕獲每個(gè)處理過(guò)程的輸出。第2章將概述TFX的MetadataStore并深入學(xué)習(xí)TFX和它的流水線組件。1.4.1為什么使用流水線編排工具2015年,谷歌的一群機(jī)器學(xué)習(xí)工程師得出結(jié)論:眾多機(jī)器學(xué)習(xí)項(xiàng)目失敗的一個(gè)原因是使用自定義代碼去連接不同的機(jī)器學(xué)習(xí)流水線步驟。3然而,這些自定義代碼無(wú)法輕易地從一個(gè)項(xiàng)目遷移到另一個(gè)項(xiàng)目。研究人員在其論文“HiddenTechnicalDebtinMachineLearningSystems”4中總結(jié)了他們的發(fā)現(xiàn)。作者們?cè)谡撐闹修q稱這些流水線步驟間的膠水代碼通常很脆弱并在超出特定范圍后無(wú)法擴(kuò)展。隨著時(shí)間的推移,人們開(kāi)發(fā)了諸如ApacheBeam、ApacheAirflow和KubeflowPipelines等工具。這些工具可用于管理機(jī)器學(xué)習(xí)流水線任務(wù),允許使用標(biāo)準(zhǔn)的編排工具并對(duì)任務(wù)間的膠水代碼進(jìn)行抽象。3谷歌于2007年開(kāi)始了一個(gè)名為Sibyl的內(nèi)部項(xiàng)目,該項(xiàng)目的目的是管理內(nèi)部機(jī)器學(xué)習(xí)產(chǎn)品流水線。2015年,這個(gè)話題在D.Sculley等人發(fā)布了他們的機(jī)器學(xué)習(xí)流水線文章“HiddenTechnicalDebtinMachineLearningSystems”后引起了廣泛的關(guān)注。4D.Sculley等,“HiddenTechnicalDebtinMachineLearningSystems”,谷歌公司(2015年)。盡管學(xué)習(xí)一個(gè)新工具(比如Beam或Airflow)或者一個(gè)新框架(比如Kubeflow),以及建立一套額外的機(jī)器學(xué)習(xí)基礎(chǔ)架構(gòu)(比如Kubernetes)看起來(lái)很麻煩,但投入這些時(shí)間會(huì)很快得到豐厚的回報(bào)。如果不采用標(biāo)準(zhǔn)的機(jī)器學(xué)習(xí)流水線,那么數(shù)據(jù)科學(xué)團(tuán)隊(duì)需要面對(duì)不統(tǒng)一的項(xiàng)目設(shè)置、隨意放置的日志文件、各不相同的調(diào)試步驟等數(shù)不完的混亂。1.4.2有向無(wú)環(huán)圖諸如ApacheBeam、ApacheAirflow和KubeflowPipelines等流水線工具使用任務(wù)間的依賴圖來(lái)控制任務(wù)的執(zhí)行流程。如圖1-2所示,所有的流水線步驟都是有向的。這意味著從任務(wù)A開(kāi)始到任務(wù)E結(jié)束的流水線,其任務(wù)間的依賴清晰定義了流水線的執(zhí)行路徑。有向圖避免了任務(wù)開(kāi)始時(shí)其依賴項(xiàng)還沒(méi)有完成計(jì)算的情況。由于我們知道訓(xùn)練數(shù)據(jù)的預(yù)處理必須先于模型訓(xùn)練執(zhí)行,因此通過(guò)有向圖的表示,可以避免模型訓(xùn)練在數(shù)據(jù)預(yù)處理完成之前執(zhí)行。圖1-2:有向無(wú)環(huán)圖示例流水線圖也必須是無(wú)環(huán)的,這意味著圖不能連接至先前已經(jīng)完成的任務(wù)。5有環(huán)意味著流水線會(huì)一直執(zhí)行且永不停止,因此工作流也就永遠(yuǎn)不能完成。5無(wú)環(huán)圖中不能存在直接或間接的環(huán)狀依賴,也就是說(shuō)A依賴B的同時(shí)B也依賴A?!g者注由于這兩個(gè)約束條件(有向和無(wú)環(huán))的存在,流水線圖被稱為有向無(wú)環(huán)圖(directedacyclicgraph,DAG)。有向無(wú)環(huán)圖是大部分工作流工具最核心的概念。第11章和第12章將討論更多關(guān)于有向無(wú)環(huán)圖的細(xì)節(jié)。1.5示例項(xiàng)目為了能更好地理解本書(shū)內(nèi)容,我們提供了使用開(kāi)源數(shù)據(jù)的示例項(xiàng)目。數(shù)據(jù)集收集了美國(guó)消費(fèi)者關(guān)于金融產(chǎn)品的投訴,內(nèi)容上既包含結(jié)構(gòu)化數(shù)據(jù)(分類/數(shù)值數(shù)據(jù)),也包含非結(jié)構(gòu)化數(shù)據(jù)(文本數(shù)據(jù))。數(shù)據(jù)來(lái)自美國(guó)消費(fèi)者金融保護(hù)局。圖1-3展示了數(shù)據(jù)集中的部分樣本。圖1-3:數(shù)據(jù)樣本這里的機(jī)器學(xué)習(xí)問(wèn)題是給定關(guān)于投訴的數(shù)據(jù),預(yù)測(cè)消費(fèi)者是否對(duì)公司的回復(fù)有異議。在本數(shù)據(jù)集中,大約30%的消費(fèi)者對(duì)回復(fù)有異議,因此數(shù)據(jù)是不均衡的。1.5.1項(xiàng)目結(jié)構(gòu)示例項(xiàng)目已經(jīng)上傳至GitHub倉(cāng)庫(kù),通過(guò)下列命令可以克隆該項(xiàng)目。$gitclone/Building-ML-Pipelines\building-machine-learning-pipelines.gitPython包版本本示例項(xiàng)目使用Python3.6~3.8、TensorFlow2.2.0和TFX0.22.0。項(xiàng)目會(huì)持續(xù)更新,但無(wú)法保證兼容其他編程語(yǔ)言或包版本。示例項(xiàng)目包含如下部分:chapters目錄包含第3章、第4章、第7章和第14章的樣例notebook;components目錄包含諸如模型定義之類的常用組件的代碼;一條完整的交互式流水線;一個(gè)機(jī)器學(xué)習(xí)實(shí)驗(yàn)的示例,其是整條流水線的起點(diǎn);由ApacheBeam、ApacheAirflow和KubeflowPipelines編排的完整的流水線;utility目錄包含下載數(shù)據(jù)的腳本。在后面的章節(jié)中,我們將逐步指導(dǎo)你通過(guò)必要的步驟將一個(gè)基于Keras模型架構(gòu)的JupyterNotebook的樣例機(jī)器學(xué)習(xí)實(shí)驗(yàn)轉(zhuǎn)換成完整的機(jī)器學(xué)習(xí)流水線。1.5.2機(jī)器學(xué)習(xí)模型示例深度學(xué)習(xí)項(xiàng)目的核心是由位于components/module.py中的get_model函數(shù)生成的模型。模型通過(guò)如下特征來(lái)預(yù)測(cè)消費(fèi)者對(duì)于回復(fù)是否存在異議。金融產(chǎn)品子產(chǎn)品公司對(duì)于投訴的回復(fù)投訴類型消費(fèi)者所在的州消費(fèi)者所在地郵政編碼消費(fèi)者投訴的內(nèi)容為了構(gòu)建機(jī)器學(xué)習(xí)流水線,假設(shè)模型架構(gòu)設(shè)計(jì)已經(jīng)完成并且不再修改。第6章將詳細(xì)討論模型架構(gòu)的細(xì)節(jié)。但實(shí)際上在本書(shū)中,模型架構(gòu)是非常小的知識(shí)點(diǎn)。本書(shū)主要討論的是在模型已經(jīng)存在的情況下該做什么。1.5.3示例項(xiàng)目的目標(biāo)本書(shū)將演示持續(xù)訓(xùn)練示例機(jī)器學(xué)習(xí)模型的必要框架、組件和基礎(chǔ)架構(gòu)元素。圖1-4展示了本書(shū)將在架構(gòu)圖中使用的軟件棧。圖1-4:示例項(xiàng)目的機(jī)器學(xué)習(xí)流水線架構(gòu)本書(shū)會(huì)盡量保持示例項(xiàng)目中機(jī)器學(xué)習(xí)問(wèn)題的通用性,以便你將之替換成自己的機(jī)器學(xué)習(xí)問(wèn)題。構(gòu)建機(jī)器學(xué)習(xí)流水線的結(jié)構(gòu)和基本步驟是不變的,可以很容易地遷移到你的實(shí)際案例中。每個(gè)組件將需要一些自定義操作(比如,從哪里讀取數(shù)據(jù)),但正如后面將討論的,這些自定義操作需要被適當(dāng)?shù)叵拗啤?.6小結(jié)本章介紹了機(jī)器學(xué)習(xí)流水線的概念并解釋了其中的步驟,同時(shí)也展示了自動(dòng)化流水線的優(yōu)勢(shì)。本章為后續(xù)章節(jié)做好了鋪墊,并在介紹示例項(xiàng)目的同時(shí)簡(jiǎn)單介紹了每章的大體輪廓。第2章將開(kāi)始構(gòu)建流水線!第2章TensorFlowExtended入門(mén)第1章介紹了機(jī)器學(xué)習(xí)流水線的概念并討論了構(gòu)成流水線的組件。本章將介紹TensorFlowExtended(TFX)。TFX庫(kù)提供了構(gòu)建機(jī)器學(xué)習(xí)流水線所需的所有組件。我們將使用TFX定義流水線任務(wù),然后可以使用諸如Airflow和KubeflowPipelines這樣的編排工具來(lái)執(zhí)行流水線任務(wù)。圖2-1概述了流水線步驟以及它們是如何結(jié)合在一起的。圖2-1:機(jī)器學(xué)習(xí)流水線中的TFX本章將介紹如何安裝TFX,并解釋其基本概念和術(shù)語(yǔ),為后續(xù)章節(jié)做好鋪墊。后續(xù)章節(jié)將深入研究那些組成流水線的組件。本章還將介紹ApacheBeam。ApacheBeam是一個(gè)定義并執(zhí)行數(shù)據(jù)處理任務(wù)的開(kāi)源工具。它在TFX流水線中有兩個(gè)用處:首先,它是許多TFX組件(諸如數(shù)據(jù)校驗(yàn)和數(shù)據(jù)預(yù)處理)用于處理數(shù)據(jù)的底層庫(kù);其次,正如第1章介紹的那樣,ApacheBeam還能用作流水線編排工具。之所以在本章介紹ApacheBeam,是因?yàn)樗粌H可以幫助你理解TFX組件,而且對(duì)于編寫(xiě)自定義組件(第10章將詳細(xì)介紹)是至關(guān)重要的。2.1什么是TFX機(jī)器學(xué)習(xí)流水線可能會(huì)變得非常復(fù)雜,管理任務(wù)間的依賴將消耗大量的資源。與此同時(shí),機(jī)器學(xué)習(xí)流水線可以包含各種任務(wù),包括數(shù)據(jù)校驗(yàn)、數(shù)據(jù)預(yù)處理、模型訓(xùn)練以及各種訓(xùn)練后的任務(wù)。如第1章所述,任務(wù)之間的連接通常比較脆弱,這會(huì)導(dǎo)致流水線出錯(cuò)?!癏iddenTechnicalDebtinMachineLearningSystems”這篇論文中稱這些連接為“膠水代碼”。這些脆弱連接的存在最終意味著生產(chǎn)模型的更新頻率會(huì)很低,數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師討厭更新這些陳舊的模型。另外,流水線需要優(yōu)秀的分布式處理系統(tǒng),這就是TFX需要使用ApacheBeam的原因。在高工作負(fù)荷的情況下更是如此。谷歌內(nèi)部也面臨同樣的問(wèn)題。因此,他們決定開(kāi)發(fā)一個(gè)平臺(tái)來(lái)簡(jiǎn)化流水線的定義,同時(shí)最大限度地減少要編寫(xiě)的任務(wù)樣板代碼。開(kāi)源版的谷歌內(nèi)部專用機(jī)器學(xué)習(xí)流水線框架就是TFX。圖2-2展示了使用TFX的通用流水線架構(gòu)。流水線編排工具是執(zhí)行任務(wù)的基礎(chǔ)。除此之外,還需要數(shù)據(jù)倉(cāng)庫(kù)來(lái)追蹤流水線的中間結(jié)果。每個(gè)組件都和數(shù)據(jù)倉(cāng)庫(kù)通信以獲得輸入數(shù)據(jù),并將輸出數(shù)據(jù)存入數(shù)據(jù)倉(cāng)庫(kù)。這些數(shù)據(jù)會(huì)作為后續(xù)任務(wù)的輸入。TFX提供了集成所有這些工具的層,該層提供了用于主要流水線任務(wù)的各個(gè)組件。圖2-2:機(jī)器學(xué)習(xí)流水線架構(gòu)起初,谷歌在開(kāi)源TensorFlow庫(kù)(比如第8章將討論的TensorFlowServing)中發(fā)布了TFX庫(kù)下的部分流水線功能。2019年,谷歌發(fā)布了開(kāi)源的膠水代碼,其中包含所有必需的流水線組件,可以用于將各個(gè)庫(kù)結(jié)合在一起并能自動(dòng)地為諸如ApacheAirflow、ApacheBeam和KubeflowPipelines等編排工具創(chuàng)建機(jī)器學(xué)習(xí)流水線。TFX提供了多種可以覆蓋大量用例的流水線組件。在撰寫(xiě)本書(shū)時(shí),已經(jīng)有以下這些組件。ExampleGen:用于數(shù)據(jù)讀取。StatisticsGen、SchemaGen和ExampleValidator:用于數(shù)據(jù)校驗(yàn)。Transform:用于數(shù)據(jù)預(yù)處理。Trainer:用于模型訓(xùn)練。ResolverNode:用于檢查先前訓(xùn)練完成的模型。Evaluator:用于模型分析和模型驗(yàn)證。Pusher:用于模型部署。圖2-3展示了流水線的組件和庫(kù)如何組合在一起。圖2-3:TFX組件和庫(kù)后續(xù)章節(jié)將詳細(xì)討論這些組件和庫(kù)。對(duì)于需要使用非標(biāo)準(zhǔn)功能的場(chǎng)景,第10章將討論如何創(chuàng)建自定義的流水線組件。TFX的穩(wěn)定版在撰寫(xiě)本章時(shí),TFX的1.X穩(wěn)定版尚未發(fā)布。本章以及后續(xù)章節(jié)所使用的TFXAPI可能會(huì)在未來(lái)發(fā)生變動(dòng)。本書(shū)的所有代碼均已在TFXv0.22.0下測(cè)試通過(guò)。2.2安裝TFXTFX可以通過(guò)運(yùn)行以下Python安裝程序命令輕松安裝:$pipinstalltfxtfx依賴的各種軟件包也會(huì)被自動(dòng)安裝。以上命令不僅會(huì)安裝TFXPython包(比如TensorFlowDataValidation),也會(huì)把ApacheBeam等依賴一并安裝。在安裝完TFX后,可以導(dǎo)入單個(gè)Python包。如果想使用單個(gè)TFX包(比如想用TensorFlowDataValidation校驗(yàn)數(shù)據(jù)集,參見(jiàn)第4章),那么推薦采用如下方式:importtensorflow_data_validationastfdvimporttensorflow_transformastftimporttensorflow_transform.beamastft_beam...另一種方式是導(dǎo)入相應(yīng)的TFX組件(假設(shè)剛好需要在流水線中使用這個(gè)組件),如下所示。fromponentsimportExampleValidatorfromponentsimportEvaluatorfromponentsimportTransform...2.3TFX組件概述組件處理比執(zhí)行單個(gè)任務(wù)更復(fù)雜。所有的機(jī)器學(xué)習(xí)流水線組件都從通道中讀取數(shù)據(jù),以獲得元數(shù)據(jù)倉(cāng)庫(kù)中的工件。然后,數(shù)據(jù)從元數(shù)據(jù)倉(cāng)庫(kù)提供的路徑中被讀取并處理。當(dāng)前組件的輸出(也就是已經(jīng)處理完的數(shù)據(jù))將提供給后續(xù)流水線組件使用。組件的通用內(nèi)部組成通常如下。接收輸入執(zhí)行動(dòng)作存儲(chǔ)最終結(jié)果在TFX的術(shù)語(yǔ)中,上述3個(gè)內(nèi)部組成被分別稱為驅(qū)動(dòng)器(driver)、執(zhí)行器(executor)和發(fā)布器(publisher)。驅(qū)動(dòng)器處理對(duì)元數(shù)據(jù)倉(cāng)庫(kù)的查詢;執(zhí)行器執(zhí)行組件的動(dòng)作;發(fā)布器負(fù)責(zé)管理輸出元數(shù)據(jù)在MetadataStore中的存儲(chǔ)。驅(qū)動(dòng)器和發(fā)布器不會(huì)移動(dòng)任何數(shù)據(jù),它們通過(guò)讀寫(xiě)MetadataStore中的引用來(lái)完成數(shù)據(jù)讀寫(xiě)。圖2-4展示了TFX組件的結(jié)構(gòu)。圖2-4:TFX組件概覽組件的輸入和輸出被稱為工件(artifact)。工件可以是原始的輸入數(shù)據(jù)、預(yù)處理過(guò)的數(shù)據(jù)或訓(xùn)練完成的模型。每個(gè)工件都關(guān)聯(lián)著一份存儲(chǔ)在MetadataStore中的元數(shù)據(jù)。工件的元數(shù)據(jù)由其類型和屬性構(gòu)成,這可以保證各個(gè)組件高效地交換數(shù)據(jù)。TFX目前提供了10種工件類型,后文將陸續(xù)介紹。2.4什么是機(jī)器學(xué)習(xí)元數(shù)據(jù)TFX組件通過(guò)元數(shù)據(jù)彼此進(jìn)行“通信”(而不是在流水線組件間直接傳遞工件),組件讀取并產(chǎn)生指向流水線工件的引用。工件可以是原始數(shù)據(jù)集、轉(zhuǎn)換用的計(jì)算圖或者導(dǎo)出的模型。因此,元數(shù)據(jù)是TFX流水線的支柱。在組件間傳遞元數(shù)據(jù)而不直接傳遞工件的一個(gè)優(yōu)勢(shì)在于,所有的數(shù)據(jù)都能夠?qū)崿F(xiàn)中心化存儲(chǔ)。在實(shí)踐中,工作流流程如下:當(dāng)組件執(zhí)行時(shí),它使用MLMD(MLMetadata)API保存相應(yīng)的元數(shù)據(jù)。比如,組件驅(qū)動(dòng)器會(huì)從元數(shù)據(jù)倉(cāng)庫(kù)中收到指向原始數(shù)據(jù)集的引用。在組件執(zhí)行后,組件發(fā)布器會(huì)把指向組件輸出的引用存儲(chǔ)在元數(shù)據(jù)倉(cāng)庫(kù)中。MLMD會(huì)持續(xù)地將元數(shù)據(jù)保存到基于某個(gè)存儲(chǔ)后端的MetadataStore中。當(dāng)前,MLMD支持以下3種MetadataStore存儲(chǔ)后端。內(nèi)存數(shù)據(jù)庫(kù)(通過(guò)內(nèi)存模式的SQLite實(shí)現(xiàn))SQLiteMySQL由于TFX組件能夠得到持續(xù)的追蹤,因此MLMD提供了許多很有用的功能。在第7章討論模型驗(yàn)證時(shí)將看到,來(lái)自相同組件的不同工件可以進(jìn)行比較。在這種情況下,TFX可以將模型過(guò)去的分析結(jié)果和現(xiàn)在的分析結(jié)果進(jìn)行對(duì)比,以檢查相比以前的模型,最新訓(xùn)練的模型是否有更高的準(zhǔn)確率或者更小的損失值。元數(shù)據(jù)還可以幫助確定基于前面某個(gè)工件的所有后續(xù)工件。這為機(jī)器學(xué)習(xí)流水線創(chuàng)造了一種審查線索。圖2-5展示了每個(gè)組件和MetadataStore之間的交互以及MetadataStore如何在數(shù)據(jù)庫(kù)后端存儲(chǔ)元數(shù)據(jù)。圖2-5:使用MLMD存儲(chǔ)元數(shù)據(jù)2.5交互式流水線設(shè)計(jì)和實(shí)現(xiàn)機(jī)器學(xué)習(xí)流水線的過(guò)程可能有時(shí)會(huì)令人沮喪,比如調(diào)試流水線組件這種工作時(shí)常充滿挑戰(zhàn)。因此,圍繞著交互式流水線的TFX功能很有用。事實(shí)上,后續(xù)章節(jié)將逐步實(shí)現(xiàn)一條機(jī)器學(xué)習(xí)流水線,并演示如何通過(guò)交互式流水線完成其實(shí)現(xiàn)過(guò)程。該流水線運(yùn)行在JupyterNotebook中,并且可以立即查看組件的工件。當(dāng)流水線的功能確認(rèn)已經(jīng)全部完成時(shí),第11章和第12章將介紹如何將交互式流水線轉(zhuǎn)換成生產(chǎn)級(jí)流水線,比如在ApacheAirflow上運(yùn)行的流水線。所有的交互式流水線都是在JupyterNotebook或者GoogleColab環(huán)境中進(jìn)行編程的。與將在第11章和第12章討論的編排工具不同,交互式流水線由用戶編排和執(zhí)行。通過(guò)導(dǎo)入下列所需的包,可以啟動(dòng)交互式流水線:importtensorflowastffromeractive_contextimport\InteractiveContext當(dāng)導(dǎo)入所需的包之后,就可以創(chuàng)建context對(duì)象了。context對(duì)象會(huì)執(zhí)行組件并顯示其工件。此時(shí),InteractiveContext還將創(chuàng)建一個(gè)簡(jiǎn)單的存在于內(nèi)存中的機(jī)器學(xué)習(xí)MetadataStore:context=InteractiveContext()在創(chuàng)建StatisticsGen等流水線組件之后,便可以通過(guò)context對(duì)象的run方法來(lái)執(zhí)行組件,下面是一個(gè)例子:fromponentsimportStatisticsGenstatistcs_gen=StatisticsGen(example=example_gen.outputs['example'])context.run(statistcs_gen)組件自身會(huì)接收來(lái)自先前組件(在本例中是數(shù)據(jù)讀取組件ExampleGen)的輸出并將其作為實(shí)例化參數(shù)。組件在其任務(wù)執(zhí)行完成后會(huì)自動(dòng)地將輸出工件的元數(shù)據(jù)寫(xiě)入元數(shù)據(jù)倉(cāng)庫(kù)。有些組件的輸出可以顯示在notebook中??梢詫?shí)時(shí)獲取并以可視化方式展示結(jié)果,這對(duì)用戶來(lái)說(shuō)非常方便。舉例來(lái)說(shuō),可以使用StatisticsGen組件來(lái)檢查數(shù)據(jù)集的特征:context.show(statistics_gen.outputs['statistics'])運(yùn)行完上述context函數(shù)后,可以在notebook中看到圖2-6所示的數(shù)據(jù)集統(tǒng)計(jì)信息概覽。圖2-6:交互式流水線有助于以可視化方式檢查數(shù)據(jù)集有時(shí)候,通過(guò)編程來(lái)檢查組件的輸出工件會(huì)很有優(yōu)勢(shì)。在組件執(zhí)行完成后,可以訪問(wèn)工件的屬性,具體有哪些屬性取決于工件的類型,如下所示:forartifactinstatistics_gen.outputs['statistics'].get():print(artiface.uri)上述命令給出了如下結(jié)果:'/tmp/tfx-interactive-2020-05-15T04_50_16.251447/StatisticsGen/statistics/2'后續(xù)章節(jié)將逐一展示每個(gè)組件如何在交互式context中執(zhí)行。第11章和第12章將展示完整的流水線以及如何通過(guò)Airflow和Kubeflow來(lái)編排它。2.6TFX的替代品在進(jìn)入后續(xù)章節(jié)深入研究TFX組件前,先來(lái)看看TFX的替代品。在過(guò)去幾年中,機(jī)器學(xué)習(xí)流水線的編排一直是一個(gè)重大的工程挑戰(zhàn),因此許多硅谷公司爭(zhēng)相開(kāi)發(fā)自己的流水線框架也就不足為奇了。表2-1列出了一些知名的框架。表2-1:知名公司及其框架公司框架介紹文檔或源代碼AirbnbAeroSolve用微軟必應(yīng)搜索githubairbnb/aerosolveStripeRailyard用微軟必應(yīng)搜索striperailyardSpotifyLuigi用微軟必應(yīng)搜索githubspotify/luigiUberMichelangelo用微軟必應(yīng)搜索ubermichelangeloNetflixMetaflow用微軟必應(yīng)搜索metaflow由于框架都起源于公司,因此在設(shè)計(jì)它們時(shí)要考慮到特定的工程棧。例如,Airbnb的AeroSolve就專注于基于Java的推理代碼,Spotify的Luigi則專注于高效的編排。TFX在這方面并沒(méi)有什么不同。當(dāng)前,TFX的架構(gòu)和數(shù)據(jù)結(jié)構(gòu)都假設(shè)你使用TensorFlow(或Keras)作為機(jī)器學(xué)習(xí)框架。有些TFX組件可以和其他機(jī)器學(xué)習(xí)框架結(jié)合使用。例如,可以使用TensorFlow數(shù)據(jù)校驗(yàn)組件對(duì)數(shù)據(jù)進(jìn)行分析,然后再由scikit-learn模型使用。但是,TFX框架和TensorFlow或Keras模型緊密關(guān)聯(lián)。由于TFX得到了TensorFlow社區(qū)的支持,并且很多像Spotify這樣的公司正在采用TFX,因此TFX被認(rèn)為是穩(wěn)定且成熟的框架,最終將被更廣泛的機(jī)器學(xué)習(xí)工程師采用。2.7ApacheBeam簡(jiǎn)介各種TFX組件和庫(kù)(比如TensorFlowTransform)都依賴ApacheBeam才能有效地處理流水線數(shù)據(jù)。由于其對(duì)TFX生態(tài)系統(tǒng)的重要性,我們想簡(jiǎn)要介紹ApacheBeam在TFX組件的幕后是如何工作的。第11章將討論ApacheBeam的第二個(gè)用途:作為流水線編排工具。ApacheBeam提供了一種開(kāi)源的、供應(yīng)商中立的方式,以用來(lái)描述可以在各種環(huán)境下執(zhí)行的數(shù)據(jù)處理步驟。由于ApacheBeam適用的場(chǎng)景很多,因此其可用于描述批處理、流操作和數(shù)據(jù)流水線。實(shí)際上,TFX依賴于ApacheBeam并將其用于各種組件(比如TensorFlowTransform或TensorFlowDataValidation)。本書(shū)將在討論TensorFlowDataValidation(參見(jiàn)第4章)和TensorFlowTransform(參見(jiàn)第5章)時(shí),詳細(xì)討論TFX生態(tài)系統(tǒng)中ApacheBeam的具體用法。盡管ApacheBeam從其支持的運(yùn)行時(shí)工具中抽象出了數(shù)據(jù)處理邏輯,但它可以在多個(gè)分布式處理運(yùn)行時(shí)環(huán)境中執(zhí)行。這意味著你可以在ApacheSpark或GoogleCloudDataflow上運(yùn)行相同的數(shù)據(jù)流水線,而無(wú)須更改流水線描述。另外,ApacheBeam不僅可以用于描述批處理過(guò)程,而且還無(wú)縫支持流式操作。2.7.1安裝ApacheBeam的安裝非常簡(jiǎn)單??梢允褂靡韵路椒ò惭b其最新版本:$pipinstallapache-beam如果你打算在GoogleCloudPlatform(GCP)的環(huán)境中使用ApacheBeam,比如要處理GoogleBigQuery的數(shù)據(jù)或在GoogleCloudDataflow上運(yùn)行數(shù)據(jù)流水線(詳細(xì)內(nèi)容參見(jiàn)4.4節(jié)),可以按照以下步驟安裝ApacheBeam:$pipinstall'apache-beam[gcp]'如果你打算在AmazonWebServices(AWS)的環(huán)境中使用ApacheBeam(比如想從S3bucket加載數(shù)據(jù)),則應(yīng)按以下步驟安裝ApacheBeam:$pipinstall'apache-beam[boto]'如果你使用Python軟件包管理器pip安裝TFX,則會(huì)自動(dòng)安裝ApacheBeam。2.7.2基本數(shù)據(jù)流水線ApacheBeam的抽象基于兩個(gè)概念:集合和轉(zhuǎn)換。一方面,ApacheBeam的集合描述了在給定文件或流中讀取或?qū)懭霐?shù)據(jù)的操作。另一方面,ApacheBeam的轉(zhuǎn)換描述了操作數(shù)據(jù)的方法。所有集合和轉(zhuǎn)換都在流水線的上下文中執(zhí)行(在Python中通過(guò)上下文管理器命令with表示)。在下面的示例中定義集合或轉(zhuǎn)換時(shí),實(shí)際上沒(méi)有數(shù)據(jù)被加載或轉(zhuǎn)換。只有當(dāng)流水線在運(yùn)行時(shí)環(huán)境(比如ApacheBeam的DirectRunner、ApacheSpark、ApacheFlink或GoogleCloudDataflow)的上下文中執(zhí)行時(shí),才會(huì)發(fā)生這種情況。基本集合示例數(shù)據(jù)流水線通常以讀取或?qū)懭霐?shù)據(jù)開(kāi)始和結(jié)束,這在ApacheBeam中常常由名為PCollections的集合進(jìn)行處理。然后對(duì)集合進(jìn)行轉(zhuǎn)換,最終結(jié)果可以再次表示為集合并寫(xiě)入文件系統(tǒng)。以下示例展示了如何讀取文本文件并返回所有行:importapache_beamasbeamwithbeam.Pipeline()asp:?lines=p|beam.io.ReadFromText(input_file)??使用上下文管理器定義流水線。?將文本讀入PCollection。與ReadFromText操作類似,ApacheBeam提供了將集合寫(xiě)入文本文件的函數(shù)(比如WriteToText)。通常在執(zhí)行完所有轉(zhuǎn)換后執(zhí)行寫(xiě)操作:withbeam.Pipeline()asp:...output|beam.io.WriteToText(output_file)??將輸出寫(xiě)入文件output_file?;巨D(zhuǎn)換示例在ApacheBeam中,數(shù)據(jù)是通過(guò)轉(zhuǎn)換來(lái)操作的。正如在本例以及第5章看到的那樣,可以使用管道運(yùn)算符|將轉(zhuǎn)換鏈接起來(lái)。如果鏈接多個(gè)相同類型的轉(zhuǎn)換,則必須在管道運(yùn)算符和右括號(hào)之間使用字符串標(biāo)識(shí)符進(jìn)行標(biāo)記以提供操作的名稱。在以下示例中,我們將在文本文件中提取的行上依次應(yīng)用所有轉(zhuǎn)換:counts=(lines|'Split'>>beam.FlatMap(lambdax:re.findall(r'[A-Za-z\']+',x))|'PairWithOne'>>beam.Map(lambdax:(x,1))|'GroupAndSum'>>beam.CombinePerKey(sum))來(lái)詳細(xì)看看這段代碼。例如,我們將使用“Hello,howdoyoudo?”和“Iamwell,thankyou.”作為例子。Split使用re.findall將每一行拆分為詞列表,得到了如下結(jié)果:["Hello","how","do","you","do"]["I","am","well","thank","you"]beam.FlatMap將結(jié)果映射成了如下的PCollection:"Hello""how""do""you""do""I""am""well""thank""you"接下來(lái),PairWithOne使用beam.Map從每個(gè)詞和其計(jì)數(shù)(結(jié)果為1)中創(chuàng)建了一個(gè)元組:("Hello",1)("how",1)("do",1)("you",1)("do",1)("I",1)("am",1)("well",1)("thank",1)("you",1)最后,GroupAndSum將每個(gè)詞的所有元組都加了起來(lái):("Hello",1)("how",1)("do",2)("you",2)("I",1)("am",1)("well",1)("thank",1)還可以將Python函數(shù)用作轉(zhuǎn)換的一部分。下面的示例說(shuō)明了如何將format_result函數(shù)應(yīng)用于前面產(chǎn)生的求和結(jié)果。該函數(shù)將結(jié)果元組轉(zhuǎn)換為字符串,然后可以將其寫(xiě)入文本文件:defformat_result(word_count):"""Converttuples(token,count)intoastring"""(word,count)=word_countreturn"{}:{}".format(word,count)output=counts|'Format'>>beam.Map(format_result)ApacheBeam提供了各種預(yù)定義的轉(zhuǎn)換。但是,如果沒(méi)有你想用的操作,則可以使用Map運(yùn)算符編寫(xiě)自己的轉(zhuǎn)換。需要注意的是,用戶自定義的這些操作應(yīng)該能夠以分布式方式運(yùn)行,這樣便可以充分利用運(yùn)行時(shí)環(huán)境的能力。組合在一起在討論了ApacheBeam流水線的各個(gè)概念之后,將它們?nèi)拷M合成一個(gè)示例。之前的代碼片段和以下示例是ApacheBeam簡(jiǎn)介的修訂版本。為了便于閱讀,該示例中的ApacheBeam代碼已做了簡(jiǎn)化:importreimportapache_beamasbeamfromapache_beam.ioimportReadFromTextfromapache_beam.ioimportWriteToTextfromapache_beam.options.pipeline_optionsimportPipelineOptionsfromapache_beam.options.pipeline_optionsimportSetupOptionsinput_file="gs://dataflow-samples/shakespeare/kinglear.txt"?output_file="/tmp/output.txt"#定義流水線選項(xiàng)object.pipeline_options=PipelineOptions()withbeam.Pipeline(options=pipeline_options)asp:?#將文本文件或文件模式讀入PCollectionlines=p|ReadFromText(input_file)?#統(tǒng)計(jì)每個(gè)單詞出現(xiàn)的次數(shù)counts=(?lines|'Split'>>beam.FlatMap(lambdax:re.findall(r'[A-Za-z\']+',x))|'PairWithOne'>>beam.Map(lambdax:(x,1))|'GroupAndSum'>>beam.CombinePerKey(sum))#將單詞統(tǒng)計(jì)情況格式化為字符串類型的PCollectiondefformat_result(word_count):(word,count)=word_countreturn"{}:{}".format(word,count)output=counts|'Format'>>beam.Map(format_result)#使用“寫(xiě)入”轉(zhuǎn)換(具有副作用)將結(jié)果輸出到文件output|WriteToText(output_file)?文本存儲(chǔ)在GoogleCloudStoragebucket中。?設(shè)置ApacheBeam流水線。?通過(guò)讀取文本文件創(chuàng)建數(shù)據(jù)集合。?在集合上執(zhí)行轉(zhuǎn)換。上面的示例流水線下載了莎士比亞的《李爾王》,并在整個(gè)語(yǔ)料庫(kù)上執(zhí)行了計(jì)算詞數(shù)量的流水線。然后將結(jié)果寫(xiě)入了位于/tmp/output.txt的文本文件。2.7.3執(zhí)行流水線可以通過(guò)執(zhí)行以下命令使用ApacheBeam的DirectRunner運(yùn)行流水線(假定先前的示例代碼已保存為basic_pipeline.py)。如果想在不同的ApacheBeam運(yùn)行器(比如ApacheSpark或ApacheFlink)上執(zhí)行此流水線,則需要通過(guò)pipeline_options對(duì)象設(shè)置流水線配置:pythonbasic_pipeline.py轉(zhuǎn)換的結(jié)果可以在指定的文本文件中找到。$head/tmp/output.txt*KING:243LEAR:236DRAMATIS:1PERSONAE:1king:65...2.8小結(jié)本章簡(jiǎn)要介紹了TFX,并討論了元數(shù)據(jù)倉(cāng)庫(kù)的重要性以及TFX組件的一般性內(nèi)部結(jié)構(gòu)。本章還介紹了ApacheBeam,并展示了如何使用ApacheBeam進(jìn)行簡(jiǎn)單的數(shù)據(jù)轉(zhuǎn)換。本章討論的所有內(nèi)容在閱讀第3~7章中有關(guān)流水線組件以及第11章和第12章中的流水線編排內(nèi)容時(shí)會(huì)很有用。第一步是將數(shù)據(jù)放入流水線,第3章將對(duì)此進(jìn)行介紹。第3章數(shù)據(jù)讀取在基本的TFX設(shè)置和MLMetadataStore就位后,本章將重點(diǎn)介紹如何將數(shù)據(jù)集讀入流水線以供各種組件使用,如圖3-1所示。圖3-1:機(jī)器學(xué)習(xí)流水線中的數(shù)據(jù)讀取TFX為我們提供了從文件或服務(wù)中讀取數(shù)據(jù)的組件。本章將介紹其基本概念,解釋如何將數(shù)據(jù)集拆分為訓(xùn)練集和評(píng)估集,并演示如何將多份導(dǎo)出數(shù)據(jù)組合為一個(gè)包羅萬(wàn)象的數(shù)據(jù)集。然后,本章將討論一些讀取不同形式的數(shù)據(jù)(結(jié)構(gòu)化數(shù)據(jù)、文本和圖像)的策略,這些策略在前面的用例中很有用。3.1數(shù)據(jù)讀取的概念在這一流水線步驟中,我們從外部服務(wù)(比如GoogleCloudBigQuery)讀取數(shù)據(jù)文件或請(qǐng)求流水線運(yùn)行數(shù)據(jù)。在將讀取的數(shù)據(jù)集傳遞給下一個(gè)組件之前,我們將可用數(shù)據(jù)劃分為獨(dú)立的數(shù)據(jù)集(比如訓(xùn)練數(shù)據(jù)集和校驗(yàn)數(shù)據(jù)集),然后將數(shù)據(jù)集轉(zhuǎn)換為T(mén)FRecord文件,在TFRecord文件中,數(shù)據(jù)是以tf.Example結(jié)構(gòu)表示的。TFRecordTFRecord是為流式傳輸大型數(shù)據(jù)集而優(yōu)化的輕量型格式。實(shí)際上,大多數(shù)TensorFlow用戶將序列化的ProtocolBuffers(一個(gè)跨平臺(tái)、跨語(yǔ)言的庫(kù))數(shù)據(jù)存儲(chǔ)在TFRecord文件中,但TFRecord文件格式實(shí)際上支持所有的二進(jìn)制數(shù)據(jù),如下所示:importtensorflowastfwithtf.io.TFRecordWriter("test.tfrecord")asw:w.write(b"Firstrecord")w.write(b"Secondrecord")forrecordintf.data.TFRecordDataset("test.tfrecord"):print(record)tf.Tensor(b'Firstrecord',shape=(),dtype=string)tf.Tensor(b'Secondrecord',shape=(),dtype=string)如果TFRecord文件包含tf.Example記錄,則每個(gè)記錄都包含一個(gè)或多個(gè)特征,這些特征代表數(shù)據(jù)中的列。這些數(shù)據(jù)存儲(chǔ)在二進(jìn)制文件中,可以被高效地讀取。如果對(duì)TFRecord文件的內(nèi)部結(jié)構(gòu)感興趣,推薦你閱讀TensorFlow文檔。將數(shù)據(jù)存儲(chǔ)為T(mén)FRecord和tf.Example具有以下好處。其數(shù)據(jù)結(jié)構(gòu)是系統(tǒng)獨(dú)立的,因?yàn)樗揽縋rotocolBuffers來(lái)序列化數(shù)據(jù)。TFRecord經(jīng)過(guò)優(yōu)化,可以快速下載或?qū)懭氪罅繑?shù)據(jù)。代表TFRecord中每行數(shù)據(jù)的tf.Example也是TensorFlow生態(tài)系統(tǒng)中的默認(rèn)數(shù)據(jù)結(jié)構(gòu),因此其可用于所有TFX組件。讀取、拆分和轉(zhuǎn)換數(shù)據(jù)集的過(guò)程是由ExampleGen組件執(zhí)行的。正如我們?cè)谝韵率纠袑⒖吹降?,既可以從本地和遠(yuǎn)程文件夾讀取數(shù)據(jù)集,也可以從數(shù)據(jù)服務(wù)(例如GoogleCloudBigQuery)中請(qǐng)求數(shù)據(jù)集。3.1.1讀取本地?cái)?shù)據(jù)文件ExampleGen組件可以讀取一些數(shù)據(jù)結(jié)構(gòu),包括CSV(commaseparatedvalue)文件、預(yù)計(jì)算的TFRecord文件以及ApacheAvro和ApacheParquet的序列化輸出。將CSV轉(zhuǎn)換為tf.Example結(jié)構(gòu)化數(shù)據(jù)或文本數(shù)據(jù)的數(shù)據(jù)集通常存儲(chǔ)在CSV文件中。TFX提供了讀取這些文件并將其轉(zhuǎn)換為tf.Example數(shù)據(jù)結(jié)構(gòu)的功能。以下代碼演示了如何從示例項(xiàng)目下包含CSV數(shù)據(jù)的文件夾中讀取數(shù)據(jù):importosfromponentsimportCsvExampleGenfromtfx.utils.dsl_utilsimportexternal_inputbase_dir=os.getcwd()data_dir=os.path.join(os.pardir,"data")examples=external_input(os.path.join(base_dir,data_dir))?example_gen=CsvExampleGen(input=examples)?context.run(example_gen)??定義數(shù)據(jù)路徑。?實(shí)例化流水線組件。?交互式執(zhí)行組件。如果將組件作為交互式流水線的一部分執(zhí)行,則運(yùn)行的元數(shù)據(jù)將顯示在JupyterNotebook中。該組件的輸出如圖3-2所示,其突出顯示了訓(xùn)練數(shù)據(jù)集和評(píng)估數(shù)據(jù)集的存儲(chǔ)位置。圖3-2:ExampleGen組件的輸出文件夾結(jié)構(gòu)ExampleGen的輸入路徑應(yīng)該僅包含數(shù)據(jù)文件。該組件會(huì)嘗試讀取路徑級(jí)別內(nèi)的所有文件。其他任何該組件無(wú)法讀取的文件(比如元數(shù)據(jù)文件),都會(huì)使該組件步驟執(zhí)行失敗。除非特意配置,否則該組件不會(huì)讀取子目錄下的文件。導(dǎo)入現(xiàn)有的TFRecord文件有時(shí)我們的數(shù)據(jù)(比如計(jì)算機(jī)視覺(jué)中的圖像文件或者自然語(yǔ)言處理中的大語(yǔ)料集)無(wú)法高效地表示為CSV格式。在這些情況下,建議將數(shù)據(jù)集轉(zhuǎn)換為T(mén)FRecord數(shù)據(jù)結(jié)構(gòu),然后使用ImportExampleGen組件加載TFRecord文件。如果你希望將數(shù)據(jù)轉(zhuǎn)換為T(mén)FRecord文件這一轉(zhuǎn)換過(guò)程作為流水線的一部分,請(qǐng)查閱第10章,第10章討論了自定義TFX組件(包括數(shù)據(jù)讀取組件)的開(kāi)發(fā)。可以使用以下示例來(lái)讀取TFRecord文件:importosfromponentsimportImportExampleGenfromtfx.utils.dsl_utilsimportexternal_inputbase_dir=os.getcwd()data_dir=os.path.join(os.pardir,"tfrecord_data")examples=external_input(os.path.join(base_dir,data_dir))example_gen=ImportExampleGen(input=examples)context.run(example_gen)由于數(shù)據(jù)集已經(jīng)存儲(chǔ)為T(mén)FRecord文件中的tf.Example記錄,因此可以無(wú)須進(jìn)行任何轉(zhuǎn)換直接導(dǎo)入。ImportExampleGen組件可以處理此導(dǎo)入步驟。將序列化的Parquet數(shù)據(jù)轉(zhuǎn)換為tf.Example第2章討論過(guò)TFX組件的內(nèi)部體系結(jié)構(gòu)以及由其執(zhí)行器驅(qū)動(dòng)的組件的行為。如果想將新文件類型加載到流水線中,則可以重寫(xiě)組件的executor_class,而不是編寫(xiě)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論