Tensorflow_cloud ve Google Cloud ile NasNet'in dağıtılmış eğitimi

TensorFlow.org'da görüntüle GitHub'da görüntüle Not defterini indir Kaggle logosuKaggle'da koş

Bu örnek, dağıtılmış eğitim kullanılarak geniş ölçekte tensorflow_cloud ve Google Cloud Platform kullanılarak bir NasNetMobile modelinin nasıl eğitileceğini göstermek için EfficientNet ile ince ayar yoluyla Görüntü sınıflandırmasına dayanmaktadır.

Gerekli modülleri içe aktar

import tensorflow as tf
tf.version.VERSION
'2.6.0'
! pip install -q tensorflow-cloud

import tensorflow_cloud as tfc
tfc.__version__
import sys

Proje Konfigürasyonları

Proje parametrelerini ayarlayın. Google Cloud'a Özel parametreler için Google Cloud Projesi Kurulum Talimatlarına bakın.

# 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 = 'nasnet'

# 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")

Google Cloud Projenizi kullanmak için not defterinin kimliğini doğrulama

Kaggle Not Defterleri için aşağıdaki hücreyi çalıştırmadan önce "Eklentiler"->"Google Cloud SDK"yı tıklayın.

# 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

Verileri yükleyin ve hazırlayın

Ham verileri okuyun ve veri kümelerini eğitmek ve test etmek için bölün.

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

# Setting input specific parameters
# The model expects input of dimension (INPUT_IMG_SIZE, INPUT_IMG_SIZE, 3)
INPUT_IMG_SIZE = 32
NUM_CLASSES = 10

Görüntüyü büyütmek için ön işleme katmanları API'leri ekleyin.

from tensorflow.keras.layers.experimental import preprocessing
from tensorflow.keras.models import Sequential


img_augmentation = Sequential(
    [
        # Resizing input to better match ImageNet size
        preprocessing.Resizing(256, 256),
        preprocessing.RandomRotation(factor=0.15),
        preprocessing.RandomFlip(),
        preprocessing.RandomContrast(factor=0.1),
    ],
    name="img_augmentation",
)

Modeli yükleyin ve eğitime hazırlanın

NASNetMobile'ın önceden eğitilmiş bir modelini (ağırlıklarla birlikte) yükleyeceğiz ve modelin veri kümesiyle daha iyi eşleşecek şekilde ince ayarını yapmak için birkaç katmanın donmasını çözeceğiz.

from tensorflow.keras import layers

def build_model(num_classes, input_image_size):
    inputs = layers.Input(shape=(input_image_size, input_image_size, 3))
    x = img_augmentation(inputs)

    model = tf.keras.applications.NASNetMobile(
        input_shape=None,
        include_top=False,
        weights="imagenet",
        input_tensor=x,
        pooling=None,
        classes=num_classes,
    )

    # Freeze the pretrained weights
    model.trainable = False

    # We unfreeze the top 20 layers while leaving BatchNorm layers frozen
    for layer in model.layers[-20:]:
        if not isinstance(layer, layers.BatchNormalization):
            layer.trainable = True

    # Rebuild top
    x = layers.GlobalAveragePooling2D(name="avg_pool")(model.output)
    x = layers.BatchNormalization()(x)

    x = layers.Dense(128, activation="relu")(x)
    x = layers.Dense(64, activation="relu")(x)
    outputs = layers.Dense(num_classes, activation="softmax", name="pred")(x)

    # Compile
    model = tf.keras.Model(inputs, outputs, name="NASNetMobile")
    optimizer = tf.keras.optimizers.Adam(learning_rate=3e-4)
    model.compile(
        optimizer=optimizer,
        loss="sparse_categorical_crossentropy",
        metrics=["accuracy"]
    )
    return model
model = build_model(NUM_CLASSES, INPUT_IMG_SIZE)

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)

else:
    # 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)

Uzaktan eğitime başlayın

Bu adım, bu not defterindeki kodunuzu uzaktan yürütmeye hazırlayacak ve modeli eğitmek için Google Cloud Platform'da uzaktan dağıtılmış bir eğitim başlatacak. İş gönderildikten sonra Tensorboard aracılığıyla işin ilerlemesini izlemek için bir sonraki adıma geçebilirsiniz.

# 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 distributed training job using GPUs.
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'],
      worker_config=tfc.COMMON_MACHINE_CONFIGS['K80_1X'],
      worker_count=3,
    job_labels={'job': JOB_NAME}
)

Eğitim Sonuçları

Colab örneğinizi yeniden bağlayın

Uzaktan eğitim işlerinin çoğu uzun sürüyor. Colab kullanıyorsanız eğitim sonuçlarının alınmasından önce zaman aşımına uğrayabilir. Bu durumda Colab örneğinizi yeniden bağlamak ve eğitim sonuçlarına erişmek üzere yapılandırmak için aşağıdaki bölümleri yeniden çalıştırın. Aşağıdaki bölümleri sırayla çalıştırın:

  1. Gerekli modülleri içe aktar
  2. Proje Konfigürasyonları
  3. Google Cloud Projenizi kullanmak için not defterinin kimliğini doğrulama

Tensorboard'u Yükle

Eğitim devam ederken sonuçları görüntülemek için Tensorboard'u kullanabilirsiniz. Sonuçların yalnızca antrenmanınız başladıktan sonra gösterileceğini unutmayın. Bu birkaç dakika sürebilir.

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

Eğitilmiş modelinizi yükleyin

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