אימון מבוזר NasNet עם tensorflow_cloud ו-Google Cloud

הצג באתר TensorFlow.org הפעל ב-Google Colab הצג ב-GitHub הורד מחברת לוגו של Kaggleרוץ בקאגל

דוגמה זו מבוססת על סיווג תמונה באמצעות כוונון עדין עם EfficientNet כדי להדגים כיצד לאמן מודל NasNetMobile באמצעות tensorflow_cloud ו-Google Cloud Platform בקנה מידה באמצעות אימון מבוזר.

ייבוא ​​מודולים נדרשים

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

import tensorflow_cloud as tfc
tfc.__version__
import sys

תצורות פרויקט

הגדר פרמטרים של הפרויקט. לפרמטרים ספציפיים של Google Cloud, עיין בהוראות ההגדרה של Google Cloud Project .

# 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 Project שלך

עבור Kaggle Notebooks לחץ על "תוספות"->"Google Cloud SDK" לפני הפעלת התא למטה.

# 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

טען והכנת נתונים

קרא נתונים גולמיים ופצל כדי לאמן ולבדוק מערכי נתונים.

(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

הוסף ממשקי API של שכבות עיבוד מקדים להגדלת תמונה.

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

טען את הדגם והתכונן לאימון

נטען מודל מאומן מראש של NASNetMobile (עם משקולות) ונשחרר כמה שכבות לכוונון עדין של המודל כך שיתאים יותר למערך הנתונים.

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)

התחל את האימון מרחוק

שלב זה יכין את הקוד שלך מהמחברת הזו לביצוע מרחוק ויתחיל הדרכה מבוזרת מרחוק ב-Google Cloud Platform כדי לאמן את המודל. לאחר הגשת המשרה תוכל לעבור לשלב הבא כדי לעקוב אחר התקדמות העבודות באמצעות 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 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}
)

תוצאות אימון

חבר מחדש את מופע ה-Colab שלך

רוב עבודות ההדרכה מרחוק נמשכות זמן רב. אם אתה משתמש ב-Colab, ייתכן שהזמן קצוב לפני שתוצאות האימון יהיו זמינות. במקרה כזה, הפעל מחדש את הסעיפים הבאים כדי להתחבר מחדש ולהגדיר את מופע ה-Colab שלך כדי לגשת לתוצאות האימון. הפעל את הסעיפים הבאים לפי הסדר:

  1. ייבוא ​​מודולים נדרשים
  2. תצורות פרויקט
  3. אימות המחברת לשימוש ב-Google Cloud Project שלך

טען Tensorboard

בזמן שהאימון בעיצומו אתה יכול להשתמש ב-Tensorboard כדי לראות את התוצאות. שימו לב שהתוצאות יופיעו רק לאחר תחילת האימון. זה יכול לקחת כמה דקות.

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

טען את הדגם המאומן שלך

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