Performans ipuçları

Bu belge, TensorFlow Veri Kümelerine (TFDS) özel performans ipuçları sağlar. TFDS'nin veri kümelerini tf.data.Dataset nesneleri olarak sağladığını unutmayın, bu nedenle tf.data kılavuzundaki tavsiyeler hala geçerlidir.

Karşılaştırma veri kümeleri

Herhangi bir tf.data.Dataset nesnesini kıyaslamak için tfds.benchmark(ds) kullanın.

Sonuçları normalleştirmek için batch_size= 'ı belirttiğinizden emin olun (örn. 100 iter/sn -> 3200 ex/sn). Bu, herhangi bir yinelenebilir ile çalışır (örneğin tfds.benchmark(tfds.as_numpy(ds)) ).

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

Küçük veri kümeleri (1 GB'den az)

Tüm TFDS veri kümeleri, verileri diskte TFRecord formatında saklar. Küçük veri kümeleri için (örn. MNIST, CIFAR-10/-100), .tfrecord okumak önemli bir ek yük getirebilir.

Bu veri kümeleri belleğe sığdığından, veri kümesini önbelleğe alarak veya önceden yükleyerek performansı önemli ölçüde artırmak mümkündür. TFDS'nin küçük veri kümelerini otomatik olarak önbelleğe aldığını unutmayın (aşağıdaki bölümde ayrıntılar vardır).

Veri kümesini önbelleğe alma

Burada, görüntüleri normalleştirdikten sonra veri kümesini açıkça önbelleğe alan bir veri hattı örneği verilmiştir.

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.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)

Bu veri kümesi üzerinde yineleme yapıldığında, önbelleğe alma sayesinde ikinci yineleme ilkinden çok daha hızlı olacaktır.

Otomatik önbelleğe alma

Varsayılan olarak, TFDS, aşağıdaki kısıtlamaları karşılayan veri kümelerini ds.cache() ile) otomatik olarak önbelleğe alır:

  • Toplam veri kümesi boyutu (tüm bölümler) tanımlanır ve < 250 MiB
  • shuffle_files devre dışı bırakıldı veya yalnızca tek bir parça okundu

tfds.ReadConfig içindeki tfds.load try_autocaching=False öğesini tfds.ReadConfig öğesine ileterek otomatik önbelleğe almayı devre dışı bırakmak mümkündür. Belirli bir veri kümesinin otomatik önbellek kullanıp kullanmayacağını görmek için veri kümesi kataloğu belgelerine bakın.

Tüm verileri tek bir Tensör olarak yükleme

Veri kümeniz belleğe sığıyorsa, tüm veri kümesini tek bir Tensör veya NumPy dizisi olarak da yükleyebilirsiniz. Bunu, tüm örnekleri tek bir tf.Tensor toplu olarak toplu batch_size=-1 ayarlayarak yapmak mümkündür. Ardından tfds.as_numpy dönüştürme için 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,
))

Büyük veri kümeleri

Büyük veri kümeleri parçalanır (birden çok dosyaya bölünür) ve genellikle belleğe sığmaz, bu nedenle önbelleğe alınmamaları gerekir.

Karıştırma ve eğitim

Eğitim sırasında verileri iyi karıştırmak önemlidir - kötü karıştırılmış veriler daha düşük eğitim doğruluğuna neden olabilir.

Kayıtları karıştırmak için ds.shuffle kullanmaya ek olarak, birden çok dosyaya bölünmüş daha büyük veri kümeleri için iyi karıştırma davranışı elde etmek için shuffle_files=True değerini de ayarlamalısınız. Aksi takdirde, dönemler parçaları aynı sırayla okuyacak ve bu nedenle veriler gerçekten rastgele olmayacaktır.

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

Ek olarak, shuffle_files=True olduğunda, TFDS options.deterministic öğesini devre dışı bırakır, bu da hafif bir performans artışı sağlayabilir. Deterministik karıştırma elde etmek için, tfds.ReadConfig ile bu özelliği devre dışı bırakmak mümkündür: ya read_config.shuffle_seed ayarlayarak ya da read_config.options.deterministic üzerine yazarak.

Verilerinizi çalışanlar arasında otomatik olarak paylaşın (TF)

Birden çok çalışan üzerinde eğitim verirken, tfds.ReadConfig input_context bağımsız değişkenini kullanabilirsiniz, böylece her çalışan verilerin bir alt kümesini okuyacaktır.

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)

Bu, alt bölünmüş API'nin tamamlayıcısıdır. İlk olarak, alt bölüm API'si uygulanır: train[:50%] , okunacak bir dosya listesine dönüştürülür. Ardından, bu dosyalara bir ds.shard() uygulanır. Örneğin, num_input_pipelines=2 ile train[:50%] kullanıldığında, 2 çalışanın her biri verilerin 1/4'ünü okuyacaktır.

shuffle_files=True olduğunda, dosyalar bir çalışan içinde karıştırılır, ancak çalışanlar arasında karıştırılmaz. Her çalışan, dönemler arasında aynı dosya alt kümesini okuyacaktır.

Verilerinizi çalışanlar arasında otomatik olarak parçalayın (Jax)

Jax ile verilerinizi çalışanlar arasında dağıtmak için tfds.split_for_jax_process veya tfds.even_splits API'sini kullanabilirsiniz. Bölünmüş API kılavuzuna bakın.

split = tfds.split_for_jax_process('train', drop_remainder=True)
ds = tfds.load('my_dataset', split=split)

tfds.split_for_jax_process , aşağıdakiler için basit bir diğer addır:

# The current `process_index` loads only `1 / process_count` of the data.
splits = tfds.even_splits('train', n=jax.process_count(), drop_remainder=True)
split = splits[jax.process_index()]

Daha hızlı görüntü kod çözme

Varsayılan olarak, TFDS görüntüleri otomatik olarak çözer. Ancak, tfds.decode.SkipDecoding ile görüntü kod çözme işlemini atlamanın ve tfds.decode.SkipDecoding tf.io.decode_image olarak uygulamanın daha performanslı olabileceği durumlar vardır:

Her iki örneğin kodu, kod çözme kılavuzunda mevcuttur.

Kullanılmayan özellikleri atla

Özelliklerin yalnızca bir alt kümesini kullanıyorsanız, bazı özellikleri tamamen atlamak mümkündür. Veri kümenizde kullanılmayan birçok özellik varsa, bunların kodunu çözmemek performansı önemli ölçüde iyileştirebilir. https://www.tensorflow.org/datasets/decode#only_decode_a_sub-set_of_the_features'a bakın