تدريب موزع على NasNet مع Tensorflow_cloud وGoogle Cloud

عرض على TensorFlow.org تشغيل في جوجل كولاب عرض على جيثب تحميل دفتر شعار كاجلتشغيل في 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 الخاص بك

بالنسبة إلى أجهزة 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

أضف واجهات برمجة التطبيقات لطبقات المعالجة المسبقة لتكبير الصورة.

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 الخاص بك

تحميل Tensorboard

أثناء تقدم التدريب، يمكنك استخدام Tensorboard لعرض النتائج. لاحظ أن النتائج لن تظهر إلا بعد بدء التدريب. قد يستغرق هذا بضع دقائق.

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

قم بتحميل النموذج المدرب الخاص بك

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