本頁說明如何設定 GPU 工作負載,以便在 Google Distributed Cloud Bare Metal 叢集中使用動態資源分配功能。動態資源配置是 Kubernetes API,可讓您在 Pod 和容器之間要求及共用 GPU 等一般資源。這些資源是由第三方驅動程式管理。
透過動態資源分配,Kubernetes 會根據參照的裝置設定排程 Pod。應用程式運算子不需要在工作負載中選取特定節點,也不需要確保每個 Pod 要求的裝置數量,與附加至這些節點的裝置數量完全相同。這個程序與分配儲存空間的磁碟區類似。
這項功能可動態且精確地分配裸機叢集內的 GPU 資源,協助您執行 AI 工作負載,進而提升資源用量和高需求工作負載的效能。
本文適用於管理底層技術基礎架構生命週期的管理員、架構師和營運人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud
事前準備
設定 GPU 工作負載以使用動態資源分配功能前,請確認符合下列必要條件:
- 裸機叢集為 1.33.0 以上版本。
- 作業系統為 Ubuntu 22.04 或 Red Hat Enterprise Linux (RHEL) 9.4。
- 您已更新叢集,啟用動態資源分配功能,如「啟用動態資源分配」一文所述。
- 您至少有一部節點機器連接 GPU,並已安裝 NVIDIA GPU 驅動程式。詳情請參閱「安裝或解除安裝隨附的 NVIDIA GPU 運算子」。
- 您已按照「GPU 專用的 NVIDIA DRA 驅動程式」中的操作說明,在所有已連結 GPU 的節點上安裝 NVIDIA DRA 驅動程式。
建立使用動態資源配置的 GPU 工作負載
如要讓 GPU 工作負載利用動態資源分配功能要求 GPU,工作負載必須與 ResourceClaim 位於共用命名空間,且 ResourceClaim 說明 GPU 裝置分配要求。工作負載必須參照 Kubernetes 的 ResourceClaim,才能指派 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。Pod 中的容器是 NVIDIA 計算統一設備架構 (CUDA) 範例,專門用於在 GPU 上執行 CUDA 工作負載。pod1如果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
下載並安裝 SELinux 政策模組
nvidia_container_t,這是存取 GPU 的必要條件。詳情請參閱 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 的容器。詳情請參閱「How to use GPUs in containers on bare metal RHEL 8」(如何在裸機 RHEL 8 上使用容器中的 GPU)。
這項功能使用
resource.k8s.io/v1beta1API 群組,與這項功能的 Kubernetes 開放原始碼 API 群組resource.k8s.io/v1不同。v1開放原始碼 API 群組提供的功能更多,穩定性也優於v1beta1API 群組。
後續步驟
- 如要進一步瞭解動態資源分配,請參閱 Kubernetes 說明文件。
- 瞭解如何在裸機上提供第三方 LLM。