kubeflow系列(二):kubeflow組件剖析大全


kubeflow作為基於雲原生的機器學習大禮包,即可以作為一個很好的雲原生的學習例子,同時基於k8s的生態必將是未來的發展的方向,相信後續Mxnet、paddle等各類型技術框架也都會運行在kubernetes這個生態之上,而對組件和架構的梳理可以以最快的速度瞭解kubeflow。


為了對kubeflow有個更直觀深入的瞭解,對kubeflow的各組件進行簡單的介紹,先從機器學習任務來看kubeflow的的實現。kubeflow安裝可以看:

機器學習任務工程化實現流程

一個建模任務下來主要可以分為四大塊任務

業務理解(Business Understanding)數據獲取及數據理解(Data Acquistition)特徵處理(Feature Engineering)、建模與模型訓練(Model Training)、模型評估(Model Evaluation)模型部署(Deployment),提供模型服務

一個機器學習任務從開始到結束主要分為了四大任務,Kubeflow的各項功能可以說就是圍繞這四項任務構建的。

kubeflow

kubeflow 最開始基於tf-operator,後來隨著項目發展最後變成一個基於雲原生構建的機器學習任務工具大集合。從數據採集,驗證,到模型訓練和服務發佈,幾乎所有步驟的小組件 Kubeflow 都提供解決方案的組件:

kubeflow特點:

基於k8s,具有云原生的特性:彈性伸縮、高可用、DevOps等集成大量機器學習所用到的工具

結構

kubeflow的完整結構可以看他的kustomize安裝文件:

<code>kustomize/├── ambassador.yaml├── api-service.yaml├── argo.yaml├── centraldashboard.yaml├── jupyter-web-app.yaml├── katib.yaml├── metacontroller.yaml├── minio.yaml├── mysql.yaml├── notebook-controller.yaml├── persistent-agent.yaml├── pipelines-runner.yaml├── pipelines-ui.yaml├── pipelines-viewer.yaml├── pytorch-operator.yaml├── scheduledworkflow.yaml├── tensorboard.yaml└── tf-job-operator.yaml/<code>

ambassador 微服務網關
argo 用於任務工作流編排
centraldashboard kubeflow的dashboard看板頁面
tf-job-operator 深度學習框架引擎,一個基於tensorflow構建的CRD,資源類型kind為TFJob
tensorboard tensorflow的訓練可視化UI界面
katib 超參數服務器
pipeline 一個機器學習的工作流組件
jupyter 一個交互式業務IDE編碼環境


TFJob

TFJob 是將 tensorflow 的分佈式架構基於 k8s 構建的一種CRD:

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

<code>apiVersion: kubeflow.org/v1beta2kind: TFJobmetadata: name: mnist-train namespace: kubeflowspec: tfReplicaSpecs: Chief: # 調度器 replicas: 1 template: spec: containers: - command: - /usr/bin/python - /opt/model.py env: - name: modelDir value: /mnt - name: exportDir value: /mnt/export image: mnist-test:v0.1 name: tensorflow volumeMounts: - mountPath: /mnt name: local-storage workingDir: /opt restartPolicy: OnFailure volumes: - name: local-storage persistentVolumeClaim: claimName: local-path-pvc Ps: # 參數服務器 replicas: 1 template: spec: containers: - command: - /usr/bin/python - /opt/model.py env: - name: modelDir value: /mnt - name: exportDir value: /mnt/export image: mnist-test:v0.1 name: tensorflow volumeMounts: - mountPath: /mnt name: local-storage workingDir: /opt restartPolicy: OnFailure volumes: - name: local-storage persistentVolumeClaim: claimName: local-path-pvc Worker: # 計算節點 replicas: 2 template: spec: containers: - command: - /usr/bin/python - /opt/model.py env: - name: modelDir value: /mnt - name: exportDir value: /mnt/export image: mnist-test:v0.1 name: tensorflow volumeMounts: - mountPath: /mnt name: local-storage workingDir: /opt restartPolicy: OnFailure volumes: - name: local-storage persistentVolumeClaim: claimName: local-path-pvc/<code>


tensorboard 訓練可視化界面

掛載日誌文件,創建 tensorboard 可視化服務

配置文件

<code>apiVersion: v1kind: Servicemetadata: name: tensorboard-tb namespace: kubeflowspec: ports: - name: http port: 8080 targetPort: 80 selector: app: tensorboard tb-job: tensorboard---apiVersion: apps/v1beta1kind: Deploymentmetadata: name: tensorboard-tb namespace: kubeflowspec: replicas: 1 template: metadata: labels: app: tensorboard tb-job: tensorboard name: tensorboard namespace: kubeflow spec: containers: - command: - /usr/local/bin/tensorboard - --logdir=/mnt - --port=80 env: - name: logDir value: /mnt image: tensorflow/tensorflow:1.11.0 name: tensorboard ports: - containerPort: 80 volumeMounts: - mountPath: /mnt name: local-storage serviceAccount: default-editor volumes: - name: local-storage persistentVolumeClaim: claimName: mnist-test-pvc/<code>


tf-serving

tenserflow serving 提供一個穩定的接口,供用戶調用,來應用該模型,serving 通過模型文件直接創建模型即服務(Model as a service)


配置文件:

<code>apiVersion: v1kind: Servicemetadata: labels: app: mnist name: mnist-service-local namespace: kubeflowspec: ports: - name: grpc-tf-serving port: 9000 targetPort: 9000 - name: http-tf-serving port: 8500 targetPort: 8500 selector: app: mnist type: ClusterIP---apiVersion: extensions/v1beta1kind: Deploymentmetadata: labels: app: mnist name: mnist-service-local namespace: kubeflowspec: template: metadata: labels: app: mnist version: v1 spec: containers: - args: - --port=9000 - --rest_api_port=8500 - --model_name=mnist - --model_base_path=/mnt/export command: - /usr/bin/tensorflow_model_server env: - name: modelBasePath value: /mnt/export image: tensorflow/serving:1.11.1 imagePullPolicy: IfNotPresent livenessProbe: initialDelaySeconds: 30 periodSeconds: 30 tcpSocket: port: 9000 name: mnist ports: - containerPort: 9000 - containerPort: 8500 resources: limits: cpu: "4" memory: 4Gi requests: cpu: "1" memory: 1Gi volumeMounts: - mountPath: /mnt name: local-storage/<code>


pipeline

pipeline 是一個可視化的kubeflow任務工作流(Workflow),定義了一個有向無環圖描述的流水線,流水線中每一步流程是由容器定義組成的組件。

運行步驟:

先要定義一個Experiment實驗然後發起任務,定義一個Pipeline運行Pipeline實例

pipeline結構介紹

pipeline主要分為八部分:

Python SDK: 用於創建kubeflow pipeline 的DSLDSL compiler: 將Python代碼轉換成YAML靜態配置文件Pipeline web server: pipeline的前端服務Pipeline Service: pipeline的後端服務Kubernetes resources: 創建CRDs運行pipelineMachine learning metadata service: 用於存儲任務流容器之間的數據交互(input/output)Artifact storage: 用於存儲 Metadata 和 Pipeline packages, viewsOrchestration controllers:任務編排,比如Argo Workflow.

案例:

<code>import kfpfrom kfp import dsldef gcs_download_op(url): return dsl.ContainerOp( name='GCS - Download', image='google/cloud-sdk:272.0.0', command=['sh', '-c'], arguments=['gsutil cat $0 | tee $1', url, '/tmp/results.txt'], file_outputs={ 'data': '/tmp/results.txt', } )def echo2_op(text1, text2): return dsl.ContainerOp( name='echo', image='library/bash:4.4.23', command=['sh', '-c'], arguments=['echo "Text 1: $0"; echo "Text 2: $1"', text1, text2] )@dsl.pipeline( name='Parallel pipeline', description='Download two messages in parallel and prints the concatenated result.')def download_and_join( url1='http://shikanon.com/ml-pipeline-playground/shakespeare1.txt', url2='http://shikanon.com/ml-pipeline-playground/shakespeare2.txt'): """A three-step pipeline with first two running in parallel.""" download1_task = gcs_download_op(url1) download2_task = gcs_download_op(url2) echo_task = echo2_op(download1_task.output, download2_task.output)if __name__ == '__main__': kfp.compiler.Compiler().compile(download_and_join, __file__ + '.yaml')/<code>


jupyter-notebook

jupyter 是最大限度的利用交互式的工作,他的主要工作體現利用交互式的操作幫助用戶快速理解數據和測試評估模型。

主要包括兩個模塊jupyter-web-app 和 notebook-controller, jupyter 架構:

也可以用 jupyterhub 代替jupyter, jupyterhub提供了更多功能, jupyterhub 結構: