設計原型至實際工作環境:使用 Vertex AI 訓練自訂模型

1. 總覽

在本實驗室中,您將使用 Vertex AI 執行自訂訓練工作。

這個實驗室屬於「從原型設計到投入實際工作環境」系列影片。您將使用花卉資料集建立圖片分類模型。如要瞭解詳情,請觀看隨附的影片:

課程內容

學習重點:

  • 建立 Vertex AI Workbench 代管型筆記本
  • 透過 Vertex AI 使用者介面設定及啟動自訂訓練工作
  • 使用 Vertex AI Python SDK 設定及啟動自訂訓練工作

在 Google Cloud 中執行這個研究室的總費用約為 $1 美元。

2. Vertex AI 簡介

這個實驗室使用 Google Cloud 最新推出的 AI 產品服務。Vertex AI 將 Google Cloud 的機器學習產品整合為流暢的開發體驗。先前,使用 AutoML 訓練的模型和自訂模型必須透過不同的服務存取。這項新產品會與其他新產品一起合併為一個 API。您也可以將現有專案遷移至 Vertex AI。

Vertex AI 包含許多不同產品,可支援端對端機器學習工作流程。本研究室將著重於下列產品:訓練工作台

Vertex 產品總覽

3. 設定環境

您必須擁有啟用計費功能的 Google Cloud Platform 專案,才能執行這個程式碼研究室。如要建立專案,請按照這裡的操作說明進行。

步驟 1:啟用 Compute Engine API

前往「Compute Engine」,然後選取「啟用」 (如果尚未啟用)。

步驟 2:啟用 Artifact Registry API

前往「Artifact Registry」,然後選取「Enable」(如果尚未啟用)。您將使用這個檔案為自訂訓練工作建立容器。

步驟 3:啟用 Vertex AI API

前往 Cloud 控制台的 Vertex AI 專區,然後點選「啟用 Vertex AI API」

Vertex AI 資訊主頁

步驟 4:建立 Vertex AI Workbench 執行個體

在 Cloud 控制台的 Vertex AI 專區中,按一下 Workbench:

Vertex AI 選單

啟用 Notebooks API (如果尚未啟用)。

Notebook_api

啟用後,按一下「MANAGED NOTEBOOKS」

Notebooks_UI

然後選取「新增筆記本」

new_notebook

為筆記本命名,然後在「權限」下方選取「服務帳戶」

create_notebook

選取「進階設定」

選取「安全性」下方的 [啟用終端機] (如果尚未啟用)。

enable_terminal

您可以保留其他進階設定。

接著,按一下「建立」。佈建執行個體需要幾分鐘的時間。

建立執行個體後,請選取「OPEN JUPYTERLAB」

open_jupyterlab

4. 將訓練應用程式程式碼容器化

您可以將訓練應用程式程式碼放入 Docker 容器,然後將該容器推送至 Google Artifact Registry,藉此將訓練工作提交至 Vertex AI。您可以使用這種方法訓練任何架構建立的模型。

首先,請在 Launcher 選單中開啟筆記本執行個體的終端機視窗:

在筆記本中開啟終端機

步驟 1:建立 Cloud Storage 值區

在這項訓練工作中,您會將經過訓練的 TensorFlow 模型匯出至 Cloud Storage 值區。您也會將訓練資料儲存在 Cloud Storage 值區中。

在終端機中執行以下指令,為專案定義 env 變數,請務必將 your-cloud-project 替換為專案 ID:

PROJECT_ID='your-cloud-project'

接著,請在終端機中執行下列指令,在專案中建立新的值區。

BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET

步驟 2:將資料複製到 Cloud Storage 值區

我們需要將花卉資料集儲存至 Cloud Storage。為了示範,您會先將資料集下載到這個 Workbench 執行個體,然後再複製到值區。

下載並解壓縮資料。

wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz

然後複製到您剛建立的值區。我們加入 -r 是因為要複製整個目錄,而 -m 則是為了執行多重處理複製作業,加快作業速度。

gsutil -m cp -r flower_photos $BUCKET

步驟 3:編寫訓練程式碼

建立名為 flowers 的新目錄,並使用 cd 加入該目錄:

mkdir flowers
cd flowers

執行以下指令,為訓練程式碼建立目錄,並新增 Python 檔案。

mkdir trainer
touch trainer/task.py

flowers/ 目錄現在應該會包含以下內容:

+ trainer/
    + task.py

如要進一步瞭解如何建構訓練應用程式程式碼,請查看說明文件

接著,開啟剛才建立的 task.py 檔案,然後複製以下程式碼。

請將 {your-gcs-bucket} 替換為您剛建立的 Cloud Storage 值區名稱。

透過 Cloud Storage FUSE 工具,Vertex AI 訓練中的訓練工作可透過本機檔案系統中的檔案存取 Cloud Storage 資料。啟動自訂訓練工作時,工作會看到目錄 /gcs,其中包含所有 Cloud Storage 值區的子目錄。因此訓練程式碼中的資料路徑開頭為 /gcs

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''
  
  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

# TRAIN MODEL
history = model.fit(
  train_dataset,
  validation_data=validation_dataset,
  epochs=EPOCHS
)

# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')

步驟 4:建立 Dockerfile

如要將程式碼容器化,您需要建立 Dockerfile。您會在 Dockerfile 中加入執行映像檔所需的所有指令。其會安裝所有必要的程式庫,並設定訓練程式碼的進入點。

在終端機中,於花卉目錄的根目錄中建立空白的 Dockerfile:

touch Dockerfile

現在 flowers/ 目錄中應會顯示以下內容:

+ Dockerfile
+ trainer/
    + task.py

開啟 Dockerfile,並將下列內容複製到該檔案中:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.task"]

我們來看看這個檔案中的指令。

FROM 指令會指定基本映像檔,也就是您要建立的映像檔所建構的父項。您將使用 深度學習容器 TensorFlow Enterprise 2.8 GPU Docker 映像檔做為基礎映像檔。Google Cloud 的深度學習容器預先安裝許多常見的機器學習和數據資料學架構。

WORKDIR 指令會指定後續指令要在映像檔上的哪個目錄執行。

COPY 指令會將訓練程式碼複製到 Docker 映像檔。請注意,在本範例中,訓練器目錄中只有一個 Python 檔案,但在更貼近實際情況的範例中,您可能會有其他檔案。也許是 data.py,負責處理資料預先處理,而名為 model.py 則只有模型程式碼等。如需更複雜的訓練程式碼,請參閱封裝 Python 專案的 Python 文件。

如果您想新增任何其他程式庫,可以使用 RUN 指令來安裝 pip (例如 RUN pip install -r requirements.txt)。不過,在本例中,我們不需要任何其他項目。

最後,ENTRYPOINT 指令會設定進入點來叫用訓練程式。這就是我們開始訓練工作時會執行的內容。我們無法順利執行 task.py 檔案。

如要進一步瞭解如何為 Vertex AI Training 編寫 Dockerfile,請參閱這篇文章

步驟 4:建構容器

在 Workbench 活頁的終端機中執行下列指令,為專案定義 env 變數,並務必將 your-cloud-project 替換為專案的 ID:

PROJECT_ID='your-cloud-project'

在 Artifact Registry 中建立存放區

REPO_NAME='flower-app'

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"

在 Google Artifact Registry 中,使用容器映像檔的 URI 定義變數:

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest

設定 Docker

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

接著,從 flower 目錄根層級執行下列指令,建構容器:

docker build ./ -t $IMAGE_URI

最後,將其推送至 Artifact Registry:

docker push $IMAGE_URI

將容器推送至 Artifact Registry 後,您就可以開始訓練工作。

5. 在 Vertex AI 上執行自訂訓練工作

本實驗室使用 Google Artifact Registry 中的自訂容器進行自訂訓練,但您也可以使用預先建構的容器執行訓練工作。

首先,請前往 Cloud 控制台的 Vertex 專區,然後前往「訓練」專區:

訓練選單

步驟 1:設定訓練工作

按一下「建立」,輸入訓練工作參數。

create_training

  • 在「Dataset」下方,選取「No managed dataset」
  • 接著選取「Custom training (advanced)」(自訂訓練 (進階))做為訓練方法,然後按一下「Continue」
  • 選取「訓練新模型」,然後在「模型名稱」中輸入 flowers-model (或您要命名的模型名稱)
  • 按一下 [Continue] (繼續)

在「容器設定」步驟中,選取「自訂容器」

自訂容器選項

在第一個方塊 (容器映像檔) 中,輸入上一節的 IMAGE_URI 變數值。應為:us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest,並使用您自己的專案 ID。將其餘欄位留空,然後按一下「Continue」

再次按一下「繼續」,略過「超參數」步驟。

步驟 2:設定運算叢集

如以下所示設定「Worker pool 0」

worker_pool_0

您現在可以略過步驟 6,並在本系列的下一個實驗室中設定預測容器。

按一下「START TRAINING」,即可啟動訓練工作。在控制台的「訓練」部分,您會在「訓練管道」分頁下方看到新啟動的工作:

訓練工作

🎉 恭喜!🎉

您已瞭解如何使用 Vertex AI 執行下列作業:

  • 針對自訂容器中提供的訓練程式碼啟動自訂訓練工作。您在本例中使用 TensorFlow 模型,但您可以使用自訂或內建容器,訓練使用任何架構建構的模型。

如要進一步瞭解 Vertex 的其他部分,請參閱說明文件

6. [選用] 使用 Vertex AI Python SDK

上一節說明如何透過使用者介面啟動訓練工作。在本節中,您將瞭解使用 Vertex AI Python SDK 提交訓練工作的其他方法。

返回筆記本執行個體,然後透過啟動工具建立 TensorFlow 2 筆記本:

new_notebook

匯入 Vertex AI SDK。

from google.cloud import aiplatform

接著建立 CustomContainerTrainingJob。您必須將 container_uri 中的 {PROJECT_ID} 替換為專案名稱,並將 staging_bucket 中的 {BUCKET} 替換為您先前建立的值區。

my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
                                               container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
                                               staging_bucket='gs://{BUCKET}')

接著,執行工作。

my_job.run(replica_count=1,
           machine_type='n1-standard-8',
           accelerator_type='NVIDIA_TESLA_V100',
           accelerator_count=1)

為了示範,這項工作已設定為在比前一節中更大的機器上執行。此外,我們會使用 GPU 執行。如果您未指定 machine-typeaccelerator_typeaccelerator_count,系統會預設在 n1-standard-4 上執行工作。

您可以在控制台的「訓練」部分的「自訂工作」分頁下方,查看訓練工作。

7. 清理

Vertex AI Workbench 代管的筆記本有閒置的關閉功能,因此我們不必擔心如何關閉執行個體。如果您想手動關閉執行個體,請按一下控制台 Vertex AI Workbench 專區中的「停止」按鈕。如想完全刪除筆記本,請按一下「刪除」按鈕。

停止執行個體

如要刪除 Storage 值區,請使用 Cloud 控制台中的導覽選單前往「Storage」(儲存空間)、選取值區,然後點選「Delete」(刪除):

刪除儲存空間