ترجمت واجهة 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)

مجموعات البيانات الصغيرة (<جيجابايت)

تقوم جميع مجموعات بيانات TFDS بتخزين البيانات على القرص بتنسيق TFRecord . بالنسبة لمجموعات البيانات الصغيرة (مثل Mnist و Cifar ...) ، يمكن للقراءة من .tfrecord أن تضيف .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 ميغا بايت
  • shuffle_files معطلة ، أو قراءة جزء واحد فقط

من الممكن إلغاء الاشتراك في التخزين المؤقت التلقائي عن طريق تمرير try_autocaching=False إلى tfds.ReadConfig في tfds.load . ألق نظرة على وثائق كتالوج مجموعة البيانات لمعرفة ما إذا كانت مجموعة بيانات معينة ستستخدم التخزين المؤقت التلقائي.

تحميل البيانات كاملة على هيئة موتر واحد

إذا كانت مجموعة البيانات الخاصة بك تتلاءم مع الذاكرة ، فيمكنك أيضًا تحميل مجموعة البيانات الكاملة كمصفوفة Tensor أو NumPy واحدة. من الممكن القيام بذلك عن طريق تعيين batch_size=-1 على 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)

هذا مكمل لواجهة برمجة التطبيقات الفرعية. أولاً يتم تطبيق subplit API (يتم تحويل train[:50%] إلى قائمة ملفات للقراءة) ، ثم يتم تطبيق ds.shard() op على تلك الملفات. مثال: عند استخدام train[:50%] مع num_input_pipelines=2 ، num_input_pipelines=2 كل عامل من العاملين 2 1/4 من البيانات.

عندما يكون shuffle_files=True ، يتم خلط الملفات داخل عامل واحد ، ولكن ليس بين العاملين. سيقرأ كل عامل نفس المجموعة الفرعية من الملفات بين العصور.

فك تشفير أسرع للصور

بشكل افتراضي يقوم TFDS بفك تشفير الصور تلقائيًا. ومع ذلك ، هناك حالات يمكن أن يكون من الأفضل فيها تخطي فك تشفير الصورة باستخدام tfds.decode.SkipDecoding وتطبيق tf.io.decode_image op يدويًا:

  • عند تصفية الأمثلة (باستخدام ds.filter ) ، لفك تشفير الصور بعد تصفية الأمثلة.
  • عند اقتصاص الصور ، لاستخدام tf.image.decode_and_crop_jpeg المرجع.

يتوفر رمز كلا المثالين في دليل فك التشفير.