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

動的リソース割り当ては、Google Distributed Cloud ベアメタル クラスタ内の Pod とコンテナ間で GPU などのリソースをリクエストして共有できるようにする Kubernetes API です。サードパーティのドライバがこれらのデバイスを管理し、Kubernetes がストレージ ボリュームと同様に動的に割り当てます。AI ワークロードで特定のノードをターゲットにしたり、接続されているデバイスの正確な数をリクエストしたりする必要はありません。このドキュメントでは、GPU ワークロードが動的リソース割り当てを使用するよう構成する方法について説明します。

始める前に

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

  • ベアメタル クラスタのバージョンが 1.33.0 以降である。
  • オペレーティング システムが Ubuntu 22.04 または Red Hat Enterprise Linux(RHEL)9.4 である。
  • 動的リソース割り当てを有効にするの説明に沿って、すでにクラスタを更新して動的リソース割り当てを有効にしている。
  • GPU が接続され、NVIDIA GPU ドライバがインストールされているノードマシンが少なくとも 1 つある。詳細については、バンドルされている NVIDIA GPU Operator をインストールまたはアンインストールするをご覧ください。
  • バンドルされた NVIDIA GPU Operator を使用している場合、バージョン 1.33.0 以降では Container Device Interface(CDI)がデフォルトで有効になります。手動でインストールした GPU オペレーターを使用している場合は、ClusterPolicy で CDI が有効になっていることを確認します。
  • GPU 用 NVIDIA DRA ドライバの手順に沿って、すべての GPU 接続ノードに NVIDIA DRA ドライバがインストールされている。

動的リソース割り当てを使用する 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 Compute Unified Device Architecture(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. 次のコマンドを使用して、マニフェストをクラスタに適用します。

      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
      

制限事項

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

  • サポートされているバージョンの NVIDIA GPU Operator で RHEL OS を使用すると、Container Device Interface(CDI)がデバイス インジェクションと SELinux ラベリングを自動的に処理します。手動の SELinux ポリシー構成を使用したり、Pod securityContext を設定したりする必要はありません。

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

次のステップ