このページでは、Google Distributed Cloud ベアメタル クラスタで動的リソース割り当てを使用するように GPU ワークロードを構成する方法について説明します。動的リソース割り当ては、Pod とコンテナ間で GPU などの汎用リソースをリクエストして共有できる 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 EOF
RESOURCE_CLAIM_NAME
は、GPU リクエストのリソース クレームの名前に置き換えます。前の手順で作成した
ResourceClaim
を参照するワークロードを作成します。次のワークロードの例は、
dra-test
Namespace でgpu-claim
という名前のResourceClaim
を参照する方法を示しています。pod1
Pod のコンテナは、GPU で CUDA ワークロードを実行するように設計された NVIDIA コンピューティング統合デバイス アーキテクチャ(CUDA)サンプルです。pod1
Pod が正常に完了すると、動的リソース割り当て機能が正常に機能しており、動的リソース割り当てでクラスタ内の 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/v1beta1
API グループを使用します。これは、この機能のオープンソース Kubernetes API グループであるresource.k8s.io/v1
とは異なります。v1
オープンソース API グループは、v1beta1
API グループよりも多くの機能と優れた安定性を提供します。
次のステップ
- リソースの動的割り当ての詳細については、Kubernetes のドキュメントをご覧ください。
- ベアメタルでサードパーティの LLM をサービングする方法を確認する。