יצירת סקריפט הדרכה

כדי ליצור מודל בהתאמה אישית, צריך סקריפט אימון ב-Python שיוצר ומאמן את המודל בהתאמה אישית. מאתחלים את משימת האימון באמצעות סקריפט האימון של Python, ואז מפעילים את השיטה run של משימת האימון כדי להריץ את הסקריפט.

בנושא הזה, יוצרים את סקריפט ההדרכה ואז מציינים את ארגומנטי הפקודה עבור סקריפט ההדרכה.

יצירת סקריפט הדרכה

בקטע הזה יוצרים סקריפט הדרכה. הסקריפט הזה הוא קובץ חדש בסביבת המחברת שלכם בשם task.py. בהמשך המדריך הזה, מעבירים את הסקריפט הזה לבונה aiplatform.CustomTrainingJob. כשמריצים את הסקריפט, הוא מבצע את הפעולות הבאות:

  • הנתונים נטענים במערך הנתונים שיצרתם ב-BigQuery.

  • משתמש ב-TensorFlow Keras API כדי ליצור, לקמפל ולאמן את המודל.

  • ההגדרה הזו מציינת את מספר האפוקים ואת גודל האצווה שבהם יש להשתמש כשמפעילים את השיטה Keras Model.fit.

  • מציינים איפה לשמור את פריטי המידע שנוצרו בתהליך פיתוח (Artifact) של המודל באמצעות משתנה הסביבה AIP_MODEL_DIR. ‫AIP_MODEL_DIR מוגדר על ידי Vertex AI ומכיל את ה-URI של ספרייה לשמירת ארטיפקטים של מודלים. מידע נוסף זמין במאמר בנושא משתני סביבה לספריות מיוחדות ב-Cloud Storage.

  • מייצאים TensorFlow SavedModel לספריית המודל. מידע נוסף זמין במאמר שימוש בפורמט SavedModel באתר TensorFlow.

כדי ליצור את סקריפט האימון, מריצים את הקוד הבא במחברת:

%%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 – זהו מספר התקופות של זמן המערכת שבהן נעשה שימוש כשמאמנים את המודל. תקופה של זמן מערכת (epoch) היא איטרציה על הנתונים במהלך אימון המודל. במדריך הזה משתמשים ב-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),
]