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),
]