輕鬆擴展你的機器學習能力 : Kubeflow 原 薦

提起機器學習,尤其是深度學習,大家可能會對諸如Tensorflow,Pytorch,Caffee的工具耳熟能詳。但其實在實際的機器學習的生命週期中,訓練模型(上述工具主要解決的問題)只是整個機器學習生命週期的很小一部分。

“ml life cycle”的图片搜索结果

數據如何準備?模型訓練好了如何部署?如何上雲?如何上規模Scale?等等挑戰隨之而來。隨着機器學習的廣泛應用,許多工具響應而生,以解決模型部署的問題。例如:

我們今天就來看一看Google推出的Kubeflow。Kubeflow,顧名思義,是Kubernetes + Tensorflow,是Google爲了支持自家的Tensorflow的部署而開發出的開源平臺,當然它同時也支持Pytorch和基於Python的SKlearn等其它機器學習的引擎。與其它的產品相比較,因爲是基於強大的Kubernetes之上構建,Kubeflow的未來和生態系統更值得看好。

Kukeflow主要提供在生產系統中簡單的大規模部署機器學習的模型的功能,利用Kubernetes,它可以做到:

  • 簡單,可重複,可移植的部署
  • 利用微服務提供鬆耦合的部署和管理
  • 按需擴大規模

Kubeflow是基於K8S的機器學習工具集,它提供一系列的腳本和配置,來管理K8S的組件。Kubeflow基於K8s的微服務架構,其核心組件包括:

基於K8s,擴展其它能力非常方便,Kubeflow提供的其它擴展包括:

我們可以看出,基於K8s,Kubeflow利用已有的生態系統來構微服務,可以說充分體現了微服務的高度擴展性。

我們下面就來看看Kubeflow是如何整合了這些組件,來提供機器學習模型部署的功能的。

JupyterHub

Jupyter Notebook是深受數據科學家喜愛的開發工具,它提供出色的交互和實時反饋。JupyterHub提供一個使用Juypter Notebook的多用戶使用環境,它包含以下組件:

  • 多用戶Hub
  • 可配置的HTTP代理
  • 多個但用戶Notebook server

運行以下的命令通過port-forward訪問jyputer hub

kubectl port-forward tf-hub-0 8000:8000 -n <ns>

第一次訪問,可以創建一個notebook的實例。創建的實例可以選擇不同的鏡像,可以實現對GPU的支持。同時需要選擇配置資源的參數。

創建好的jupyterlab (JupyterLab是新一代的Juypter Notebook)的界面如下:

不過我還是比較習慣傳統的notebook界面。Lab的優點是可以開Console,這個不錯。(Lab也支持打開傳統的notebook界面)

Kubeflow在notebook鏡像中集成了Tensorboard,可以方便的對tensflow的程序進行可視化和調試。

在jyputerlab的Console中,輸入下面的命令開啓Tensorboard:

tensorboard --logdir <logdir>
$ tensorboard --logdir /tmp/logs
2018-09-15 20:30:21.186275: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
W0915 20:30:21.204606 Reloader tf_logging.py:121] Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events.  Overwriting the graph with the newest event.
W0915 20:30:21.204929 Reloader tf_logging.py:121] Found more than one metagraph event per run. Overwriting the metagraph with the newest event.
W0915 20:30:21.205569 Reloader tf_logging.py:121] Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events.  Overwriting the graph with the newest event.
TensorBoard 1.8.0 at http://jupyter-admin:6006 (Press CTRL+C to quit)

訪問tensorboard也需要port-forward,這裏user是創建notebook的用戶名,kubeflow爲爲一個實例創建一個Pod。缺省的tensorboard的端口是6006。

kubectl port-forward jupyter-<user> 6006:6006 -n <ns>

Tensorflow 訓練

爲了支持在Kubernete中進行分佈式的Tensorflow的訓練,Kubeflow開發了K8s的CDRTFJob (tf-operater)。

“distributed TensorFlow training jobs”的图片搜索结果

如上圖所示,分佈式的Tensorflow支持0到多個以下的進程:

  • Chief  負責協調訓練任務
  • Ps Parameter servers,參數服務器,爲模型提供分佈式的數據存儲
  • Worker 負責實際訓練模型的任務. 在某些情況下 worker 0 可以充當Chief的責任.
  • Evaluator 負責在訓練過程中進行性能評估

下面的yaml配置是Kubeflow提供的一個CNN Benchmarks的例子。

---
apiVersion: kubeflow.org/v1alpha2
kind: TFJob
metadata:
  labels:
    ksonnet.io/component: mycnnjob
  name: mycnnjob
  namespace: kubeflow
spec:
  tfReplicaSpecs:
    Ps:
      template:
        spec:
          containers:
          - args:
            - python
            - tf_cnn_benchmarks.py
            - --batch_size=32
            - --model=resnet50
            - --variable_update=parameter_server
            - --flush_stdout=true
            - --num_gpus=1
            - --local_parameter_device=cpu
            - --device=cpu
            - --data_format=NHWC
            image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
            name: tensorflow
            workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure
      tfReplicaType: PS
    Worker:
      replicas: 1
      template:
        spec:
          containers:
          - args:
            - python
            - tf_cnn_benchmarks.py
            - --batch_size=32
            - --model=resnet50
            - --variable_update=parameter_server
            - --flush_stdout=true
            - --num_gpus=1
            - --local_parameter_device=cpu
            - --device=cpu
            - --data_format=NHWC
            image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
            name: tensorflow
            workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure

在Kubeflow中運行這個例子,會創建一個TFjob。可以使用Kubectl來管理,監控這個Job的運行。

# 監控當前狀態
kubectl get -o yaml tfjobs <jobname> -n <ns>

# 查看事件
kubectl describe tfjobs <jobname> -n <ns>

# 查看運行日誌
kubectl logs mycnnjob-[ps|worker]-0 -n <ns>

Tensoflow 服務(Serving)

Serving就是指當模型訓練好了以後,提供一個穩定的接口,供用戶調用,來應用該模型。

基於Tensorflow的Serving功能,Kubeflow提供一個Tensorflow模型服務器(model server)的Ksonnet模塊來提供模型服務的功能。

Kukeflow支持使用S3,Google Cloud或者NFS來存貯模型。並支持利用Istio來收集Telemetry。

其它機器學習引擎的支持

雖說Tensorflow是自家的機器學習引擎,但是Google的Kubeflow也提供了對其它不同引擎的支持,包含:

  • Pytorch  PyTorch是由Facebook的人工智能研究小組開發,基於Torch的開源Python機器學習庫。
  • MXnet Apache MXNet是一個現代化的開源深度學習軟件框架,用於訓練和部署深度神經網絡。它具有可擴展性,允許快速模型培訓,並支持靈活的編程模型和多種編程語言 MXNet庫是可移植的,可以擴展到多個GPU和多臺機器。
  • Chainer  Chainer是一個開源深度學習框架,純粹用Python編寫,基於Numpy和CuPy Python庫。 該項目由日本風險投資公司Preferred Networks與IBM,英特爾,微軟和Nvidia合作開發。 Chainer因其早期採用“按運行定義”方案以及其在大規模系統上的性能而聞名。Kubeflow對Chainer的支持要到下一個版本。現在還在Beta。
  • MPI  使用MPI來訓練Tensorflow。這部分看到的資料比較少。

這些都是用Kubernetes CDRs的形式來支持的,用戶只要利用KS創建對應的組件來管理就好了。

Seldon Serving

既然要支持不同的機器學習引擎,當然也不能只提供基於Tensforflow的模型服務,爲了提供其它模型服務的能力,Kubeflow集成了Seldon。

Seldon Core是基於K8s的開源的機器學習模型部署平臺。

機器學習部署面臨許多挑戰。 Seldon Core希望幫助應對這些挑戰。它的高級目標是:

  • 允許數據科學家使用任何機器學習工具包或編程語言創建模型。我們計劃最初涵蓋以下工具/語言:
    • 基於Python的模型包括
      • Tensorflow模型
      • Sklearn模特
    • Spark模型
    • H2O模型
    • R模型
  • 在部署時通過REST和gRPC自動公開機器學習模型,以便輕鬆集成到需要預測的業務應用程序中。
  • 允許將複雜的運行時推理圖部署爲微服務。這些圖可以包括:
    • 模型 - 可執行機器學習模型的運行時推理
    • 路由器 - 將API請求路由到子圖。示例:AB測試,多武裝強盜。
    • 組合器 - 結合子圖的響應。示例:模型集合
    • 變形器 - 轉換請求或響應。示例:轉換要素請求。
  • 處理已部署模型的完整生命週期管理:
    • 更新運行時圖表,無需停機
    • 縮放
    • 監控
    • 安全

除了提供單模型服務的功能,Seldon還支持AB測試,異常檢測等等。

“Seldon core architecture”的图片搜索结果

模型部署好了之後,通過API Gateway暴露的endpoint來訪問和使用模型。

http://<ambassadorEndpoint>/seldon/<deploymentName>/api/v0.1/predictions

“kubeflow architecture”的图片搜索结果

 

Argo

argo是一個開源的基於容器的工作流引擎,並實現爲一個K8S的CRD。

  • 用容器實現工作流的每一個步驟
  • 用DAG的形式描述多個任務之間的關係的依賴
  • 支持機器學習和數據處理中的計算密集型任務
  • 無需複雜配置就可以在容器中運行CICD

用容器來實現工作流已經不是什麼新鮮事了,codeship就是用容器來實現CICD的每一步。所以Argo很適合CICD。

下圖就是一個Argo工作流的例子:

機器學習同樣可以抽象爲一個或者多個工作流。Kubeflow繼承了Argo來作爲其機器學習的工作流引擎。

可以通過Kubectl proxy來訪問Kubeflow中的Argo UI。 http://localhost:8001/api/v1/namespaces/kubeflow/services/argo-ui/proxy/workflows

現階段,並沒有實際的Argo工作流來運行機器學習的例子。但是Kubeflow在使用Argo來做自己的CICD系統。

 

Pachyderm

Pychyderm是容器化的數據池,提供像git一樣的數據版本系統管理,並提供一個數據流水線,來構建你的數據科學項目。

 

總結

Kubeflow利用Google自家的兩大利器Kubernete和Tensorflow,強強聯手,來提供一個數據科學的工具箱和部署平臺。我們可以看到他有很多優點:

  • 雲優化 - 基於K8s,可以說,所有功能都很容易的在雲上擴展。諸如多租戶功能,動態擴展,對AWS/GCP的支持等等
  • 利用微服務架構,擴展性強,基於容器,加入心得組件非常容易
  • 出色的DevOps和CICD支持,使用Ksonnet/argo,部署和管理組件和CICD都變得非常輕鬆
  • 多核心支持,除了我們本文提到的深度學習引擎,Kubeflow很容易擴展新的引擎,例如Caffe2正在開發中。
  • GPU支持

同時我們也可以看到Kubeflow的一些問題:

  • 組件比較多,缺乏協調,更像是一推工具集合。希望能有一個整合流暢的工作流,能統一各個步驟。
  • 文檔還需改善

當然,kubeflow的當前版本是0.2.5,我相信,未來Kubeflow會有很好的發展。

 

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章