使用 GPU 和彈性啟動佈建模式執行小型批次工作負載


本指南說明如何使用彈性啟動佈建模式,為中小型訓練工作負載最佳化 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,取得最新版本。

如果沒有叢集,或叢集不符合需求,可以使用 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 加速器類型。

  1. 取得叢集所在位置:

    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
    
  2. 列出可用 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 限制為特定機器系列。如要尋找機器類型,請按照下列步驟操作:

  1. 請參閱可用的 GPU 模型表。
  2. 找到所選 GPU 加速器類型的資料列。
  3. 查看該列的「機器系列」欄。這個欄會顯示必須使用的機器系列。
  4. 如要查看可指定的機器類型名稱,請按一下機器系列中的連結。

只有 N1 系列機器是例外,因為這類機器會提供額外指引,說明所選加速器類型可搭配使用的 N1 機器類型。

使用加速器最佳化機器前,請先確認該機器支援彈性啟動佈建模式,如「依機器類型提供的用量選項」所示。

判斷加速器數量

如果您使用 Autopilot 模式的叢集,請略過本節,並前往「執行批次工作負載」一節。

如要建立節點集區,您必須決定要附加至節點集區中每個節點的加速器數量。有效值取決於加速器類型和機器類型。每種機器類型支援的 GPU 數量都有上限。如要判斷要使用的值 (預設值為 1):

  1. 請參閱 GPU 機器類型
  2. 在表格中,搜尋機型系列的加速器類型。
  3. 使用「GPU 數量」欄中的值。

建立採用彈性啟動的節點集區

如果您使用 Autopilot 模式的叢集,請略過本節,並前往「執行批次工作負載」一節。

如要在現有 Standard 叢集上建立啟用彈性啟動功能的節點集區,可以使用 gcloud CLI 或 Terraform。

gcloud

  1. 建立採用彈性啟動模式的節點集區:

    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 會建立節點集區,其中的節點包含指定加速器類型的兩個執行個體。節點集區一開始有零個節點,且已啟用自動調度資源功能

  2. 確認節點集區的彈性啟動狀態:

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --format="get(config.flexStart)"
    

    如果節點集區已啟用彈性啟動功能,flexStart 欄位會設為 True

Terraform

您可以使用 Terraform 模組,搭配 GPU 使用彈性啟動。

  1. 在 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 成功執行特定工作。

  1. Google Cloud 控制台中,按一下「Activate Cloud Shell」(啟用 Cloud Shell),啟動 Cloud Shell 工作階段。Cloud Shell 啟用圖示工作階段會在 Google Cloud 控制台的底部窗格中開啟。

  2. 建立名為 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
    
  3. 套用 dws-flex-start.yaml 資訊清單:

    kubectl apply -f dws-flex-start.yaml
    
  4. 確認 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 帳戶收取本頁面所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

刪除個別資源

  1. 刪除工作:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. 刪除節點集區:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location LOCATION_NAME
    
  3. 刪除叢集:

    gcloud container clusters delete CLUSTER_NAME
    

後續步驟