本頁說明如何設定 Google Kubernetes Engine (GKE) 基礎架構,以支援動態資源分配 (DRA)。您可以在這個頁面建立叢集,部署 GPU 或 TPU 工作負載,並手動安裝啟用 DRA 所需的驅動程式。
本頁適用於平台管理員,他們希望減少使用專用硬體裝置設定基礎架構的複雜度和額外負擔。
關於 DRA
DRA 是 Kubernetes 內建功能,可讓您在叢集中,彈性地要求、分配及共用 Pod 和容器之間的硬體。詳情請參閱「關於動態資源分配」。
限制
- 不支援節點自動佈建。
- Autopilot 叢集不支援 DRA。
- 您無法使用下列 GPU 共用功能:
- 分時 GPU
- 多執行個體 GPU
- 多程序服務 (MPS)
需求條件
如要使用 DRA,GKE 版本必須為 1.32.1-gke.1489001 以上。
此外,您也應熟悉下列規定和限制,具體內容視您想使用的硬體類型而定:
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
如果您未使用 Cloud Shell,請安裝 Helm CLI:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
建立 GKE Standard 叢集
建立 Standard 模式叢集,啟用 DRA 的 Kubernetes Beta 版 API:
gcloud container clusters create CLUSTER_NAME \
--quiet \
--enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
--release-channel=rapid \
--enable-autoupgrade \
--location CONTROL_PLANE_LOCATION \
--num-nodes "1" \
--cluster-version GKE_VERSION \
--workload-pool="PROJECT_ID.svc.id.goog"
更改下列內容:
CLUSTER_NAME
:叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。GKE_VERSION
:用於叢集和節點的 GKE 版本。必須為 1.32.1-gke.1489001 以上版本。PROJECT_ID
:您的專案 ID。
準備 GKE 環境以支援 DRA
在 GKE 中,您可以將 DRA 與 GPU 和 TPU 搭配使用。建立節點集區時,必須使用下列設定,才能在預先發布版期間搭配 DRA 使用:
- 如果是 GPU,請停用自動安裝 GPU 驅動程式。
- 為節點新增必要的存取範圍。
- 新增節點標籤,確保節點只執行 DRA 工作負載。
- 啟用叢集自動調度資源功能。
其他節點集區設定 (例如機器類型、加速器類型、數量、節點作業系統和節點位置) 則取決於您的需求。
準備 GPU 環境
建立具有所需硬體的節點集區:
gcloud beta container node-pools create "gpu-pool" \ --quiet \ --project PROJECT_ID \ --cluster CLUSTER_NAME \ --location CONTROL_PLANE_LOCATION \ --node-version KUBERNETES_VERSION \ --machine-type "n1-standard-8" \ --accelerator "type=nvidia-tesla-t4,count=2,gpu-driver-version=disabled" \ --image-type "UBUNTU_CONTAINERD" \ --disk-type "pd-standard" \ --disk-size "100" \ --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \ --num-nodes "1" \ --enable-autoscaling \ --min-nodes "1" \ --max-nodes "6" \ --location-policy "ANY" \ --max-surge-upgrade 1 \ --max-unavailable-upgrade 0 \ --node-locations ZONE \ --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
更改下列內容:
CLUSTER_NAME
:叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。請確認所選位置與您指定的 GPU 位於相同區域。ZONE
:提供您指定 GPU 的區域。
在 Container-Optimized OS 或 Ubuntu 節點上,手動安裝驅動程式。如需詳細操作說明,請參閱「手動安裝 NVIDIA GPU 驅動程式」。
如果使用 COS,請執行下列指令來部署安裝 DaemonSet,並安裝預設的 GPU 驅動程式版本:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
如果使用 Ubuntu,您部署的安裝 DaemonSet 會依據 GPU 類型和 GKE 節點版本而異,詳情請參閱操作說明的 Ubuntu 專區。
提取並更新包含 GPU 運算子的 Helm Chart:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
為 GPU 運算子建立命名空間:
kubectl create namespace gpu-operator
在
gpu-operator
命名空間中建立 ResourceQuota。ResourceQuota 可讓 GPU 運算子部署與 Kubernetes 系統 Pod 具有相同優先順序的 Pod。kubectl apply -n gpu-operator -f - << EOF apiVersion: v1 kind: ResourceQuota metadata: name: gpu-operator-quota spec: hard: pods: 100 scopeSelector: matchExpressions: - operator: In scopeName: PriorityClass values: - system-node-critical - system-cluster-critical EOF
使用 Helm 指令碼安裝 GPU 運算子:
helm install --wait --generate-name -n gpu-operator nvidia/gpu-operator \ --set driver.enabled=false \ --set operator.repository=ghcr.io/nvidia \ --set operator.version=6171a52d \ --set validator.repository=ghcr.io/nvidia/gpu-operator \ --set validator.version=6171a52d \ --set toolkit.repository=ghcr.io/nvidia \ --set toolkit.version=5d9b27f1-ubuntu20.04 \ --set gfd.repository=ghcr.io/nvidia \ --set gfd.version=f171c926-ubi9 \ --set cdi.enabled=true \ --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \ --set toolkit.installDir=/home/kubernetes/bin/nvidia
準備 TPU 環境
建立使用 TPU 的節點集區。以下範例會建立 TPU Trillium 節點集區:
gcloud container node-pools create NODEPOOL_NAME \
--cluster CLUSTER_NAME --num-nodes 1 \
--location CONTROL_PLANE_LOCATION \
--node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
--machine-type=ct6e-standard-8t \
--enable-autoupgrade
請替換下列項目:
* NODEPOOL_NAME
:節點集區的名稱。
* CLUSTER_NAME
:叢集名稱。
* CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
存取及安裝 DRA 驅動程式
下列各節說明如何安裝 GPU 和 TPU 的 DRA 驅動程式。DRA 驅動程式可讓 Kubernetes 動態將附加裝置分配給工作負載。您可以使用提供的 Helm 資訊套件,為 GPU 和 TPU 安裝 DRA 驅動程式。如要存取 Helm 資訊圖表,請完成下列步驟:
複製
ai-on-gke
存放區,存取包含 GPU 和 TPU 適用的 DRA 驅動程式的 Helm 資訊圖表:git clone https://github.com/GoogleCloudPlatform/ai-on-gke/common-infra.git
前往內含圖表的目錄:
cd common-infra/common/charts
在 GPU 上安裝 DRA 驅動程式
取得包含 DRA 驅動程式的 Helm 圖表後,請完成下列步驟,安裝 GPU 的 DRA 驅動程式:
COS
helm upgrade -i --create-namespace --namespace nvidia nvidia-dra-driver-gpu nvidia-dra-driver-gpu/ \
--set image.repository=ghcr.io/nvidia/k8s-dra-driver-gpu \
--set image.tag=d1fad7ed-ubi9 \
--set image.pullPolicy=Always \
--set controller.priorityClassName="" \
--set kubeletPlugin.priorityClassName="" \
--set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
--set nvidiaCtkPath=/home/kubernetes/bin/nvidia/toolkit/nvidia-ctk \
--set deviceClasses="{gpu}" \
--set gpuResourcesEnabledOverride=true \
--set resources.computeDomains.enabled=false \
--set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
--set kubeletPlugin.tolerations[0].operator=Exists \
--set kubeletPlugin.tolerations[0].effect=NoSchedule \
--set kubeletPlugin.tolerations[1].key=cloud.google.com/compute-class \
--set kubeletPlugin.tolerations[1].operator=Exists \
--set kubeletPlugin.tolerations[1].effect=NoSchedule
Ubuntu
helm upgrade -i --create-namespace --namespace nvidia nvidia-dra-driver-gpu nvidia-dra-driver-gpu/ \
--set image.repository=ghcr.io/nvidia/k8s-dra-driver-gpu \
--set image.tag=d1fad7ed-ubi9 \
--set image.pullPolicy=Always \
--set controller.priorityClassName="" \
--set kubeletPlugin.priorityClassName="" \
--set nvidiaDriverRoot="/opt/nvidia" \
--set nvidiaCtkPath=/home/kubernetes/bin/nvidia/toolkit/nvidia-ctk \
--set deviceClasses="{gpu}" \
--set gpuResourcesEnabledOverride=true \
--set resources.computeDomains.enabled=false \
--set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
--set kubeletPlugin.tolerations[0].operator=Exists \
--set kubeletPlugin.tolerations[0].effect=NoSchedule \
--set kubeletPlugin.tolerations[1].key=cloud.google.com/compute-class \
--set kubeletPlugin.tolerations[1].operator=Exists \
--set kubeletPlugin.tolerations[1].effect=NoSchedule
在 TPU 上安裝 DRA 驅動程式
取得包含驅動程式的 Helm 圖表後,請完成下列步驟來安裝 TPU 驅動程式:
./tpu-dra-driver/install-tpu-dra-driver.sh
確認基礎架構已準備好支援 DRA
確認 ResourceSlice
列出您新增的硬體裝置:
kubectl get resourceslices -o yaml
如果您使用前一節的範例,ResourceSlice
會類似下列內容,具體取決於您使用的硬體類型:
GPU
apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
kind: ResourceSlice
metadata:
# lines omitted for clarity
spec:
devices:
- basic:
attributes:
architecture:
string: Turing
brand:
string: Nvidia
cudaComputeCapability:
version: 7.5.0
cudaDriverVersion:
version: 12.2.0
driverVersion:
version: 535.230.2
index:
int: 0
minor:
int: 0
productName:
string: Tesla T4
type:
string: gpu
uuid:
string: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef
capacity:
memory:
value: 15Gi
name: gpu-0
TPU
apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
kind: ResourceSlice
metadata:
# lines omitted for clarity
spec:
devices:
- basic:
attributes:
index:
int: 0
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "0"
- basic:
attributes:
index:
int: 1
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "1"
- basic:
attributes:
index:
int: 2
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "2"
- basic:
attributes:
index:
int: 3
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "3"
driver: tpu.google.com
nodeName: gke-tpu-b4d4b61b-fwbg
pool:
generation: 1
name: gke-tpu-b4d4b61b-fwbg
resourceSliceCount: 1
kind: List
metadata:
resourceVersion: ""