自訂訓練工作 (Vertex AI API 中的 CustomJob
資源) 是您在 Vertex AI 中執行自訂機器學習 (ML) 訓練程式碼的基本方式。
提交工作前
在 Vertex AI 中建立 CustomJob
之前,您必須建立 Python 訓練應用程式或自訂容器映像檔,以便定義要在 Vertex AI 上執行的訓練程式碼和依附元件。
建議您使用 Google Cloud CLI 的自動封裝功能 (請參閱本指南稍後的章節),透過單一指令從本機機器上的程式碼建立 Docker 容器映像檔、將此容器映像檔推送至 Artifact Registry,以及建立 CustomJob
。
否則,您必須手動建立 Python 訓練應用程式或自訂容器映像檔。
如果您不確定要選擇哪一個選項,請參閱訓練碼規定瞭解詳情。
自訂工作的內容
建立自訂工作時,您需要指定 Vertex AI 執行訓練程式碼時所需的設定,包括:
- 單一節點訓練 (
WorkerPoolSpec
) 的一個工作站集區,或分散式訓練的多個工作站集區 - 用於設定工作排程的選用設定 (
Scheduling
)、為訓練程式碼設定特定環境變數、使用自訂服務帳戶,以及使用 VPC 網路對等互連
您可以在工作站集區中指定下列設定:
- 機器類型和加速器
- 設定工作站集區執行的訓練程式碼類型:Python 訓練應用程式 (
PythonPackageSpec
) 或自訂容器 (ContainerSpec
)
您也可以設定自訂工作在持續性資源上執行,而非在工作啟動期間建立新的運算資源。如要進一步瞭解永久資源,請參閱「永久資源總覽」。
設定分散式訓練
您可以指定多個工作站集區,為分散式訓練設定 CustomJob
。
本頁中的大部分範例都會顯示單一複本訓練工作,以及一個 worker 集區。如要修改這些值以進行分散式訓練,請按照下列步驟操作:
- 使用第一個工作站集區設定主要備用資源,並將備用資源數量設為 1。
- 如果機器學習架構支援這些額外的叢集工作,以便進行分散式訓練,請新增更多工作站集區,以便設定工作站副本、參數伺服器副本或評估器副本。
進一步瞭解如何使用分散式訓練。
建立 CustomJob
如要建立 CustomJob
,請按照下列任一分頁中的操作說明進行操作,具體取決於您要使用的工具。如果您使用 gcloud 指令列介面,可以使用單一指令將本機機器上的訓練程式碼自動封裝至 Docker 容器映像檔,然後將容器映像檔推送至 Artifact Registry,並建立 CustomJob
。其他選項假設您已建立 Python 訓練應用程式或自訂容器映像檔。
gcloud
以下範例使用 gcloud ai custom-jobs create
指令。
如果訓練程式碼位於本機電腦上,建議您按照「自動封裝」一節的說明操作。或者,如果您已建立 Python 訓練應用程式或自訂容器映像檔,請直接跳至「不使用自動封裝」一節。
自動打包
如果本機電腦上有訓練程式碼,您可以使用單一指令執行下列操作:
- 根據您的程式碼建構自訂 Docker 映像檔。
- 將映像檔推送至 Artifact Registry。
- 根據圖片啟動
CustomJob
。
結果與使用任何其他自訂容器建立 CustomJob
類似;如果這個指令版本對您的工作流程較方便,您可以使用這個版本。
事前準備
由於這個版本的指令會建構並推送 Docker 映像檔,因此您必須在本機電腦上執行下列設定:
如果您使用的是 Linux,請設定 Docker,以便在沒有
sudo
的情況下執行 Docker。Enable the Artifact Registry API.
為 Docker 設定驗證機制,以便將 Docker 映像檔推送至 Artifact Registry:
gcloud auth configure-docker
建構及推送 Docker 映像檔,並建立 CustomJob
下列指令會根據預先建構的訓練容器映像檔和本機 Python 程式碼建構 Docker 映像檔,將映像檔推送至 Artifact Registry,並建立 CustomJob
。
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH
更改下列內容:
LOCATION:容器或 Python 套件執行的區域。
JOB_NAME:必填。
CustomJob
的顯示名稱。MACHINE_TYPE:機器類型。請參閱可用訓練機器類型。
REPLICA_COUNT:要使用的 worker 備用資源數量。在大多數情況下,請將此值設為第一個工作站集區的
1
。EXECUTOR_IMAGE_URI:執行提供程式碼的容器映像檔 URI。請參閱可用於訓練的預先建構容器。
這個映像檔會做為您使用此指令建構的新 Docker 映像檔的基本映像檔。
WORKING_DIRECTORY:本機檔案系統中的目錄,其中包含執行訓練程式碼的進入點指令碼 (請參閱下列清單項目)。
您可以使用指令碼的父目錄或更高層級的目錄。您可能需要使用較高層級的目錄,才能指定完整的 Python 模組名稱 (請參閱下列清單項目)。如果包含
requirements.txt
或setup.py
檔案,您可能也需要使用較高層級的目錄。詳情請參閱「安裝依附元件」。請注意,即使您指定較高層級的目錄,這個指令仍只會將進入點指令碼的父目錄複製到 Docker 映像檔。
SCRIPT_PATH:相對於本機檔案系統中的 WORKING_DIRECTORY 路徑,指向訓練程式碼的進入點指令碼。這個檔案可以是 Python 指令碼 (結尾為
.py
) 或 Bash 指令碼。舉例來說,如果您要執行
/hello-world/trainer/task.py
,而 WORKING_DIRECTORY 為/hello-world
,請使用trainer/task.py
做為這個值。使用
python-module
取代script
您可以選擇將
script=SCRIPT_PATH
替換為python-module=PYTHON_MODULE
,藉此指定 WORKING_DIRECTORY 中的 Python 模組名稱,以便做為訓練的進入點執行。例如,您可以指定python-module=trainer.task
,而非script=trainer/task.py
。在這種情況下,產生的 Docker 容器會以模組形式載入程式碼,而非以指令碼形式載入。如果進入點指令碼會在 WORKING_DIRECTORY 中匯入其他 Python 模組,您可能會想使用這個選項。
安裝依附元件
使用自動封裝功能時,您可以使用 gcloud CLI 的 local-run
指令,在容器中安裝 Python 依附元件。如要瞭解安裝 Python 依附元件的各種方式,請參閱 local-run
指令指南中的「安裝依附元件」一節。
使用自動封裝功能時,指定依附元件的語法會與使用 local-run
指令時略有不同。您必須在 --worker-pool-spec
旗標的值中使用選項,而非使用指令列標記指定依附元件。此外,這些選項內的值必須以分號而非半形逗號分隔。具體來說,語法如下:
在
--worker-pool-spec
旗標的值中使用local-package-path
選項,而非local-run
指令的--local-package-path
旗標。如果您使用這個選項指定的工作目錄含有requirements.txt
或setup.py
檔案,自動封裝會根據這個檔案安裝相依項。上述範例說明瞭這個語法。
(選用) 在
--worker-pool-spec
旗標的值中,使用requirements
選項,而非--requirements
旗標。請改用分號,而非使用半形逗號分隔 PyPI 依附元件。(選用) 在
--worker-pool-spec
旗標的值中,使用extra-packages
選項,而非--extra-packages
旗標。請改用分號,而非使用半形逗號分隔本機依附元件。(選用) 在
--worker-pool-spec
標記的值中,使用extra-dirs
選項,而非--extra-dirs
標記。請改用分號,不要使用半形逗號分隔目錄路徑。
以下範例說明如何使用所有選用技巧安裝依附元件。(您可以指定其中任何子集)。為了示範分號語法,這個範例為每個選項指定兩個值。為了縮短範例長度,其他 --worker-pool-spec
選項會以 [...]
取代。
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=[...],requirements=PYPI_DEP_1;PYPI_DEP_2,extra-packages=LOCAL_DEP_1;LOCAL_DEP_2,extra-dirs=EXTRA_DIR_1;EXTRA_DIR_2
如要瞭解這些預留位置的適當值,請參閱 local-run
指令指南中的「安裝依附元件」。
不使用自動封裝
如果您不使用自動封裝功能,可以使用類似下列指令建立 CustomJob
。視您建立 Python 訓練應用程式或自訂容器映像檔而定,請選擇下列其中一個分頁:
Python 訓練應用程式
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--python-package-uris=PYTHON_PACKAGE_URIS \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE
更改下列內容:
- LOCATION:容器或 Python 套件執行的區域。
-
JOB_NAME:必填。
CustomJob
的顯示名稱。 - PYTHON_PACKAGE_URIS:以半形逗號分隔的 Cloud Storage URI 清單,指定訓練程式及其依附套件的 Python 套件檔案。套件 URI 數量上限為 100。
- MACHINE_TYPE:機器類型。請參閱可用訓練機器類型。
-
REPLICA_COUNT:要使用的 worker 備用資源數量。在大多數情況下,請將此值設為第一個工作站集區的
1
。 - EXECUTOR_IMAGE_URI:執行提供程式碼的容器映像檔 URI。請參閱可用於訓練的預先建構容器。
- PYTHON_MODULE:安裝套件後要執行的 Python 模組名稱。
自訂容器映像檔
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI
更改下列內容:
分散式訓練
如要執行分散式訓練,請為每個 worker pool 指定 --worker-pool-spec
旗標多次。
如果您使用自動封裝功能,則只需在第一個 worker 集區中指定 local-package-path
、script
和其他與自動封裝相關的選項即可。在後續工作站集區中省略與訓練程式碼相關的欄位,這些集區都會使用透過自動封裝建立的相同訓練容器。
舉例來說,下列指令會調整先前的自動封裝範例,以便使用第二個工作站集區:
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH \
--worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT
如果您未使用自動封裝功能,請完整且獨立地指定每個工作站集區,請勿省略任何欄位。
下列指令會調整先前的範例,以便使用第二個工作站集區:
Python 訓練應用程式
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--python-package-uris=PYTHON_PACKAGE_URIS \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE \
--worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,executor-image-uri=SECOND_POOL_EXECUTOR_IMAGE_URI,python-module=SECOND_POOL_PYTHON_MODULE
自訂容器映像檔
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
--worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,container-image-uri=SECOND_POOL_CUSTOM_CONTAINER_IMAGE_URI
進階設定
如果您想指定前述範例中未提供的設定選項,可以使用 --config
標記,在本機環境中指定 config.yaml
檔案的路徑,該檔案包含 CustomJobSpec
的欄位。例如:
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--config=config.yaml
請參閱 config.yaml
檔案範例。
控制台
您無法在 Google Cloud 主控台中直接建立 CustomJob
資源。不過,您可以建立可建立 CustomJob
的 TrainingPipeline
資源。
以下操作說明說明如何建立 TrainingPipeline
,以便建立 CustomJob
且不執行任何其他操作。如要使用其他 TrainingPipeline
功能,例如使用受管理的資料集進行訓練,或是在訓練結束後建立 Model
資源,請參閱「建立訓練管道」一文。
在 Google Cloud 控制台的 Vertex AI 專區中,前往「Training pipelines」頁面。
按一下「建立」圖示
,開啟「訓練新模型」窗格。在「訓練方法」步驟中,指定下列設定:
在「Dataset」下拉式清單中,選取「No managed dataset」。
選取「自訂訓練 (進階)」。
按一下「繼續」。
在「模型詳細資料」步驟中,選擇「訓練新模型」或「訓練新版本」。如果您選取「訓練新模型」,請為模型輸入所需名稱 MODEL_NAME。按一下「繼續」。
在「Training container」步驟中,指定下列設定:
選取要使用預先建構的容器還是自訂容器進行訓練。
視您的選擇而定,請執行下列任一操作:
如果您想使用預建容器進行訓練,請向 Vertex AI 提供所需資訊,讓系統使用您上傳至 Cloud Storage 的訓練套件:
使用「Model framework」和「Model framework version」下拉式清單,指定要使用的預先建構容器。
在「Package location」欄位中,指定您建立並上傳的 Python 訓練應用程式的 Cloud Storage URI。這個檔案通常結尾為
.tar.gz
。在「Python 模組」欄位中,輸入訓練應用程式進入點的模組名稱。
如果您想使用自訂容器進行訓練,請在「Container image」欄位中指定容器映像檔的 Artifact Registry 或 Docker Hub URI。
在「模型輸出目錄」欄位中,您可以指定可存取的值區中目錄的 Cloud Storage URI。目錄尚不需要存在。
這個值會在
baseOutputDirectory
API 欄位中傳遞至 Vertex AI,該欄位會設定訓練應用程式在執行時可存取的多個環境變數。選用:您可以在「引數」欄位中指定 Vertex AI 開始執行訓練程式碼時要使用的引數。所有引數的總長度上限為 100,000 個半形字元。這些引數的行為會因您使用的容器類型而有所不同:
如果您使用的是預建容器,Vertex AI 會將引數做為指令列標記傳遞至 Python 模組。
如果您使用的是自訂容器,Vertex AI 會使用引數覆寫容器的
CMD
指令。
按一下「繼續」。
在「超參數調整」步驟中,確認「啟用超參數調整」核取方塊未選取。按一下「繼續」。
在「運算和定價」步驟中,指定下列設定:
在「區域」下拉式清單中,選取「支援自訂訓練的區域」。
在「Worker pool 0」部分,指定要用於訓練的運算資源。
如果您指定加速器,請確認您選擇的加速器類型在所選區域可用。
如要執行分散式訓練,請按一下「Add more worker pools」,然後為每個額外的工作站集區指定額外的運算資源組。
按一下「繼續」。
在「Prediction container」步驟中,選取「No prediction container」。
按一下「開始訓練」,啟動自訂訓練管道。
REST
使用任何要求資料之前,請先替換以下項目:
- LOCATION:容器或 Python 套件執行的區域。
- PROJECT_ID:您的專案 ID。
-
JOB_NAME:必填。
CustomJob
的顯示名稱。 - 定義自訂訓練工作:
- MACHINE_TYPE:機器類型。請參閱可用訓練機器類型。
- ACCELERATOR_TYPE:(選填) 要附加至工作中的加速器類型。
- ACCELERATOR_COUNT:(選填) 要附加至工作中的加速器數量。
- DISK_TYPE:(選填) 用於工作的開機磁碟類型,可能是
pd-standard
(預設) 或pd-ssd
。進一步瞭解磁碟類型。 - DISK_SIZE:(選填) 要用於工作開機磁碟的大小 (以 GB 為單位)。預設值為 100。
-
REPLICA_COUNT:要使用的 worker 備用資源數量。在大多數情況下,請將此值設為第一個工作站集區的
1
。 - 如果訓練應用程式是在自訂容器中執行,請指定下列項目:
- CUSTOM_CONTAINER_IMAGE_URI:Artifact Registry 或 Docker Hub 中容器映像檔的 URI,會在每個 worker 複本上執行。/li>
- 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 模組的指令列引數。
- 瞭解工作排程選項。
- TIMEOUT:(選填) 工作的最大執行時間。
- 為要套用至這項自訂工作的任何標籤指定 LABEL_NAME 和 LABEL_VALUE。
HTTP 方法和網址:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs
JSON 要求主體:
{ "displayName": "JOB_NAME", "jobSpec": { "workerPoolSpecs": [ { "machineSpec": { "machineType": MACHINE_TYPE, "acceleratorType": ACCELERATOR_TYPE, "acceleratorCount": ACCELERATOR_COUNT }, "replicaCount": REPLICA_COUNT, "diskSpec": { "bootDiskType": DISK_TYPE, "bootDiskSizeGb": DISK_SIZE }, // 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": { "timeout": TIMEOUT } }, "labels": { LABEL_NAME_1": LABEL_VALUE_1, LABEL_NAME_2": LABEL_VALUE_2 } }
如要傳送要求,請選擇以下其中一個選項:
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 相關資訊。
Java
在試用這個範例之前,請先按照 Vertex AI 快速入門:使用用戶端程式庫中的操作說明設定 Java。詳情請參閱 Vertex AI Java API 參考說明文件。
如要向 Vertex AI 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
在試用這個範例之前,請先按照 Vertex AI 快速入門:使用用戶端程式庫中的操作說明設定 Node.js。詳情請參閱 Vertex AI Node.js API 參考說明文件。
如要向 Vertex AI 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python 適用的 Vertex AI SDK
如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Vertex AI SDK for Python API 參考說明文件。
後續步驟
- 瞭解如何使用 Cloud Profiler,找出訓練效能瓶頸,以更快速且經濟實惠的方式訓練模型。
- 請參閱「建立訓練管道」,瞭解如何建立訓練管道,以便在 Vertex AI 中執行自訂訓練應用程式。
- 瞭解如何根據資源可用性排定自訂訓練工作。