動的リソース割り当てで GPU デバイスを管理する

このページでは、Google Distributed Cloud ベアメタル クラスタで動的リソース割り当てを使用するように GPU ワークロードを構成する方法について説明します。動的リソース割り当ては、Pod とコンテナ間で GPU などの汎用リソースをリクエストして共有できる Kubernetes API です。これらのリソースはサードパーティのドライバによって管理されます。

動的リソース割り当てを使用すると、Kubernetes は参照するデバイス構成に基づいて Pod をスケジュールします。アプリ オペレーターは、ワークロードで特定のノードを選択する必要がなく、各 Pod がこれらのノードに接続されているデバイスの数を正確にリクエストする必要もありません。このプロセスは、ストレージのボリュームの割り当てと同様です。

この機能を使用すると、ベアメタル クラスタ内の GPU リソースを動的かつ正確に割り当てて AI ワークロードを実行し、要求の厳しいワークロードのリソース使用率とパフォーマンスを向上させることができます。

このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する管理者、アーキテクト、オペレーターを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。

始める前に

動的リソース割り当てを使用するように GPU ワークロードを構成する前に、次の前提条件が満たされていることを確認します。

動的リソース割り当てを使用する GPU ワークロードを作成する

GPU ワークロードで GPU をリクエストする動的リソース割り当てを利用するには、GPU デバイス割り当てのリクエストを記述する ResourceClaim を使用して、共有 Namespace に存在する必要があります。Kubernetes が GPU リソースを割り当てるには、ワークロードが ResourceClaim を参照する必要があります。

次の手順では、ワークロードが動的リソース割り当てを使用して GPU リソースをリクエストする環境を設定します。

  1. 動的リソース割り当てに関連するリソースを作成するには、クラスタに新しい Namespace を作成します。

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

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

    • CLUSTER_KUBECONFIG: ユーザー クラスタの kubeconfig ファイルのパス。

    • NAMESPACE_NAME は、動的リソース割り当て Namespace の名前に置き換えます。

  2. GPU アクセスのリクエストを記述する ResourceClaim を作成します。

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    RESOURCE_CLAIM_NAME は、GPU リクエストのリソース クレームの名前に置き換えます。

  3. 前の手順で作成した ResourceClaim を参照するワークロードを作成します。

    次のワークロードの例は、dra-test Namespace で gpu-claim という名前の ResourceClaim を参照する方法を示しています。pod1 Pod のコンテナは、GPU で CUDA ワークロードを実行するように設計された NVIDIA コンピューティング統合デバイス アーキテクチャ(CUDA)サンプルです。pod1 Pod が正常に完了すると、動的リソース割り当て機能が正常に機能しており、動的リソース割り当てでクラスタ内の GPU リソースを管理する準備が整っていることを示します。

    Ubuntu

    1. 次のコマンドを使用して、マニフェストをクラスタに適用します。

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. GPU へのアクセスに必要な SELinux ポリシー モジュール nvidia_container_t をダウンロードしてインストールします。

      詳細については、NVIDIA の dgx-selinux リポジトリをご覧ください。

    2. 次のコマンドを使用して、マニフェストをクラスタに適用します。

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

制限事項

動的リソース割り当てを使用する場合は、次の制限事項を考慮してください。

  • RHEL OS を使用する場合、SELinux ポリシーが GPU にアクセスしようとするコンテナを妨害する可能性があります。詳細については、ベアメタル RHEL 8 のコンテナで GPU を使用する方法をご覧ください。

  • この機能は resource.k8s.io/v1beta1 API グループを使用します。これは、この機能のオープンソース Kubernetes API グループである resource.k8s.io/v1 とは異なります。v1 オープンソース API グループは、v1beta1 API グループよりも多くの機能と優れた安定性を提供します。

次のステップ