使用 Spot VM 進行訓練

總覽

使用 Spot VM 可降低無伺服器訓練工作的執行成本。 Spot VM 是虛擬機器 (VM) 執行個體,屬於 Compute Engine 的剩餘容量。Spot VM 的折扣幅度相當可觀,但 Compute Engine 可能會隨時先占 (停止或刪除) Spot VM,以取回資源。

詳情請參閱「Spot VM」。

限制與需求

使用 Agent Platform 的 Spot VM 時,請注意下列限制和規定:

  • 使用 Agent Platform 時,所有Spot VM 限制均適用。
  • 使用 Spot VM 搭配 Agent Platform 時,僅支援無伺服器訓練和推論。
  • 系統不支援搭配 TPU Pod 使用 Spot VM。
  • 不支援透過 Google Cloud 控制台提交工作。

帳單

如果您的工作負載具備容錯能力,且能承受 VM 可能遭到先占的影響,Spot VM 就可大幅節省您的運算費用。如果部分 VM 在處理過程中停止,工作執行速度會變慢,但不會完全停止。Spot VM 不會對現有 VM 造成額外負載,就能完成批次處理工作,且不用全額購買更多標準 VM。請參閱「搶占處理」。

使用 Spot VM 時,系統會根據工作時間長度和機型計費。 工作處於佇列或遭到搶占時,您不必支付費用。

先占處理

Compute Engine 隨時可以回收 Spot VM。 因此,無伺服器訓練工作必須具備容錯能力,才能充分發揮 Spot VM 的效益。Spot VM 遭到先占時,無伺服器訓練工作會失敗並顯示 STOCKOUT 錯誤,Compute Engine 最多會嘗試重新啟動工作六次。如要瞭解如何充分運用 Spot VM,請參閱 Spot VM 最佳做法

以下列舉幾種方法,可讓無伺服器訓練作業容錯:

  • 建立檢查點即可儲存進度。定期儲存模型進度,可確保終止的無伺服器訓練工作能從上次儲存的查核點繼續執行,而不是從頭開始。
  • 使用 Elastic Horovod。彈性訓練功能可讓 Horovod 擴充運算資源,不必重新啟動或從檢查點繼續執行。詳情請參閱「Elastic Horovod」。
  • 使用關機指令碼。當 Compute Engine 搶占 Spot VM 時,您可以使用關閉指令碼,在 VM 遭到搶占前嘗試執行清除動作。詳情請參閱「使用關閉指令碼處理先占」。

事前準備

準備無伺服器訓練應用程式:

將訓練工作設定為使用 Spot VM

如要設定無伺服器訓練工作使用 Spot VM,請在排程設定中指定 SPOT 策略。

REST

使用任何要求資料之前,請先修改下列項目的值:

  • LOCATION:要執行容器或 Python 套件的區域。
  • PROJECT_ID: 您的 [專案 ID](/resource-manager/docs/creating-managing-projects#identifiers)。 。
  • JOB_NAME:必填,CustomJob 的顯示名稱。
  • 定義自訂訓練工作:
    • MACHINE_TYPE:機器類型。請參閱可用的訓練機器類型
    • REPLICA_COUNT:要使用的 worker 副本數量。在大多數情況下,請將此值設為1,以用於第一個 worker 集區
    • 如果訓練應用程式在自訂容器中執行,請指定下列項目:
      • CUSTOM_CONTAINER_IMAGE_URI:Docker 容器映像檔的 URI,內含訓練程式碼。瞭解如何建立自訂容器映像檔
      • CUSTOM_CONTAINER_COMMAND:選用。容器啟動時要叫用的指令。這項指令會覆寫容器的預設進入點。
      • CUSTOM_CONTAINER_ARGS:選用。啟動容器時要傳遞的引數。
    • 如果訓練應用程式是可在預先建立的容器中執行的 Python 套件,請指定下列項目:
      • EXECUTOR_IMAGE_URI:執行所提供程式碼的容器映像檔 URI。請參閱可用的預先建構訓練容器
      • PYTHON_PACKAGE_URIS:以半形逗號分隔的 Cloud Storage URI 清單,指定訓練程式及其依附元件套件的 Python 套件檔案。套件 URI 數量上限為 100 個。
      • PYTHON_MODULE:安裝套件後要執行的 Python 模組名稱。
      • PYTHON_PACKAGE_ARGS:選用。要傳遞至 Python 模組的命令列引數。

HTTP 方法和網址:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

JSON 要求內文:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "MACHINE_TYPE"
          }
        },
        "replicaCount": REPLICA_COUNT,

        // Union field task can be only one of the following:
        "containerSpec": {
          "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
          "command": [
            CUSTOM_CONTAINER_COMMAND
          ],
          "args": [
            CUSTOM_CONTAINER_ARGS
          ]
        },
        "pythonPackageSpec": {
          "executorImageUri": EXECUTOR_IMAGE_URI,
          "packageUris": [
            PYTHON_PACKAGE_URIS
          ],
          "pythonModule": PYTHON_MODULE,
          "args": [
            PYTHON_PACKAGE_ARGS
          ]
        }
        // End of list of possible types for union field task.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "strategy": "SPOT"
    }
  }
}

如要傳送要求,請選擇以下其中一個選項:

curl

將要求主體儲存在名為 request.json 的檔案中,然後執行下列指令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"

PowerShell

將要求主體儲存在名為 request.json 的檔案中,然後執行下列指令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

回覆內容會包含規格資訊和 JOB_ID

Python

如要瞭解如何安裝或更新 Agent Platform SDK for Python,請參閱「安裝 Agent Platform SDK for Python」。詳情請參閱「Agent Platform SDK for Python API 參考文件」。

customJob = aiplatform.CustomJob(
    display_name=TEST_CASE_NAME,
    worker_pool_specs=worker_pool_spec,
    staging_bucket=OUTPUT_DIRECTORY
)
customJob.run(
    scheduling_strategy=aiplatform.compat.types.custom_job.Scheduling.Strategy.SPOT
)

後續步驟