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

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

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

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

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

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

תיקיית סיווג התמונות במאגר כלי ההמרה של נתונים ב-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=your-project-id --location=us-central2
  2. מפעילים Cloud TPU באמצעות הפקודה gcloud.

    $ gcloud compute tpus tpu-vm create tpu-name \
        --zone=us-central2-b \
        --accelerator-type=v4-8 \
        --version=tpu-vm-tf-2.17.1-pjrt

    תיאורים של דגלי פקודות

    • zone: האזור שבו אתם מתכננים ליצור את Cloud TPU.
    • accelerator-type: סוג המאיץ מציין את הגרסה והגודל של Cloud TPU שרוצים ליצור. מידע נוסף על סוגי המאיצים הנתמכים בכל גרסת TPU זמין במאמר בנושא גרסאות TPU.
    • version: גרסת התוכנה של Cloud TPU.
  3. מתחברים ל-TPU באמצעות SSH:

    $ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b

    כשמתחברים ל-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 נמצא בתיקייה 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 כדי למחוק את משאב ה-VM.

    $ gcloud compute tpus tpu-vm delete tpu-name \
      --zone=us-central2-b
  3. מריצים את הפקודה gcloud compute tpus tpu-vm list כדי לוודא שה-VM נמחק. יכול להיות שיחלפו כמה דקות עד שהמחיקה תסתיים. תגובה כמו הדוגמה הבאה מציינת שהמופעים נמחקו בהצלחה.

    $ gcloud compute tpus tpu-vm list --zone=us-central2-b
    Listed 0 items.
    
  4. מריצים את ה-CLI של gcloud כמו שמוצג, ומחליפים את bucket-name בשם של קטגוריה של Cloud Storage שיצרתם לצורך המדריך הזה:

    $ gcloud storage rm gs://bucket-name --recursive