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