com 对象与其基础 rcw 分开后就不能再使用_如何使用 Kubeflow 机器学习流水线
翻譯:Bach(才云)
校對:星空下的文仔(才云)、bot(才云)
為什么要使用機器學習流水線
現在,機器學習流水線(Machine Learning Pipeline)被大家給予了極大的關注,它旨在自動化和協調訓練機器學習模型所涉及的各個步驟,但是,很多人也不清楚將機器學習工作流程建模為自動流水線到底有什么好處。
當訓練新的 ML 模型時,大多數據科學家和 ML 工程師會開發一些新的 Python 腳本或 interactive notebook,以進行數據提取和預處理,來構建用于訓練模型的數據集;然后創建幾個其他腳本或 notebook 來嘗試不同類型的模型或機器學習框架;最后收集、調試指標,評估每個模型在測試數據集上的運行情況,來確定要部署到生產中的模型。
手動機器學習工作流程顯然,這是對真正機器學習工作流程的過度簡化,而且這種通用方法需要大量的人工參與,并且除了最初開發該方法的工程師之外,其他人都無法輕易重復使用。
由此,我們使用機器學習流水線來解決這些問題。與其將數據準備、模型訓練、模型驗證和模型部署視為特定模型中的單一代碼庫,不如將其視為一系列獨立的模塊化步驟,讓每個步驟都專注于具體任務。
機器學習流水線將機器學習工作流程建模為機器學習流水線有很多好處:
- 自動化:通過消除手動干預的需求,我們可以安排流水線按照需求重新訓練模型,從而確保模型能夠適應隨時間變化的訓練數據。
- 重復使用:由于流水線的步驟與流水線本身是分開的,所以我們可以輕松地在多個流水線中重復使用單個步驟。
- 重復性:任何數據科學家或工程師都可以通過手動工作流程重新運行流水線,這樣就很清楚需要以什么順序運行不同的腳本或 notebook。
- 環境解耦:通過保持機器學習流水線的步驟解耦,我們可以在不同類型的環境中運行不同的步驟。例如,某些數據準備步驟可能需要在大型計算機集群上運行,而模型部署步驟則可能在單個計算機上運行。
什么是 Kubeflow
Kubeflow 是一個基于 Kubernetes 的開源平臺,旨在簡化機器學習系統的開發和部署。Kubeflow 在官方文檔中被稱為 “Kubernetes 機器學習工具包”,它由幾個組件(component)組成,這些組件跨越了機器學習開發生命周期的各個步驟,包括了 notebook developent environment、超參數調試、功能管理、模型服務以及 ML Pipelines。
Kubeflow 中央儀表板在本文中,我們只關注 Kubeflow 的 Pipelines 組件。
環境
本文選擇在裸機上運行的 Kubernetes 集群,但實際上我們可以在安裝 Kubeflow 的任何 Kubernetes 集群上運行示例代碼。本地唯一需要的依賴項是 Kubeflow Pipelines SDK,我們可以使用 pip 安裝 SDK:pip install kfp 。
Kubeflow Pipelines
Kubeflow 中的流水線由一個或多個組件(component)組成,它們代表流水線中的各個步驟。每個組件都在其自己的 Docker 容器中運行,這意味著流水線中的每個步驟都具有自己的一組依賴關系,與其他組件無關。
對于開發的每個組件,我們創建一個單獨的 Docker 鏡像,該鏡像會接收輸入、執行操作、進行輸出。另外,我們要有一個單獨的 Python 腳本,pipeline.py 腳本會從每個 Docker 鏡像創建 Pipelines 組件,然后使用這些組件構造流水線(Pipeline)。我們總共創建四個組件:
- preprocess-data:該組件將從 sklearn.datasets 中加載 Boston Housing 數據集,然后將其拆分為訓練集和測試集。
- train-model:該組件將訓練模型,以使用“Boston Housing”數據集來預測 Boston 房屋的中位數。
- test-model:該組件會在測試數據集上計算并輸出模型的均方誤差。
- deploy-model:在本文中,我們不會專注于模型的部署和服務,因此該組件將僅記錄一條消息,指出它正在部署模型。實際情況下,這可能是將任何模型部署到 QA 或生產環境的通用組件。
Preprocess Data 組件
第一個 Pipelines 組件用 sklearn.datasets 加載 Boston Housing 數據集。我們使用 Sci-kit Learn 的train_test_split 函數將此數據集分為訓練集和測試集,然后用 np.save 將數據集保存到磁盤,以便以后的組件重復使用。
到目前為止,我們只有一個簡單的 Python 腳本。現在,我們需要創建一個執行該腳本的 Docker 鏡像,這里編寫一個 Dockerfile 來創建鏡像:
從 python:3.7-slim 基礎鏡像開始,我們使用 pip 安裝必需的軟件包,將預處理的 Python 腳本從本地計算機復制到容器,然后將 preprocess.py 腳本指定為容器 Entrypoint,這樣在容器啟動時,腳本就會執行。K8sMeetup
構建流水線
現在,我們著手構建流水線,首先要確保可以從 Kubernetes 集群訪問上文構建的 Docker 鏡像。本文使用 GitHub Actions 構建鏡像并將其推送到 Docker Hub。
現在定義一個組件,每個組件都要定義為一個返回 ContainerOp 類型的對象(object)。此類型來自我們先前安裝的 kfp SDK。這是流水線中第一個組件的組件定義:
請注意,對于 image 參數,我們傳遞了上文 Dockerfile 定義的 Docker 鏡像的名稱,對于 file_outputs 參數,指定了 Python 腳本組件保存到磁盤的四個 .npy 文件的文件路徑。通過將這四個文件指定為“File Output”,我們可以將它們用于流水線中的其他組件。
注意:在組件中對文件路徑進行硬編碼不是一個很好的做法,就如上面的代碼中那樣,這要求創建組件定義的人員要了解有關組件實現的特定細節。這會讓組件接受文件路徑作為命令行參數更加干凈,定義組件的人員也可以完全控制輸出文件的位置。
定義了第一個組件后,我們創建一個使用 preprocess-data 組件的流水線:
流水線由一個注解 @dsl.pipeline 修飾的 Python 函數定義。在函數內,我們可以像使用其他任何函數一樣使用組件。為了運行流水線,我們創建一個 kfp.Client 對象,再調用 create_run_from_pipeline_func 函數,并傳入定義流水線的函數。
如果執行該腳本,然后導航到 Kubeflow 中央儀表板流水線部分的“Experiment”視圖,我們就能看到流水線的執行情況。在流水線的圖形視圖中單擊該組件,我們還可以看到來自 preprocess-data 組件的四個文件輸出。
Kubeflow 流水線用戶界面因此,我們可以運行流水線并在 GUI 中進行可視化,但是只有一個步驟的流水線并沒什么意思,下面我們來創建其余的組件。
其余組件
對于 train-model 組件,我們創建一個簡單的 Python 腳本,該腳本使用 Sci-kit Learn 來訓練回歸模型。這類似于預處理器組件的 Python 腳本,其中最大的區別是,這里用 argparse 來接受訓練數據的文件路徑以作為命令行參數。
這個 Dockerfile 與我們用于第一個組件的非常相似,從基礎鏡像開始,安裝必要的軟件包,將 Python 腳本復制到容器中,然后執行腳本。
其他兩個組件 test-model 和 deploy-model 遵循著相同的模式。實際上,它們與我們已經實現的兩個組件非常像,這里就不再贅述。如果大家有興趣,可以在以下 GitHub 存儲庫中找到該流水線的所有代碼:https : //http://github.com/gnovack/kubeflow-pipelines
就像之前的 preprocess-data 組件一樣,我們將從這三個組件中構建 Docker 鏡像并將其推送到 Docker Hub:
- train-model: gnovack/boston_pipeline_train
- test-model: gnovack/boston_pipeline_test
- deploy-model: gnovack/boston_pipeline_deploy
完整的流水線
現在是時候創建完整的機器學習流水線了。首先,我們為 train-model、test-model 和 deploy-model 組件創建組件定義。
該 train-model 組件的定義與之前的 preprocess-data 組件的定義之間的唯一主要區別是, train-model 接受兩個參數,x_train 和 y_train,其將作為命令行參數傳遞給容器并進行解析,這會在使用 argparse 模塊的組件實現中。
這里 test-model 和 deploy-model 組件定義為:
定義了四個 Pipelines 組件后,我們現在重新訪問 boston_pipeline 函數,并將所有組件一起使用。
這里有幾點要注意:
- 在第 6 行,當我們調用 preprocess_op() 函數時,將函數的輸出存儲在名為 _preprocess_op 的變量中。要訪問 preprocess-data 組件的輸出,我們使用 _preprocess_op.outputs['NAME_OF_OUTPUT']。
- 默認情況下,當我們從組件訪問 file_outputs 時,我們獲取的是文件內容而不是文件路徑。在本文中,由于這些不是純文本文件,因此我們不能僅將文件內容作為命令行參數傳遞到 Docker 容器組件中。要訪問文件路徑,我們需要使用 dsl.InputArgumentPath() 并傳入組件輸出。
現在,如果我們運行創建的流水線并導航到 Kubeflow 中央儀表板中的“Pipelines UI”,我們可以看到流水線圖中顯示的所有四個組件。
結論
在本文中,我們創建了一個非常簡單的機器學習流水線,該流水線可以加載一些數據、訓練模型、在保留數據集上對其進行評估、對其進行“deploy”。通過使用 Kubeflow Pipelines,我們能夠將該工作流中的每個步驟封裝到 Pipelines 組件中,每個組件都在各自獨立的 Docker 容器環境中運行。這種封裝促進了機器學習工作流程中各步驟之間的松散耦合,并為將來流水線中組件的重復使用提供了可能性。
本文簡單介紹了 Kubeflow Pipelines 的功能,希望能夠幫助大家了解組件(component)的基礎知識,以及如何使用它們創建和運行流水線。
原文鏈接:如何使用 Kubeflow 機器學習流水線
總結
以上是生活随笔為你收集整理的com 对象与其基础 rcw 分开后就不能再使用_如何使用 Kubeflow 机器学习流水线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++提取PDF页成BMP图片
- 下一篇: java教学视频全集迅雷,BAT大厂面试