動的リソース割り当ては、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 リソースをリクエストする環境をセットアップする手順は次のとおりです。
動的リソース割り当てに関連するリソースを作成するため、クラスタに新しい
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
次のコマンドを使用して、マニフェストをクラスタに適用します。
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/v1beta1API グループを使用します。これは、この機能のオープンソース Kubernetes API グループであるresource.k8s.io/v1とは異なります。v1オープンソース API グループは、v1beta1API グループよりも多くの機能を持ち、安定性も優れています。
次のステップ
- リソースの動的割り当ての詳細については、Kubernetes のドキュメントをご覧ください。
- ベアメタルでサードパーティ LLM のサービスを提供する方法を確認します。