在本機進行容器化及執行訓練程式碼

您可以使用 gcloud ai custom-jobs local-run 指令,根據訓練程式碼建構 Docker 容器映像檔,並在本機電腦上以容器形式執行映像檔。這項功能有以下幾個好處:

  • 您只需具備最少的 Docker 知識,就能建構容器映像檔。您不需要自行編寫 Dockerfile。您之後可以將這個映像檔推送至 Artifact Registry,並用於自訂容器訓練

    對於進階用途,您可能還是想自行編寫 Dockerfile

  • 容器映像檔可執行 Python 訓練應用程式或 Bash 指令碼。

    您可以使用 Bash 指令碼執行以其他程式設計語言編寫的訓練程式碼 (只要您也指定支援其他語言的基本容器映像檔即可)。

  • 在本機執行容器時,訓練程式碼的執行方式與在 Vertex AI 上執行的方式類似。

    在本機上執行程式碼,有助於您在 Vertex AI 上執行自訂訓練前,先對程式碼進行偵錯。

事前準備

  1. 設定 Vertex AI 開發環境。

  2. 安裝 Docker Engine

  3. 如果您使用的是 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 依附元件或任意檔案:

安裝其他 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 搭配運作,這項選項就很實用。請執行下列步驟:

  1. 在本機電腦上安裝 NVIDIA Container Toolkit (nvidia-docker) (如果尚未安裝)。

  2. 執行 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 提供的憑證,請執行下列操作:

  1. 建立或選取服務帳戶,並設定訓練程式碼應具備的權限。

  2. 將此服務帳戶的服務帳戶金鑰下載至本機電腦。

  3. 執行 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 自訂程式碼服務代理身分進行驗證,但可以建立具有類似權限的服務帳戶,並在本機使用該帳戶。

後續步驟