マルチインスタンス GPU の実行


このページでは、NVIDIA® A100 グラフィック プロセッシング ユニット(GPU)をパーティショニングし、Google Kubernetes Engine(GKE)の複数のコンテナ間で単一の GPU を共有する方法について説明します。

このページは、PodノードDeploymentNamespace などの Kubernetes のコンセプトと、ノードプール自動スケーリング自動プロビジョニングなどの GKE のコンセプトを理解していることを前提としています。

はじめに

コンテナのワークロードで一部の GPU しか必要としない場合でも、Kubernetes はコンテナごとに 1 つのフル GPU を割り当てます。このため、特に、最新世代の高性能な GPU を使用している場合などは、リソースの無駄やコスト超過が発生する可能性があります。GPU 使用率を向上させるには、マルチインスタンス GPU を使用します。1 つの NVIDIA A100 GPU は最大 7 つのスライスに分割できます。各スライスはノード上の 1 つのコンテナに個別に割り当てることができるので、1 つの NVIDIA A100 GPU を最大 7 つのコンテナで共有できます。マルチインスタンス GPU を使用すると、ワークロード間でハードウェアを分離し、GPU で実行中のすべてのコンテナに予測可能で一貫性のある QoS を提供できます。

CUDA® アプリケーションの場合、マルチインスタンス GPU を意識する必要はほとんどありません。各 GPU パーティションは通常の GPU リソースとして表示されるので、プログラミング モデルに変わりはありません。

マルチインスタンス GPU の詳細については、NVIDIA マルチインスタンス GPU のユーザーガイドをご覧ください。

マルチインスタンス GPU のパーティション

A100 GPU は 7 つのコンピューティング ユニットと 8 つのメモリユニットで構成され、さまざまなサイズの GPU インスタンスにパーティションを分割できます。GPU パーティションのサイズは [compute]g.[memory]gb の構文で表します。たとえば、GPU パーティション サイズが 1g.5gb の場合、1 つのコンピューティング ユニット(GPU のストリーミング マルチプロセッサの 7 分の 1)と 1 つのメモリユニット(5 GB)から構成された GPU インスタンスを意味します。A100 GPU のパーティション サイズはクラスタの作成時に指定できます。例については、マルチインスタンス GPU を有効にしてクラスタを作成するをご覧ください。

NVIDIA マルチインスタンス GPU ユーザーガイドにあるパーティショニングの表に、GPU パーティション サイズと、各 GPU パーティションで使用可能なコンピューティング リソースとメモリリソースの量が記載されています。この表には、A100 GPU で作成可能な各パーティション サイズで使用可能な GPU インスタンスの数も示されています。

次の表に、GKE がサポートするパーティション サイズを示します。

パーティション サイズ GPU インスタンス インスタンスあたりのコンピューティング ユニット数 インスタンスあたりのメモリユニット数
1g.5gb 7 1 1
2g.10gb 3 2 2
3g.20gb 2 3 4
7g.40gb 1 7 8

ノードプール内の各ノードの GPU は同じ方法でパーティション分割されます。たとえば、ノードプールに 2 つのノードが存在し、各ノードに 4 つの GPU が割り当てられ、パーティション サイズが 1g.5gb とします。GKE は、各 GPU にサイズが 1g.5gb のパーティションを 7 個作成します。各ノードに 4 つの GPU があるため、各ノードで使用可能な 1g.5gb GPU パーティションは 28 個になります。このノードプールにはノードが 2 つあるため、ノードプール全体では合計で 56 個の 1g.5gb GPU パーティションを使用できます。

複数の GPU パーティション タイプを持つ GKE クラスタを作成する場合は、複数のノードプールを作成する必要があります。たとえば、1 つのクラスタ内で GPU パーティションが 1g.5gb3g.20gb のノードがそれぞれ必要な場合は、2 つのノードプールを作成して、1 つのプールの GPU パーティション サイズを 1g.5gb に、もう 1 つのプールは 3g.20gb に設定します。

各ノードには、そのノードで使用可能な GPU パーティション サイズのラベルが設定されます。これにより、ワークロードは必要な GPU パーティション サイズのノードをターゲットにできます。たとえば、1g.5gb GPU インスタンスのあるノードには、次のようなラベルが設定されます。

cloud.google.com/gke-gpu-partition-size=1g.5gb

仕組み

マルチインスタンス GPU を使用するには、次の作業を行います。

  1. マルチインスタンス GPU を有効にしてクラスタを作成する
  2. ドライバをインストールして GPU パーティションを構成する
  3. ノード上の GPU リソースの数を確認する
  4. ノードにコンテナをデプロイする

料金

マルチインスタンス GPU は A100 GPU 専用です。ワークロードの実行に使用されるその他のプロダクトに加えて、A100 GPU の料金が適用されます。A100 GPU 全体をクラスタ内のノードに接続し、パーティショニングできます。GPU の料金情報については、GPU の料金ページをご覧ください。

制限事項

  • GKE で、信頼性の低いワークロードにマルチインスタンス GPU パーティションを使用することはおすすめしません。
  • GPU パーティションの自動スケーリングと自動プロビジョニングは、GKE バージョン 1.20.7-gke.400 以降で完全にサポートされています。それ以前のバージョンでは、ワークロードに必要な特定の GPU パーティション サイズに基づいて自動スケーリングを行うには、ノードプールに 1 つ以上のノードが存在している必要があります。
  • GPU インスタンスでは、GPU 使用率の指標(duty_cycle など)は利用できません。

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. ゾーンクラスタの場合はデフォルトの Compute Engine ゾーン、リージョン クラスタまたは Autopilot クラスタの場合はデフォルトの Compute Engine リージョンを選択します。

gcloud config の使用

  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project PROJECT_ID
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot クラスタまたはリージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region COMPUTE_REGION
  • gcloud を最新バージョンに更新します。
    gcloud components update
  • マルチインスタンス GPU は、GKE バージョン 1.19.7-gke.2503 以降でサポートされます。
  • 十分な量の NVIDIA A100 GPU 割り当てが必要です。割り当ての増加をリクエストするをご覧ください。

マルチインスタンス GPU を使用するクラスタを作成する

マルチインスタンス GPU を使用するクラスタを作成する場合は、gpuPartitionSize と一緒に acceleratorTypeacceleratorCount を指定する必要があります。マルチインスタンス GPU は A100 GPU でのみサポートされているため、acceleratorTypenvidia-tesla-a100 にする必要があります。

次の例では、1 つのノードを含む GKE クラスタを作成し、そのノードに 1g.5gb サイズの GPU パーティションを設定します。このページの他の手順では GPU パーティション サイズ 1g.5gb を使用します(各 GPU に 7 つのパーティションを作成します)。前述のサポート対象の GPU パーティション サイズを使用することもできます。

  1. マルチインスタンス GPU を使用するクラスタを作成するには、gcloud コマンドライン ツールで次のコマンドを実行します。

    gcloud container clusters create CLUSTER_NAME  \
        --project=PROJECT_ID  \
        --zone ZONE  \
        --cluster-version=CLUSTER_VERSION  \
        --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb  \
        --machine-type=a2-highgpu-1g  \
        --num-nodes=1
    

    次のように置き換えます。

    • CLUSTER_NAME: 新しいクラスタの名前。
    • PROJECT_ID: Google Cloud プロジェクトの ID。
    • ZONE: クラスタ コントロール プレーンのコンピューティング ゾーン
    • CLUSTER_VERSION: バージョンは 1.19.7-gke.2503 以降にする必要があります。
  2. 新しく作成したクラスタに接続するように kubectl を構成します。

    gcloud container clusters get-credentials CLUSTER_NAME
    

    get-credentials コマンドの出力は次のとおりです。

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    

ドライバをインストールして GPU パーティションを構成する

クラスタを作成したら、デバイス プラグインを更新し、ノードに NVIDIA のデバイス ドライバをインストールする必要があります。

  1. デバイス プラグインを更新して、GPU インスタンスの検出を有効にします。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/cmd/nvidia_gpu/device-plugin.yaml
    
  2. マルチインスタンス GPU を使用するには、バージョン 450.80.02 以降の NVIDIA ドライバが必要です。ドライバのインストール後、マルチインスタンス GPU モードを有効にしてノードを再起動し、変更を適用する必要があります。GPU がマルチインスタンス GPU モードになったら、必要な GPU パーティションを作成します。

    これらの作業をすべて行うには、次の DaemonSet コマンドを実行します。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-nvidia-mig.yaml
    

    ノードを再起動してマルチインスタンス GPU モードを有効にするため、処理が完了まで数分かかることがあります。

ノード上の GPU リソースの数を確認する

次のコマンドを実行し、nvidia.com/gpu リソースの容量と割り当て可能な数が 7 であることを確認します。

kubectl describe nodes

コマンドの出力は次のとおりです。

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

ノードにコンテナをデプロイする

ノード上のマルチインスタンス GPU デバイスごとに 1 つのコンテナをデプロイできます。この例では、パーティション サイズが 1g.5gb で、ノードで 7 つのマルチインスタンス GPU パーティションを使用できます。このノードには、GPU を使用するコンテナを最大 7 個までデプロイできます。

  1. 次に、cuda:11.0-base コンテナを起動して、nvidia-smi でコンテナ内の GPU の UUID を出力する例を示します。この例では、7 個のコンテナがあり、各コンテナが 1 つの GPU パーティションを使用できます。この例では、1g.5gb GPU パーティションを持つノードをターゲットとするノードセレクタも設定します。

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-simple
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: cuda-simple
      template:
        metadata:
          labels:
            app: cuda-simple
        spec:
          nodeSelector:
            cloud.google.com/gke-gpu-partition-size: 1g.5gb
          containers:
          - name: cuda-simple
            image: nvidia/cuda:11.0-base
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
    
  2. 7 つの Pod すべてが稼働していることを確認します。

    kubectl get pods
    

    コマンドの出力は次のとおりです。

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. ログを表示して、前のコマンドの Pod 名を使用して GPU UUID を確認します。

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    コマンドの出力は次のとおりです。

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    
  4. 表示したいログがほかにもある場合は、この手順を繰り返します。

    kubectl logs cuda-simple-849c47f6f6-8cjrb
    

    コマンドの出力は次のとおりです。

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/7/0)
    

次のステップ