המרת מערך נתונים של סיווג תמונות לשימוש עם Cloud TPU

במדריך הזה מוסבר איך להשתמש בסקריפט image classification data converter sample כדי להמיר מערך נתונים גולמי של סיווג תמונות לפורמט TFRecord שמשמש לאימון מודלים של Cloud TPU.

קובצי TFRecord מאפשרים לקרוא קבצים גדולים מ-Cloud Storage בצורה יעילה יותר מאשר לקרוא כל תמונה כקובץ נפרד. אפשר להשתמש ב-TFRecord בכל מקום שבו משתמשים בצינור (pipeline) של tf.data.Dataset.

מידע נוסף על השימוש ב-TFRecord זמין במאמרי TensorFlow הבאים:

אם אתם משתמשים ב-PyTorch או ב-JAX ולא ב-Cloud Storage לאחסון מערך הנתונים, יכול להיות שלא תיהנו מאותם יתרונות של TFRecords.

סקירה כללית של המרות

התיקייה image classification (סיווג תמונות) במאגר של כלי להמרת נתונים ב-GitHub מכילה את הסקריפט converter, את image_classification_data.py ואת הטמעה לדוגמה simple_example.py שאפשר להעתיק ולשנות כדי לבצע המרת נתונים משלכם.

בדוגמה של ממיר נתוני סיווג התמונות מוגדרות שתי מחלקות, ImageClassificationConfig ו-ImageClassificationBuilder. הכיתות האלה מוגדרות ב-tpu/tools/data_converter/image_classification_data.py.

ImageClassificationConfig היא מחלקה בסיסית מופשטת. מגדירים מחלקת משנה (subclass) של ImageClassificationConfig כדי להגדיר את ההגדרה שנדרשת ליצירת מופע של ImageClassificationBuilder.

ImageClassificationBuilder הוא כלי ליצירת מערכי נתונים של TensorFlow לסיווג של מערכי נתונים של תמונות. זו מחלקה משנית של tdfs.core.GeneratorBasedBuilder. הוא מאחזר דוגמאות נתונים ממערך הנתונים וממיר אותן ל-TFRecords. קובצי TFRecord נכתבים לנתיב שצוין על ידי הפרמטר data_dir של המתודה __init__ של ImageClassificationBuilder.

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

הפונקציה main() יוצרת מערך נתונים של נתוני תמונה שנוצרו באופן אקראי ומבצעת יצירה של אובייקט SimpleDatasetConfig, תוך ציון מספר הסיווגים והנתיב למערך הנתונים בדיסק. לאחר מכן, main() יוצר מופע של אובייקט ImageClassificationBuilder, ומעביר את המופע SimpleDatasetConfig. ולסיום, main() שיחות download_and_prepare(). כשקוראים לשיטה הזו, מופע ImageClassificationBuilder משתמש בגנרטור של דוגמאות נתונים שהוטמע על ידי SimpleDatasetConfig כדי לטעון כל דוגמה, ושומר אותן בסדרה של קובצי TFRecord.

הסבר מפורט יותר זמין במחברת Classification Converter.

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

כדי להמיר את מערך הנתונים לפורמט TFRecord, צריך ליצור מחלקת משנה של ImageClassificationConfig ולהגדיר את המאפיינים הבאים:

  • num_labels: מחזירה את מספר סיווגי התמונות
  • supported_modes: מחזירה רשימה של מצבים שנתמכים על ידי מערך הנתונים שלכם (לדוגמה: test, train, validate)
  • text_label_map: מחזירה מילון שממפה בין תווית של מחלקת טקסט לבין תווית של מחלקת מספרים שלמים (SimpleDatasetConfig לא משתמשת במאפיין הזה, כי היא לא דורשת מיפוי)
  • download_path: הנתיב שממנו צריך להוריד את מערך הנתונים (‫SimpleDatasetConfig לא משתמש במאפיין הזה, ‫example_generator() טוען את הנתונים מהדיסק)

מטמיעים את פונקציית הגנרטור example_generator(). השיטה הזו צריכה להחזיר מילון שמכיל את נתוני התמונה ואת שם סיווג התמונה לכל דוגמה. הפונקציה ImageClassificationBuilder משתמשת בפונקציה example_generator() כדי לאחזר כל דוגמה ולכתוב אותה לדיסק בפורמט TFRecord.

הפעלת דוגמה להמרת נתונים

  1. יוצרים קטגוריה של Cloud Storage באמצעות הפקודה הבאה:

    gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --location=LOCATION

    מחליפים את מה שכתוב בשדות הבאים:

    • BUCKET_NAME: שם לקטגוריה.
    • PROJECT_ID: מזהה הפרויקט.
    • LOCATION: המיקום שבו תיצור הקטגוריה. לדוגמה, US-CENTRAL1.
  2. יוצרים Cloud TPU באמצעות הפקודה gcloud compute instances create.

    $ gcloud compute instances create TPU_NAME \
        --machine-type=MACHINE_TYPE \
        --zone=ZONE \
        --image-family=IMAGE_FAMILY \
        --image-project=IMAGE_PROJECT \
        --maintenance-policy=TERMINATE

    מחליפים את מה שכתוב בשדות הבאים:

    • TPU_NAME: שם ל-TPU.
    • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש עבור TPU VM. מידע נוסף זמין במאמר בנושא סוגי מכונות TPU.
    • ZONE: האזור שבו ייווצר ה-TPU.
    • IMAGE_FAMILY: משפחת התמונות של תמונת מערכת ההפעלה שרוצים להשתמש בה. תשמש התמונה העדכנית ביותר שמשויכת למשפחה הזו ושלא הוצאה משימוש. כדי לציין תמונה ספציפית, מחליפים את הדגל --image-family בדגל --image ומגדירים את הערך שלו לתמונה של מערכת הפעלה נתמכת. רשימה של מערכות הפעלה נתמכות זמינה במאמר תמונות של מערכות הפעלה של TPU.
    • IMAGE_PROJECT: מזהה הפרויקט של תמונת מערכת ההפעלה. רשימה של מזהי פרויקטים שמשויכים לכל תמונה ציבורית זמינה במאמר בנושא תמונות של מערכת הפעלה של TPU.
  3. מתחברים ל-TPU באמצעות SSH:

    $ gcloud compute ssh TPU_NAME --zone=ZONE

    כשמתחברים ל-TPU, שורת הפקודה של המעטפת משתנה מ-username@projectname ל-username@vm-name.

  4. מתקינים את החבילות הנדרשות.

    (vm)$ pip3 install opencv-python-headless pillow
    (vm)$ pip3 install tensorflow-datasets
  5. יוצרים את משתני הסביבה הבאים שבהם הסקריפט משתמש.

    (vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME
    (vm)$ export CONVERTED_DIR=$HOME/tfrecords
    (vm)$ export GENERATED_DATA=$HOME/data
    (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords
    (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw
    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
  6. מורידים את מאגר TensorFlow TPU.

    (vm)$ cd /usr/share/
    (vm)$ git clone https://github.com/tensorflow/tpu.git
    (vm)$ cd tpu/tools/data_converter

הפעלת כלי להמרת נתונים במערך נתונים פיקטיבי

סקריפט simple_example.py נמצא בתיקייה simple_example.py של דוגמת ממיר הנתונים.image_classification הפעלת הסקריפט עם הפרמטרים הבאים יוצרת קבוצה של תמונות מזויפות וממירה אותן ל-TFRecords.

(vm)$ python3 image_classification/simple_example.py \
  --num_classes=1000 \
  --data_path=$GENERATED_DATA \
  --generate=True \
  --num_examples_per_class_low=10 \
  --num_examples_per_class_high=11 \
  --save_dir=$CONVERTED_DIR

הפעלת כלי להמרת נתונים באחד ממערכי הנתונים הגולמיים שלנו

  1. יוצרים משתנה סביבה למיקום של הנתונים הגולמיים.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
  2. מריצים את הסקריפט simple_example.py.

    (vm)$ python3 image_classification/simple_example.py \
    --num_classes=1000 \
    --data_path=$GCS_RAW \
    --generate=False \
    --save_dir=$CONVERTED_DIR

הסקריפט simple_example.py מקבל את הפרמטרים הבאים:

  • num_classes מתייחס למספר הכיתות במערך הנתונים. אנחנו משתמשים כאן ב-1000 כדי להתאים לפורמט ImageNet.
  • generate קובע אם ליצור את הנתונים הגולמיים.
  • data_path מתייחס לנתיב שבו הנתונים נוצרים אם generate=True, או לנתיב שבו הנתונים הגולמיים מאוחסנים אם generate=False.
  • ההגדרות num_examples_per_class_low ו-num_examples_per_class_high קובעות כמה דוגמאות ייווצרו לכל כיתה. הסקריפט יוצר מספר אקראי של דוגמאות בטווח הזה.
  • save_dir מתייחס למיקום שבו נשמרים קובצי ה-TFRecord. כדי לאמן מודל ב-Cloud TPU, הנתונים צריכים להיות מאוחסנים ב-Cloud Storage. זה יכול להיות ב-Cloud Storage או במכונה הווירטואלית.

שינוי השם של קובצי TFRecord והעברה שלהם ל-Cloud Storage

בדוגמה הבאה נעשה שימוש בנתונים שהומרו עם מודל ResNet.

  1. משנים את השם של קובצי TFRecord לאותו פורמט כמו קובצי TFRecord של ImageNet:

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ sudo apt update
    (vm)$ sudo apt install rename
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. מעתיקים את קובצי ה-TFRecord ל-Cloud Storage:

    (vm)$ gcloud storage cp train* $GCS_CONVERTED
    (vm)$ gcloud storage cp validation* $GCS_CONVERTED

הסרת המשאבים

  1. מתנתקים מ-Cloud TPU, אם עדיין לא עשיתם זאת:

    (vm)$ exit

    ההנחיה אמורה להיות עכשיו user@projectname, מה שמראה שאתם ב-Cloud Shell.

  2. ב-Cloud Shell, מריצים את הפקודה gcloud compute instances delete כדי למחוק את מכונת ה-VM של TPU.

    $ gcloud compute instances delete TPU_NAME \
        --zone=ZONE
  3. מריצים את הפקודה gcloud compute instances list כדי לוודא שה-VM נמחק. יכול להיות שתהליך המחיקה יימשך כמה דקות.

    $ gcloud compute instances list --zone=ZONE
  4. כדי למחוק את הקטגוריה, מריצים את הפקודה הבאה ומחליפים את BUCKET_NAME בשם הקטגוריה שיצרתם במדריך הזה:

    $ gcloud storage rm gs://BUCKET_NAME --recursive