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

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

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

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

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

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

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

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

  • המשתנה AIP_MODEL_DIR בסביבה מציין איפה לשמור את פריטי המודל. ‫AIP_MODEL_DIR מוגדר על ידי Gemini Enterprise Agent Platform ומכיל את ה-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/gemini-enterprise-agent-platform/machine-learning/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),
]