โมเดล Keras การฝึกอบรมด้วย TensorFlow Cloud

ดูใน TensorFlow.org เรียกใช้ใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

บทนำ

TensorFlow Cloud เป็นแพ็คเกจ Python ที่ให้ API สำหรับการเปลี่ยนจากการดีบักภายในไปสู่การฝึกอบรมแบบกระจายใน Google Cloud อย่างราบรื่น ช่วยลดความยุ่งยากในขั้นตอนการฝึกโมเดล TensorFlow บนคลาวด์ให้เป็นการเรียกใช้ฟังก์ชันเพียงครั้งเดียวโดยต้องการการตั้งค่าเพียงเล็กน้อยและไม่มีการเปลี่ยนแปลงโมเดลของคุณ TensorFlow Cloud จัดการงานเฉพาะบนคลาวด์เช่นการสร้างอินสแตนซ์ VM และกลยุทธ์การกระจายสำหรับโมเดลของคุณโดยอัตโนมัติ คู่มือนี้จะสาธิตวิธีการเชื่อมต่อกับ Google Cloud ผ่าน TensorFlow Cloud และฟังก์ชันการทำงานที่หลากหลายที่มีให้ภายใน TensorFlow Cloud เราจะเริ่มด้วยกรณีการใช้งานที่ง่ายที่สุด

ติดตั้ง

เราจะเริ่มต้นด้วยการติดตั้ง TensorFlow Cloud และนำเข้าแพ็คเกจที่เราต้องการในคู่มือนี้

pip install -q tensorflow_cloud
import tensorflow as tf
import tensorflow_cloud as tfc

from tensorflow import keras
from tensorflow.keras import layers

ภาพรวม API: ตัวอย่างแรกจากต้นทางถึงปลายทาง

เริ่มต้นด้วยสคริปต์การฝึกโมเดล Keras เช่น CNN ต่อไปนี้:

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

model = keras.Sequential(
    [
        keras.Input(shape=(28, 28)),
        # Use a Rescaling layer to make sure input values are in the [0, 1] range.
        layers.experimental.preprocessing.Rescaling(1.0 / 255),
        # The original images have shape (28, 28), so we reshape them to (28, 28, 1)
        layers.Reshape(target_shape=(28, 28, 1)),
        # Follow-up with a classic small convnet
        layers.Conv2D(32, 3, activation="relu"),
        layers.MaxPooling2D(2),
        layers.Conv2D(32, 3, activation="relu"),
        layers.MaxPooling2D(2),
        layers.Conv2D(32, 3, activation="relu"),
        layers.Flatten(),
        layers.Dense(128, activation="relu"),
        layers.Dense(10),
    ]
)

model.compile(
    optimizer=keras.optimizers.Adam(),
    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=keras.metrics.SparseCategoricalAccuracy(),
)

model.fit(x_train, y_train, epochs=20, batch_size=128, validation_split=0.1)

ในการฝึกโมเดลนี้บน Google Cloud เราเพียงแค่ต้องเพิ่มการเรียกเพื่อ run() ที่จุดเริ่มต้นของสคริปต์ก่อนที่จะนำเข้า:

tfc.run()

คุณไม่จำเป็นต้องกังวลเกี่ยวกับงานเฉพาะบนคลาวด์เช่นการสร้างอินสแตนซ์ VM และกลยุทธ์การกระจายเมื่อใช้ TensorFlow Cloud API มีค่าเริ่มต้นอัจฉริยะสำหรับพารามิเตอร์ทั้งหมด - ทุกอย่างสามารถกำหนดค่าได้ แต่หลายรุ่นสามารถพึ่งพาค่าเริ่มต้นเหล่านี้ได้

เมื่อเรียก run() TensorFlow Cloud จะ:

  • เตรียมสคริปต์ Python หรือโน้ตบุ๊กให้พร้อมใช้งาน
  • แปลงเป็นอิมเมจ Docker พร้อมการอ้างอิงที่จำเป็น
  • เรียกใช้งานการฝึกอบรมบน VM ที่ใช้ GCP GPU
  • สตรีมบันทึกที่เกี่ยวข้องและข้อมูลงาน

การกำหนดค่า VM เริ่มต้นคือหัวหน้า 1 คนและคนงาน 0 คนที่มีแกน CPU 8 คอร์และ 1 Tesla T4 GPU

การกำหนดค่า Google Cloud

เพื่ออำนวยความสะดวกในเส้นทางที่เหมาะสมสำหรับการฝึกอบรมระบบคลาวด์คุณจะต้องทำการตั้งค่าในครั้งแรก หากคุณเป็นผู้ใช้ Google Cloud รายใหม่มีขั้นตอนเบื้องต้นสองสามประการที่คุณจะต้องดำเนินการ:

  1. สร้างโครงการ GCP
  2. เปิดใช้งานบริการแพลตฟอร์ม AI
  3. สร้างบัญชีบริการ
  4. ดาวน์โหลดรหัสการอนุญาต
  5. สร้างที่เก็บข้อมูล Cloud Storage

คำแนะนำในการตั้งค่าครั้งแรกโดยละเอียดสามารถพบได้ใน TensorFlow Cloud README และตัวอย่างการตั้งค่าเพิ่มเติมจะแสดงใน บล็อก TensorFlow

เวิร์กโฟลว์ทั่วไปและที่เก็บข้อมูลบนคลาวด์

ในกรณีส่วนใหญ่คุณจะต้องดึงโมเดลของคุณหลังจากการฝึกอบรมบน Google Cloud สำหรับสิ่งนี้สิ่งสำคัญคือต้องเปลี่ยนเส้นทางการบันทึกและการโหลดไปยัง Cloud Storage ในขณะที่ฝึกอบรมจากระยะไกล เราสามารถสั่ง TensorFlow Cloud ไปยังที่เก็บข้อมูล Cloud Storage สำหรับงานที่หลากหลาย ที่เก็บข้อมูลสามารถใช้เพื่อบันทึกและโหลดชุดข้อมูลการฝึกอบรมขนาดใหญ่จัดเก็บบันทึกการโทรกลับหรือน้ำหนักแบบจำลองและบันทึกไฟล์โมเดลที่ได้รับการฝึกอบรม ในการเริ่มต้นให้กำหนดค่า fit() เพื่อบันทึกโมเดลลงใน Cloud Storage และตั้งค่าการตรวจสอบ TensorBoard เพื่อติดตามความคืบหน้าของการฝึกอบรม

def create_model():
    model = keras.Sequential(
        [
            keras.Input(shape=(28, 28)),
            layers.experimental.preprocessing.Rescaling(1.0 / 255),
            layers.Reshape(target_shape=(28, 28, 1)),
            layers.Conv2D(32, 3, activation="relu"),
            layers.MaxPooling2D(2),
            layers.Conv2D(32, 3, activation="relu"),
            layers.MaxPooling2D(2),
            layers.Conv2D(32, 3, activation="relu"),
            layers.Flatten(),
            layers.Dense(128, activation="relu"),
            layers.Dense(10),
        ]
    )

    model.compile(
        optimizer=keras.optimizers.Adam(),
        loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        metrics=keras.metrics.SparseCategoricalAccuracy(),
    )
    return model

มาบันทึกบันทึกของ TensorBoard และจุดตรวจโมเดลที่สร้างขึ้นระหว่างการฝึกอบรมในที่เก็บข้อมูลบนคลาวด์ของเรา

import datetime
import os

# Note: Please change the gcp_bucket to your bucket name.
gcp_bucket = "keras-examples"

checkpoint_path = os.path.join("gs://", gcp_bucket, "mnist_example", "save_at_{epoch}")

tensorboard_path = os.path.join(  # Timestamp included to enable timeseries graphs
    "gs://", gcp_bucket, "logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
)

callbacks = [
    # TensorBoard will store logs for each epoch and graph performance for us.
    keras.callbacks.TensorBoard(log_dir=tensorboard_path, histogram_freq=1),
    # ModelCheckpoint will save models after each epoch for retrieval later.
    keras.callbacks.ModelCheckpoint(checkpoint_path),
    # EarlyStopping will terminate training when val_loss ceases to improve.
    keras.callbacks.EarlyStopping(monitor="val_loss", patience=3),
]

model = create_model()

ที่นี่เราจะโหลดข้อมูลของเราจาก Keras โดยตรง โดยทั่วไปแนวทางปฏิบัติที่ดีที่สุดในการจัดเก็บชุดข้อมูลของคุณในที่เก็บข้อมูล Cloud Storage ของคุณ แต่ TensorFlow Cloud ยังสามารถรองรับชุดข้อมูลที่จัดเก็บไว้ในเครื่องได้อีกด้วย ซึ่งครอบคลุมอยู่ในส่วน Multi-file ของคู่มือนี้

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

TensorFlow Cloud API มีฟังก์ชัน remote() เพื่อตรวจสอบว่ามีการเรียกใช้โค้ดในเครื่องหรือบนคลาวด์ สิ่งนี้ช่วยให้สามารถกำหนดพารามิเตอร์ fit() แยกต่างหากสำหรับการดำเนินการภายในและระยะไกลและให้วิธีการสำหรับการดีบักที่ง่ายดายโดยไม่ต้องใช้เครื่องในพื้นที่ของคุณมากเกินไป

if tfc.remote():
    epochs = 100
    callbacks = callbacks
    batch_size = 128
else:
    epochs = 5
    batch_size = 64
    callbacks = None

model.fit(x_train, y_train, epochs=epochs, callbacks=callbacks, batch_size=batch_size)
Epoch 1/5
938/938 [==============================] - 6s 3ms/step - loss: 0.4867 - sparse_categorical_accuracy: 0.8556
Epoch 2/5
938/938 [==============================] - 3s 3ms/step - loss: 0.0638 - sparse_categorical_accuracy: 0.9796
Epoch 3/5
938/938 [==============================] - 3s 3ms/step - loss: 0.0411 - sparse_categorical_accuracy: 0.9870
Epoch 4/5
938/938 [==============================] - 3s 3ms/step - loss: 0.0333 - sparse_categorical_accuracy: 0.9895
Epoch 5/5
938/938 [==============================] - 3s 3ms/step - loss: 0.0278 - sparse_categorical_accuracy: 0.9910
<tensorflow.python.keras.callbacks.History at 0x7fa57866c4e0>

มาบันทึกโมเดลใน GCS หลังจากการฝึกอบรมเสร็จสิ้น

save_path = os.path.join("gs://", gcp_bucket, "mnist_example")

if tfc.remote():
    model.save(save_path)

เรายังสามารถใช้ที่เก็บข้อมูลนี้สำหรับการสร้างอิมเมจ Docker แทนอินสแตนซ์ Docker ในเครื่องของคุณ สำหรับสิ่งนี้เพียงเพิ่มที่เก็บข้อมูลของคุณในพารามิเตอร์ docker_image_bucket_name

tfc.run(docker_image_bucket_name=gcp_bucket)

หลังจากฝึกโมเดลแล้วเราสามารถโหลดโมเดลที่บันทึกไว้และดูบันทึก TensorBoard ของเราเพื่อตรวจสอบประสิทธิภาพ

model = keras.models.load_model(save_path)
!tensorboard dev upload --logdir "gs://keras-examples-jonah/logs/fit" --name "Guide MNIST"

โครงการขนาดใหญ่

ในหลายกรณีโปรเจ็กต์ของคุณที่มีโมเดล Keras อาจครอบคลุมสคริปต์ Python มากกว่าหนึ่งสคริปต์หรืออาจเกี่ยวข้องกับข้อมูลภายนอกหรือการอ้างอิงเฉพาะ TensorFlow Cloud มีความยืดหยุ่นสำหรับการปรับใช้ขนาดใหญ่และมีฟังก์ชันอัจฉริยะมากมายเพื่อช่วยโครงการของคุณ

จุดเริ่มต้น: รองรับสคริปต์ Python และสมุดบันทึก Jupyter

การเรียก run() API ของคุณจะไม่อยู่ในสคริปต์ Python เดียวกันกับโค้ดการฝึกโมเดลของคุณเสมอไป เพื่อจุดประสงค์นี้เราจัดเตรียมพารามิเตอร์ entry_point พารามิเตอร์ entry_point สามารถใช้เพื่อระบุสคริปต์ Python หรือโน้ตบุ๊กที่โค้ดการฝึกโมเดลของคุณมีชีวิตอยู่ เมื่อเรียก run() จากสคริปต์เดียวกันกับโมเดลของคุณให้ใช้ entry_point default เป็น None

pip อ้างอิง pip

หากโปรเจ็กต์ของคุณเรียกใช้การอ้างอิง pip เพิ่มเติมเป็นไปได้ที่จะระบุไลบรารีที่ต้องการเพิ่มเติมโดยรวมไฟล์ requirements.txt ในไฟล์นี้เพียงแค่ใส่รายการของการอ้างอิงที่จำเป็นทั้งหมดและ TensorFlow Cloud จะจัดการการรวมสิ่งเหล่านี้เข้ากับระบบคลาวด์ของคุณ

สมุดบันทึก Python

TensorFlow Cloud ยังสามารถรันได้จากโน้ตบุ๊ก Python นอกจากนี้ entry_point ที่คุณระบุสามารถเป็นสมุดบันทึกได้หากจำเป็น มีความแตกต่างที่สำคัญสองประการที่ควรคำนึงถึงระหว่าง TensorFlow Cloud บนโน้ตบุ๊กเมื่อเทียบกับสคริปต์:

  • เมื่อเรียก run() จากภายในโน้ตบุ๊กต้องระบุที่เก็บข้อมูล Cloud Storage สำหรับสร้างและจัดเก็บอิมเมจ Docker ของคุณ
  • การตรวจสอบสิทธิ์ GCloud เกิดขึ้นทั้งหมดผ่านคีย์การตรวจสอบสิทธิ์ของคุณโดยไม่มีข้อกำหนดโครงการ ตัวอย่างเวิร์กโฟลว์โดยใช้ TensorFlow Cloud จากโน้ตบุ๊กมีอยู่ในส่วน "รวมทั้งหมดเข้าด้วยกัน" ของคู่มือนี้

โครงการหลายไฟล์

หากโมเดลของคุณขึ้นอยู่กับไฟล์เพิ่มเติมคุณจะต้องแน่ใจว่าไฟล์เหล่านี้อยู่ในไดเร็กทอรีเดียวกัน (หรือไดเร็กทอรีย่อย) ของจุดเข้าใช้งานที่ระบุ ทุกไฟล์ที่เก็บไว้ในไดเร็กทอรีเดียวกันกับ entry_point ระบุจะรวมอยู่ในอิมเมจ Docker รวมถึงไฟล์ใด ๆ ที่จัดเก็บในไดเร็กทอรีย่อยที่อยู่ติดกับ entry_point นอกจากนี้ยังเป็นจริงสำหรับการอ้างอิงที่คุณอาจต้องการซึ่งไม่สามารถหาได้ผ่าน pip

สำหรับตัวอย่างของจุดเริ่มต้นที่กำหนดเองและโปรเจ็กต์หลายไฟล์ที่มีการอ้างอิง pip เพิ่มเติมโปรดดูตัวอย่างไฟล์หลายไฟล์นี้บน TensorFlow Cloud Repository เพื่อความกะทัดรัดเราจะรวมการ run() ของตัวอย่างไว้ด้วย:

tfc.run(
    docker_image_bucket_name=gcp_bucket,
    entry_point="train_model.py",
    requirements="requirements.txt"
)

การกำหนดค่าเครื่องจักรและการฝึกอบรมแบบกระจาย

การฝึกโมเดลอาจต้องใช้ทรัพยากรต่างๆมากมายขึ้นอยู่กับขนาดของโมเดลหรือชุดข้อมูล เมื่อพิจารณาถึงการกำหนดค่าที่มี GPU หลายตัวการเลือก กลยุทธ์การกระจายที่ เหมาะสมจึงเป็นเรื่องสำคัญ ที่นี่เราสรุปการกำหนดค่าที่เป็นไปได้บางส่วน:

การกระจายผู้ปฏิบัติงานหลายคน

ที่นี่เราสามารถใช้ COMMON_MACHINE_CONFIGS เพื่อกำหนด CPU หลัก 1 ตัวและ GPU สำหรับผู้ปฏิบัติงาน 4 ตัว

tfc.run(
    docker_image_bucket_name=gcp_bucket,
    chief_config=tfc.COMMON_MACHINE_CONFIGS['CPU'],
    worker_count=2,
    worker_config=tfc.COMMON_MACHINE_CONFIGS['T4_4X']
)

โดยค่าเริ่มต้น TensorFlow Cloud จะเลือกกลยุทธ์การกระจายที่ดีที่สุดสำหรับการกำหนดค่าเครื่องของคุณด้วยสูตรง่ายๆโดยใช้ chief_config , worker_config และ worker_count มีให้

การกระจาย TPU

มาฝึกโมเดลเดียวกันบน TPU ดังที่แสดง:

tfc.run(
    docker_image_bucket_name=gcp_bucket,
    chief_config=tfc.COMMON_MACHINE_CONFIGS["CPU"],
    worker_count=1,
    worker_config=tfc.COMMON_MACHINE_CONFIGS["TPU"]
)

กลยุทธ์การจัดจำหน่ายที่กำหนดเอง

ในการระบุกลยุทธ์การแจกจ่ายที่กำหนดเองให้จัดรูปแบบโค้ดของคุณตามปกติตามที่คุณทำตาม คู่มือการฝึกอบรมแบบกระจาย และตั้งค่า distribution_strategy เป็น None ด้านล่างนี้เราจะระบุกลยุทธ์การกระจายของเราเองสำหรับรูปแบบ MNIST เดียวกัน

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

mirrored_strategy = tf.distribute.MirroredStrategy()
with mirrored_strategy.scope():
  model = create_model()

if tfc.remote():
    epochs = 100
    batch_size = 128
else:
    epochs = 10
    batch_size = 64
    callbacks = None

model.fit(
    x_train, y_train, epochs=epochs, callbacks=callbacks, batch_size=batch_size
)

tfc.run(
    docker_image_bucket_name=gcp_bucket,
    chief_config=tfc.COMMON_MACHINE_CONFIGS['CPU'],
    worker_count=2,
    worker_config=tfc.COMMON_MACHINE_CONFIGS['T4_4X'],
    distribution_strategy=None
)

ภาพ Docker ที่กำหนดเอง

ตามค่าเริ่มต้น TensorFlow Cloud จะใช้ อิมเมจฐาน Docker ที่ จัดหาโดย Google และสอดคล้องกับ TensorFlow เวอร์ชันปัจจุบันของคุณ อย่างไรก็ตามคุณยังสามารถระบุอิมเมจ Docker ที่กำหนดเองเพื่อให้เหมาะกับความต้องการในการสร้างของคุณได้หากจำเป็น สำหรับตัวอย่างนี้เราจะระบุอิมเมจ Docker จาก TensorFlow เวอร์ชันเก่า:

tfc.run(
    docker_image_bucket_name=gcp_bucket,
    base_docker_image="tensorflow/tensorflow:2.1.0-gpu"
)

เมตริกเพิ่มเติม

คุณอาจพบว่ามีประโยชน์ในการแท็กงานระบบคลาวด์ของคุณด้วยป้ายกำกับเฉพาะหรือเพื่อสตรีมบันทึกของโมเดลของคุณในระหว่างการฝึกอบรมระบบคลาวด์ เป็นแนวทางปฏิบัติที่ดีในการรักษาการติดฉลากที่เหมาะสมสำหรับงานระบบคลาวด์ทั้งหมดสำหรับการเก็บบันทึก เพื่อจุดประสงค์นี้ run() ยอมรับพจนานุกรมของเลเบลได้ถึง 64 คู่คีย์ - ค่าซึ่งมองเห็นได้จากบันทึกการสร้างคลาวด์ บันทึกเช่นประสิทธิภาพของยุคและโมเดลการบันทึกภายในสามารถเข้าถึงได้โดยใช้ลิงก์ที่ให้มาโดยเรียกใช้ tfc.run หรือพิมพ์ไปยังเทอร์มินัลภายในของคุณโดยใช้แฟ stream_logs

job_labels = {"job": "mnist-example", "team": "keras-io", "user": "jonah"}

tfc.run(
    docker_image_bucket_name=gcp_bucket,
    job_labels=job_labels,
    stream_logs=True
)

วางมันทั้งหมดเข้าด้วยกัน

สำหรับ Colab เชิงลึกซึ่งใช้คุณสมบัติหลายอย่างที่อธิบายไว้ในคู่มือนี้ให้ทำตาม ตัวอย่างนี้ เพื่อฝึกโมเดลที่ล้ำสมัยเพื่อจดจำสายพันธุ์สุนัขจากภาพถ่ายโดยใช้การดึงคุณลักษณะ