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

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

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

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

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

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

הקצאת הדיסק שמוגדרת כברירת מחדל למכונת TPU VM היא 100GiB. ההורדה למכונת ה-TPU VM דורשת 300GiB, לכן אם אתם מורידים למופע של מכונת ה-TPU VM, תצטרכו להוסיף נפח אחסון בלוקים עמיד עם 200GiB של נפח אחסון נוסף כדי להשלים את ההורדה. ב-TPU VM, אפשר לבדוק את נפח האחסון הזמין באמצעות הפקודה df -ha. מידע נוסף על שינוי הגודל של דיסקים מצורפים זמין במאמרים שינוי ההגדרות של נפח Google Cloud 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}.