KubeFlow提供TFJob和PyTorchJob等CRD(CustomResourceDefinition),基于這些CRD,您可以在Kubernetes集群上運行分布式訓練,無需過多關注分布式代碼邏輯,也無需過多考慮集群的運維工作,可以將全部精力集中到模型開發當中,DataScience集群為您提供穩定的算力輸出,以及Tensorflow和PyTorch等豐富的機器學習框架。

前提條件

  • 已創建DataScience集群,并且選擇了Kubeflow服務,詳情請參見創建集群
  • 下載dsdemo代碼:請已創建DataScience集群的用戶,使用釘釘搜索釘釘群號32497587加入釘釘群以獲取dsdemo代碼。

背景信息

通過以下三種方式為您展示Training示例:

準備工作

  1. 通過SSH方式連接集群,詳情請參見登錄集群
  2. 上傳并解壓縮下載的代碼包至集群Master節點的/dsdemo目錄下。
    本文示例是上傳并解壓縮在root/dsdemo目錄下,您可以指定目錄。

estimator-API

  1. 執行以下命令,進入estimator-API目錄。
    cd /root/dsdemo/kubeflow_samples/training/tf/estimator-API
  2. 制作Train鏡像。
    • 執行以下命令,制作Train鏡像。
      make
    • 執行以下命令,制作鏡像并將鏡像push到鏡像倉庫。
      make push
  3. 根據您的實際需求,修改distributed_tfjob.yaml文件內容。
    您需要修改代碼中image的值,distributed_tfjob.yaml文件內容如下。
    apiVersion: "kubeflow.org/v1"
    kind: "TFJob"
    metadata:
      name: "distributed-training"
    spec:
      cleanPodPolicy: None
      tfReplicaSpecs:
        Worker:
          replicas: 3
          restartPolicy: Never
          template:
            metadata:
                  annotations:
                    scheduling.k8s.io/group-name: "distributed-training"
            spec:
              containers:
                - name: tensorflow
                  image: datascience-registry.cn-beijing.cr.aliyuncs.com/kubeflow-examples/distributed_worker:0.1.4
                  volumeMounts:
                    - mountPath: /train
                      name: training
              volumes:
                - name: training
                  persistentVolumeClaim:
                    claimName: strategy-estimator-volume
  4. 執行以下命令,使修改的配置生效。
    kubectl apply -f distributed_tfjob.yaml
  5. 根據您的實際需求,修改pvc.yaml配置文件。
    pvc.yaml文件內容如下。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: strategy-estimator-volume
      labels:
        app: strategy-estimator-volume
    spec:
      storageClassName: "nfs-client"
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
    說明 您可以修改storage的值,調大存儲空間,例如50 Gi。
  6. 執行以下命令,使修改的配置生效。
    kubectl apply -f pvc.yaml
  7. 查看訓練狀態。
    1. 執行以下命令,獲取Pod信息。
      kubectl get pods
      返回如下類似信息。
      NAME                                      READY   STATUS      RESTARTS   AGE
      distributed-training-worker-0             0/1     Completed   0          22h
      distributed-training-worker-1             0/1     Completed   0          22h
      distributed-training-worker-2             0/1     Completed   0          22h
      nfs-client-provisioner-5cb8b7cf76-k2z4d   1/1     Running     0          25h
      說明 當Pod的狀態為Completed時,表示訓練結束。
    2. 執行以下命令,查看Log信息。
      kubectl logs distributed-training-worker-0
  8. 查看Checkpoint模型導出文件。
    1. 執行以下命令,進入default_storage_class目錄。
      cd /mnt/disk1/k8s_pv/default_storage_class
    2. 執行ll命令,獲取模型目錄。
      total 28
      drwxrwxrwx 2 root    root     4096 Jul  8 16:56 anonymous-workspace-ds-notebook2-pvc-09789bbd-aa40-4381-af63-ebcab57c584f
      drwxrwxrwx 7 root    root     4096 Jul  8 18:09 anonymous-workspace-ds-notebook-pvc-ae4db112-9491-4449-854a-7b0e67264703
      drwxrwxrwx 5 root    root     4096 Jul  8 16:27 default-strategy-estimator-volume-pvc-6cd2979e-f925-45b7-8c25-ce67e12e2f03
      drwxrwxrwx 3 root    root     4096 Jul  8 13:47 kubeflow-katib-mysql-pvc-9a3ebbfe-2952-4eaa-8a83-36e42d620cac
      drwxrwxrwx 3 root    root     4096 Jul  8 13:47 kubeflow-metadata-mysql-pvc-5778e165-8a08-4536-8e36-9185144d3d6d
      drwxrwxrwx 3 root    root     4096 Jul  8 13:47 kubeflow-minio-pvc-pvc-10015211-fc40-460e-b723-a5c220112d08
      drwxrwxrwx 6 polkitd ssh_keys 4096 Jul  8 13:54 kubeflow-mysql-pv-claim-pvc-5136b864-c868-4951-9b34-f6c5f06c2d6f
                                      
    3. 執行以下命令,進入模型目錄。
      cd default-strategy-estimator-volume-pvc-6cd2979e-f925-45b7-8c25-ce67e12e2f03
      說明 default-strategy-estimator-volume-pvc-6cd2979e-f925-45b7-8c25-ce67e12e2f03需要替換為您實際生成的目錄。
    4. 執行以下命令,進入master目錄。
      cd master
    5. 執行下ll命令,查看目錄信息。
      total 4
      drwxr-xr-x 3 root root 4096 Jul  8 16:27 1625732821
    6. 執行以下命令,進入1625732821目錄。
      cd 1625732821
      說明 1625732821需要替換為您實際生成的目錄。
    7. 執行下ll命令,查看目錄信息。
      total 1788
      -rw-r--r-- 1 root root    130 Jul  8 16:27 checkpoint
      -rw-r--r-- 1 root root 838550 Jul  8 16:27 events.out.tfevents.1625732823.distributed-training-worker-0
      -rw-r--r-- 1 root root 523304 Jul  8 16:27 graph.pbtxt
      drwxr-xr-x 2 root root   4096 Jul  8 16:27 keras
      -rw-r--r-- 1 root root    780 Jul  8 16:27 model.ckpt-0.data-00000-of-00001
      -rw-r--r-- 1 root root    249 Jul  8 16:27 model.ckpt-0.index
      -rw-r--r-- 1 root root 218354 Jul  8 16:27 model.ckpt-0.meta
      -rw-r--r-- 1 root root    780 Jul  8 16:27 model.ckpt-3200.data-00000-of-00001
      -rw-r--r-- 1 root root    249 Jul  8 16:27 model.ckpt-3200.index
      -rw-r--r-- 1 root root 218354 Jul  8 16:27 model.ckpt-3200.meta

keras-API

重要 此示例需要GPU環境,因此創建DataScience集群時需要選擇GPU的配置,并且制作鏡像時也需要GPU。
  1. 執行以下命令,進入keras-API目錄。
    cd /root/dsdemo/kubeflow_samples/training/tf/keras-API
  2. 制作Train鏡像。
    • 執行以下命令,制作Train鏡像。
      make
    • 執行以下命令,制作鏡像并將鏡像push到鏡像倉庫。
      make push
  3. 根據您的實際需求,修改目錄下訓練配置文件的鏡像名稱。
    multi_worker_tfjob.yaml文件內容如下。
    apiVersion: kubeflow.org/v1
    kind: TFJob
    metadata:
      name: multi-worker
    spec:
      cleanPodPolicy: None
      tfReplicaSpecs:
        Worker:
          replicas: 3
          restartPolicy: Never
          template:
            spec:
              containers:
                - name: tensorflow
                  image: datascience-registry.cn-beijing.cr.aliyuncs.com/kubeflow-examples/multi_worker_strategy:0.1.1
                  volumeMounts:
                    - mountPath: /train
                      name: training
                  resources:
                    limits:
                      nvidia.com/gpu: 1
              volumes:
                - name: training
                  persistentVolumeClaim:
                    claimName: strategy-volume
  4. 執行以下命令,使修改的配置生效。
    kubectl apply -f multi_worker_tfjob.yaml
  5. 修改pvc配置文件。
    pvc.yaml文件內容如下。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: strategy-volume
      labels:
        app: strategy-volume
    spec:
      storageClassName: "nfs-client"
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
    說明 您可以修改storage的值,調大存儲空間,例如50 Gi。
  6. 執行以下命令,使修改的配置生效。
    kubectl apply -f pvc.yaml
  7. 查看訓練狀態。
    1. 執行以下命令,獲取Pod信息。
      kubectl get pods
      返回如下類似信息。
      NAME                                      READY   STATUS      RESTARTS   AGE
      multi-worker-worker-0                     0/1     Pending     0          5m33s
      multi-worker-worker-1                     0/1     Pending     0          5m33s
      multi-worker-worker-2                     0/1     Pending     0          5m33s
      nfs-client-provisioner-5cb8b7cf76-k2z4d   1/1     Running     0          25h
      說明 當Pod的狀態為Completed時,表示訓練結束。
    2. 執行以下命令,查看Log信息。
      kubectl logs distributed-training-worker-0
  8. 進入如下目錄,查看Checkpoint模型導出文件。
    ll /mnt/disk1/k8s_pv/default_storage_class/default-strategy-estimator-volume-pvc-aa16c081-cd94-4565-bfde-daee90ee25a4/master/1625553118/
    說明 default-strategy-estimator-volume-pvc-aa16c081-cd94-4565-bfde-daee90ee25a41625553118需要替換為您實際的目錄。
    total 1788
    -rw-r--r-- 1 root root    130 Jul  6 14:32 checkpoint
    -rw-r--r-- 1 root root 838550 Jul  6 14:32 events.out.tfevents.1625553120.distributed-training-worker-0
    -rw-r--r-- 1 root root 523405 Jul  6 14:32 graph.pbtxt
    drwxr-xr-x 2 root root   4096 Jul  6 14:31 keras
    -rw-r--r-- 1 root root    780 Jul  6 14:32 model.ckpt-0.data-00000-of-00001
    -rw-r--r-- 1 root root    249 Jul  6 14:32 model.ckpt-0.index
    -rw-r--r-- 1 root root 218354 Jul  6 14:32 model.ckpt-0.meta
    -rw-r--r-- 1 root root    780 Jul  6 14:32 model.ckpt-3200.data-00000-of-00001
    -rw-r--r-- 1 root root    249 Jul  6 14:32 model.ckpt-3200.index
    -rw-r--r-- 1 root root 218354 Jul  6 14:32 model.ckpt-3200.meta

Pytorch訓練

  1. 執行以下命令,進入mnist目錄。
    cd /root/dsdemo/kubeflow_samples/training/pytorch/mnist
  2. 制作Train鏡像。
    • 執行以下命令,制作Train鏡像。
      make
    • 執行以下命令,制作鏡像并將鏡像push到鏡像倉庫。
      make push
  3. 根據您的實際需求,修改訓練配置文件的鏡像名稱。
    apiVersion: "kubeflow.org/v1"
    kind: "PyTorchJob"
    metadata:
      name: "pytorch-dist-mnist-gloo"
    spec:
      pytorchReplicaSpecs:
        Master:
          replicas: 1
          restartPolicy: OnFailure
          template:
            metadata:
              annotations:
                sidecar.istio.io/inject: "false"
            spec:
              containers:
                - name: pytorch
                  image: datascience-registry.cn-beijing.cr.aliyuncs.com/kubeflow-examples/pytorch-dist-mnist-test:0.1.5
                  args: ["--backend", "gloo"]
                  volumeMounts:
                    - mountPath: /train
                      name: training
                  # Comment out the below resources to use the CPU.
                  resources: 
                    limits:
                      nvidia.com/gpu: 1
              volumes:
                - name: training
                  persistentVolumeClaim:
                    claimName: strategy-pytorch-volume
        Worker:
          replicas: 1
          restartPolicy: OnFailure
          template:
            metadata:
              annotations:
                sidecar.istio.io/inject: "false"
            spec:
              containers: 
                - name: pytorch
                  image: datascience-registry.cn-beijing.cr.aliyuncs.com/kubeflow-examples/pytorch-dist-mnist-test:0.1.5
                  args: ["--backend", "gloo"]
                  volumeMounts:
                    - mountPath: /train
                      name: training
                  # Comment out the below resources to use the CPU.
                  resources: 
                    limits:
                      nvidia.com/gpu: 1
              volumes:
                - name: training
                  persistentVolumeClaim:
                    claimName: strategy-pytorch-volume
  4. 修改pvc配置文件。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: strategy-pytorch-volume
      labels:
        app: strategy-pytorch-volume
    spec:
      storageClassName: "nfs-client"
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
    說明 您可以修改storage的值,調大存儲空間,例如50 Gi。
  5. 申請PVC并提交訓練。
    kubectl apply -f ./v1/pytorch_job_mnist_gloo.yaml
  6. 查看訓練狀態。
    1. 執行以下命令,獲取Pod信息。
      kubectl get pods
      返回如下類似信息。
      NAME                                      READY   STATUS      RESTARTS   AGE
      pytorch-dist-mnist-gloo-worker-0          0/1     Pending     0          11m
      說明 當Pod的狀態為Completed時,表示訓練結束。
    2. 執行以下命令,查看Log信息。
      kubectl logs pytorch-dist-mnist-gloo-master-0
  7. 進入如下目錄,查看Checkpoint模型導出文件。
    cd /mnt/disk1/k8s_pv/default_storage_class/default-strategy-pytorch-volume-pvc-633b12ab-5f63-4e63-97b9-24c2b3de733c/
    說明 default-strategy-pytorch-volume-pvc-633b12ab-5f63-4e63-97b9-24c2b3de733c需要替換為您實際的目錄。
    返回信息類似如下所示。
    total 1688
    -rw-r--r-- 1 root root 1725813 Jul  6 15:35 mnist_cnn.pt

問題反饋

如果您在使用DataScience集群過程中有任何疑問或問題,請聯系我們的技術人員協助處理,同時也歡迎您使用釘釘搜索釘釘群號32497587加入釘釘群進行反饋或交流。