提起機器學習,尤其是深度學習,大家可能會對諸如Tensorflow,Pytorch,Caffee的工具耳熟能詳。但其實在實際的機器學習的生命週期中,訓練模型(上述工具主要解決的問題)只是整個機器學習生命週期的很小一部分。
數據如何準備?模型訓練好了如何部署?如何上雲?如何上規模Scale?等等挑戰隨之而來。隨着機器學習的廣泛應用,許多工具響應而生,以解決模型部署的問題。例如:
我們今天就來看一看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的配置管理
- ... ...
我們可以看出,基於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的CDR,TFJob (tf-operater)。
如上圖所示,分佈式的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模型
- 基於Python的模型包括
- 在部署時通過REST和gRPC自動公開機器學習模型,以便輕鬆集成到需要預測的業務應用程序中。
- 允許將複雜的運行時推理圖部署爲微服務。這些圖可以包括:
- 模型 - 可執行機器學習模型的運行時推理
- 路由器 - 將API請求路由到子圖。示例:AB測試,多武裝強盜。
- 組合器 - 結合子圖的響應。示例:模型集合
- 變形器 - 轉換請求或響應。示例:轉換要素請求。
- 處理已部署模型的完整生命週期管理:
- 更新運行時圖表,無需停機
- 縮放
- 監控
- 安全
除了提供單模型服務的功能,Seldon還支持AB測試,異常檢測等等。
模型部署好了之後,通過API Gateway暴露的endpoint來訪問和使用模型。
http://<ambassadorEndpoint>/seldon/<deploymentName>/api/v0.1/predictions
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會有很好的發展。
參考:
- kubeflow
- open mpi
- Kubeflow: Cloud-native machine learning with Kubernetes
- Bringing Your Data Pipeline Into The Machine Learning Era
- Introducing Argo — A Container-Native Workflow Engine for Kubernetes
- Introducing Seldon Deploy
- jupyterhub 文檔
- MPI AND SCALABLE DISTRIBUTED MACHINE LEARNING
- Chainer 使複雜神經網絡變的簡單
- pachyderm 文檔
- https://github.com/fnproject/fn-helm/issues/21