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的各項功能可以說就是圍繞這四項任務構建的。

kubeflow

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

kubeflow系列(二):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

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

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)

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


    配置文件:

    <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實例
    kubeflow系列(二):kubeflow組件剖析大全

    pipeline結構介紹

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

    pipeline主要分為八部分:

    • Python SDK: 用於創建kubeflow pipeline 的DSL
    • DSL compiler: 將Python代碼轉換成YAML靜態配置文件
    • Pipeline web server: pipeline的前端服務
    • Pipeline Service: pipeline的後端服務
    • Kubernetes resources: 創建CRDs運行pipeline
    • Machine learning metadata service: 用於存儲任務流容器之間的數據交互(input/output)
    • Artifact storage: 用於存儲 Metadata 和 Pipeline packages, views
    • Orchestration 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 架構:

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

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

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



    分享到:


    相關文章: