학습 스크립트 만들기

커스텀 모델을 만들려면 커스텀 모델을 만들고 학습시키는 Python 학습 스크립트가 필요합니다. Python 학습 스크립트로 학습 작업을 초기화한 후 학습 작업의 run 메서드를 호출하여 스크립트를 실행합니다.

이 주제에서는 학습 스크립트를 만든 후 학습 스크립트의 명령어 인수를 지정합니다.

학습 스크립트 만들기

이 섹션에서는 학습 스크립트를 만듭니다. 이 스크립트는 task.py라는 노트북 환경에 있는 새 파일입니다. 이 튜토리얼의 뒷부분에서 이 스크립트를 aiplatform.CustomTrainingJob 생성자에 전달합니다. 스크립트가 실행되면 다음을 수행합니다.

  • 생성한 BigQuery 데이터 세트에 데이터를 로드합니다.

  • TensorFlow Keras API를 사용하여 모델을 빌드, 컴파일, 학습시킵니다.

  • Keras Model.fit 메서드가 호출될 때 사용할 에포크 수와 배치 크기를 지정합니다.

  • AIP_MODEL_DIR 환경 변수를 사용하여 모델 아티팩트를 저장할 위치를 지정합니다. AIP_MODEL_DIR은 Vertex AI에서 설정되며 모델 아티팩트를 저장하기 위한 디렉터리의 URI를 포함합니다. 자세한 내용은 특수한 Cloud Storage 디렉터리의 환경 변수를 참조하세요.

  • TensorFlow SavedModel을 모델 디렉터리로 내보냅니다. 자세한 내용은 TensorFlow 웹사이트의 SavedModel 형식 사용을 참조하세요.

학습 스크립트를 만들려면 노트북에서 다음 코드를 실행합니다.

%%writefile task.py

import argparse
import numpy as np
import os

import pandas as pd
import tensorflow as tf

from google.cloud import bigquery
from google.cloud import storage

# Read environmental variables
training_data_uri = os.getenv("AIP_TRAINING_DATA_URI")
validation_data_uri = os.getenv("AIP_VALIDATION_DATA_URI")
test_data_uri = os.getenv("AIP_TEST_DATA_URI")

# Read args
parser = argparse.ArgumentParser()
parser.add_argument('--label_column', required=True, type=str)
parser.add_argument('--epochs', default=10, type=int)
parser.add_argument('--batch_size', default=10, type=int)
args = parser.parse_args()

# Set up training variables
LABEL_COLUMN = args.label_column

# See https://cloud.google.com/vertex-ai/docs/workbench/managed/executor#explicit-project-selection for issues regarding permissions.
PROJECT_NUMBER = os.environ["CLOUD_ML_PROJECT_ID"]
bq_client = bigquery.Client(project=PROJECT_NUMBER)

# Download a table
def download_table(bq_table_uri: str):
    # Remove bq:// prefix if present
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix) :]

    # Download the BigQuery table as a dataframe
    # This requires the "BigQuery Read Session User" role on the custom training service account.
    table = bq_client.get_table(bq_table_uri)
    return bq_client.list_rows(table).to_dataframe()

# Download dataset splits
df_train = download_table(training_data_uri)
df_validation = download_table(validation_data_uri)
df_test = download_table(test_data_uri)

def convert_dataframe_to_dataset(
    df_train: pd.DataFrame,
    df_validation: pd.DataFrame,
):
    df_train_x, df_train_y = df_train, df_train.pop(LABEL_COLUMN)
    df_validation_x, df_validation_y = df_validation, df_validation.pop(LABEL_COLUMN)

    y_train = tf.convert_to_tensor(np.asarray(df_train_y).astype("float32"))
    y_validation = tf.convert_to_tensor(np.asarray(df_validation_y).astype("float32"))

    # Convert to numpy representation
    x_train = tf.convert_to_tensor(np.asarray(df_train_x).astype("float32"))
    x_test = tf.convert_to_tensor(np.asarray(df_validation_x).astype("float32"))

    # Convert to one-hot representation
    num_species = len(df_train_y.unique())
    y_train = tf.keras.utils.to_categorical(y_train, num_classes=num_species)
    y_validation = tf.keras.utils.to_categorical(y_validation, num_classes=num_species)

    dataset_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    dataset_validation = tf.data.Dataset.from_tensor_slices((x_test, y_validation))
    return (dataset_train, dataset_validation)

# Create datasets
dataset_train, dataset_validation = convert_dataframe_to_dataset(df_train, df_validation)

# Shuffle train set
dataset_train = dataset_train.shuffle(len(df_train))

def create_model(num_features):
    # Create model
    Dense = tf.keras.layers.Dense
    model = tf.keras.Sequential(
        [
            Dense(
                100,
                activation=tf.nn.relu,
                kernel_initializer="uniform",
                input_dim=num_features,
            ),
            Dense(75, activation=tf.nn.relu),
            Dense(50, activation=tf.nn.relu),
            Dense(25, activation=tf.nn.relu),
            Dense(3, activation=tf.nn.softmax),
        ]
    )

    # Compile Keras model
    optimizer = tf.keras.optimizers.RMSprop(lr=0.001)
    model.compile(
        loss="categorical_crossentropy", metrics=["accuracy"], optimizer=optimizer
    )

    return model

# Create the model
model = create_model(num_features=dataset_train._flat_shapes[0].dims[0].value)

# Set up datasets
dataset_train = dataset_train.batch(args.batch_size)
dataset_validation = dataset_validation.batch(args.batch_size)

# Train the model
model.fit(dataset_train, epochs=args.epochs, validation_data=dataset_validation)

tf.saved_model.save(model, os.getenv("AIP_MODEL_DIR"))

스크립트를 만들면 노트북의 루트 폴더에 표시됩니다.

학습 스크립트 보기

학습 스크립트의 인수 정의

학습 스크립트에 다음 명령줄 인수를 전달합니다.

  • label_column - 데이터에서 예측하려는 항목이 포함된 열을 식별합니다. 이 경우 해당 열은 species입니다. 데이터를 처리할 때 LABEL_COLUMN이라는 변수에 이를 정의했습니다. 자세한 내용은 데이터 다운로드, 사전 처리, 분할을 참조하세요.

  • epochs - 모델을 학습시킬 때 사용되는 에포크 수입니다. 에포크는 모델을 학습시킬 때 데이터에 대한 반복입니다. 이 튜토리얼에서는 에포크 20개를 사용합니다.

  • batch_size - 모델을 업데이트하기 전에 처리되는 샘플 수입니다. 이 튜토리얼에서는 배치 크기 10을 사용합니다.

스크립트에 전달되는 인수를 정의하려면 다음 코드를 실행합니다.

JOB_NAME = "custom_job_unique"

EPOCHS = 20
BATCH_SIZE = 10

CMDARGS = [
    "--label_column=" + LABEL_COLUMN,
    "--epochs=" + str(EPOCHS),
    "--batch_size=" + str(BATCH_SIZE),
]