דף זה תורגם על ידי Cloud Translation API.
Switch to English

טיפים לביצועים

מסמך זה מספק טיפים לביצועים ספציפיים ל- TFDS. שים לב ש- TFDS מספק ערכות נתונים כ- tf.data.Dataset s, ולכן העצות tf.data עדיין חלות.

מערכי נתונים של מידוד

השתמש ב- tfds.core.benchmark(ds) כדי לבצע אמות מידה עם כל אובייקט tf.data.Dataset .

הקפד לציין את batch_size= כדי לנרמל את התוצאות (למשל 100 iter / sec -> 3200 ex / sec).

ds = tfds.load('mnist', split='train').batch(32).prefetch()
# Display some benchmark statistics
tfds.core.benchmark(ds, batch_size=32)
# Second iteration is much faster, due to auto-caching
tfds.core.benchmark(ds, batch_size=32)

מערכי נתונים קטנים (<GB)

כל מערכי הנתונים של TFDS מאחסנים את הנתונים בדיסק בפורמט TFRecord . עבור מערכי נתונים קטנים (למשל Mnist, Cifar, ...), קריאה מ .tfrecord יכולה להוסיף תקורה משמעותית.

מכיוון שמערכי נתונים אלה נכנסים לזיכרון, ניתן לשפר משמעותית את הביצועים על ידי אחסון במטמון או טעינה מראש של מערך הנתונים. שים לב ש- TFDS שומר אוטומטית קבוצות נתונים קטנות (ראה פרק הבא לפרטים).

שמירת מערך הנתונים

להלן דוגמה לצינור נתונים אשר מטמון במפורש את מערך הנתונים לאחר מנרמל התמונות.

def normalize_img(image, label):
  """Normalizes images: `uint8` -> `float32`."""
  return tf.cast(image, tf.float32) / 255., label


ds, ds_info = tfds.load(
    'mnist',
    split='train',
    as_supervised=True,  # returns `(img, label)` instead of dict(image=, ...)
    with_info=True,
)
# Applying normalization before `ds.cache()` to re-use it.
# Note: Random transformations (e.g. images augmentations) should be applied
# after both `ds.cache()` (to avoid caching randomness) and `ds.batch()` (for
# vectorization [1]).
ds = ds.map(normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.cache()
# For true randomness, we set the shuffle buffer to the full dataset size.
ds = ds.shuffle(ds_info.splits['train'].num_examples)
# Batch after shuffling to get unique batches at each epoch.
ds = ds.batch(128)
ds = ds.prefetch(tf.data.experimental.AUTOTUNE)

בעת איטרציה על מערך נתונים זה, האיטרציה השנייה תהיה מהירה בהרבה מהראשונה בזכות המטמון.

אחסון במטמון אוטומטי

כברירת מחדל, TFDS שומר קבצים אוטומטיים קבוצות נתונים העומדות באילוצים הבאים:

  • הגודל הכולל של מערך הנתונים (כל הפיצולים) מוגדר ו <250 MiB
  • shuffle_files מושבת, או קוראים רק רסיס אחד

אפשר לבטל את הסכמתך למטמון אוטומטי על ידי העברת try_autocaching=False ל- tfds.ReadConfig ב- tfds.load . עיין בתיעוד קטלוג מערך הנתונים כדי לראות אם מערך נתונים ספציפי ישתמש במטמון אוטומטי.

טוען את הנתונים המלאים כטנסור יחיד

אם מערך הנתונים שלך נכנס לזיכרון, תוכל גם לטעון את מערך הנתונים המלא כמערך Tensor או NumPy יחיד. אפשר לעשות זאת על ידי הגדרת batch_size=-1 לאצווה את כל הדוגמאות ב- tf.Tensor יחיד. לאחר מכן השתמש ב- tfds.as_numpy להמרה מ- tf.Tensor ל- np.array .

(img_train, label_train), (img_test, label_test) = tfds.as_numpy(tfds.load(
    'mnist',
    split=['train', 'test'],
    batch_size=-1,
    as_supervised=True,
))

מערכי נתונים גדולים

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

דשדוש ואימונים

במהלך האימון חשוב לדשדש היטב את הנתונים; נתונים מעורבבים בצורה גרועה עלולים לגרום לדיוק נמוך יותר באימונים.

בנוסף לשימוש ב- ds.shuffle כדי לערבב רשומות, עליך גם להגדיר shuffle_files=True כדי לקבל התנהגות מדשדשת טובה עבור מערכי נתונים גדולים יותר שמגוררים למספר קבצים. אחרת, תקופות יקראו את הרסיסים באותו סדר, ולכן הנתונים לא יהיו אקראיים באמת.

ds = tfds.load('imagenet2012', split='train', shuffle_files=True)

בנוסף, כאשר shuffle_files=True , TFDS משבית options.experimental_deterministic אופציונליות. ניסוי_דטרמיניסטי, מה שעשוי לתת שיפור ביצועים קל. כדי לקבל דשדוש דטרמיניסטי, ניתן לבטל את הצטרפותך לתכונה זו באמצעות tfds.ReadConfig : על ידי הגדרת read_config.shuffle_seed או החלפת read_config.options.experimental_deterministic .

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

כאשר אימון על עובדים מרובים, אתה יכול להשתמש input_context הטיעון של tfds.ReadConfig , כך שכל עובד ייקרא קבוצת משנה של נתון.

input_context = tf.distribute.InputContext(
    input_pipeline_id=1,  # Worker id
    num_input_pipelines=4,  # Total number of workers
)
read_config = tfds.ReadConfig(
    input_context=input_context,
)
ds = tfds.load('dataset', split='train', read_config=read_config)

זה משלים ל- API המשנה. ראשית מוחל ה- API של תת המשנה ( train[:50%] מומרת לרשימת קבצים לקריאה) ואז ds.shard() op על אותם קבצים. דוגמא: כאשר משתמשים train[:50%] עם num_input_pipelines=2 , כל אחד מהעובדים 2 יקרא 1/4 מהנתונים.

When shuffle_files=True , קבצים shuffle_files=True בתוך עובד אחד, אך לא בין עובדים. כל עובד יקרא את אותה קבוצת קבצים בין עידנים.

פענוח תמונות מהיר יותר

כברירת מחדל TFDS מפענח תמונות באופן אוטומטי. עם זאת, ישנם מקרים בהם יכול להיות יותר ביצועים לדלג על פענוח התמונה באמצעות tfds.decode.SkipDecoding ולהחיל ידנית את tf.io.decode_image op:

  • בעת סינון דוגמאות (עם ds.filter ), לפענוח תמונות לאחר שסוננו דוגמאות.
  • בעת חיתוך תמונות, השתמש ב- tf.image.decode_and_crop_jpeg op.

הקוד לשתי הדוגמאות זמין במדריך הפענוח .