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

您可以使用 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

舉例來說,您可以在 setup.py 中新增 install_requires 引數,以便在 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 可在程式碼中使用 ADC 在本機殼層中提供的憑證。

您可以使用 gcloud auth application-default login 指令,透過使用者帳戶使用 ADC,也可以在殼層中設定環境變數,透過服務帳戶使用 ADC

如要讓容器使用 Google Cloud 憑證 (而非本機殼層中 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 自訂程式碼服務代理身分進行驗證,但可以建立具有類似權限的服務帳戶,並在本地使用。

後續步驟