הורדה, עיבוד מראש והעלאה של מערך הנתונים ImageNet

במאמר הזה מוסבר איך להוריד את מערך הנתונים ImageNet, לבצע בו עיבוד מקדים ולהעלות אותו לשימוש בארכיטקטורת מכונת וירטואלית של Cloud TPU.

‫ImageNet הוא מסד נתונים של תמונות. התמונות במסד הנתונים מאורגנות בהיררכיה, וכל צומת בהיררכיה מיוצג על ידי מאות ואלפי תמונות.

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

עיבוד מראש של מערך הנתונים המלא ImageNet

מערך הנתונים ImageNet מורכב משלושה חלקים: נתוני אימון, נתוני אימות ותוויות תמונות.

נתוני האימון מכילים 1,000 קטגוריות ו-1.2 מיליון תמונות, והם זמינים להורדה. נתוני האימות והבדיקה לא כלולים בנתוני האימון של ImageNet (הכפילויות הוסרו).

נתוני האימות והבדיקה מורכבים מ-150,000 תמונות שנאספו מ-Flickr וממנועי חיפוש אחרים, וסומנו ידנית בנוכחות או בהיעדר של 1, 000 קטגוריות של אובייקטים. 1,000 קטגוריות האובייקטים כוללות גם צמתים פנימיים וגם צמתי עלים של ImageNet, אבל אין חפיפה ביניהן. קבוצת משנה אקראית של 50,000 תמונות עם תוויות פורסמה כנתוני אימות, יחד עם רשימה של 1,000 קטגוריות. התמונות שנותרו משמשות לצורך הערכה, והן פורסמו ללא תוויות.

שלבים לעיבוד מראש של מערך הנתונים המלא ImageNet

יש חמישה שלבים להכנת מערך הנתונים המלא של ImageNet לשימוש על ידי מודל למידת מכונה:

  1. מוודאים שיש מקום ביעד ההורדה.
  2. הגדרת ספריות היעד
  3. נרשמים באתר ImageNet ומבקשים הרשאת הורדה.
  4. הורדת קבוצת הנתונים לדיסק מקומי או למכונה וירטואלית

  5. מריצים את הסקריפט לעיבוד מראש ולהעלאה.

אימות דרישות המקום

לא משנה אם מורידים את מערך הנתונים למחשב מקומי או למכונה וירטואלית, צריך לפחות 300GB של נפח אחסון פנוי ביעד ההורדה.

הקצאת הדיסק שמוגדרת כברירת מחדל למכונת TPU VM היא 10GB. ההורדה למכונת ה-TPU הווירטואלית דורשת 300GiB, ולכן אם אתם מתכוונים להוריד למכונת ה-TPU הווירטואלית, אתם צריכים להוסיף נפח אחסון בלוקים עמיד עם נפח נוסף כדי להשלים את ההורדה, או להגדיל את הגודל של דיסק האתחול ב-TPU. ב-TPU VM, אפשר לבדוק את נפח האחסון הזמין באמצעות הפקודה df -ha. מידע נוסף על שינוי הגודל של דיסקים זמין במאמרים שינוי הגודל והביצועים המוקצים של נפח Hyperdisk ושינוי הגודל של נפח Persistent Disk.

כשמוסיפים אחסון בלוקים עמיד, חשוב לציין את הספרייה שבה הדיסק הותקן. לדוגמה: /mnt/disks/mnt-dir.

הגדרת ספריות היעד

במכונה המקומית או במופע של מכונה וירטואלית, מגדירים את מבנה הספריות לאחסון הנתונים שהורדו.

  1. עוברים לספרייה שבה רוצים להוריד את הנתונים. אם אתם משתמשים ב-Persistent Disk, מחליפים את DATASET_ROOT_DIR בספרייה שבה הדיסק מותקן, לדוגמה, /mnt/disks/mnt-dir:

    cd DATASET_ROOT_DIR
  2. יוצרים ספרייה, לדוגמה, imagenet, ביעד ההורדה (מחשב מקומי או TPU VM).

    mkdir imagenet
    
  3. בספרייה הזו, יוצרים שתי ספריות משנה: train ו-validation.

    mkdir imagenet/train
    mkdir imagenet/validation
    
  4. מייצאים את ספריית imagenet כקובץ IMAGENET_HOME.

    export IMAGENET_HOME=DATASET_ROOT_DIR/imagenet
    sudo chown ${USER} ${IMAGENET_HOME}

הרשמה ובקשת הרשאה להורדת מערך הנתונים

נרשמים באתר Imagenet. לא תוכלו להוריד את מערך הנתונים עד ש-ImageNet תאשר את ההרשמה ותשלח לכם אימייל אישור. אם לא קיבלתם את אישור ההרשמה באימייל תוך כמה ימים, אתם יכולים ליצור קשר עם התמיכה של ImageNet כדי לברר למה ההרשמה שלכם לא אושרה. אחרי שההרשמה תאושר, תוכלו להוריד את מערך הנתונים. במדריכים ל-Cloud TPU שמשתמשים במערך הנתונים ImageNet, נעשה שימוש בתמונות מ-ImageNet Large Scale Visual Recognition Challenge 2012 ‏ (ILSVRC2012).

הורדת מערך הנתונים ImageNet

  1. באתר ההורדה של LSRVC 2012, עוברים לקטע Images (תמונות) בדף ולוחצים לחיצה ימנית על Training images (תמונות לאימון) (Task 1 & 2) (משימה 1 ו-2). כתובת ה-URL להורדה של החלק הכי גדול של מערך האימון. שומרים את כתובת ה-URL.

    לוחצים לחיצה ימנית על 'תמונות לאימון (משימה 3)' כדי לקבל את כתובת ה-URL של מערך האימון השני. שומרים את כתובת ה-URL.

    לוחצים לחיצה ימנית על 'תמונות אימות (כל המשימות)' כדי לקבל את כתובת ה-URL של מערך נתוני האימות. שומרים את כתובת ה-URL.

    אם מורידים את קובצי ImageNet למכונה המקומית, צריך להעתיק את הספריות במכונה המקומית לספרייה התואמת $IMAGENET_HOMEבמכונה הווירטואלית. העתקת מערך הנתונים של ImageNet ממארח מקומי למופע של מכונה וירטואלית נמשכת כ-13 שעות.

    לפני שמעתיקים את מערך הנתונים ImageNet למכונה הווירטואלית של TPU, צריך לזהות את השם של מופע המכונה הווירטואלית של TPU. כדי לעשות את זה, מתחברים למכונת ה-TPU הווירטואלית באמצעות SSH. שם מכונת ה-VM מוצג בשורת הפקודה אחרי הסמל @.

    משתמשים בפקודה הבאה כדי להעתיק את הקבצים שבתיקייה ‎~/imagenet במחשב המקומי אל $IMAGENET_HOME במכונת ה-VM.

    gcloud compute scp --recurse $IMAGENET_HOME USERNAME@VM_INSTANCE_NAME:~/imagenet
  2. מתוך $IMAGENET_HOME, מורידים את הקבצים Training images (Task 1 & 2) באמצעות כתובת ה-URL השמורה.

    הקובץ Training images (Task 1 & 2) הוא מערך האימון הגדול. הגודל שלו הוא 138GiB, ואם מורידים אותו ל-TPU VM באמצעות Cloud Shell, ההורדה נמשכת כ-40 שעות. אם החיבור של Cloud Shell למכונה הווירטואלית מתנתק, אפשר להוסיף את הקידומת nohup לפקודה או להשתמש ב-screen.

    cd $IMAGENET_HOME
    nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar

    מחליפים את כתובת ה-URL בכתובת ה-URL ששמרתם קודם עבור 'תמונות לאימון (משימה 1 ומשימה 2)', כי יכול להיות שכתובת ה-URL השתנתה.

  3. מחלקים את ספריות ההדרכה הנפרדות לספרייה $IMAGENET_HOME/train באמצעות הפקודה הבאה. החילוץ נמשך בין שעה ל-3 שעות.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train

    מחלקים את קובצי ה-tar של האימון שנמצאים בספרייה $IMAGENET_HOME/train, כמו שמוצג בתסריט הבא:

    cd $IMAGENET_HOME/train
    for f in *.tar; do
        d=basename $f .tar
        mkdir $d
        tar xf $f -C $d
    done

    אחרי שאתם מחלצים את קובצי ה-tar, מומלץ למחוק אותם כדי לפנות מקום בדיסק.

  4. מתוך $IMAGENET_HOME, מורידים את הקבצים Training images (Task 3) באמצעות כתובת ה-URL שנשמרה.

    הקובץ Training images (Task 3)‎ (תמונות לאימון (משימה 3)) הוא בגודל 728MB, וההורדה שלו אורכת כמה דקות בלבד, כך שלא צריך לנקוט אמצעי זהירות כדי למנוע ניתוק של Cloud Shell.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar

    מחליפים את כתובת ה-URL בכתובת ה-URL ששמרתם קודם עבור 'תמונות לאימון (משימה 3)', כי יכול להיות שכתובת ה-URL השתנתה.

  5. מחלקים את ספריות ההדרכה הנפרדות לספרייה $IMAGENET_HOME/train באמצעות הפקודה הבאה.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train

    מחלקים את קובצי ה-tar של האימון שנמצאים בספרייה $IMAGENET_HOME/train, כמו שמוצג בתסריט הבא:

    cd ${IMAGENET_HOME}/train
    
    for f in *.tar; do
        d=`basename $f .tar`
        mkdir $d
        tar xf $f -C $d
    done

    אחרי שאתם מחלצים את קובצי ה-tar, מומלץ למחוק אותם כדי לפנות מקום בדיסק.

  6. מתוך $IMAGENET_HOME, מורידים את הקבצים 'תמונות אימות (כל המשימות)' באמצעות כתובת ה-URL שנשמרה.

    יכול להיות שתהיה בעיה בחיבור ל-Cloud Shell כשמורידים את הקובץ Validation images (all tasks). כדי למנוע ניתוק של Cloud Shell, אפשר להשתמש ב-nohup או ב-screen.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar

    מחליפים את כתובת ה-URL בכתובת ה-URL ששמרתם קודם עבור 'תמונות לאימות' (כל המשימות), כי יכול להיות שכתובת ה-URL השתנתה.

    ההורדה תימשך כ-30 דקות.

  7. מחלקים את קובצי האימות הנפרדים לספרייה $IMAGENET_HOME/validation באמצעות הפקודה הבאה.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation

    אם הורדתם את קובצי האימות למחשב המקומי, אתם צריכים להעתיק את הספרייה $IMAGENET_HOME/validation במחשב המקומי לספרייה $IMAGENET_HOME/validation במופע של המכונה הווירטואלית. פעולת ההעתקה הזו נמשכת כ-30 דקות.

  8. מורידים את קובץ התוויות.

    wget -O $IMAGENET_HOME/synset_labels.txt \
    https://raw.githubusercontent.com/tensorflow/models/master/research/slim/datasets/imagenet_2012_validation_synset_labels.txt

    אם הורדתם את קובץ התוויות למחשב המקומי, אתם צריכים להעתיק אותו לספרייה $IMAGENET_HOME במחשב המקומי אל $IMAGENET_HOME במופע של המכונה הווירטואלית. פעולת ההעתקה הזו נמשכת כמה שניות.

    השמות של ספריות המשנה של נתוני האימון (לדוגמה, n03062245) הם 'מזהי WordNet' (wnid). ב-ImageNet API אפשר לראות את המיפוי של מזהי WordNet לתוויות האימות המשויכות להם בקובץ synset_labels.txt. במקרה הזה, קבוצת מילים נרדפות היא קבוצה של תמונות דומות מבחינה חזותית.

עיבוד מערך הנתונים של Imagenet והעלאה שלו ל-Cloud Storage (אופציונלי)

  1. מורידים את הסקריפט imagenet_to_gcs.py מ-GitHub:

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
  2. אם אתם מעלים את מערך הנתונים ל-Cloud Storage:

    1. משתמשים בקטגוריה קיימת או יוצרים קטגוריה חדשה לפי ההוראות שבמאמר יצירת קטגוריות.

    2. מציינים את המיקום של קטגוריית האחסון כדי להעלות את מערך הנתונים של ImageNet:

      export STORAGE_BUCKET=gs://BUCKET_NAME
  3. אם אתם מעלים את מערך הנתונים למחשב המקומי או למכונה וירטואלית, צריך לציין ספריית נתונים לאחסון מערך הנתונים:

    (vm)$ export DATA_DIR=$IMAGENET_HOME/DATASET_DIRECTORY
  4. מתקינים את הספריות הבאות במחשב או בסביבה וירטואלית:

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. מריצים את הסקריפט כדי לבצע עיבוד מקדים של מערך הנתונים הגולמי כ-TFRecords ומעלים אותו ל-Cloud Storage באמצעות הפקודה הבאה:

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$STORAGE_BUCKET  \
      --raw_data_dir=$IMAGENET_HOME \
      --local_scratch_dir=$IMAGENET_HOME/tf_records

הסקריפט יוצר קבוצה של ספריות (גם לאימון וגם לאימות) של הטופס:

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024

וגם

${DATA_DIR}/validation-00000-of-00128
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

אחרי שהנתונים מועלים לקטגוריה ב-Cloud, מריצים את המודל ומגדירים את --data_dir=${DATA_DIR}.