您可以使用 gcloud ai custom-jobs local-run
指令,根據訓練程式碼建構 Docker 容器映像檔,並在本機電腦上以容器形式執行映像檔。這項功能有以下幾個好處:
您只需具備最少的 Docker 知識,就能建構容器映像檔。您不需要自行編寫 Dockerfile。您之後可以將這個映像檔推送至 Artifact Registry,並用於自訂容器訓練。
對於進階用途,您可能還是想自行編寫 Dockerfile。
容器映像檔可執行 Python 訓練應用程式或 Bash 指令碼。
您可以使用 Bash 指令碼執行以其他程式設計語言編寫的訓練程式碼 (只要您也指定支援其他語言的基本容器映像檔即可)。
在本機執行容器時,訓練程式碼的執行方式與在 Vertex AI 上執行的方式類似。
在本機上執行程式碼,有助於您在 Vertex AI 上執行自訂訓練前,先對程式碼進行偵錯。
事前準備
如果您使用的是 Linux,請設定 Docker,以便在沒有
sudo
的情況下執行 Docker。local-run
指令必須進行這項設定,才能使用 Docker。
使用 local-run
指令
執行下列指令,根據訓練程式碼建構容器映像檔,並在本機執行容器:
gcloud ai custom-jobs local-run \
--executor-image-uri=BASE_IMAGE_URI \
--local-package-path=WORKING_DIRECTORY \
--script=SCRIPT_PATH \
--output-image-uri=OUTPUT_IMAGE_NAME
更改下列內容:
BASE_IMAGE_URI:要用於容器基礎的 Docker 映像檔 URI。請選擇基本映像檔,其中包含訓練程式碼所需的依附元件。
您可以使用預先建構的訓練容器映像檔的 URI,或任何其他適用於 Dockerfile
FROM
指令的有效值,例如公開提供的 Docker 映像檔,或是您有權存取的 Artifact Registry 中的 Docker 映像檔。WORKING_DIRECTORY:檔案系統中位於最底層的目錄,其中包含所有訓練程式碼和本機依附元件,您需要這些元件才能進行訓練。
根據預設,這項指令只會將
--script
標記 (請參閱下列清單項目) 指定的檔案父目錄複製到產生的 Docker 映像檔中。Docker 映像檔不一定會納入 WORKING_DIRECTORY 中的所有檔案;如要自訂要納入哪些檔案,請參閱本文件中有關納入依附元件的部分。如果您省略
--local-package-path
旗標 (和這個預留位置),local-run
指令會使用這個值的目前工作目錄。SCRIPT_PATH:相對於本機檔案系統中的 WORKING_DIRECTORY 路徑,指向訓練程式碼的進入點指令碼。這個檔案可以是 Python 指令碼 (結尾為
.py
) 或 Bash 指令碼。舉例來說,如果您要執行
/hello-world/trainer/task.py
,而 WORKING_DIRECTORY 為/hello-world
,請使用trainer/task.py
做為這個值。如果您指定 Python 指令碼,則基本映像檔必須安裝 Python;如果您指定 Bash 指令碼,則基本映像檔必須安裝 Bash。(所有預先建構的訓練容器和許多其他公開可用的 Docker 映像檔都包含這兩種依附元件)。
使用
--python-module
取代--script
如果您省略
--script
標記 (和 SCRIPT_PATH),則必須改用--python-module
標記,在 WORKING_DIRECTORY 中指定 Python 模組的名稱,以便做為訓練的進入點。例如,您可以指定--python-module=trainer.task
,而非--script=trainer/task.py
。在這種情況下,產生的 Docker 容器會以模組形式載入程式碼,而非以指令碼形式載入。如果進入點指令碼會在 WORKING_DIRECTORY 中匯入其他 Python 模組,您可能會想使用這個選項。
OUTPUT_IMAGE_NAME:由指令建構的結果 Docker 映像檔名稱。您可以使用
docker build
的-t
標記所接受的任何值。如果您日後打算將映像檔推送至 Artifact Registry,建議您使用符合 Artifact Registry 規定的映像檔名稱。(您也可以稍後再為圖片加上其他名稱)。
如果您省略
--output-image-uri
標記 (和這個預留位置),local-run
指令會根據目前時間和進入點指令碼的檔案名稱,為圖片加上名稱。
這個指令會根據您的設定建構 Docker 容器映像檔。建構映像檔後,指令會列印下列輸出內容:
A training image is built.
Starting to run ...
然後,指令會立即使用這個容器映像檔,在本機電腦上執行容器。容器結束時,指令會列印下列輸出內容:
A local run is finished successfully using custom image: OUTPUT_IMAGE_NAME
其他選項
以下各節將說明您可以用來自訂 local-run
指令行為的其他選項。
安裝依附元件
訓練程式碼可以依賴在基礎映像檔上安裝的任何依附元件 (例如預先建構的訓練容器映像檔包含許多機器學習 Python 程式庫),以及您在 local-run
指令建立的 Docker 映像檔中納入的任何檔案。
使用 --script
旗標或 --python-module
旗標指定指令碼時,指令會將指令碼的父目錄 (及其子目錄) 複製到 Docker 映像檔。舉例來說,如果您指定 --local-package-path=/hello-world
和 --script=trainer/task.py
,則指令會將 /hello-world/trainer/
複製到 Docker 映像檔。
您也可以完成下列任一章節所述的額外步驟,從檔案系統中加入其他 Python 依附元件或任意檔案:
- 使用
requirements.txt
檔案為 Python 依附元件 - 使用
setup.py
檔案為 Python 依附元件 - 指定個別 PyPI 依附元件
- 指定本機 Python 依附元件
- 加入其他檔案
安裝其他 Python 依附元件
您可以透過多種方式在 Docker 映像檔中納入其他 Python 依附元件:
使用 requirements.txt
檔案
如果工作目錄中含有名為 requirements.txt
的檔案,local-run
指令會將其視為 pip 需求檔案,並使用該檔案在 Docker 映像檔中安裝 Python 依附元件。
使用 setup.py
檔案
如果工作目錄中有名為 setup.py
的檔案,local-run
指令會將其視為 Python setup.py
檔案,將檔案複製到 Docker 映像檔,然後在 Docker 映像檔中包含此檔案的目錄上執行 pip install
。
舉例來說,您可以將 install_requires
引數新增至 setup.py
,以便在 Docker 映像檔中安裝 Python 依附元件。
指定個別 PyPI 依附元件
您可以使用 --requirements
標記,在 Docker 映像檔中從 PyPI 安裝特定依附元件。例如:
gcloud ai custom-jobs local-run \
--executor-image-uri=BASE_IMAGE_URI \
--local-package-path=WORKING_DIRECTORY \
--script=SCRIPT_PATH \
--output-image-uri=OUTPUT_IMAGE_NAME \
--requirements=REQUIREMENTS
將 REQUIREMENTS 替換為以半形逗號分隔的 Python 需求指定符清單。
指定其他本機 Python 依附元件
您可以使用 --extra-packages
標記安裝特定本機 Python 依附元件。這些 Python 依附元件必須位於工作目錄中,且每個依附元件的格式必須為 pip install
支援的格式,例如 wheel 檔案或 Python 來源發布版本。
例如:
gcloud ai custom-jobs local-run \
--executor-image-uri=BASE_IMAGE_URI \
--local-package-path=WORKING_DIRECTORY \
--script=SCRIPT_PATH \
--output-image-uri=OUTPUT_IMAGE_NAME \
--extra-packages=LOCAL_DEPENDENCIES
將 LOCAL_DEPENDENCIES 替換為以半形逗號分隔的本機檔案路徑清單,並以工作目錄為基準。
加入其他檔案
如要將其他目錄複製到 Docker 映像檔 (不必將這些目錄安裝為 Python 依附元件),您可以使用 --extra-dirs
旗標。您只能指定工作目錄下的目錄。例如:
gcloud ai custom-jobs local-run \
--executor-image-uri=BASE_IMAGE_URI \
--local-package-path=WORKING_DIRECTORY \
--script=SCRIPT_PATH \
--output-image-uri=OUTPUT_IMAGE_NAME \
--extra-dirs=EXTRA_DIRECTORIES
將 EXTRA_DIRECTORIES 替換為以半形逗號分隔的本機目錄清單,並以工作目錄為基準。
訓練應用程式引數
如果訓練應用程式的進入點指令碼需要指令列引數,您可以在執行 local-run
指令時指定這些引數。這些引數不會儲存在 Docker 映像檔中,而是在映像檔以容器執行時,以引數的形式傳遞。
如要將引數傳遞至進入點指令碼,請在所有指令的其他旗標之後,將 --
引數和指令碼的引數傳遞至 local-run
指令。
舉例來說,假設您在本機執行以下指令碼:
python /hello-world/trainer/task.py \
--learning_rate=0.1 \
--input_data=gs://BUCKET/small-dataset/
使用 local-run
指令時,您可以使用下列旗標,在容器中執行具有相同引數的指令碼:
gcloud ai custom-jobs local-run \\
--executor-image-uri=BASE_IMAGE_URI \
--local-package-path=/hello-world \
--script=/trainer/task.py \
--output-image-uri=OUTPUT_IMAGE_NAME \
-- \
--learning_rate=0.1 \
--input_data=gs://BUCKET/small-dataset/
使用 GPU 加速模型訓練
如果您想最終將 local-run
指令建立的 Docker 映像檔部署至 Vertex AI,並使用 GPU 進行訓練,請務必撰寫可充分利用 GPU 的訓練程式碼,並使用支援 GPU 的 Docker 映像檔做為 --executor-image-uri
標記的值。舉例來說,您可以使用支援 GPU 的預建訓練容器映像檔。
如果本機電腦執行的是 Linux 且有 GPU,您也可以設定 local-run
指令,讓指令在本機執行容器時使用 GPU。這項選項可選,但如果您想測試訓練程式碼如何與 GPU 搭配運作,這項選項就很實用。請執行下列步驟:
執行
local-run
指令時,請指定--gpu
旗標。例如:gcloud ai custom-jobs local-run \ --executor-image-uri=BASE_IMAGE_URI \ --local-package-path=WORKING_DIRECTORY \ --script=SCRIPT_PATH \ --output-image-uri=OUTPUT_IMAGE_NAME \ --gpu
指定自訂服務帳戶
根據預設,當 local-run
指令在本機容器中執行訓練程式碼時,會透過應用程式預設憑證 (ADC) 將本機環境中提供的 Google Cloud 憑證掛載到容器中,以便訓練程式碼使用 ADC 進行驗證,並使用相同的憑證。也就是說,當您執行 local-run
指令時,ADC 會將本機殼層中可用的憑證提供給您的程式碼。
您可以使用 gcloud auth application-default login
指令,為 ADC 使用您的使用者帳戶,也可以在殼層中設定環境變數,為 ADC 使用服務帳戶。
如果您希望容器使用 Google Cloud 憑證執行,而非在本機 Shell 中由 ADC 提供的憑證,請執行下列操作:
建立或選取服務帳戶,並設定訓練程式碼應具備的權限。
將此服務帳戶的服務帳戶金鑰下載至本機電腦。
執行
local-run
指令時,請指定--service-account-key-file
標記。例如:gcloud ai custom-jobs local-run \ --executor-image-uri=BASE_IMAGE_URI \ --local-package-path=WORKING_DIRECTORY \ --script=SCRIPT_PATH \ --output-image-uri=OUTPUT_IMAGE_NAME \ --service-account-key-file=KEY_PATH
將 KEY_PATH 替換為本機檔案系統中服務帳戶金鑰的路徑。此路徑必須以殼層目前的工作目錄為基準,不得以
--local-package-path
標記指定的目錄為基準。
在產生的容器中,訓練程式碼可以使用 ADC 驗證指定的服務帳戶憑證。
與在 Vertex AI 上訓練的比較
在 Vertex AI 中執行自訂訓練工作時,Vertex AI 預設會使用 專案的 Vertex AI 自訂程式碼服務代理來執行程式碼。您也可以附加其他服務帳戶,以便進行自訂訓練。
使用 local-run
指令時,您無法以 Vertex AI 自訂程式碼服務代理身分進行驗證,但可以建立具有類似權限的服務帳戶,並在本機使用該帳戶。