¿Cuál es el beneficio de dividir el archivo tfrecord en fragmentos?

17

Estoy trabajando en el reconocimiento de voz con Tensorflow y planeo entrenar LSTM NN con un conjunto de datos de ondas masivas. Debido a las ganancias de rendimiento, planeo usar tfrecords. Hay varios ejemplos en Internet (Inception for ej.) Donde los archivos de registro se dividen en fragmentos. Mi pregunta es: ¿cuál es el beneficio de tener archivos tfrecords en fragmentos? ¿Hay alguna ganancia de rendimiento adicional de esta división?

striki70
fuente

Respuestas:

11

Al investigar los beneficios de dividirse en múltiples archivos, la única respuesta razonable provino de una de las personas de Google.

Dijeron que las ganancias de rendimiento son insignificantes, pero estoy de acuerdo en que dividir archivos puede ayudar, especialmente si desea transferir el conjunto de datos a otra ubicación.

Tenga en cuenta que ahora no necesita barajar antes de guardar, porque (actualmente) el método recomendado para leer TFRecords utiliza tf.data.TFRecordDatasetun .shuffle()método muy útil .

bartgras
fuente
2
.shuffle()El método no es una solución ideal si tiene un gran archivo tfrecord. La salida aleatoria está algo relacionada con el orden original si no utiliza un tamaño de búfer grande. Creo que es necesario mezclar previamente los datos antes de guardarlos en un registro o dividirlos en fragmentos cuando tiene un gran conjunto de datos.
Bruce Chou
7

Para aquellos que aún se preguntan: es para que puedan mezclar sus datos. Con sus TFrecords en un archivo, no puede barajar el pedido. Esto suele ser necesario con SGD.

Sin embargo, con los fragmentos, puede mezclar el orden de los fragmentos, lo que le permite aproximar los datos aleatoriamente como si tuviera acceso a los TFRecords individuales. Esto es claramente mejor que nada, y claramente cuantos más fragmentos tenga, mejor será esta aproximación.

La alternativa es mezclar previamente sus datos duplicándolos o no usar TFRecords en absoluto.

miguel.martin
fuente
4

Dividir los archivos TFRecord en fragmentos lo ayuda a mezclar grandes conjuntos de datos que no caben en la memoria.

Imagine que tiene millones de ejemplos de capacitación guardados en el disco y desea ejecutarlos repetidamente a través de un proceso de capacitación. Además, suponga que para cada repetición de los datos de entrenamiento (es decir, cada época) desea cargar los datos en un orden completamente aleatorio.

Un enfoque es tener un archivo por ejemplo de entrenamiento y generar una lista de todos los nombres de archivo. Luego, al comienzo de cada época, baraja la lista de nombres de archivo y carga los archivos individuales. El problema con este enfoque es que está cargando millones de archivos desde ubicaciones aleatorias en su disco. Esto puede ser lento, especialmente en un disco duro. Incluso una matriz RAID 0 no ayudará con la velocidad si está cargando millones de archivos pequeños desde ubicaciones aleatorias. El problema empeora aún más si está accediendo a los archivos a través de una conexión de red.

Otro enfoque es leer los ejemplos de entrenamiento en secuencia de un archivo TFRecord grande y mezclar los ejemplos en la memoria utilizando un búfer aleatorio. Sin embargo, el búfer aleatorio normalmente no puede ser mayor que la memoria DDR disponible para su CPU. Y si el búfer aleatorio es significativamente más pequeño que su conjunto de datos, entonces puede que no baraje adecuadamente los datos. Los datos pueden ser barajados "localmente" pero no barajados "globalmente". Es decir, los ejemplos del comienzo del conjunto de datos no pueden mezclarse con ejemplos del final del conjunto de datos.

Una buena solución es utilizar una combinación equilibrada de los dos enfoques anteriores dividiendo su conjunto de datos en múltiples archivos TFRecord (llamados fragmentos). Durante cada época, puede barajar los nombres de archivo de fragmentos para obtener una barajadura global y utilizar un búfer de barajadura para obtener barajaduras locales. Un buen equilibrio hará que los fragmentos sean lo suficientemente grandes como para evitar problemas de velocidad del disco, pero mantendrá los fragmentos lo suficientemente pequeños como para permitir una mezcla adecuada mediante un búfer aleatorio.

Aquí están los pasos exactos:

  1. Coloca al azar todos los ejemplos de entrenamiento en múltiples archivos TFRecord (fragmentos).
  2. Al comienzo de cada época, baraja la lista de nombres de archivos de fragmentos.
  3. Lea ejemplos de entrenamiento de los fragmentos y pase los ejemplos a través de un buffer aleatorio. Por lo general, el búfer aleatorio debe ser más grande que el tamaño del fragmento para garantizar una buena combinación en fragmentos.
  4. Pase los ejemplos mezclados a su proceso de entrenamiento.
Benjamin Coffer
fuente
3

Dividir un archivo TFRecords en múltiples fragmentos tiene esencialmente 3 ventajas:

  1. Más fácil de barajar . Como otros han señalado, hace que sea fácil mezclar los datos en un nivel grueso (antes de usar un búfer aleatorio).
  2. Más rápido de descargar . Si los archivos se distribuyen en varios servidores, descargar varios archivos de diferentes servidores en paralelo optimizará el uso del ancho de banda (en lugar de descargar un archivo de un solo servidor). Esto puede mejorar el rendimiento significativamente en comparación con la descarga de datos de un solo servidor.
  3. Más simple de manipular . Es más fácil manejar 10,000 archivos de 100MB cada uno en lugar de un solo archivo de 1TB. Los archivos enormes pueden ser difíciles de manejar: en particular, es mucho más probable que las transferencias fallen. También es más difícil manipular subconjuntos de datos cuando todo está en un solo archivo.
MiniQuark
fuente