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

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

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

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

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

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

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

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

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

  • Jupyterhub 多租戶Nootbook服務
  • Tensorflow/Pytorch/MPI/MXnet/Chainer 主要的機器學習引擎
  • Seldon 提供在K8s上對於機器學習模型的部署
  • Argo 基於K8s的工作流引擎
  • Ambassador API Gateway
  • Istio 提供微服務的管理,Telemetry收集
  • Ksonnet K8s部署工具
  • 基於K8s,擴展其它能力非常方便,Kubeflow提供的其它擴展包括:

  • Pachyderm 基於容器和K8s的數據流水線 (git for data)
  • Weaveworks flux 基於git的配置管理
  • ... ...
  • 輕鬆擴展你的機器學習能力 Kubeflow

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

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

    JupyterHub

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

    • 多用戶Hub
    • 可配置的HTTP代理
    • 多個但用戶Notebook server
    輕鬆擴展你的機器學習能力 Kubeflow

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

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

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

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

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

    不過我還是比較習慣傳統的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 /<user>
    輕鬆擴展你的機器學習能力 Kubeflow

    Tensorflow 訓練

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

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

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

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

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

    ---
    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 /<jobname>

    # 查看事件

    kubectl describe tfjobs <jobname> -n /<jobname>

    # 查看運行日誌

    kubectl logs mycnnjob-[ps|worker]-0 -n 

    Tensoflow 服務(Serving)

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

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

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

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

    其它機器學習引擎的支持

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

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

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

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

    http://<ambassadorendpoint>/seldon/<deploymentname>/api/v0.1/predictions/<deploymentname>/<ambassadorendpoint>
    輕鬆擴展你的機器學習能力 Kubeflow

    Argo

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

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

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

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

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

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

    可以通過Kubectl proxy來訪問Kubeflow中的Argo UI。

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

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

    Pachyderm

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

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

    總結

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

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

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

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

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


    分享到:


    相關文章: