Menyesuaikan model yang luas dan mendalam menggunakan Google Cloud

Lihat di TensorFlow.org Jalankan di Google Colab Lihat di GitHub Unduh buku catatan Logo KaggleJalankan di Kaggle

Dalam contoh ini kita akan menggunakan CloudTuner dan Google Cloud untuk Menyesuaikan Model Lebar dan Mendalam berdasarkan model merdu yang diperkenalkan dalam pembelajaran data terstruktur dengan jaringan Lebar, Dalam, dan Lintas . Dalam contoh ini kita akan menggunakan kumpulan data dari CAIIS Dogfood Day

Impor modul yang diperlukan

import datetime
import uuid

import numpy as np
import pandas as pd
import tensorflow as tf
import os
import sys
import subprocess

from tensorflow.keras import datasets, layers, models
from sklearn.model_selection import train_test_split

# Install the latest version of tensorflow_cloud and other required packages.
if os.environ.get("TF_KERAS_RUNNING_REMOTELY", True):
    subprocess.run(
        ['python3', '-m', 'pip', 'install', 'tensorflow-cloud', '-q'])
    subprocess.run(
        ['python3', '-m', 'pip', 'install', 'google-cloud-storage', '-q'])
    subprocess.run(
        ['python3', '-m', 'pip', 'install', 'fsspec', '-q'])
    subprocess.run(
        ['python3', '-m', 'pip', 'install', 'gcsfs', '-q'])

import tensorflow_cloud as tfc
print(tfc.__version__)
0.1.15
tf.version.VERSION
'2.6.0'

Konfigurasi Proyek

Menetapkan parameter proyek. Untuk detail selengkapnya tentang Parameter khusus Google Cloud, lihat Petunjuk Penyiapan Proyek Google Cloud .

# Set Google Cloud Specific parameters

# TODO: Please set GCP_PROJECT_ID to your own Google Cloud project ID.
GCP_PROJECT_ID = 'YOUR_PROJECT_ID' 

# TODO: Change the Service Account Name to your own Service Account
SERVICE_ACCOUNT_NAME = 'YOUR_SERVICE_ACCOUNT_NAME'
SERVICE_ACCOUNT = f'{SERVICE_ACCOUNT_NAME}@{GCP_PROJECT_ID}.iam.gserviceaccount.com'

# TODO: set GCS_BUCKET to your own Google Cloud Storage (GCS) bucket.
GCS_BUCKET = 'YOUR_GCS_BUCKET_NAME'

# DO NOT CHANGE: Currently only the 'us-central1' region is supported.
REGION = 'us-central1'
# Set Tuning Specific parameters

# OPTIONAL: You can change the job name to any string.
JOB_NAME = 'wide_and_deep'

# OPTIONAL: Set Number of concurrent tuning jobs that you would like to run.
NUM_JOBS = 5

# TODO: Set the study ID for this run. Study_ID can be any unique string.
# Reusing the same Study_ID will cause the Tuner to continue tuning the
# Same Study parameters. This can be used to continue on a terminated job,
# or load stats from a previous study.
STUDY_NUMBER = '00001'
STUDY_ID = f'{GCP_PROJECT_ID}_{JOB_NAME}_{STUDY_NUMBER}'

# Setting location were training logs and checkpoints will be stored
GCS_BASE_PATH = f'gs://{GCS_BUCKET}/{JOB_NAME}/{STUDY_ID}'
TENSORBOARD_LOGS_DIR = os.path.join(GCS_BASE_PATH,"logs")

Mengautentikasi notebook untuk menggunakan Proyek Google Cloud Anda

Untuk Kaggle Notebooks, klik "Add-on"->"Google Cloud SDK" sebelum menjalankan sel di bawah.

# Using tfc.remote() to ensure this code only runs in notebook
if not tfc.remote():

    # Authentication for Kaggle Notebooks
    if "kaggle_secrets" in sys.modules:
        from kaggle_secrets import UserSecretsClient
        UserSecretsClient().set_gcloud_credentials(project=GCP_PROJECT_ID)

    # Authentication for Colab Notebooks
    if "google.colab" in sys.modules:
        from google.colab import auth
        auth.authenticate_user()
        os.environ["GOOGLE_CLOUD_PROJECT"] = GCP_PROJECT_ID

Muat datanya

Membaca data mentah dan membaginya untuk melatih dan menguji kumpulan data. Untuk langkah ini, Anda perlu menyalin set data ke bucket GCS agar dapat diakses selama pelatihan. Untuk contoh ini kami menggunakan kumpulan data dari https://www.kaggle.com/c/caiis-dogfood-day-2020

Untuk melakukannya, Anda dapat menjalankan perintah berikut untuk mendownload dan menyalin kumpulan data ke bucket GCS Anda, atau mendownload kumpulan data secara manual melalui Kaggle UI dan mengunggah file train.csv ke bucket GCS Anda melalui GCS UI .

# Download the dataset
kaggle competitions download -c caiis-dogfood-day-2020

# Copy the training file to your bucket
gsutil cp ./caiis-dogfood-day-2020/train.csv $GCS_BASE_PATH/caiis-dogfood-day-2020/train.csv
train_URL = f'{GCS_BASE_PATH}/caiis-dogfood-day-2020/train.csv'
data = pd.read_csv(train_URL)
train, test = train_test_split(data, test_size=0.1)
# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(df, shuffle=True, batch_size=32):
  df = df.copy()
  labels = df.pop('target')
  ds = tf.data.Dataset.from_tensor_slices((dict(df), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(df))
  ds = ds.batch(batch_size)
  return ds
sm_batch_size = 1000  # A small batch size is used for demonstration purposes
train_ds = df_to_dataset(train, batch_size=sm_batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=sm_batch_size)

Memproses data terlebih dahulu

Menyiapkan lapisan prapemrosesan untuk data masukan kategorikal dan numerik. Untuk rincian lebih lanjut tentang lapisan prapemrosesan, silakan lihat bekerja dengan lapisan prapemrosesan .

from tensorflow.keras.layers.experimental import preprocessing

def create_model_inputs():
    inputs ={}
    for name, column in data.items():
        if name in ('id','target'):
            continue
        dtype = column.dtype
        if dtype == object:
            dtype = tf.string
        else:
            dtype = tf.float32

        inputs[name] = tf.keras.Input(shape=(1,), name=name, dtype=dtype)

    return inputs
#Preprocessing the numeric inputs, and running them through a normalization layer.
def preprocess_numeric_inputs(inputs):

    numeric_inputs = {name:input for name,input in inputs.items()
                      if input.dtype==tf.float32}

    x = layers.Concatenate()(list(numeric_inputs.values()))
    norm = preprocessing.Normalization()
    norm.adapt(np.array(data[numeric_inputs.keys()]))
    numeric_inputs = norm(x)
    return numeric_inputs
# Preprocessing the categorical inputs.
def preprocess_categorical_inputs(inputs):
    categorical_inputs = []
    for name, input in inputs.items():
        if input.dtype == tf.float32:
            continue

        lookup = preprocessing.StringLookup(vocabulary=np.unique(data[name]))
        one_hot = preprocessing.CategoryEncoding(max_tokens=lookup.vocab_size())

        x = lookup(input)
        x = one_hot(x)
        categorical_inputs.append(x)

    return layers.concatenate(categorical_inputs)

Tentukan arsitektur model dan hyperparameter

Di bagian ini kita mendefinisikan parameter penyetelan menggunakan Keras Tuner Hyper Parameters dan fungsi pembuatan model. Fungsi pembuatan model mengambil argumen hp dari mana Anda dapat mengambil sampel hyperparameter, seperti hp.Int('units', min_value=32, max_value=512, step=32) (integer dari rentang tertentu).

import kerastuner

# Configure the search space
HPS = kerastuner.engine.hyperparameters.HyperParameters()
HPS.Float('learning_rate', min_value=1e-4, max_value=1e-2, sampling='log')

HPS.Int('num_layers', min_value=2, max_value=5)
for i in range(5):
    HPS.Float('dropout_rate_' + str(i), min_value=0.0, max_value=0.3, step=0.1)
    HPS.Choice('num_units_' + str(i), [32, 64, 128, 256])
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam


def create_wide_and_deep_model(hp):

    inputs = create_model_inputs()
    wide = preprocess_categorical_inputs(inputs)
    wide = layers.BatchNormalization()(wide)

    deep = preprocess_numeric_inputs(inputs)
    for i in range(hp.get('num_layers')):
        deep = layers.Dense(hp.get('num_units_' + str(i)))(deep)
        deep = layers.BatchNormalization()(deep)
        deep = layers.ReLU()(deep)
        deep = layers.Dropout(hp.get('dropout_rate_' + str(i)))(deep)

    both = layers.concatenate([wide, deep])
    outputs = layers.Dense(1, activation='sigmoid')(both)
    model = tf.keras.Model(inputs=inputs, outputs=outputs)
    metrics = [
        tf.keras.metrics.Precision(name='precision'),
        tf.keras.metrics.Recall(name='recall'),
        'accuracy',
        'mse'
    ]

    model.compile(
        optimizer=Adam(lr=hp.get('learning_rate')),
        loss='binary_crossentropy',
        metrics=metrics)
    return model

Konfigurasikan CloudTuner

Di bagian ini kami mengonfigurasi cloud tuner untuk eksekusi jarak jauh dan lokal. Perbedaan utama antara keduanya adalah strategi distribusinya.

from tensorflow_cloud import CloudTuner

distribution_strategy = None
if not tfc.remote():
    # Using MirroredStrategy to use a single instance with multiple GPUs
    # during remote execution while using no strategy for local.
    distribution_strategy = tf.distribute.MirroredStrategy()

tuner = CloudTuner(
    create_wide_and_deep_model,
    project_id=GCP_PROJECT_ID,
    project_name=JOB_NAME,
    region=REGION,
    objective='accuracy',
    hyperparameters=HPS,
    max_trials=100,
    directory=GCS_BASE_PATH,
    study_id=STUDY_ID,
    overwrite=True,
    distribution_strategy=distribution_strategy)
# Configure Tensorboard logs
callbacks=[
    tf.keras.callbacks.TensorBoard(log_dir=TENSORBOARD_LOGS_DIR)]

# Setting to run tuning remotely, you can run tuner locally to validate it works first.
if tfc.remote():
    tuner.search(train_ds, epochs=20, validation_data=test_ds, callbacks=callbacks)

# You can uncomment the code below to run the tuner.search() locally to validate
# everything works before submitting the job to Cloud. Stop the job manually
# after one epoch.

# else:
#     tuner.search(train_ds, epochs=1, validation_data=test_ds, callbacks=callbacks)

Mulai pelatihan jarak jauh

Langkah ini akan menyiapkan kode Anda dari notebook ini untuk eksekusi jarak jauh dan memulai NUM_JOBS eksekusi paralel dari jarak jauh untuk melatih model. Setelah pekerjaan dikirimkan, Anda dapat melanjutkan ke langkah berikutnya untuk memantau kemajuan pekerjaan melalui Tensorboard.

tfc.run_cloudtuner(
    distribution_strategy='auto',
    docker_config=tfc.DockerConfig(
        image_build_bucket=GCS_BUCKET
        ),
    chief_config=tfc.MachineConfig(
        cpu_cores=16,
        memory=60,
    ),
    job_labels={'job': JOB_NAME},
    service_account=SERVICE_ACCOUNT,
    num_jobs=NUM_JOBS
)

Hasil Pelatihan

Hubungkan kembali instance Colab Anda

Sebagian besar tugas pelatihan jarak jauh berjalan lama, jika Anda menggunakan Colab mungkin waktu habis sebelum hasil pelatihan tersedia. Jika demikian, jalankan kembali bagian berikut untuk menyambungkan kembali dan mengonfigurasi instance Colab Anda untuk mengakses hasil pelatihan. Jalankan bagian berikut secara berurutan:

  1. Impor modul yang diperlukan
  2. Konfigurasi Proyek
  3. Mengautentikasi notebook untuk menggunakan Proyek Google Cloud Anda

Muat Papan Tensor

Saat pelatihan sedang berlangsung, Anda dapat menggunakan Tensorboard untuk melihat hasilnya. Perhatikan bahwa hasilnya hanya akan terlihat setelah pelatihan Anda dimulai. Ini mungkin memakan waktu beberapa menit.

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

Anda dapat mengakses aset pelatihan sebagai berikut. Perhatikan bahwa hasilnya hanya akan ditampilkan setelah tugas penyetelan Anda menyelesaikan setidaknya satu kali uji coba. Ini mungkin memakan waktu beberapa menit.

if not tfc.remote():
    tuner.results_summary(1)
    best_model = tuner.get_best_models(1)[0]
    best_hyperparameters = tuner.get_best_hyperparameters(1)[0]

    # References to best trial assets
    best_trial_id = tuner.oracle.get_best_trials(1)[0].trial_id
    best_trial_dir = tuner.get_trial_dir(best_trial_id)