動態資源分配是一項 Kubernetes API,可讓您在 Google Distributed Cloud 裸機叢集的 Pod 和容器之間,要求及共用 GPU 等資源。這些裝置由第三方驅動程式管理,Kubernetes 則會動態分配,就像儲存空間磁碟區一樣。AI 工作負載不需指定特定節點,或要求確切數量的連接裝置。本文說明如何設定 GPU 工作負載,以使用動態資源分配功能。
事前準備
將 GPU 工作負載設為使用動態資源分配功能前,請先確認符合下列必要條件:
- 裸機叢集為 1.33.0 以上版本。
- 作業系統為 Ubuntu 22.04 或 Red Hat Enterprise Linux (RHEL) 9.4。
- 您已按照「啟用動態資源分配」一節的說明,更新叢集以啟用動態資源分配。
- 您至少有一部節點機器,已連接 GPU 並安裝 NVIDIA GPU 驅動程式。詳情請參閱「安裝或解除安裝隨附的 NVIDIA GPU Operator」。
- 如果使用隨附的 NVIDIA GPU 運算子,1.33.0 以上版本預設會啟用 Container Device Interface (CDI)。如果您使用手動安裝的 GPU 運算子,請確認
ClusterPolicy已啟用 CDI。 - 您已按照「適用於 GPU 的 NVIDIA DRA 驅動程式」中的操作說明,在所有連接 GPU 的節點上安裝 NVIDIA DRA 驅動程式。
建立使用動態資源分配的 GPU 工作負載
如要讓 GPU 工作負載利用動態資源分配功能要求 GPU,工作負載必須位於共用命名空間,且該命名空間須有 ResourceClaim,用於描述 GPU 裝置分配要求。工作負載必須參照 ResourceClaim,Kubernetes 才能指派 GPU 資源。
請按照下列步驟設定環境,讓工作負載使用動態資源分配功能要求 GPU 資源:
如要建立與動態資源分配相關的資源,請在叢集中建立新的
Namespace:cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f - apiVersion: v1 kind: Namespace metadata: name: NAMESPACE_NAME EOF更改下列內容:
CLUSTER_KUBECONFIG:使用者叢集 kubeconfig 檔案的路徑。NAMESPACE_NAME:動態資源分配命名空間的名稱。
建立
ResourceClaim,說明 GPU 存取權要求: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命名空間中名為gpu-claim的ResourceClaim。pod1Pod 中的容器是 NVIDIA 計算統一設備架構 (CUDA) 範例,用於在 GPU 上執行 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
限制
使用動態資源分配時,請注意下列限制:
如果使用 RHEL OS 搭配支援的 NVIDIA GPU 運算子版本,Container Device Interface (CDI) 會自動處理裝置插入和 SELinux 標籤。您不必手動設定 SELinux 政策或設定 Pod
securityContext。這項功能使用
resource.k8s.io/v1beta1API 群組,與這項功能的開放原始碼 Kubernetes API 群組resource.k8s.io/v1不同。v1開放原始碼 API 群組提供的功能比v1beta1API 群組更多,穩定性也更高。
後續步驟
- 如要進一步瞭解動態資源分配,請參閱 Kubernetes 說明文件。
- 瞭解如何在裸機上提供第三方 LLM。