本指南說明如何使用彈性啟動佈建模式,為中小型訓練工作負載最佳化 GPU 佈建作業。在本指南中,您將使用彈性啟動功能部署工作負載,該工作負載包含兩個 Kubernetes 工作。每項工作都需要一個 GPU。GKE 會自動佈建具有兩個 A100 GPU 的單一節點,以執行這兩項作業。
如果工作負載需要多節點分散式處理,請考慮使用彈性啟動搭配佇列佈建。詳情請參閱「使用彈性啟動和排隊佈建功能,執行大規模工作負載」。
本指南適用於機器學習 (ML) 工程師、平台管理員和操作員,以及有興趣使用 Kubernetes 容器自動化調度管理功能執行批次工作負載的資料和 AI 專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
彈性啟動定價
如果工作負載需要視情況動態佈建資源,且最多可保留七天,不需要複雜的配額管理,並能以具成本效益的方式存取,建議使用彈性啟動。彈性啟動功能採用 Dynamic Workload Scheduler,並按照 Dynamic Workload Scheduler 定價計費:
- vCPU、GPU 和 TPU 可享折扣 (最高 53%)。
- 即付即用。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
- 確認您有執行 1.33.0-gke.1712000 以上版本的 Autopilot 叢集或Standard 叢集。
- 請確認您已瞭解彈性啟動的限制。
- 使用標準叢集時,請確認您至少維護一個未啟用彈性啟動的節點集區,叢集才能正常運作。
- 確認節點位置有先占 GPU 配額。
如果沒有叢集,或叢集不符合需求,可以使用 gcloud CLI 建立標準地區叢集。新增下列旗標,瞭解 flex-start:
--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8
建立彈性啟動節點集區時,請使用先前提及的旗標和 --accelerator type=nvidia-l4,count=1
。
如果您的標準叢集符合需求,請參閱下幾個章節,瞭解如何為叢集選取 GPU 加速器類型和機器類型。
選擇 GPU 加速器類型
如果您使用 Autopilot 模式的叢集,請略過本節,並前往「執行批次工作負載」一節。
GPU 僅於特定區域提供。您需要找出在 Standard 叢集所在區域中可用的 GPU 加速器類型。如果您有地區標準叢集,提供 GPU 加速器類型的區域必須位於叢集所在的區域。建立節點集區時,請指定節點的加速器類型和可用區。如果您指定的加速器類型在叢集位置無法使用,節點集區建立作業就會失敗。
執行下列指令,取得叢集位置和支援的 GPU 加速器類型。
取得叢集所在位置:
gcloud container clusters list
輸出結果會與下列內容相似:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE example-cluster-1 us-west2 1.33.2-gke.1111000 34.102.3.122 e2-medium 1.33.2-gke.1111000 9 RUNNING IPV4
列出可用 GPU 加速器類型,但不包括該位置的虛擬工作站:
gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
將
LOCATION_NAME
替換為叢集位置。舉例來說,如要取得
us-west2
區域的 GPU 加速器類型清單,請執行下列指令:gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
輸出結果會與下列內容相似:
nvidia-b200 us-west2-c NVIDIA B200 180GB nvidia-tesla-p4 us-west2-c NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-c NVIDIA T4 nvidia-tesla-p4 us-west2-b NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-b NVIDIA T4
選擇相容的機型
如果您使用 Autopilot 模式的叢集,請略過本節,並前往「執行批次工作負載」一節。
瞭解叢集位置可用的 GPU 後,即可判斷相容的機器類型。 Google Cloud 會將 GPU 限制為特定機器系列。如要尋找機器類型,請按照下列步驟操作:
- 請參閱可用的 GPU 模型表。
- 找到所選 GPU 加速器類型的資料列。
- 查看該列的「機器系列」欄。這個欄會顯示必須使用的機器系列。
- 如要查看可指定的機器類型名稱,請按一下機器系列中的連結。
只有 N1 系列機器是例外,因為這類機器會提供額外指引,說明所選加速器類型可搭配使用的 N1 機器類型。
使用加速器最佳化機器前,請先確認該機器支援彈性啟動佈建模式,如「依機器類型提供的用量選項」所示。
判斷加速器數量
如果您使用 Autopilot 模式的叢集,請略過本節,並前往「執行批次工作負載」一節。
如要建立節點集區,您必須決定要附加至節點集區中每個節點的加速器數量。有效值取決於加速器類型和機器類型。每種機器類型支援的 GPU 數量都有上限。如要判斷要使用的值 (預設值為 1
):
- 請參閱 GPU 機器類型。
- 在表格中,搜尋機型系列的加速器類型。
- 使用「GPU 數量」欄中的值。
建立採用彈性啟動的節點集區
如果您使用 Autopilot 模式的叢集,請略過本節,並前往「執行批次工作負載」一節。
如要在現有 Standard 叢集上建立啟用彈性啟動功能的節點集區,可以使用 gcloud CLI 或 Terraform。
gcloud
建立採用彈性啟動模式的節點集區:
gcloud container node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --project PROJECT_ID \ --accelerator type=ACCELERATOR_TYPE,count=COUNT \ --machine-type MACHINE_TYPE \ --max-run-duration MAX_RUN_DURATION \ --flex-start \ --node-locations NODE_ZONES \ --num-nodes 0 \ --enable-autoscaling \ --total-min-nodes 0 \ --total-max-nodes 5 \ --location-policy ANY \ --reservation-affinity none \ --no-enable-autorepair
更改下列內容:
NODE_POOL_NAME
:您為節點集區選擇的名稱。CLUSTER_NAME
:要修改的 Standard 叢集名稱。LOCATION_NAME
:叢集控制層的運算區域。PROJECT_ID
:您的專案 ID。ACCELERATOR_TYPE
:要附加至執行個體的特定加速器類型 (例如 NVIDIA T4 的nvidia-tesla-t4
)。COUNT
:要附加至執行個體的加速器數量。預設值為1
。MACHINE_TYPE
:節點使用的機器類型。MAX_RUN_DURATION
:選用。節點的最長執行時間 (以秒為單位),最多為預設的七天。輸入的號碼必須以s
結尾。舉例來說,如要指定一天,請輸入86400s
。NODE_ZONES
:以半形逗號分隔的清單,列出 GKE 建立節點集區的一或多個可用區。
在這個指令中,
--flex-start
標記會指示gcloud
建立啟用彈性啟動功能的節點集區。GKE 會建立節點集區,其中的節點包含指定加速器類型的兩個執行個體。節點集區一開始有零個節點,且已啟用自動調度資源功能
確認節點集區的彈性啟動狀態:
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
如果節點集區已啟用彈性啟動功能,
flexStart
欄位會設為True
。
Terraform
您可以使用 Terraform 模組,搭配 GPU 使用彈性啟動。
- 在 Terraform 設定中新增下列區塊:
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"
queued_provisioning {
enabled = false
}
}
node_config {
machine_type = "MACHINE_TYPE"
accelerator_type = "ACCELERATOR_TYPE"
accelerator_count = COUNT
node_locations = ["NODE_ZONES"]
flex_start = true
}
更改下列內容:
MACHINE_TYPE
:節點使用的機器類型。- :要附加至執行個體的特定加速器類型 (例如 NVIDIA T4 的
nvidia-tesla-t4
)。ACCELERATOR_TYPE
COUNT
:要附加至執行個體的加速器數量。預設值為1
。NODE_ZONES
:以半形逗號分隔的清單,列出 GKE 建立節點集區的一或多個區域。
Terraform 會呼叫 Google Cloud API,建立叢集和節點集區,並使用彈性啟動功能搭配 GPU。節點集區一開始有零個節點,且已啟用自動調度資源功能。如要進一步瞭解 Terraform,請參閱 terraform.io 上的google_container_node_pool
資源規格。
執行批次工作負載
在本節中,您將建立兩個 Kubernetes 工作,每個工作都需要一個 GPU。 Kubernetes 中的 Job 控制器會建立一或多個 Pod,並確保這些 Pod 成功執行特定工作。在Google Cloud 控制台中,按一下「Activate Cloud Shell」(啟用 Cloud Shell),啟動 Cloud Shell 工作階段。
工作階段會在 Google Cloud 控制台的底部窗格中開啟。
建立名為
dws-flex-start.yaml
的檔案:apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure --- apiVersion: batch/v1 kind: Job metadata: name: job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE containers: - name: container-2 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
套用
dws-flex-start.yaml
資訊清單:kubectl apply -f dws-flex-start.yaml
確認 Job 在同一節點上執行:
kubectl get pods -l "job-name in (job-1,job-2)" -o wide
輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none> job-2 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除個別資源
刪除工作:
kubectl delete job -l "job-name in (job-1,job-2)"
刪除節點集區:
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
刪除叢集:
gcloud container clusters delete CLUSTER_NAME
後續步驟
- 進一步瞭解 GKE 中的 GPU。
- 進一步瞭解節點自動佈建。
- 進一步瞭解在 GKE 上執行批次工作負載的最佳做法。