このトピックでは、GPUに関するよくある質問に対する回答を示します。
NVIDIA A100 GPU (ECS. ebmgn7) を搭載したecsベアメタルインスタンスの追加に失敗した場合はどうすればよいですか?
Alibaba Cloud Linux 3でGPUリソースを要求するポッドを実行すると、システムプロンプトがNVML: 不明なエラーの初期化に失敗したのはなぜですか。
ACKはvGPU高速化インスタンスをサポートしていますか?
vGPUアクセラレーションインスタンスは、NVIDIA GRIDライセンスが購入され、GRIDライセンスサーバーがセットアップされている場合にのみ、通常どおりに機能します。 ただし、Alibaba CloudはGRIDライセンスサーバーを提供していません。 その結果、vGPU高速化インスタンスを含むContainer Service for Kubernetes (ACK) クラスターが作成された後、クラスター内のvGPU高速化インスタンスを直接使用することはできません。 したがって、ACKコンソールでクラスターを作成するときに、ACKではvGPUアクセラレーションインスタンスを選択できなくなります。
ACKコンソールで、名前の先頭にECS. vgn5i、ecs.vgn6i、ecs.vgn7i、またはecs.sgn7iが付いているvGPUアクセラレーションecs (Elastic Compute Service) インスタンスタイプを選択することはできません。 ワークロードがvGPU高速化インスタンスに強く依存している場合は、NVIDIA GRIDライセンスを購入し、独自にGRIDライセンスサーバーを設定できます。
GRIDライセンスサーバーは、vGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスを更新するために必要です。
vGPUアクセラレーションECSインスタンスを購入し、GRIDライセンスサーバーのセットアップ方法に関するNVIDIAのドキュメントをよく理解しておく必要があります。 詳細については、「NVIDIA公式ウェブサイト」をご参照ください。
GRIDライセンスサーバーをセットアップしたら、次の手順を実行して、vGPUアクセラレーションインスタンスをACKクラスターに追加します。
vGPU高速化インスタンスをACKクラスターに追加
Quota Centerでカスタムイメージを使用する権限を申請します。
CentOS 7.XまたはAlibaba Cloud Linux 2に基づくカスタムイメージを作成します。 カスタムイメージはNVIDIA GRIDドライバーと共にインストールし、NVIDIAライセンスで設定する必要があります。 詳細については、「インスタンスからカスタムイメージを作成する」および「vGPUアクセラレーションLinuxインスタンスにGRIDドライバーをインストールする」をご参照ください。
ノードプールを作成します。 詳細については、「ノードプールの作成」をご参照ください。
ステップ3で作成したノードプールにvGPU高速化インスタンスを追加します。 詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。
次の対処方法: ACKクラスターのvGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスを更新
ACKクラスター内のvGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスを更新する方法の詳細については、「ACKクラスター内のvGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスの更新」をご参照ください。
クラスター内のGPUアクセラレーションノードのカーネルバージョンを手動で更新するにはどうすればよいですか?
クラスター内のGPUアクセラレーションノードのカーネルバージョンを手動で更新するには、次の手順を実行します。
現在のカーネルバージョンは3.10.0-957.21.3
より前です。
更新するカーネルのバージョンを確認します。 更新を実行するときは注意して続行してください。
次の手順は、NVIDIAドライバーを更新する方法を示しています。 カーネルバージョンの更新方法の詳細については説明しません。
管理するGPU高速化ノードをスケジュール不可に設定します。 この例では、ノードcn-beijing.i-2ze19qyi8votgjz12345が使用されます。
kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345 node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
GPU高速化ノードのポッドを他のノードに移行します。
kubectl drain cn-beijing.i-2ze19qyi8votgjz12345 --grace-period=120 --ignore-daemonsets=true node/cn-beijing.i-2ze19qyi8votgjz12345 cordoned WARNING: Ignoring DaemonSet-managed pods: flexvolume-9scb4, kube-flannel-ds-r2qmh, kube-proxy-worker-l62sf, logtail-ds-f9vbg pod/nginx-ingress-controller-78d847fb96-5fkkw evicted
現在のNVIDIAドライバーをアンインストールします。
説明この例では、NVIDIAドライバー384.111がアンインストールされます。 ドライバーのバージョンが384.111でない場合は、NVIDIAの公式Webサイトからドライバーのインストールパッケージをダウンロードし、
384.111
次のサンプルコードでNVIDIAドライバーのバージョンを使用します。GPUアクセラレーションノードにログインし、
nvidia-smi
コマンドを実行してドライバーのバージョンを確認します。sudo nvidia-smi -a | grep 'Driver Version' Driver Version : 384.111
ドライバーのインストールパッケージをダウンロードします。
sudo cd /tmp/ sudo curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
説明インストールパッケージは、NVIDIAドライバーをアンインストールするために必要です。
NVIDIAドライバーをアンインストールします。
sudo chmod u+x NVIDIA-Linux-x86_64-384.111.run sudo sh./NVIDIA-Linux-x86_64-384.111.run --uninstall -a -s -q
カーネルのバージョンを更新します。
GPU高速化ノードを再起動します。
sudo reboot
GPU高速化ノードにログインし、対応するkernel-develパッケージをインストールします。
sudo yum install -y kernel-devel-$(uname -r)
NVIDIAの公式Webサイトにアクセスし、必要なNVIDIAドライバーをダウンロードしてから、GPUアクセラレーションノードにドライバーをインストールします。 この例では、NVIDIAドライバー410.79をダウンロードしてインストールします。
sudo cd /tmp/ sudo curl -O https://cn.download.nvidia.cn/tesla/410.79/NVIDIA-Linux-x86_64-410.79.run sudo chmod u+x NVIDIA-Linux-x86_64-410.79.run sudo sh ./NVIDIA-Linux-x86_64-410.79.run -a -s -q # warm up GPU sudo nvidia-smi -pm 1 || true sudo nvidia-smi -acp 0 || true sudo nvidia-smi --auto-boost-default=0 || true sudo nvidia-smi --auto-boost-permission=0 || true sudo nvidia-modprobe -u -c=0 -m || true
/etc/rc.d/rc.localファイルに次の設定が含まれていることを確認してください。 それ以外の場合は、次の設定をファイルに追加します。
sudo nvidia-smi -pm 1 || true sudo nvidia-smi -acp 0 || true sudo nvidia-smi --auto-boost-default=0 || true sudo nvidia-smi --auto-boost-permission=0 || true sudo nvidia-modprobe -u -c=0 -m || true
kubeletとDockerを再起動します。
sudo service kubelet stop sudo service docker restart sudo service kubelet start
GPU高速化ノードをschedulableに設定します。
kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345 node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
nvidia-device-pluginコンテナーで次のコマンドを実行し、GPUアクセラレーションノードにインストールされているドライバーのバージョンを確認します。
kubectl exec -n kube-system -t nvidia-device-plugin-cn-beijing.i-2ze19qyi8votgjz12345 nvidia-smi Thu Jan 17 00:33:27 2019 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 410.79 Driver Version: 410.79 CUDA Version: N/A | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla P100-PCIE... On | 00000000:00:09.0 Off | 0 | | N/A 27C P0 28W / 250W | 0MiB / 16280MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
説明docker ps
コマンドを実行した後にGPUアクセラレーションノードでコンテナーが起動されない場合は、「GPUアクセラレーションノードでコンテナーが起動されていない場合はどうすればよいですか? 」を参照して問題を解決します。
GPUアクセラレーションノードでコンテナが起動されない場合はどうすればよいですか?
特定のKubernetesバージョンでは、GPU高速化ノードでkubeletとDockerを再起動した後、ノードでコンテナーは起動されません。
sudo service kubelet stop
Redirecting to /bin/systemctl stop kubelet.service
sudo service docker stop
Redirecting to /bin/systemctl stop docker.service
sudo service docker start
Redirecting to /bin/systemctl start docker.service
sudo service kubelet start
Redirecting to /bin/systemctl start kubelet.service
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
次のコマンドを実行して、cgroupドライバを確認します。
sudo docker info | grep -i cgroup
Cgroup Driver: cgroupfs
この出力は、cgroup ドライバーが cgroupfs に設定されていることを示しています。
問題を解決するには、次の手順を実行します。
/etc/docker/daemon.jsonのコピーを作成します。 次に、次のコマンドを実行して /etc/docker/daemon.jsonを更新します。
sudo cat >/etc/docker/daemon.json <<-EOF { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "10" }, "oom-score-adjust": -1000, "storage-driver": "overlay2", "storage-opts":["overlay2.override_kernel_check=true"], "live-restore": true } EOF
次のコマンドを実行して、Dockerとkubeletを再起動します。
sudo service kubelet stop Redirecting to /bin/systemctl stop kubelet.service sudo service docker restart Redirecting to /bin/systemctl restart docker.service sudo service kubelet start Redirecting to /bin/systemctl start kubelet.service
次のコマンドを実行して、cgroupドライバーがsystemdに設定されていることを確認します。
sudo docker info | grep -i cgroup Cgroup Driver: systemd
NVIDIA A100 GPUを搭載したECSベアメタルインスタンスの追加に失敗した場合はどうすればよいですか?
ECS. ebmgn7ファミリーなど、NVIDIA A100 GPUを備えたecs Bare Metalインスタンスタイプは、マルチインスタンスGPU (MIG) 機能をサポートしています。 インスタンスに保持されているMIG設定により、ECSインスタンスをクラスターに追加できない場合があります。 この問題を防ぐために、ACKがNVIDIA 100 GPUを備えたECS Bare Metalインスタンスをクラスターに追加すると、ACKはECSインスタンスの保持されているMIG設定を自動的にリセットします。 しかしながら、リセットには時間がかかることがある。 この場合、ノード初期化スクリプトの実行がタイムアウトします。
ECS. ebmgn7ファミリーのecs Bare Metalインスタンスの追加に失敗した場合、インスタンスで次のコマンドを実行します。
sudo cat /var/log/ack-deploy.log
出力に次のエラーが含まれているかどうかを確認します。
command timeout: timeout 300 nvidia-smi --gpu-reset
上記のエラーが出力に含まれている場合、MIG設定のリセットにより、ノード初期化スクリプトの実行がタイムアウトしました。 ノードを再度追加します。 詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。
Alibaba Cloud Linux 3でGPUリソースを要求するポッドを実行すると、システムプロンプトがNVML: 不明なエラーの初期化に失敗したのはなぜですか。
問題
Alibaba Cloud Linux 3でsystemctl daemon-reload
およびsystemctl daemon-reexec
コマンドを実行した後、ポッドは期待どおりにGPUを使用できません。 ポッドでnvidia-smi
コマンドを実行すると、次のエラーが返されます。
sudo nvidia-smi
Failed to initialize NVML: Unknown Error
原因
Alibaba Cloud Linux 3でsystemdを使用し、systemctl daemon-reload
およびsystemctl daemon-reexec
コマンドを実行すると、cgroup設定が更新されます。 その結果、ポッドはNVIDIA GPUを期待どおりに使用できません。 詳細については、「課題1671」と「課題48」をご参照ください。
解決策
この問題を修正するには、次の操作を実行します。
シナリオ1: ポッドが環境変数NVIDIA_VISIBLE_DEVICES=allを使用してGPUリソースを要求する場合、特権モードで実行するようにポッドを設定できます。 例:
apiVersion: v1 kind: Pod metadata: name: test-gpu-pod spec: containers: - name: test-gpu-pod image: centos:7 command: - sh - -c - sleep 1d securityContext: # Configure the pod to run in privileged mode. privileged: true
シナリオ2: ポッドのGPU共有が有効になっている場合、Alibaba Cloud Linux 2またはCentOS 7でポッドを実行することを推奨します。
シナリオ3: ポッドを再作成します。 ポッドレクリエーションの影響を評価します。 ただし、この問題はポッドの再作成後も続くことがあります。
シナリオ4: この問題が解決しない場合は、Alibaba Cloud Linux 2やCentOS 7などの別のオペレーティングシステムを使用できます。
XID 119またはXID 120エラーが原因でGPUがバスから外れた場合はどうすればよいですか?
解決策
さまざまなシナリオに基づいて、GPUシステムプロセッサ (GSP) コンポーネントを無効にします。
新しいノードの追加
ノードプールを作成したり、既存のノードプールの設定を変更したりできます。
ack.aliyun.com/disable-nvidia-gsp
ラベルを追加し、ラベル値をtrueに設定します。 これにより、後続の操作でノードプールに新しいノードを追加すると、新しく追加されたノードに対してGSPコンポーネントが自動的に無効になります。操作とパラメーターの詳細については、「ノードプールの作成」および「ノードプールの変更」をご参照ください。
説明GSPコンポーネントを無効にすると、ノードのスケールアウトに必要な時間が長くなる場合があります。
既存ノードの追加
ノードプールを作成したり、ノードを追加する既存のノードプールの構成を変更したりできます。
ack.aliyun.com/disable-nvidia-gsp
ラベルを追加し、ラベル値をtrueに設定します。 これにより、後続の操作で既存のノードをノードプールに追加すると、そのノードに対してGSPコンポーネントが自動的に無効になります。操作とパラメーターの詳細については、「ノードプールの作成」および「ノードプールの変更」をご参照ください。
説明GSPコンポーネントを無効にすると、ノードのスケールアウトに必要な時間が長くなる場合があります。
既存のノードをノードプールに追加します。 操作および使用に関する注意事項の詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。
既存のノードの管理
次のいずれかの方法を使用して、既存のノードのGSPを無効にできます。
ノードプールラベルを追加してGSPを無効にする
ノードが属するノードプールに
ack.aliyun.com/disable-nvidia-gsp
ラベルを追加し、ラベル値をtrueに設定します。操作とパラメーターの詳細については、「ノードプールの変更」をご参照ください。
ECSインスタンスをリリースせずに、クラスターからノードを削除します。 詳細については、「ノードの削除」をご参照ください。
削除したノードをクラスターに再追加します。 操作および使用に関する注意事項の詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。
ノードにログインし、GSPを手動で無効にします
クラスターからノードを削除してクラスターに再追加した後、そのノードに対してGSPを無効にできない場合は、そのノードにログインして手動でGSPを無効にできます。 詳細については、「」をご参照ください。XID 119またはXID 120エラーが原因でGPUがバスから外れた場合はどうすればよいですか?
説明GSPはNVIDIAドライバ510以降で導入されています。 ノードにログインし、NVIDIAドライバを470から525に更新する場合、更新前にGSPを無効にする必要はありません。 ただし、更新後にGSP関連の問題が発生する可能性があります。 この場合、更新後に手動でGSPを無効にする必要があります。 詳細については、「」をご参照ください。XID 119またはXID 120エラーが原因でGPUがバスから外れた場合はどうすればよいですか?.
障害のあるGPUを分離するにはどうすればよいですか?
GPU共有を使用すると、障害のあるGPUがタスクの失敗を引き起こす可能性があります。 障害のあるGPUにタスクを繰り返しスケジュールすることを避けるために、障害のあるGPUを手動でマークできます。 その後、スケジューラは障害のあるGPUにポッドをスケジュールしなくなります。 このようにして、障害のあるGPUが分離されます。
この機能を使用するには、スケジューラとクラスタが次の要件を満たしていることを確認してください。
クラスターがKubernetes 1.24以降を実行する場合は、スケジューラーバージョンが1.xx.x-aliyun-6.4.3.xxx以降であることを確認します。
クラスターがKubernetes 1.22を実行している場合は、スケジューラーバージョンが1.22.15-aliyun-6.2.4.xxx以降であることを確認してください。
GPU共有はクラスターで使用されます。 詳細については、「GPU共有の概要」をご参照ください。
特別なConfigMapをクラスターに送信して、障害のあるGPUをマークできます。 例:
apiVersion: v1
kind: ConfigMap
metadata:
name: <node-name>-device-status # Replace <node-name> with the actual node name.
namespace: kube-system
data:
devices: |
- deviceId: 0 #Run nvidia-smi to obtain the GPU serial number.
deviceType: gpu
healthy: false
ConfigMapはkube-system名前空間に属し、その名前は次の形式である必要があります。障害のあるGPUのノードの名前 + -device-status
。 data
セクションのdeviceId
を、nvidia-smi
によって返されたGPUシリアル番号に設定します。 deviceType
をgpu
に、healthy
をfalse
に設定します。 前述のConfigMapをクラスターに送信すると、スケジューラは障害のあるGPUを自動的に分離します。