Ver en TensorFlow.org | Ejecutar en Google Colab | Ver en GitHub | Descargar cuaderno | Ejecutar en Kaggle |
Este ejemplo se basa en el ejemplo Keras-Tuner CIFAR10 para demostrar cómo ejecutar trabajos de ajuste de HP utilizando TensorFlow Cloud y Google Cloud Platform a escala.
Importar módulos requeridos
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
! pip install -q tensorflow-cloud
import tensorflow_cloud as tfc
tf.version.VERSION
'2.6.0'
Configuraciones de proyecto
Establecer parámetros del proyecto Para los parámetros específicos de Google Cloud, consulte las Instrucciones de configuración del proyecto de 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 = 'cifar10'
# 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")
Autenticar el cuaderno para usar su proyecto Google Cloud
Para Kaggle Notebooks, haga clic en "Complementos" -> "Google Cloud SDK" antes de ejecutar la siguiente celda.
# 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
Cargar y preparar datos
Lea datos sin procesar y divídalos para entrenar y probar conjuntos de datos.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
# Setting input specific parameters
# The model expects input of dimensions (INPUT_IMG_SIZE, INPUT_IMG_SIZE, 3)
INPUT_IMG_SIZE = 32
NUM_CLASSES = 10
Definir la arquitectura del modelo y los hiperparámetros.
En esta sección definimos nuestros parámetros de ajuste utilizando Keras Tuner Hyper Parameters y una función de creación de modelos. La función de creación de modelos toma un argumento hp del cual se pueden tomar muestras de hiperparámetros, como hp.Int('units', min_value=32, max_value=512, step=32) (un número entero de un rango determinado).
import kerastuner
from tensorflow.keras import layers
# Configure the search space
HPS = kerastuner.engine.hyperparameters.HyperParameters()
HPS.Int('conv_blocks', 3, 5, default=3)
for i in range(5):
HPS.Int('filters_' + str(i), 32, 256, step=32)
HPS.Choice('pooling_' + str(i), ['avg', 'max'])
HPS.Int('hidden_size', 30, 100, step=10, default=50)
HPS.Float('dropout', 0, 0.5, step=0.1, default=0.5)
HPS.Float('learning_rate', 1e-4, 1e-2, sampling='log')
def build_model(hp):
inputs = tf.keras.Input(shape=(INPUT_IMG_SIZE, INPUT_IMG_SIZE, 3))
x = inputs
for i in range(hp.get('conv_blocks')):
filters = hp.get('filters_'+ str(i))
for _ in range(2):
x = layers.Conv2D(
filters, kernel_size=(3, 3), padding='same')(x)
x = layers.BatchNormalization()(x)
x = layers.ReLU()(x)
if hp.get('pooling_' + str(i)) == 'max':
x = layers.MaxPool2D()(x)
else:
x = layers.AvgPool2D()(x)
x = layers.GlobalAvgPool2D()(x)
x = layers.Dense(hp.get('hidden_size'),
activation='relu')(x)
x = layers.Dropout(hp.get('dropout'))(x)
outputs = layers.Dense(NUM_CLASSES, activation='softmax')(x)
model = tf.keras.Model(inputs, outputs)
model.compile(
optimizer=tf.keras.optimizers.Adam(
hp.get('learning_rate')),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
Configurar un CloudTuner
En esta sección configuramos el sintonizador de nube para ejecución tanto remota como local. La principal diferencia entre los dos es la estrategia de distribución.
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(
build_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(x=x_train, y=y_train, epochs=30, validation_split=0.2, 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(x=x_train, y=y_train, epochs=1, validation_split=0.2, callbacks=callbacks)
Iniciar la formación remota
Este paso preparará su código desde este cuaderno para la ejecución remota e iniciará NUM_JOBS ejecuciones paralelas de forma remota para entrenar el modelo. Una vez enviados los trabajos, puede pasar al siguiente paso para monitorear el progreso de los trabajos a través de Tensorboard.
# If you are using a custom image you can install modules via requirements txt file.
with open('requirements.txt','w') as f:
f.write('pandas==1.1.5\n')
f.write('numpy==1.18.5\n')
f.write('tensorflow-cloud\n')
f.write('keras-tuner\n')
# Optional: Some recommended base images. If you provide none the system will choose one for you.
TF_GPU_IMAGE= "tensorflow/tensorflow:latest-gpu"
TF_CPU_IMAGE= "tensorflow/tensorflow:latest"
tfc.run_cloudtuner(
distribution_strategy='auto',
requirements_txt='requirements.txt',
docker_config=tfc.DockerConfig(
parent_image=TF_GPU_IMAGE,
image_build_bucket=GCS_BUCKET
),
chief_config=tfc.COMMON_MACHINE_CONFIGS['K80_4X'],
job_labels={'job': JOB_NAME},
service_account=SERVICE_ACCOUNT,
num_jobs=NUM_JOBS
)
Resultados del entrenamiento
Vuelva a conectar su instancia de Colab
La mayoría de los trabajos de capacitación remota son de larga duración; si utiliza Colab, es posible que se agote el tiempo de espera antes de que los resultados de la capacitación estén disponibles. En ese caso, vuelva a ejecutar las siguientes secciones para volver a conectarse y configurar su instancia de Colab para acceder a los resultados de la capacitación. Ejecute las siguientes secciones en orden:
- Importar módulos requeridos
- Configuraciones de proyecto
- Autenticar el cuaderno para usar su proyecto Google Cloud
Cargar tensorboard
Mientras el entrenamiento está en curso, puedes usar Tensorboard para ver los resultados. Tenga en cuenta que los resultados se mostrarán solo después de que haya comenzado su entrenamiento. Esto puede tardar unos minutos.
%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR
Puede acceder a los recursos de capacitación de la siguiente manera. Tenga en cuenta que los resultados se mostrarán solo después de que su trabajo de ajuste haya completado al menos una prueba. Esto puede tardar unos minutos.
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)