すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:GPU高速化ECSインスタンスの再起動または置き換え後にGPUのIDが変更される問題を修正

最終更新日:Nov 14, 2024

GPU高速化インスタンスに障害が発生すると、インスタンス上のGPUのIDが変更される場合があります。 GPU IDが変更された場合、コンテナは通常どおり起動できません。 GPUOpsは、GPUアクセラレーションインスタンス上のGPUのIDが /var/lib/kubelet/device-plugins/kubelet_internal_checkpointファイルに格納されているものと同じかどうかを検出するために使用されます。 GPU IDが同じでない場合、GPUOpsはcheckpointファイルを削除します。 次に、Kubeletは別のチェックポイントファイルを生成します。 これにより、チェックポイントファイルに保存されているGPU IDが実際のGPU IDと同じになります。 このトピックでは、GPUアクセラレーションインスタンスのGPUのIDがインスタンスの障害後に変更される問題を修正する方法について説明します。

前提条件

背景情報

  • 失敗したGPUアクセラレーションインスタンスが再起動または置き換えられた後、インスタンス上のGPUのIDが変更される場合があります。 GPU IDが /var/lib/kubelet/device-plugins/kubelet_internal_checkpointファイルに格納されているものと異なる場合、GPUアクセラレーションインスタンスのコンテナは通常どおり起動できません。

    説明
    • GPU高速化インスタンスとは、GPUを備えたECS (Elastic Compute Service) インスタンスを指します。

    • GPUのIDは、次のシナリオで変更される可能性があります。

      • 失敗したGPUアクセラレーションインスタンスが再起動または置き換えられました。

      • GPUアクセラレーションインスタンスを手動で再起動します。

  • GPUOpsは、Linux上で実行できるバイナリプログラムです。 GPUOpsのダウンロード方法の詳細については、「GPUOps」をご参照ください。

  • GPU高速化インスタンスには、複数のGPUを搭載できます。 各GPUは、一意のIDを有する。

ステップ1: GPUOpsのデプロイ

単一ノードへのGPUOpsのデプロイ

  1. 次のコマンドを実行して、GPUOpsを /usr/local/bin/ ディレクトリにコピーし、GPUOpsに実行可能権限を付与します。

    cp ./gpuops /usr/local/bin/
    chmod +x gpuops
  2. 次のコマンドを実行して、GPUOpsがインスタンスで自動的に起動できるようにします。

    cat > /etc/systemd/system/gpuops.service <<EOF
    [Unit]
    Description=Gpuops: check kubelet checkpoint gpu status
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/bin/gpuops check
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    systemctl enable gpuops.service

一度に複数のノードにGPUOpsをデプロイする

GPU高速化インスタンスを含むKubernetesクラスターで、次のYAMLテンプレートを使用してDaemonSetをデプロイします。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: gpuops-deploy
  labels:
    k8s-app: gpuops-deploy
spec:
  selector:
    matchLabels:
      name: gpuops-deploy
  template:
    metadata:
      labels:
        name: gpuops-deploy
    spec:
      hostPID: true
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: aliyun.accelerator/nvidia_name
                    operator: Exists
      containers:
        - name: gpuops
          image: registry.cn-beijing.aliyuncs.com/acs/gpuops:latest
          command:
          securityContext:
            privileged: true
          volumeMounts:
            - name: hostbin
              mountPath: /workspace/host/usr/local/bin
            - name: hostsystem
              mountPath: /workspace/host/etc/systemd/system
      terminationGracePeriodSeconds: 30
      volumes:
        - name: hostbin
          hostPath:
            path: /usr/local/bin
        - name: hostsystem
          hostPath:
            path: /etc/systemd/system

DaemonSetのデプロイ後、GPU高速化インスタンスを含むKubernetesクラスターは、すべてのワーカーノードで次の操作を実行します。

  • GPUOpsを /usr/local/bin/ ディレクトリにコピーし、GPUOpsを実行可能にします。

  • GPUOpsがインスタンスで自動的に起動できるようにします。

クラスタ内で失敗したGPUアクセラレーションインスタンスが再起動または置き換えられた場合、GPUOpsは、チェックポイントファイルに格納されているGPU IDが実際のGPU IDと同じであることを確認します。

ステップ2: GPUOpsがGPU IDの問題を修正したことを確認する

  1. GPUOpsのデプロイ後、GPU高速化インスタンスを使用してKubernetesクラスターにポッドを作成します。

    次のYAMLテンプレートを使用してポッドを作成します。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: app-3g-v1
      labels:
        app: app-3g-v1
    spec:
      replicas: 1
      serviceName: "app-3g-v1"
      podManagementPolicy: "Parallel"
      selector: # define how the deployment finds the pods it manages
        matchLabels:
          app: app-3g-v1
      template: # define the pods specifications
        metadata:
          labels:
            app: app-3g-v1
        spec:
          containers:
          - name: app-3g-v1
            image: registry.cn-shanghai.aliyuncs.com/tensorflow-samples/cuda-malloc:3G
            resources:
              limits:
                nvidia.com/gpu: 1
  2. 次のコマンドを実行して、ポッドのステータスを照会します。

    kubectl get pod

    期待される出力:

    NAME                                  READY   STATUS       RESTARTS   AGE
    app-3g-v1-0                           1/1     Running      0          22s
  3. ポッドが実行されているGPU高速化インスタンスにログインし、次のコマンドを実行してインスタンスを再起動します。

    説明

    GPU高速化インスタンスへのログイン方法の詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。

    sudo reboot
  4. 次のコマンドを実行して、GPUOpsのログを印刷します。

    journalctl -u gpuops
    • 次の出力が返された場合、checkpointファイルに格納されているGPU IDは実際のGPU IDと同じです。 アクションを実行する必要はありません。

      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z gpuops[21976]: {"level":"info","msg":"check gpu start...","time":"2020-06-28T14:49:00+08:00"}
      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z gpuops[21976]: {"level":"info","msg":"find nvidia gpu: [\"GPU-383cd6a5-00a6-b455-62c4-c163d164b837\"]","time":"2020-06-28T14:49:00+08:00"}
      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z gpuops[21976]: {"level":"info","msg":"read checkpoint: {\"Data\":{\"PodDeviceEntries\":[{\"PodUID\":\"300f47eb-e5c3-4d0b-9a87-925837b67732\",\"ContainerName\":\"app-3g-v1\",\"ResourceName\":\"aliyun.com/g
      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z systemd[1]: Started Gpuops: check kubelet checkpoint gpu status.
      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z gpuops[21976]: {"level":"info","msg":"find registered gpu: [\"GPU-383cd6a5-00a6-b455-62c4-c163d164b837\"]","time":"2020-06-28T14:49:00+08:00"}
      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z gpuops[21976]: {"level":"info","msg":"find pod gpu: null","time":"2020-06-28T14:49:00+08:00"}
      June 28 14:49:00 iZ2vc1mysgx8bqdv3oyji9Z gpuops[21976]: {"level":"info","msg":"cached gpu info in checkpoint is up to date, check gpu finished","time":"2020-06-28T14:49:00+08:00"}
    • 出力に警告メッセージが含まれている場合、GPU IDが変更されます。 この場合、GPUOpsはcheckpointファイルを削除し、Kubernetesは新しいGPU IDを格納する別のcheckpointファイルを生成します。

      June 28 14:41:16 iZ2vc1mysgx8bqdv3oyji9Z systemd[1]: Starting Gpuops: check kubelet checkpoint gpu status...
      June 28 14:41:16 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"check gpu start...","time":"2020-06-28T14:41:16+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"find nvidia gpu: [\"GPU-68ce64fb-ea68-5ad6-7e72-31f3f07378df\"]","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"read checkpoint: {\"Data\":{\"PodDeviceEntries\":[{\"PodUID\":\"300f47eb-e5c3-4d0b-9a87-925837b67732\",\"ContainerName\":\"app-3g-v1\",\"ResourceName\":\"aliyun.com/gpu
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"find registered gpu: [\"GPU-7fd52bfc-364d-1129-a142-c3f10e053ccb\"]","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"find pod gpu: [\"GPU-7fd52bfc-364d-1129-a142-c3f10e053ccb\"]","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"warning","msg":"the registered gpu uuid not equal with nvidia gpu","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"warning","msg":"cached gpu info in checkpoint is out of date","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"delete checkpoint file success","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"kubelet restart success","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z gpuops[951]: {"level":"info","msg":"check gpu finished","time":"2020-06-28T14:41:17+08:00"}
      June 28 14:41:17 iZ2vc1mysgx8bqdv3oyji9Z systemd[1]: Started Gpuops: check kubelet checkpoint gpu status.
      • 次のコマンドを実行して、実際のGPU IDを照会します。

        nvidia-smi -L

        期待される出力:

        GPU 0: Tesla T4 (UUID: GPU-0650a168-e770-3ea8-8ac3-8a1d419763e0)
      • 次のコマンドを実行して、checkpointファイルに格納されているGPU IDを照会します。

        cat /var/lib/kubelet/device-plugins/kubelet_internal_checkpoint

        期待される出力:

        {"Data":{"PodDeviceEntries":null,"RegisteredDevices":{"nvidia.com/gpu":["GPU-0650a168-e770-3ea8-8ac3-8a1d419763e0"]}},"Checksum":3952659280}

        上記の出力は、checkpointファイルに格納されているIDが実際のGPU IDと同じであることを示しています。 これは、GPUOpsが一貫性のないGPU IDの問題を修正したことを示します。