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

Container Service for Kubernetes:GPU FAQ

最終更新日:Dec 16, 2024

このトピックでは、GPUに関するよくある質問に対する回答を示します。

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クラスターに追加

  1. Quota Centerでカスタムイメージを使用する権限を申請します。

  2. CentOS 7.XまたはAlibaba Cloud Linux 2に基づくカスタムイメージを作成します。 カスタムイメージはNVIDIA GRIDドライバーと共にインストールし、NVIDIAライセンスで設定する必要があります。 詳細については、「インスタンスからカスタムイメージを作成する」および「vGPUアクセラレーションLinuxインスタンスにGRIDドライバーをインストールする」をご参照ください。

  3. ノードプールを作成します。 詳細については、「ノードプールの作成」をご参照ください。

  4. ステップ3で作成したノードプールにvGPU高速化インスタンスを追加します。 詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。

次の対処方法: ACKクラスターのvGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスを更新

ACKクラスター内のvGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスを更新する方法の詳細については、「ACKクラスター内のvGPUアクセラレーションインスタンスのNVIDIAドライバーライセンスの更新」をご参照ください。

クラスター内のGPUアクセラレーションノードのカーネルバージョンを手動で更新するにはどうすればよいですか?

クラスター内のGPUアクセラレーションノードのカーネルバージョンを手動で更新するには、次の手順を実行します。

説明

現在のカーネルバージョンは3.10.0-957.21.3より前です。

更新するカーネルのバージョンを確認します。 更新を実行するときは注意して続行してください。

次の手順は、NVIDIAドライバーを更新する方法を示しています。 カーネルバージョンの更新方法の詳細については説明しません。

  1. クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続します

  2. 管理するGPU高速化ノードをスケジュール不可に設定します。 この例では、ノードcn-beijing.i-2ze19qyi8votgjz12345が使用されます。

    kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
  3. 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
  4. 現在のNVIDIAドライバーをアンインストールします。

    説明

    この例では、NVIDIAドライバー384.111がアンインストールされます。 ドライバーのバージョンが384.111でない場合は、NVIDIAの公式Webサイトからドライバーのインストールパッケージをダウンロードし、384.111次のサンプルコードでNVIDIAドライバーのバージョンを使用します。

    1. GPUアクセラレーションノードにログインし、nvidia-smiコマンドを実行してドライバーのバージョンを確認します。

      sudo nvidia-smi -a | grep 'Driver Version'
      Driver Version                      : 384.111
    2. ドライバーのインストールパッケージをダウンロードします。

      sudo cd /tmp/
      sudo curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
      説明

      インストールパッケージは、NVIDIAドライバーをアンインストールするために必要です。

    3. 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
  5. カーネルのバージョンを更新します。

  6. GPU高速化ノードを再起動します。

    sudo reboot
  7. GPU高速化ノードにログインし、対応するkernel-develパッケージをインストールします。

    sudo yum install -y kernel-devel-$(uname -r)
  8. 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
  9. /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
  10. kubeletとDockerを再起動します。

    sudo service kubelet stop
    sudo service docker restart
    sudo service kubelet start
  11. GPU高速化ノードをschedulableに設定します。

    kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
  12. 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 に設定されていることを示しています。

問題を解決するには、次の手順を実行します。

  1. /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
  2. 次のコマンドを実行して、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
  3. 次のコマンドを実行して、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コンポーネントが自動的に無効になります。

    操作とパラメーターの詳細については、「ノードプールの作成」および「ノードプールの変更」をご参照ください。

    image

    説明

    GSPコンポーネントを無効にすると、ノードのスケールアウトに必要な時間が長くなる場合があります。

    既存ノードの追加

    1. ノードプールを作成したり、ノードを追加する既存のノードプールの構成を変更したりできます。 ack.aliyun.com/disable-nvidia-gspラベルを追加し、ラベル値をtrueに設定します。 これにより、後続の操作で既存のノードをノードプールに追加すると、そのノードに対してGSPコンポーネントが自動的に無効になります。

      操作とパラメーターの詳細については、「ノードプールの作成」および「ノードプールの変更」をご参照ください。

      image

      説明

      GSPコンポーネントを無効にすると、ノードのスケールアウトに必要な時間が長くなる場合があります。

    2. 既存のノードをノードプールに追加します。 操作および使用に関する注意事項の詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。

    既存のノードの管理

    次のいずれかの方法を使用して、既存のノードのGSPを無効にできます。

    ノードプールラベルを追加してGSPを無効にする

    1. ノードが属するノードプールにack.aliyun.com/disable-nvidia-gspラベルを追加し、ラベル値をtrueに設定します。

      操作とパラメーターの詳細については、「ノードプールの変更」をご参照ください。

      image

    2. ECSインスタンスをリリースせずに、クラスターからノードを削除します。 詳細については、「ノードの削除」をご参照ください。

    3. 削除したノードをクラスターに再追加します。 操作および使用に関する注意事項の詳細については、「既存の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-statusdataセクションのdeviceIdを、nvidia-smiによって返されたGPUシリアル番号に設定します。 deviceTypegpuに、healthyfalseに設定します。 前述のConfigMapをクラスターに送信すると、スケジューラは障害のあるGPUを自動的に分離します。