本頁面說明如何讓多個工作負載分時共用 Google Kubernetes Engine (GKE) 節點中的單一 NVIDIA® GPU 硬體加速器。在 GKE 中使用 GPU 分時功能,可更有效率地運用附加的 GPU,並節省執行費用。
本頁面適用於在 GKE 叢集上設計及部署工作負載的開發人員,以及建立及管理 GKE 叢集、規劃基礎架構和資源需求,以及監控叢集效能的管理員和架構師。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作。
閱讀本頁內容前,請先熟悉GKE 的分時運作方式,包括限制和應使用 GPU 分時的情況。
需求條件
- GKE 版本:您可以在執行 GKE 1.23.7-gke.1400 以上版本的 GKE Standard 叢集上啟用 GPU 分時功能。在執行 GKE 1.29.3-gke.1093000 以上版本的 GKE Autopilot 叢集上,您可以使用 GPU 分時功能。
- GPU 類型:您可以在所有 NVIDIA GPU 型號上啟用 GPU 時段共用功能。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
- 請確認您有足夠的 NVIDIA GPU 型號配額。如果需要更多配額,請參閱「要求增加配額」。
- 根據工作負載的資源需求和基礎 GPU 的容量,規劃 GPU 容量。
- 查看 GPU 時分多工的限制。
在 GKE 叢集和節點集區中啟用 GPU 分時功能
平台管理員必須先在 GKE Standard 叢集上啟用 GPU 分時功能,開發人員才能部署工作負載來使用 GPU。如要啟用 GPU 時段共用功能,請完成下列步驟:
執行 1.29.3-gke.1093000 以上版本的 Autopilot 叢集,預設會啟用 GPU 分時功能。Autopilot 叢集的時間分享功能是在工作負載規格中設定。詳情請參閱「部署使用分時 GPU 的工作負載」一節。
在 GKE Standard 叢集上啟用 GPU 時段共用功能
建立 GKE Standard 叢集時,您可以啟用 GPU 時段共用功能。叢集中的預設節點集區已啟用這項功能。在該叢集中手動建立新節點集區時,您仍須啟用 GPU 時段共用功能。
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--cluster-version=CLUSTER_VERSION \
--machine-type=MACHINE_TYPE \
--accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION
更改下列內容:
CLUSTER_NAME
:新叢集的名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。CLUSTER_VERSION
:叢集控制層和節點的 GKE 版本。使用 GKE 1.23.7-gke.1400 以上版本。或者,您也可以使用--release-channel=RELEASE_CHANNEL
標記,指定包含該 GKE 版本的發布管道。MACHINE_TYPE
:節點的 Compute Engine 機器類型。建議選取加速器最佳化機器類型。GPU_TYPE
:GPU 類型,必須是 NVIDIA GPU 平台,例如nvidia-tesla-v100
。GPU_QUANTITY
:要附加至預設節點集區中每個節點的實體 GPU 數量。CLIENTS_PER_GPU
:可共用每個實體 GPU 的容器數量上限。DRIVER_VERSION
:要安裝的 NVIDIA 驅動程式版本。可以是下列任一值:default
:安裝 GKE 版本的預設驅動程式版本。latest
:為 GKE 版本安裝最新可用的驅動程式版本。僅適用於使用 Container-Optimized OS 的節點。disabled
:略過自動安裝驅動程式。建立節點集區後,您必須 手動安裝驅動程式。如果省略gpu-driver-version
,系統會預設使用這個選項。
在 GKE 節點集區中啟用 GPU 分時功能
在 GKE 叢集中手動建立新節點集區時,可以啟用 GPU 時段共用功能。
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--machine-type=MACHINE_TYPE \
--accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION
更改下列內容:
NODEPOOL_NAME
:新節點集區的名稱。- :叢集名稱,必須執行 GKE 1.23.7-gke.1400 以上版本。
CLUSTER_NAME
CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。MACHINE_TYPE
:節點的 Compute Engine 機器類型。建議選取加速器最佳化機器類型。GPU_TYPE
:GPU 類型,必須是 NVIDIA GPU 平台,例如nvidia-tesla-v100
。GPU_QUANTITY
:要附加至節點集區中每個節點的實體 GPU 數量。CLIENTS_PER_GPU
:可共用每個實體 GPU 的容器數量上限。DRIVER_VERSION
:要安裝的 NVIDIA 驅動程式版本。可以是下列任一值:default
:安裝 GKE 版本的預設驅動程式版本。latest
:為 GKE 版本安裝最新可用的驅動程式版本。僅適用於使用 Container-Optimized OS 的節點。disabled
:略過自動安裝驅動程式。建立節點集區後,您必須 手動安裝驅動程式。如果省略gpu-driver-version
,系統會預設使用這個選項。
安裝 NVIDIA GPU 裝置驅動程式
請先執行下列指令,連線至叢集,再繼續操作:
gcloud container clusters get-credentials CLUSTER_NAME
如果在建立叢集時選擇停用自動安裝驅動程式,或是使用 1.27.2-gke.1200 之前的 GKE 版本,則必須手動安裝相容的 NVIDIA 驅動程式,才能管理實體 GPU 的 GPU 時段共用分割。如要安裝驅動程式,請部署 GKE 安裝 DaemonSet,設定驅動程式。
如需操作說明,請參閱「安裝 NVIDIA GPU 裝置驅動程式」。
如果您打算在叢集中使用節點自動佈建功能,也必須使用允許 GKE 為您安裝 GPU 裝置驅動程式的範圍,設定節點自動佈建功能。如需操作說明,請參閱「搭配 GPU 使用節點自動佈建功能」。
確認節點上可用的 GPU 資源
如要確認節點中顯示的 GPU 數量與啟用 GPU 時分時指定的數量相符,請說明節點:
kubectl describe nodes NODE_NAME
輸出結果會與下列內容相似:
...
Capacity:
...
nvidia.com/gpu: 3
Allocatable:
...
nvidia.com/gpu: 3
在這個輸出範例中,節點上的 GPU 資源數量為 3
,因為為 max-shared-clients-per-gpu
指定的值是 3
,而要附加至節點的實體 GPU count
數量為 1
。舉例來說,如果實體 GPU 的 count
為 2
,輸出內容會顯示 6
個可分配的 GPU 資源,每個實體 GPU 上有三個。
部署使用 GPU 分時功能的工作負載
應用程式運算子部署 GPU 工作負載時,可以在資訊清單的 nodeSelector
中指定適當的節點標籤,選取已啟用 GPU 時段共用的節點。規劃要求時,請先查看要求限制,確保 GKE 不會拒絕部署作業。
如要部署工作負載以使用 GPU 分時,請完成下列步驟:
在工作負載資訊清單中,為下列標籤新增
nodeSelector
:cloud.google.com/gke-gpu-sharing-strategy: time-sharing
:選取使用 GPU 分時的節點。cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
:選取允許特定數量的容器共用基礎 GPU 的節點。
在
spec.containers.resources.limits
中,將nvidia.com/gpu=1
GPU 資源要求新增至容器規格。
舉例來說,下列步驟說明如何將三個 Pod 部署至 GPU 時段共用節點集區。GKE 會將每個容器分配到同一個實體 GPU。容器會列印附加至該容器的 GPU UUID。
- 將下列資訊清單儲存為
gpu-timeshare.yaml
:
Autopilot
apiVersion: apps/v1 kind: Deployment metadata: name: cuda-simple spec: replicas: 3 selector: matchLabels: app: cuda-simple template: metadata: labels: app: cuda-simple spec: nodeSelector: cloud.google.com/gke-accelerator: "GPU_TYPE" cloud.google.com/gke-gpu-sharing-strategy: "time-sharing" cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU" cloud.google.com/gke-accelerator-count: "GPU_COUNT" containers: - name: cuda-simple image: nvidia/cuda:11.0.3-base-ubi7 command: - bash - -c - | /usr/local/nvidia/bin/nvidia-smi -L; sleep 300 resources: limits: nvidia.com/gpu: 1
更改下列內容:
GPU_TYPE
:GPU 類型。CLIENTS_PER_GPU
:使用這個 GPU 的工作負載數量。本範例使用的是3
。GPU_COUNT
:要附加至節點的實體 GPU 數量。本範例使用的是1
。
標準
apiVersion: apps/v1 kind: Deployment metadata: name: cuda-simple spec: replicas: 3 selector: matchLabels: app: cuda-simple template: metadata: labels: app: cuda-simple spec: nodeSelector: cloud.google.com/gke-gpu-sharing-strategy: "SHARING_STRATEGY" cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU" containers: - name: cuda-simple image: nvidia/cuda:11.0.3-base-ubi7 command: - bash - -c - | /usr/local/nvidia/bin/nvidia-smi -L; sleep 300 resources: limits: nvidia.com/gpu: 1
更改下列內容:
SHARING_STRATEGY
,並選取「分時」,即可要求 GPU 分時。CLIENTS_PER_GPU
:將使用這個 GPU 的工作負載數量。本範例使用的是3
。
套用資訊清單:
kubectl apply -f gpu-timeshare.yaml
確認所有 Pod 都在執行中:
kubectl get pods -l=app=cuda-simple
檢查任何 Pod 的記錄,即可查看 GPU 的 UUID:
kubectl logs POD_NAME
輸出結果會與下列內容相似:
GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
如果節點附加一個實體 GPU,請檢查同一節點上是否有其他 Pod,確認 GPU UUID 相同:
kubectl logs POD2_NAME
輸出結果會與下列內容相似:
GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
使用多執行個體 GPU 的 GPU 分時功能
平台管理員可能會想合併多項 GKE GPU 功能。GPU 分時功能可搭配多執行個體 GPU 使用,將單一實體 GPU 分割成最多七個切片。這些磁碟分割區彼此隔離,您可以為每個多重執行個體 GPU 分區設定 GPU 分時。
舉例來說,如果將 gpu-partition-size
設為 1g.5gb
,基礎 GPU 會分割成七個分區。如果也將 max-shared-clients-per-gpu
設為 3
,每個分割區最多可支援三個容器,因此在該實體 GPU 中,最多可分配 21 個 GPU 時段共用裝置。如要瞭解 gpu-partition-size
如何轉換為實際分割區,請參閱「多重執行個體 GPU 分割區」。
如要建立啟用 GPU 時段共用的多執行個體 GPU 叢集,請執行下列指令:
Autopilot
在 Autopilot 模式下,您可以同時使用這兩組節點選取器,將 GPU 分時和多執行個體 GPU 搭配使用。
apiVersion: apps/v1
kind: Deployment
metadata:
name: cuda-simple
spec:
replicas: 7
selector:
matchLabels:
app: cuda-simple
template:
metadata:
labels:
app: cuda-simple
spec:
nodeSelector:
cloud.google.com/gke-gpu-partition-size: 1g.5gb
cloud.google.com/gke-gpu-sharing-strategy: time-sharing
cloud.google.com/gke-max-shared-clients-per-gpu: "3"
cloud.google.com/gke-accelerator: nvidia-tesla-a100
cloud.google.com/gke-accelerator-count: "1"
containers:
- name: cuda-simple
image: nvidia/cuda:11.0.3-base-ubi7
command:
- bash
- -c
- |
/usr/local/nvidia/bin/nvidia-smi -L; sleep 300
resources:
limits:
nvidia.com/gpu: 1
標準
使用 Standard 時,您需要執行下列指令,建立 GPU 分時多例項叢集:
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--machine-type=MACHINE_TYPE \
--accelerator=type=nvidia-tesla-a100,count=GPU_QUANTITY,gpu-partition-size=PARTITION_SIZE,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION
將 PARTITION_SIZE
替換為所需的多重執行個體 GPU 分割大小,例如 1g.5gb
。
限制
- 透過 GPU 分時功能,GKE 會在共用實體 GPU 的容器之間,強制執行位址空間隔離、效能隔離和錯誤隔離。不過,系統不會對 GPU 強制執行記憶體限制。為避免發生記憶體不足 (OOM) 問題,請在工作負載中設定 GPU 記憶體限制。為避免安全性問題,請只將位於相同信任範圍的工作負載部署至 GPU 時段共用。
- 為避免容量分配期間發生非預期行為,GKE 可能會拒絕特定 GPU 時段共用要求。詳情請參閱「GPU requests for GPU time-sharing」。
- 單一實體 GPU 最多可供 48 個容器使用分時功能。規劃 GPU 時段共用設定時,請考量工作負載的資源需求,以及基礎實體 GPU 的容量,盡可能提升效能和回應速度。
後續步驟
- 進一步瞭解 GKE 中可用的 GPU 共用策略。
- 進一步瞭解 GPU。
- 進一步瞭解如何執行多執行個體 GPU。
- 如要進一步瞭解 NVIDIA GPU 的運算搶占功能,請參閱 NVIDIA Pascal 調整指南。