本頁說明如何設定 GPU 工作負載,在 Google Distributed Cloud Bare Metal 叢集中使用動態資源分配。動態資源分配是 Kubernetes API,可讓您在 Pod 和容器之間要求及共用 GPU 等一般資源。這些資源由第三方驅動程式管理。
透過動態資源分配,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 驅動程式。詳情請參閱「安裝或解除安裝隨附的 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
。pod1
Pod 中的容器是 NVIDIA 運算統一裝置架構 (CUDA) 範例,用於在 GPU 上執行 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
下載並安裝 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」。
這項功能使用
resource.k8s.io/v1beta1
API 群組,與這項功能的 Kubernetes 開放原始碼 API 群組resource.k8s.io/v1
不同。v1
開放原始碼 API 群組提供的功能更多,穩定性也優於v1beta1
API 群組。
後續步驟
- 如要進一步瞭解動態資源分配,請參閱 Kubernetes 說明文件。
- 瞭解如何在裸機上提供第三方 LLM。