Nuvem TensorFlow

Ver em TensorFlow.org Ver no GitHub Baixar caderno Logotipo do KaggleCorra em Kaggle

TensorFlow Cloud é uma biblioteca que facilita o treinamento e o ajuste de hiperparâmetros de modelos Keras no Google Cloud.

Usando a API run do TensorFlow Cloud, você pode enviar o código do modelo diretamente para sua conta do Google Cloud e usar os recursos de computação do Google Cloud sem precisar fazer login e interagir com a IU do Cloud (depois de configurar seu projeto no console).

Isso significa que você pode usar seus recursos de computação do Google Cloud diretamente de dentro de um notebook Python: um notebook como este! Você também pode enviar modelos para o Google Cloud a partir de um script Python .py simples.

Exemplo simples

Este é um exemplo introdutório simples para demonstrar como treinar um modelo remotamente usando TensorFlow Cloud e Google Cloud.

Você pode simplesmente lê-lo para ter uma ideia de como funciona ou pode executar o notebook no Google Colab. A execução do notebook requer conexão com uma conta do Google Cloud e inserção de suas credenciais e ID do projeto. Consulte Configurar e conectar-se à sua conta do Google Cloud se você ainda não tiver uma conta ou não tiver certeza de como configurar um projeto no console.

Importe os módulos necessários

import tensorflow as tf
tf.version.VERSION
'2.6.0'
! pip install -q tensorflow-cloud
import tensorflow_cloud as tfc
print(tfc.__version__)
import sys

Configurações do projeto

Defina os parâmetros do projeto. Se você não sabe qual deve ser seu GCP_PROJECT_ID ou GCS_BUCKET , consulte Configurando e conectando-se à sua conta do Google Cloud .

O JOB_NAME é opcional e você pode configurá-lo para qualquer string. Se você estiver realizando vários experimentos de treinamento (por exemplo) como parte de um projeto maior, você pode querer dar a cada um deles um JOB_NAME exclusivo.

# 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: 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'

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

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

Autenticando o notebook para usar seu projeto do Google Cloud

Este código autentica o notebook, verificando suas credenciais e identidade válidas do Google Cloud. Ele está dentro do bloco if not tfc.remote() para garantir que seja executado apenas no notebook e não será executado quando o código do notebook for enviado ao Google Cloud.

# 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

Configuração de modelo e dados

A partir daqui, seguimos o procedimento básico para configurar um modelo Keras simples para executar a classificação no conjunto de dados MNIST.

Carregar e dividir dados

Leia dados brutos e divida para treinar e testar conjuntos de dados.

(x_train, y_train), (_, _) = tf.keras.datasets.mnist.load_data()

x_train = x_train.reshape((60000, 28 * 28))
x_train = x_train.astype('float32') / 255

Crie um modelo e prepare-se para o treinamento

Crie um modelo simples e configure alguns retornos de chamada para ele.

from tensorflow.keras import layers

model = tf.keras.Sequential([
  tf.keras.layers.Dense(512, activation='relu', input_shape=(28 * 28,)),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(loss='sparse_categorical_crossentropy',
              optimizer=tf.keras.optimizers.Adam(),
              metrics=['accuracy'])

Treinamento de validação rápida

Treinaremos o modelo por uma (1) época apenas para garantir que tudo esteja configurado corretamente e agruparemos esse comando de treinamento if not tfc.remote , para que isso aconteça apenas aqui no ambiente de tempo de execução em que você estão lendo isso, não quando ele é enviado ao Google Cloud.

if not tfc.remote():
    # Run the training for 1 epoch and a small subset of the data to validate setup
    model.fit(x=x_train[:100], y=y_train[:100], validation_split=0.2, epochs=1)

Prepare-se para o treinamento remoto

O código abaixo só será executado quando o código do notebook for enviado ao Google Cloud, e não dentro do tempo de execução em que você está lendo isto.

Primeiro, configuramos retornos de chamada que irão:

  • Crie logs para TensorBoard .
  • Crie pontos de verificação e salve-os no diretório de pontos de verificação especificado acima.
  • Interrompa o treinamento do modelo se a perda não estiver melhorando o suficiente.

Em seguida, chamamos model.fit e model.save , que (quando este código está sendo executado no Google Cloud) que realmente executa o treinamento completo (100 épocas) e, em seguida, salva o modelo treinado no GCS Bucket e no diretório definidos acima.

if tfc.remote():
    # Configure Tensorboard logs
    callbacks=[
        tf.keras.callbacks.TensorBoard(log_dir=TENSORBOARD_LOGS_DIR),
        tf.keras.callbacks.ModelCheckpoint(
            MODEL_CHECKPOINT_DIR,
            save_best_only=True),
        tf.keras.callbacks.EarlyStopping(
            monitor='loss',
            min_delta =0.001,
            patience=3)]

    model.fit(x=x_train, y=y_train, epochs=100,
              validation_split=0.2, callbacks=callbacks)

    model.save(SAVED_MODEL_DIR)

Inicie o treinamento remoto

O TensorFlow Cloud pega todo o código de seu ambiente de execução local (este notebook), empacota-o e envia-o ao Google Cloud para execução. (É por isso que os wrappers if e if not tfc.remote são importantes.)

Esta etapa preparará seu código deste notebook para execução remota e, em seguida, iniciará um trabalho de treinamento remoto no Google Cloud Platform para treinar o modelo.

Primeiro adicionamos o pacote Python tensorflow-cloud a um arquivo requirements.txt , que será enviado junto com o código neste notebook. Você pode adicionar outros pacotes aqui conforme necessário.

Em seguida, uma GPU e uma imagem de CPU são especificadas. Você só precisa especificar um ou outro; a GPU é usada no código a seguir.

Finalmente, o coração da nuvem TensorFlow: a chamada para tfc.run . Quando isso for executado dentro deste notebook, todo o código deste notebook e o restante dos arquivos neste diretório serão empacotados e enviados ao Google Cloud para execução. Os parâmetros no método run especificam que os detalhes das imagens da CPU da GPU são especificados. Você só precisa especificar um ou outro; a GPU é usada no código a seguir.

Finalmente, o coração da nuvem TensorFlow: a chamada para tfc.run . Quando isso for executado dentro deste notebook, todo o código deste notebook e o restante dos arquivos neste diretório serão empacotados e enviados ao Google Cloud para execução. Os parâmetros no método run especificam os detalhes das imagens de GPU e CPU. Você só precisa especificar um ou outro; a GPU é usada no código a seguir.

Finalmente, o coração da nuvem TensorFlow: a chamada para tfc.run . Quando isso for executado dentro deste notebook, todo o código deste notebook e o restante dos arquivos neste diretório serão empacotados e enviados ao Google Cloud para execução. Os parâmetros no método run especificam os detalhes do ambiente de execução e a estratégia de distribuição (se houver) a ser usada.

Depois que o trabalho for enviado, você poderá ir para a próxima etapa para monitorar o progresso do trabalho por meio do 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('tensorflow-cloud\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"

# Submit a single node training job using GPU.
tfc.run(
    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_1X'],
    job_labels={'job': JOB_NAME}
)

Resultados do treinamento

Reconecte sua instância do Colab

A maioria dos trabalhos de treinamento remoto são de longa duração. Se você estiver usando o Colab, o tempo limite poderá expirar antes que os resultados do treinamento estejam disponíveis.

Nesse caso, execute novamente as seções a seguir para reconectar e configurar sua instância do Colab para acessar os resultados do treinamento.

  1. Importe os módulos necessários
  2. Configurações do projeto
  3. Autenticando o notebook para usar seu projeto do Google Cloud

NÃO execute novamente o restante do código.

Carregar Tensorboard

Enquanto o treinamento está em andamento, você pode usar o Tensorboard para visualizar os resultados. Observe que os resultados serão exibidos somente após o início do treinamento. Isso pode levar alguns minutos.

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

Carregue seu modelo treinado

Assim que o treinamento for concluído, você poderá recuperar seu modelo do intervalo GCS especificado acima.

trained_model = tf.keras.models.load_model(SAVED_MODEL_DIR)
trained_model.summary()