このページでは、Google Distributed Cloud ベアメタル クラスタにおいて、GPU ワークロードが動的リソース割り当てを使用するよう構成する方法について説明します。動的リソース割り当ては、GPU などの汎用リソースをリクエストして Pod とコンテナの間で共有できるようにする Kubernetes API です。これらのリソースはサードパーティのドライバによって管理されます。
動的リソース割り当てが有効になっていると、Kubernetes は、参照するデバイス構成に基づいて Pod をスケジュールします。アプリ オペレーターは、ワークロードで特定のノードを選択する必要がなく、各 Pod がこれらのノードに接続されているデバイスの数を正確にリクエストする必要もありません。このプロセスは、ストレージのボリュームの割り当てとよく似ています。
この機能を使用すると、ベアメタル クラスタ内の GPU リソースを動的かつ正確に割り当てることができ、AI ワークロードの実行に役立ちます。これにより、要求の厳しいワークロードのリソース使用率とパフォーマンスが向上します。
このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する管理者、アーキテクト、オペレーターを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
始める前に
GPU ワークロードが動的リソース割り当てを使用するよう構成する前に、次の前提条件が満たされていることを確認します。
- ベアメタル クラスタのバージョンが 1.33.0 以降である。
- オペレーティング システムが Ubuntu 22.04 または Red Hat Enterprise Linux(RHEL)9.4 である。
- 動的リソース割り当てを有効にするの説明に沿って、すでにクラスタを更新して動的リソース割り当てを有効にしている。
- GPU が接続され、NVIDIA GPU ドライバがインストールされているノードマシンが少なくとも 1 つある。詳細については、バンドルされている NVIDIA GPU Operator をインストールまたはアンインストールするをご覧ください。
- GPU 用 NVIDIA DRA ドライバの手順に沿って、すべての GPU 接続ノードに NVIDIA DRA ドライバがインストールされている。
動的リソース割り当てを使用する GPU ワークロードを作成する
GPU ワークロードで GPU をリクエストする動的リソース割り当てを利用するには、そのワークロードが、GPU デバイス割り当てのリクエストを記述した ResourceClaim と同じ Namespace に存在する必要があります。Kubernetes が GPU リソースを割り当てるには、ワークロードが ResourceClaim を参照している必要があります。
ワークロードが動的リソース割り当てを使用して GPU リソースをリクエストする環境をセットアップする手順は次のとおりです。
動的リソース割り当てに関連するリソースを作成するため、クラスタに新しい
Namespaceを作成します。cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Namespace metadata: name: NAMESPACE_NAME EOF次のように置き換えます。
CLUSTER_KUBECONFIG: ユーザー クラスタの kubeconfig ファイルのパス。NAMESPACE_NAME: 動的リソース割り当て Namespace の名前。
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 EOFRESOURCE_CLAIM_NAMEは、GPU リクエストのリソース クレームの名前に置き換えます。前のステップで作成した
ResourceClaimを参照するワークロードを作成します。次のワークロードの例は、
dra-testNamespace にあるgpu-claimという名前のResourceClaimを参照する方法を示しています。pod1Pod 内のコンテナは、GPU で CUDA ワークロードを実行するように設計された NVIDIA Compute Unified Device Architecture(CUDA)のサンプルです。pod1Pod が正常に完了した場合、それは、動的リソース割り当て機能が正常に機能していて、動的リソース割り当てによってクラスタ内の GPU リソースを管理する準備ができていることを示します。Ubuntu
次のコマンドを使用して、マニフェストをクラスタに適用します。
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
GPU へのアクセスに必要な SELinux ポリシー モジュール
nvidia_container_tをダウンロードしてインストールします。詳細については、NVIDIA の dgx-selinux リポジトリをご覧ください。
次のコマンドを使用して、マニフェストをクラスタに適用します。
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/v1beta1API グループを使用します。これは、この機能のオープンソース Kubernetes API グループであるresource.k8s.io/v1とは異なります。v1オープンソース API グループは、v1beta1API グループよりも多くの機能を持ち、安定性も優れています。
次のステップ
- リソースの動的割り当ての詳細については、Kubernetes のドキュメントをご覧ください。
- ベアメタルでサードパーティ LLM のサービスを提供する方法を確認します。