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がインスタンスの障害後に変更される問題を修正する方法について説明します。
前提条件
SSHを使用するジャンプサーバーがクラスターに追加されます。 ジャンプサーバーはインターネットにアクセスできます。 詳細については、「既存のACKクラスターのSNATエントリの設定」をご参照ください。
背景情報
失敗した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のデプロイ
次のコマンドを実行して、GPUOpsを /usr/local/bin/ ディレクトリにコピーし、GPUOpsに実行可能権限を付与します。
cp ./gpuops /usr/local/bin/ chmod +x gpuops
次のコマンドを実行して、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の問題を修正したことを確認する
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
次のコマンドを実行して、ポッドのステータスを照会します。
kubectl get pod
期待される出力:
NAME READY STATUS RESTARTS AGE app-3g-v1-0 1/1 Running 0 22s
ポッドが実行されているGPU高速化インスタンスにログインし、次のコマンドを実行してインスタンスを再起動します。
説明GPU高速化インスタンスへのログイン方法の詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
sudo reboot
次のコマンドを実行して、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の問題を修正したことを示します。