run
des Trainingsjobs auf, um das Skript auszuführen.
In diesem Thema erstellen Sie das Trainingsskript und geben dann Befehlsargumente für Ihr Trainingsskript an.
Trainingsskript erstellen
In diesem Abschnitt erstellen Sie ein Trainingsskript. Dieses Skript ist eine neue Datei mit dem Namen task.py
in Ihrer Notebookumgebung. Später in dieser Anleitung übergeben Sie dieses Skript an den Konstruktor aiplatform.CustomTrainingJob
. Das Skript führt folgende Schritte aus:
Lädt die Daten in das von Ihnen erstellte BigQuery-Dataset.
Verwendet die TensorFlow Keras API zum Erstellen, Kompilieren und Trainieren Ihres Modells.
Gibt die Anzahl der Epochen und die Batchgröße an, die beim Aufrufen der Keras-Methode
Model.fit
verwendet werden soll.Gibt an, wo Modellartefakte mit der Umgebungsvariable
AIP_MODEL_DIR
gespeichert werden.AIP_MODEL_DIR
wird von Vertex AI festgelegt und enthält den URI eines Verzeichnisses zum Speichern von Modellartefakten. Weitere Informationen finden Sie unter Umgebungsvariablen für spezielle Cloud Storage-Verzeichnisse.Exportiert eine TensorFlow-
SavedModel
in das Modellverzeichnis. Weitere Informationen finden Sie auf der TensorFlow-Website unterSavedModel
-Format verwenden.
Führen Sie den folgenden Code in Ihrem Notebook aus, um das Trainingsskript zu erstellen:
%%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"))
Nachdem Sie das Skript erstellt haben, wird es im Stammverzeichnis Ihres Notebooks angezeigt:
Argumente für Ihr Trainingsskript definieren
Sie übergeben die folgenden Befehlszeilenargumente an Ihr Trainingsskript:
label_column
– Hiermit wird die Spalte in Ihren Daten identifiziert, die das vorherzusagende Element enthält. In diesem Fall lautet diese Spaltespecies
. Sie haben dies bei der Verarbeitung Ihrer Daten in einer Variablen mit dem NamenLABEL_COLUMN
definiert. Weitere Informationen finden Sie unter Daten herunterladen, vorverarbeiten und aufteilen.epochs
– Dies ist die Anzahl der Epochen, die beim Trainieren Ihres Modells verwendet werden. Eine Epoche ist eine Iteration über die Daten beim Training Ihres Modells. Diese Anleitung umfasst 20 Epochen.batch_size
– Die Anzahl der Stichproben, die vor der Aktualisierung Ihres Modells verarbeitet werden. In dieser Anleitung wird eine Batchgröße von 10 verwendet.
Führen Sie den folgenden Code aus, um die Argumente zu definieren, die an Ihr Skript übergeben werden:
JOB_NAME = "custom_job_unique"
EPOCHS = 20
BATCH_SIZE = 10
CMDARGS = [
"--label_column=" + LABEL_COLUMN,
"--epochs=" + str(EPOCHS),
"--batch_size=" + str(BATCH_SIZE),
]