Qual è il vantaggio di dividere il file tfrecord in frammenti?


17

Sto lavorando al riconoscimento vocale con Tensorflow e sto pianificando di addestrare LSTM NN con un set di dati ad onde enormi. A causa degli aumenti delle prestazioni, ho intenzione di utilizzare tfrecords. Ci sono molti esempi su Internet (Inception per es.) In cui i file di tfrecords sono divisi in frammenti. La mia domanda è: qual è il vantaggio di avere file tfrecords nei frammenti? C'è qualche guadagno aggiuntivo in termini di prestazioni di questa divisione?

Risposte:


11

Nella ricerca dei vantaggi della suddivisione in più file, l'unica risposta ragionevole è arrivata da una delle persone di Google.

Hanno detto che i guadagni in termini di prestazioni sono trascurabili, ma sono d'accordo che la suddivisione dei file può aiutare, soprattutto se si desidera trasferire il set di dati in un'altra posizione.

Tieni presente che ora non è necessario mescolare prima di salvare, perché il metodo (attualmente) consigliato per leggere TFRecords utilizza tf.data.TFRecordDatasetun .shuffle()metodo molto utile .


2
.shuffle()Il metodo non è la soluzione ideale se si dispone di un grande file tfrecord. L'output mischiato è in qualche modo correlato all'ordine originale se non si utilizza una dimensione del buffer di grandi dimensioni. Penso che sia necessario effettuare il pre-shuffle dei dati prima di salvarli su tfrecord o dividerli in frammenti quando si dispone di un set di dati di grandi dimensioni.
Bruce Chou,

7

Per quelli che ancora si chiedono: è così che puoi mescolare i tuoi dati. Con i tuoi TFrecord in un unico file, non puoi mescolare l'ordine. Questo è in genere necessario con SGD.

Tuttavia, con i frammenti, è possibile mescolare l'ordine dei frammenti, il che consente di approssimare il mescolamento dei dati come se si avesse accesso ai singoli TFRecord. Questo è chiaramente meglio di niente, e chiaramente più frammenti hai, migliore è questa approssimazione.

L'alternativa è pre-mescolare i dati duplicandoli o non utilizzare affatto TFRecords.


4

Dividere i file TFRecord in frammenti ti aiuta a mescolare grandi set di dati che non si adattano alla memoria.

Immagina di avere milioni di esempi di allenamento salvati su disco e di volerli eseguire ripetutamente attraverso un processo di addestramento. Inoltre, supponiamo che per ogni ripetizione dei dati di addestramento (cioè ogni epoca) si desideri caricare i dati in un ordine completamente casuale.

Un approccio consiste nell'avere un file per esempio di formazione e generare un elenco di tutti i nomi di file. Quindi all'inizio di ogni epoca rimescoli l'elenco dei nomi dei file e carichi i singoli file. Il problema con questo approccio è che stai caricando milioni di file da posizioni casuali sul tuo disco. Questo può essere lento soprattutto su un disco rigido. Anche un array RAID 0 non aiuta con la velocità se si caricano milioni di piccoli file da posizioni casuali. Il problema peggiora ulteriormente se si accede ai file tramite una connessione di rete.

Un altro approccio è leggere gli esempi di addestramento in sequenza da un grande file TFRecord e mescolare gli esempi in memoria usando un buffer shuffle. Tuttavia, il buffer shuffle in genere non può essere più grande della memoria DDR disponibile per la CPU. E se il buffer shuffle è significativamente più piccolo del set di dati, è possibile che i dati non vengano mescolati in modo adeguato. I dati possono essere mescolati "localmente" ma non "globalmente" mescolati. Ossia, gli esempi dall'inizio del set di dati potrebbero non essere mescolati con gli esempi dalla fine del set di dati.

Una buona soluzione è quella di utilizzare una combinazione bilanciata dei due approcci precedenti suddividendo il set di dati in più file TFRecord (chiamati frammenti). Durante ogni epoca è possibile mescolare i nomi dei file del frammento per ottenere il riordino globale e usare un buffer di riordino per ottenere il mescolamento locale. Un buon equilibrio renderà i frammenti abbastanza grandi da prevenire problemi di velocità del disco, ma manterrà i frammenti abbastanza piccoli da consentire un mescolamento adeguato da un buffer shuffle.

Ecco i passaggi esatti:

  1. Posiziona in modo casuale tutti gli esempi di allenamento in più file TFRecord (frammenti).
  2. All'inizio di ogni epoca, mescola l'elenco dei nomi dei file dei frammenti.
  3. Leggi gli esempi di addestramento dai frammenti e passa gli esempi attraverso un buffer shuffle. In genere, il buffer shuffle dovrebbe essere più grande della dimensione del frammento per garantire una buona mescolanza tra i frammenti.
  4. Passa gli esempi mescolati nel tuo processo di allenamento.

3

La suddivisione di un file TFRecords in più frammenti presenta essenzialmente 3 vantaggi:

  1. Più facile da mescolare . Come altri hanno sottolineato, è facile mescolare i dati a un livello approssimativo (prima di utilizzare un buffer shuffle).
  2. Più veloce da scaricare . Se i file sono distribuiti su più server, il download di più file da server diversi in parallelo ottimizzerà l'utilizzo della larghezza di banda (anziché scaricare un file da un singolo server). Ciò può migliorare significativamente le prestazioni rispetto al download dei dati da un singolo server.
  3. Più semplice da manipolare . È più facile gestire 10.000 file da 100 MB ciascuno anziché un singolo file da 1 TB. I file di grandi dimensioni possono essere una seccatura da gestire: in particolare, è molto più probabile che i trasferimenti falliscano. È anche più difficile manipolare sottoinsiemi di dati quando è tutto in un singolo file.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.