Nuvem do TensorFlow

Veja no TensorFlow.org Executar no Google Colab Ver no GitHub Baixar caderno Logo KaggleCorra no Kaggle

O 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 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 o TensorFlow Cloud e o Google Cloud.

Você pode apenas lê-lo para ter uma ideia de como isso funciona ou pode executar o notebook no Google Colab. Para executar o notebook, é necessário conectar-se a uma conta do Google Cloud e inserir suas credenciais e o ID do projeto. Consulte Configurando e conectando-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.

Importar 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 fazendo vários experimentos de treinamento (por exemplo) como parte de um projeto maior, convém atribuir 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")

Como autenticar 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, estamos seguindo 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 para uma (1) época apenas para garantir que tudo esteja configurado corretamente e envolveremos esse comando de treinamento em if not tfc.remote , para que isso aconteça apenas aqui no ambiente de tempo de execução em que você está lendo isso, não quando é enviado para o 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, não dentro do tempo de execução em que você está lendo isso.

Primeiro, configuramos retornos de chamada que:

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

Em seguida, chamamos model.fit e model.save , que (quando esse código está sendo executado no Google Cloud) executam o treinamento completo (100 épocas) e salvam o modelo treinado no bucket do GCS e no diretório definido 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), o empacota e o envia 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 job 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.

Por fim, o coração da nuvem do TensorFlow: a chamada para tfc.run . Quando isso for executado dentro deste notebook, todo o código desse notebook e o restante dos arquivos nesse 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 CPU da GPU que são especificadas. Você só precisa especificar um ou outro; a GPU é usada no código a seguir.

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

Por fim, o coração da nuvem do TensorFlow: a chamada para tfc.run . Quando isso for executado dentro deste notebook, todo o código desse notebook e o restante dos arquivos nesse 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 utilizada.

Depois que o trabalho for enviado, você poderá ir para a próxima etapa para monitorar o progresso dos trabalhos 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, pode ser que o tempo limite se esgote 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. Importar módulos necessários
  2. Configurações do projeto
  3. Como autenticar 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

Quando o treinamento estiver concluído, você poderá recuperar seu modelo do GCS Bucket especificado acima.

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