本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

介紹 Kubeflow - 一個為 Kubernetes 構建的可組合、可移植、可擴充套件的機器學習堆疊

Kubernetes 與機器學習

Kubernetes 已迅速成為在任何地方部署複雜工作負載的混合解決方案。雖然它最初只用於無狀態服務,但客戶已開始將複雜工作負載遷移到該平臺,利用 Kubernetes 提供的豐富 API、可靠性和效能。增長最快的用例之一是將 Kubernetes 作為機器學習的首選部署平臺。

構建任何生產就緒的機器學習系統都涉及各種元件,通常會混合供應商和自行開發的解決方案。即使是中等複雜的設定,連線和管理這些服務也會在採用機器學習時帶來巨大的複雜性障礙。基礎設施工程師通常會在測試單個模型之前花費大量時間手動調整部署和自行開發解決方案。

更糟糕的是,這些部署與它們所部署的叢集緊密耦合,導致這些堆疊無法移動,這意味著在沒有進行重大重新架構的情況下,將模型從筆記型電腦移動到高度可擴充套件的雲集群實際上是不可能的。所有這些差異加起來會浪費精力,並在每次轉換時都可能引入錯誤。

Kubeflow 簡介

為了解決這些問題,我們宣佈建立 Kubeflow 專案,這是一個新的開源 GitHub 倉庫,致力於讓在 Kubernetes 上使用機器學習堆疊變得簡單、快速和可擴充套件。該倉庫包含:

  • JupyterHub 用於建立和管理互動式 Jupyter Notebook
  • 一個可配置為使用 CPU 或 GPU 的 Tensorflow 自定義資源 (CRD),只需一個設定即可根據叢集大小進行調整
  • 一個 TF Serving 容器。由於此解決方案依賴於 Kubernetes,因此它可以在 Kubernetes 執行的任何地方執行。只需啟動一個叢集即可!

使用 Kubeflow

假設您正在使用兩個不同的 Kubernetes 叢集:一個本地 minikube 叢集;以及一個帶有 GPU 的 GKE 叢集;並且您定義了兩個名為 minikube 和 gke 的 kubectl 上下文

首先,我們需要初始化我們的 ksonnet 應用程式並安裝 Kubeflow 軟體包。(要使用 ksonnet,您必須首先在您的作業系統上安裝它——安裝說明可以在這裡找到)

     ks init my-kubeflow  
     cd my-kubeflow  
     ks registry add kubeflow \  
     github.com/google/kubeflow/tree/master/kubeflow  
     ks pkg install kubeflow/core  
     ks pkg install kubeflow/tf-serving  
     ks pkg install kubeflow/tf-job  
     ks generate core kubeflow-core --name=kubeflow-core

現在我們可以定義與我們的兩個叢集對應的環境

     kubectl config use-context minikube  
     ks env add minikube  

     kubectl config use-context gke  
     ks env add gke  

完成了!現在只需在您的叢集上建立環境。首先,在 minikube 上:

     ks apply minikube -c kubeflow-core  

為了更快地進行訓練,在我們的多節點 GKE 叢集上建立它:

     ks apply gke -c kubeflow-core  

透過讓相同的豐富 ML 堆疊在任何地方輕鬆部署,這些環境之間的差異和重寫被最小化。

要訪問任一部署,您可以執行以下命令:

     kubectl port-forward tf-hub-0 8100:8000  

然後開啟 http://127.0.0.1:8100 訪問 JupyterHub。要更改 kubectl 使用的環境,請使用以下任一命令:

     # To access minikube  
     kubectl config use-context minikube  

     # To access GKE  
     kubectl config use-context gke  

當您執行 apply 時,您正在 K8s 上啟動

  • JupyterHub 用於在 K8s 上啟動和管理 Jupyter Notebook
  • 一個 TF CRD

假設您想提交一個訓練作業。Kubeflow 提供了 ksonnet 原型,可以輕鬆定義元件。tf-job 原型可以輕鬆為您的程式碼建立作業,但在這個示例中,我們將使用 tf-cnn 原型來執行 TensorFlow 的 CNN 基準測試

要提交訓練作業,首先從原型生成一個新作業:

     ks generate tf-cnn cnn --name=cnn  

預設情況下,tf-cnn 原型使用 1 個 Worker 且不使用 GPU,這非常適合我們的 minikube 叢集,因此我們可以直接提交它。

     ks apply minikube -c cnn

在 GKE 上,我們需要調整原型以利用多個節點和 GPU。首先,讓我們列出所有可用的引數:

     # To see a list of parameters  
     ks prototype list tf-job  

現在讓我們調整引數以利用 GPU 和多節點訪問。

     ks param set --env=gke cnn num\_gpus 1  
     ks param set --env=gke cnn num\_workers 1  

     ks apply gke -c cnn  

請注意我們如何設定這些引數,以便它們僅在部署到 GKE 時使用。您的 minikube 引數保持不變!

訓練後,您將模型匯出到服務位置。

Kubeflow 也包含一個服務包。

要部署經過訓練的模型以進行服務,請執行以下操作:

     ks generate tf-serving inception --name=inception  
     ---namespace=default --model\_path=gs://$bucket_name/$model_loc
     ks apply gke -c inception  

這突顯了 Kubeflow 的另一個選項——根據您的部署傳入輸入的能力。此命令在 GKE 叢集上建立了一個 tf-serving 服務,並使其可用於您的應用程式。

有關部署和監控 TensorFlow 訓練作業和 TensorFlow 模型的更多資訊,請參閱使用者指南

Kubeflow + ksonnet

我們想強調的一個選擇是使用 ksonnet 專案。我們認為,對於大多數 Kubeflow 使用者來說,使用多個環境(開發、測試、生產)將成為常態。透過使環境成為一流的概念,ksonnet 讓 Kubeflow 使用者可以輕鬆地在不同環境之間移動其工作負載。

特別是現在 Helm 正在將 ksonnet 整合到其下一版本平臺中,我們認為它是我們的完美選擇。有關 ksonnet 的更多資訊可以在 ksonnet 文件中找到。

我們還要感謝 Heptio 團隊加快了對 Kubeflow 使用 ksonnet 至關重要的功能。

接下來會發生什麼?

我們正在努力建設社群,我們非常希望得到您的幫助!我們已經與許多團隊合作——數夢雲紅帽和 OpenShiftCanonicalWeaveworksContainer Solutions 以及許多其他公司。CoreOS 例如,已經看到了 Kubeflow 的前景。

“Kubeflow 專案是使在 Kubernetes 上設定和生產化機器學習工作負載變得顯著更容易的必要進展,我們預計它將極大地擴充套件更多企業採用該平臺的機會。我們期待與專案成員合作,提供 Kubeflow 與企業 Kubernetes 平臺 Tectonic 的緊密整合。”——Reza Shafii,CoreOS 產品副總裁

如果您想立即在瀏覽器中嘗試 Kubeflow,我們已與 Katacoda 合作,使其變得超級簡單。您可以在這裡嘗試!

我們才剛剛開始!我們非常希望您能提供幫助。您可能會問,如何提供幫助?嗯……

說明

  • 本文於 2023 年 6 月修訂,以更新訓練模型儲存桶位置。