web-dev-qa-db-fra.com

API de données Tensorflow - prefetch

J'essaie d'utiliser de nouvelles fonctionnalités de TF, à savoir l'API Data, et je ne sais pas comment prefetch fonctionne. Dans le code ci-dessous

def dataset_input_fn(...)
    dataset = tf.data.TFRecordDataset(filenames, compression_type="ZLIB")
    dataset = dataset.map(lambda x:parser(...))
    dataset = dataset.map(lambda x,y: image_augmentation(...)
                      , num_parallel_calls=num_threads
                     )

    dataset = dataset.shuffle(buffer_size)
    dataset = dataset.batch(batch_size)    
    dataset = dataset.repeat(num_epochs)
    iterator = dataset.make_one_shot_iterator()

est-ce important entre chaque ligne au-dessus je mets dataset=dataset.prefetch(batch_size)? Ou peut-être que cela devrait être après chaque opération qui utiliserait output_buffer_size Si l'ensemble de données provenait de tf.contrib.data?

12
MPękalski

En discussion sur github j'ai trouvé un commentaire de mrry:

Notez que dans TF 1.4, il y aura une méthode Dataset.prefetch () qui facilite l'ajout de la prélecture à n'importe quel point du pipeline, pas seulement après une map (). (Vous pouvez l'essayer en téléchargeant la version nocturne actuelle.)

et

Par exemple, Dataset.prefetch () démarrera un thread d'arrière-plan pour remplir un tampon ordonné qui agit comme un tf.FIFOQueue, afin que les étapes de pipeline en aval n'aient pas besoin de se bloquer. Cependant, l'implémentation prefetch () est beaucoup plus simple, car elle n'a pas besoin de prendre en charge autant d'opérations simultanées différentes qu'un tf.FIFOQueue.

cela signifie donc que la prélecture pourrait être mise par n'importe quelle commande et cela fonctionne sur la commande précédente. Jusqu'à présent, j'ai remarqué les gains de performances les plus importants en ne les mettant qu'à la toute fin.

Il y a une autre discussion sur Signification de buffer_size dans Dataset.map, Dataset.prefetch et Dataset.shuffle où mrry explique un peu plus sur le prefetch et le tampon.

MISE À JOUR 2018/10/01 :

Depuis la version 1.7.0, l'API Dataset (dans contrib) a une option pour prefetch_to_device. Notez que cette transformation doit être la dernière du pipeline et lorsque TF 2.0 arrivera contrib aura disparu. Pour que la prélecture fonctionne sur plusieurs GPU, veuillez utiliser MultiDeviceIterator (exemple voir # 1361 ) multi_device_iterator_ops.py .

https://www.tensorflow.org/versions/master/api_docs/python/tf/contrib/data/prefetch_to_device

12
MPękalski