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")) 建立指令碼後,指令碼會顯示在 Notebook 的根目錄中:
定義訓練指令碼的引數
您可以將下列指令列引數傳遞至訓練指令碼:
label_column:此欄會標示資料中包含您要預測的項目。在本例中,該欄為species。您在處理資料時,已在名為LABEL_COLUMN的變數中定義此值。詳情請參閱「下載、預先處理及分割資料」。epochs:訓練模型時使用的週期數。週期是指訓練模型時對資料進行的疊代。本教學課程使用 20 個 epoch。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), ]