Kubeflow 入門——爲 Kubernetes 打造的組件化、可移植、可擴展的機器學習堆棧

【編者的話】本文來自 Kubeflow 項目的產品經理 David Aronchick 和首席工程師 Jeremy Lewi,主要講了他們新的開源項目——Kubeflow 的一些入門知識,Kubeflow 致力於使 Kubernetes 上的機器學習堆棧變得簡單,快速及可擴展。

Kubernetes 已經迅速成長爲部署複雜工做負載的混合解決方案。 雖然提供的只是無狀態服務,但客戶已經開始將複雜的工做負載轉移到Kubernetes 平臺上,並充分利用了 Kubernetes 提供的豐富API、可靠性以及良好的性能。其中增加最快的用途之一是使用 Kubernetes 做爲機器學習的部署平臺。

構建一套生產環境下的機器學習系統須要涉及各類組件,一般須要使用混合供應商並結合自研的解決方案。使用相對複雜的配置來鏈接和管理這些服務,給學習機器學習帶來了巨大障礙。基礎設施工程師一般會花費大量時間手動部署,而後才能測試一個模型。

更糟糕的是,上述部署與他們部署的集羣緊密相關,這些堆棧是不可移植的,這意味着在沒有進行重大從新架構的狀況下,將模型從筆記本電腦遷移到高度可擴展的雲端集羣其實是不可能的。全部這些差別都會浪費極大的精力,而且每次轉換均可能會引入 bug。html

Kubeflow 入門

爲了解決這些問題,咱們決定建立 Kubeflow 項目,一個新的開源 Github repo,致力於在 Kubernetes 上讓 ML(Machine Learning)堆棧變得簡單,快速、可擴展。

這個倉庫包含:ios

  • JupyterHub,用於建立和管理交互性的 Jupyter notebook
  • Tensorflow Custom Resource (CRD),不管是 GPU 和CPU的選擇仍是調整集羣大小,一條命令就能搞定。
  • 一個 TF 服務容器


由於此解決方案基於 Kubernetes, 因此任何運行 Kubernetes 的地方均可以使用此方案。只需啓動一個集羣,即可使用。git

使用 Kubeflow

假設你正在使用兩個不一樣的 Kubernetes 集羣:一個本地的 minikube 集羣和一個使用 GPU 的GKE集羣,並且有兩 kubectl 上下文,分別命名爲 minikube 和 gke。

首先須要初始化 ksonnet,並安裝 Kubeflow(ksonnet使用前須要在操做系統中安裝,具體可參考此處)。github

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


而後定義兩個集羣通信的環境變量。ubuntu

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 堆棧,環境變量的修改和重寫應該保持在最低限度。

執行如下命令就能夠訪問任何一個部署:
 app

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


打開地址 ttp://127.0.0.1:8100 訪問 JupyterHub。使用下面的命令,就能夠經過 kubectl 修改環境變量:機器學習

# To access minikube
kubectl config use-context minikube

# To access GKE
kubectl config use-context gke


執行應用 時, 就會在 k8s上啓動:ide

  • 啓動和管理 Jupyter notebook 的 JupyterHub
  • 一個 TF CRD


假設你想提交一個訓練任務,Kubeflow 提供了 ksonnet 原型,能夠輕鬆定義組件。tf-job 原型能夠很容易地爲你的代碼建立一個任務,可是對於訓練任務,咱們將使用運行了 TensorFlow CNN 基準的 tf-cnn 原型。

提交訓練任務前,首先從模型中生成一個新的任務

ks generate tf-cnn cnn --name=cnn


tf-cnn 模型默認使用一個 worker,沒有使用 GPU,很適合 minikube 集羣,直接提交便可。

ks apply minikube -c cnn


對於 GKE,咱們要轉爲使用另一個模型,以便充分利用其多節點及 GPU 的優點,首先,列出全部可用參數:

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


調整參數:

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 中的參數並未改變(編者注: 使用了 -- env 來指定想要修改參數的集羣)。

訓練以後,就能夠將模型遷移到用到的服務上。

Kubeflow 還包括一個服務包。在另一個單獨的例子中,咱們訓練了一個標準的 Inception 模型,並將訓練好的模型存儲在名爲 gs:// kubeflow-models 的 bucket 中,路徑爲 / inception

能夠經過下面的命令,部署一個訓練好的模型

ks generate tf-serving inception --name=inception
---namespace=default --model_path=gs://kubeflow-models/inception
ks apply gke -c inception


這也同時突出了 Kubeflow 另一個功能 -- 部署時接受輸入。這條命令建立了一個基於 GKE 集羣的 tf-serving 服務,面向應用程序可用。

有關部署和監控 TensorFlow 訓練任務和 TensorFlow 模型的更多信息,請參閱用戶指南

Kubeflow + ksonnet

咱們想引出的是 ksonnet 的使用。咱們認爲多環境(dev,test,prod)開發將會是大多數 Kubeflow 用戶的常態。經過將環境做爲一等概念,ksonnet 使 Kubeflow 用戶能夠在不一樣環境之間輕易地遷移工做負載。

咱們以爲 Ksonnet 是一個不錯的選擇,特別是如今 Helm 正在把 Ksonnet 整合到其下一個版本的平臺中。有關 ksonnet 的更多信息能夠在 ksonnet文檔中找到。

咱們也要感謝 Heptio 團隊加快支持了 Kubeflow 用到的一些 ksonnet 關鍵功能。

接下來呢?

咱們正在努力創建一個社區,並期待你們的貢獻!咱們已經和許多團隊合做好比 CaiCloudRed Hat&OpenShiftCanonicalWeaveworkContainer Solutions等等。CoreOS 對 Kubeflow 寄予了厚望:
 

「Kubeflow 在簡易化 Kubernetes 上配置和生產化機器學習工做負載上取得了重大進步,咱們認爲這會極大程度上讓更多企業接受該平臺。咱們期待與 Kubeflow 團隊合做,提供 Kubeflow 與企業級 Kubernetes 平臺 -- Tectonic 的緊密集成。「 -- Reza Shafii,CoreOS 產品副總裁

若是你如今想在瀏覽器中嘗試 Kubeflow,咱們已經與Katacoda合做, 點擊這裏輕鬆嘗試!

咱們纔剛剛起步!咱們很樂意爲您提供幫助,能夠經過如下方式關注咱們:


原文連接:Introducing Kubeflow - A Composable, Portable, Scalable ML Stack Built for Kubernetes(翻譯:李加慶

相關文章
相關標籤/搜索