Cómo usar un sistema de almacenamiento distribuido para facilitar el entrenamiento del modelo de IA

Cuando se trata de conjuntos de datos pequeños y algoritmos simples, los modelos tradicionales de aprendizaje automático se pueden almacenar en una máquina independiente o en un disco duro local. Sin embargo, a medida que se desarrolló el aprendizaje profundo, los equipos encontraron cada vez más cuellos de botella de almacenamiento al tratar con conjuntos de datos más grandes y algoritmos más complejos.

Esto destaca la importancia del almacenamiento distribuido en el campo de la inteligencia artificial (IA). JuiceFS  es un sistema de archivos distribuido de código abierto y alto rendimiento que proporciona una solución a este problema.

En este artículo, analizamos los desafíos que enfrentan los equipos de IA, cómo JuiceFS puede acelerar el entrenamiento de modelos y las estrategias comunes para acelerar el entrenamiento de modelos.

Desafíos para los equipos de IA

Los equipos de IA a menudo enfrentan los siguientes desafíos:

  • Grandes conjuntos de datos: a medida que crecen los tamaños de datos y modelos, el almacenamiento independiente no puede satisfacer las demandas de las aplicaciones. Por tanto, las soluciones de almacenamiento distribuido se convierten en una condición necesaria para solucionar estos problemas.
  • Archivado completo de conjuntos de datos históricos: en algunos casos, se generan diariamente grandes cantidades de conjuntos de datos nuevos y deben archivarse como datos históricos. Esto es especialmente importante en el campo de la conducción autónoma, donde los datos recopilados por los vehículos de prueba en carretera, como los datos de radar y cámara, son un activo valioso para las empresas. En estos casos, el almacenamiento independiente resulta insuficiente, por lo que el almacenamiento distribuido se convierte en una consideración necesaria.
  • Demasiados archivos pequeños y datos no estructurados: los sistemas de archivos distribuidos tradicionales son difíciles de administrar una gran cantidad de archivos pequeños, lo que genera una gran carga de almacenamiento de metadatos. Esto es especialmente problemático para los modelos visuales. Para resolver este problema, necesitamos un sistema de almacenamiento distribuido optimizado para almacenar archivos pequeños. Esto garantiza tareas eficientes de capacitación de capas superiores y una gestión fácil de una gran cantidad de archivos pequeños.
  • Interfaces POSIX para marcos de capacitación: los científicos de algoritmos a menudo confían en los recursos locales para la investigación y el acceso a los datos durante las etapas iniciales del desarrollo del modelo. Sin embargo, el código original generalmente requiere una modificación mínima cuando se extiende al almacenamiento distribuido para necesidades de capacitación más grandes. Por lo tanto, los sistemas de almacenamiento distribuido deben admitir interfaces POSIX para maximizar la compatibilidad con los códigos desarrollados en el entorno local.
  • Compartir conjuntos de datos comunes y segregación de datos: en algunos dominios, como la visión por computadora, los conjuntos de datos públicos autorizados deben compartirse entre diferentes equipos dentro de la empresa. Para facilitar el intercambio de datos entre equipos, estos conjuntos de datos a menudo se integran y almacenan en soluciones de almacenamiento compartido para evitar la duplicación y redundancia de datos innecesaria.
  • E/S de datos ineficientes en el entrenamiento basado en la nube: el entrenamiento del modelo basado en la nube generalmente usa el almacenamiento de objetos como el almacenamiento subyacente para una arquitectura de separación de almacenamiento y cómputo. Sin embargo, el bajo rendimiento de lectura y escritura del almacenamiento de objetos puede causar cuellos de botella significativos durante el entrenamiento.

Cómo ayuda JuiceFS a mejorar la eficiencia del entrenamiento de modelos

¿Qué es JuiceFS?

JuiceFS  es un sistema de archivos distribuido nativo de la nube de código abierto compatible con POSIX, HDFS y S3 API. JuiceFS adopta una arquitectura desacoplada, almacena metadatos en el motor de metadatos y carga datos de archivos en el almacenamiento de objetos, proporcionando una solución de almacenamiento rentable y altamente elástica.

JuiceFS tiene usuarios en más de 20 países, incluidas empresas líderes en inteligencia artificial, Internet, automotriz, telecomunicaciones, tecnología financiera y otras industrias.

La arquitectura de JuiceFS en el escenario de entrenamiento del modelo.

JuiceFS en escenarios de entrenamiento de modelos

La figura anterior muestra la arquitectura de JuiceFS en el escenario de entrenamiento del modelo, que consta de tres componentes:

  • Motor de metadatos: cualquier base de datos, como Redis o MySQL, se puede utilizar como motor de metadatos. Los usuarios pueden hacer elecciones de acuerdo a sus necesidades.
  • Almacenamiento de objetos: puede utilizar cualquier servicio de almacenamiento de objetos admitido ofrecido por la nube pública o autohospedado.
  • Cliente de Juice FS: para acceder al sistema de archivos de JuiceFS como un disco duro local, los usuarios deben montarlo en cada GPU y nodo informático.

El almacenamiento subyacente se basa en datos sin procesar en el almacenamiento de objetos, y cada nodo de cómputo tiene algún caché local, incluidos metadatos y caché de datos.

El diseño de JuiceFS permite múltiples niveles de almacenamiento en caché local en cada nodo de cómputo:

  • Nivel 1: caché basada en memoria
  • Nivel 2: caché basada en disco

Solo se accede al almacenamiento de objetos durante la filtración de caché.

Para los modelos independientes, el conjunto de datos o el conjunto de entrenamiento generalmente no llega a la memoria caché durante la primera ronda de entrenamiento. Sin embargo, a partir de la segunda ronda, con suficientes recursos de caché, hay poca necesidad de acceder al almacenamiento de objetos. Esto puede acelerar la E/S de datos.

Proceso de almacenamiento en caché de lectura y escritura en JuiceFS

Anteriormente comparamos la eficiencia de entrenar el acceso al almacenamiento de objetos con y sin almacenamiento en caché. Los resultados muestran que la caché de metadatos y la caché de datos de JuiceFS, en comparación con el almacenamiento de objetos, tienen una mejora de rendimiento promedio de más de 4 veces y una mejora de rendimiento de casi 7 veces.

La siguiente figura muestra el proceso de lectura y escritura de caché en JuiceFS:

Proceso de almacenamiento en caché de lectura y escritura de JuiceFS

Para el "caché de bloque" en la figura anterior, un bloque es un concepto lógico en JuiceFS. Cada archivo se divide en fragmentos de 64 MB para mejorar el rendimiento de lectura de archivos grandes. Esta información se almacena en caché en la memoria del proceso de JuiceFS para acelerar la eficiencia del acceso a los metadatos.
Lea el proceso de almacenamiento en caché en JuiceFS:

1. Una aplicación (que puede ser una aplicación de entrenamiento de modelos de IA o cualquier aplicación que inicie una solicitud de lectura) envía una solicitud.

2. Solicite ingresar al espacio del kernel a la izquierda. El núcleo comprueba si los datos solicitados están disponibles en la memoria caché de la página del núcleo. De lo contrario, la solicitud vuelve al proceso de JuiceFS en el espacio de usuario, que maneja todas las solicitudes de lectura y escritura.

De forma predeterminada, JuiceFS mantiene un búfer de lectura en la memoria. Cuando una solicitud no puede recuperar datos del búfer, JuiceFS accede al índice de caché de bloques, un directorio de caché local basado en disco. JuiceFS almacena archivos en fragmentos de 4 MB, por lo que la granularidad de la memoria caché también es de 4 MB.

Por ejemplo, cuando un cliente accede a una parte de un archivo, almacena en caché solo los fragmentos de 4 MB correspondientes a esa parte de los datos en el directorio de caché local, no el archivo completo. Esta es una diferencia significativa entre JuiceFS y otros sistemas de archivos o sistemas de almacenamiento en caché.

3. El índice de caché de bloques localiza rápidamente bloques de archivos en el directorio de caché local. Si se encuentra un bloque de archivo, JuiceFS lo lee desde el disco local, en el espacio del núcleo y devuelve los datos al proceso de JuiceFS, que a su vez devuelve los datos a la aplicación.

4. Después de leer los datos del disco local, también se almacenarán en la memoria caché de la página del núcleo. Esto se debe a que los sistemas Linux almacenan datos en la memoria caché de la página del núcleo de forma predeterminada si no se utiliza la E/S directa. La memoria caché de la página del núcleo acelera el acceso a la memoria caché. Si la primera solicitud acierta y devuelve datos, la solicitud no pasa por el sistema de archivos en la capa de espacio de usuario (FUSE) hacia el proceso de espacio de usuario. De lo contrario, el cliente de JuiceFS obtendrá los datos a través del directorio de caché. Si no se encuentra localmente, se envía una solicitud de red al almacenamiento de objetos, que luego obtiene los datos y los devuelve a la aplicación.

5. Cuando JuiceFS descargue datos del almacenamiento de objetos, los datos se escribirán de forma asincrónica en el directorio de caché local. Esto garantiza que la próxima vez que se acceda al mismo bloque, se accederá a la memoria caché local sin recuperarlo del almacén de objetos nuevamente.

A diferencia del almacenamiento en caché de datos, los metadatos se almacenan en caché durante un período de tiempo más corto. Para garantizar una coherencia sólida, las operaciones de apertura no se almacenan en caché de forma predeterminada. Dado el bajo tráfico de metadatos, su impacto en el rendimiento general de E/S es mínimo. Sin embargo, en escenarios de uso intensivo de archivos pequeños, la sobrecarga de metadatos también ocupa una cierta proporción.

¿Por qué el entrenamiento del modelo de IA es demasiado lento?

Cuando usa JuiceFS para el entrenamiento de modelos, el rendimiento es un factor clave que debe considerar porque afecta directamente la velocidad del proceso de entrenamiento. Varios factores pueden afectar la eficiencia del entrenamiento de JuiceFS:

motor de metadatos

La elección del motor de metadatos (como Redis, TiKV o MySQL) puede afectar significativamente el rendimiento al procesar archivos pequeños. En general, Redis es de 3 a 5 veces más rápido que otras bases de datos . Si las solicitudes de metadatos son lentas, intente utilizar una base de datos más rápida como motor de metadatos.

almacenamiento de objetos

El almacenamiento de objetos afecta el rendimiento y el rendimiento del acceso al almacén de datos. Los servicios de almacenamiento de objetos en la nube pública proporcionan un rendimiento estable. Si usa su propio almacenamiento de objetos (como Ceph o MinIO), puede optimizar los componentes para mejorar el rendimiento y la producción.

Disco local

La ubicación donde se almacena el directorio de caché tiene un impacto significativo en el rendimiento de lectura general. En casos de índices de aciertos de caché altos, la eficiencia de E/S del disco de caché afecta la eficiencia de E/S general. Por lo tanto, debe considerar factores como el tipo de almacenamiento, el medio de almacenamiento, la capacidad del disco y el tamaño del conjunto de datos.

ancho de banda de la red

Después de la primera ronda de capacitación, si el conjunto de datos es insuficiente para almacenarse completamente en caché localmente, el ancho de banda de la red o el consumo de recursos afectarán la eficiencia del acceso a los datos. En la nube, diferentes modelos de máquinas tienen diferentes anchos de banda de NIC. Esto también afecta la velocidad y la eficiencia del acceso a los datos.

tamaño de la memoria

El tamaño de la memoria afecta el tamaño de la memoria caché de la página del núcleo. Cuando hay suficiente memoria, la memoria disponible restante se puede usar como caché de datos para JuiceFS. Esto puede acelerar aún más el acceso a los datos.

Sin embargo, cuando hay poca memoria disponible, debe obtener acceso a los datos a través del disco local. Esto da como resultado una mayor sobrecarga de acceso. Además, cambiar entre el modo kernel y el modo usuario tiene implicaciones en el rendimiento, como la sobrecarga de cambio de contexto para las llamadas al sistema.

Cómo solucionar problemas en JuiceFS

JuiceFS proporciona muchas herramientas para optimizar el rendimiento y diagnosticar problemas.

Herramienta #1: Comandosjuicefs profile

Puede ejecutar este comando para analizar los registros de acceso para optimizar el rendimiento. Después de montar cada sistema de archivos, se genera un registro de acceso. Sin embargo, los registros de acceso no se guardan en tiempo real y solo se muestran cuando se visualizan.juicefs profile

En comparación con la visualización de registros de acceso sin procesar, este comando agrega información y realiza estadísticas de datos de ventana deslizante, ordenando las solicitudes por tiempo de respuesta de mayor a menor. Esto le ayuda a centrarse en las solicitudes con tiempos de respuesta lentos y a analizar más a fondo la relación entre la solicitud y el motor de metadatos o el almacén de objetos.juicefs profile

Herramienta #2: Comandosjuicefs stats

Este comando recopila datos de monitoreo desde una perspectiva macro y los muestra en tiempo real. Supervisa el uso de la CPU, el uso de la memoria, el uso del búfer en memoria, las solicitudes de lectura/escritura de FUSE, las solicitudes de metadatos y la latencia de almacenamiento de objetos para el punto de montaje actual. Estas métricas de monitoreo detalladas facilitan la visualización y el análisis de posibles cuellos de botella o problemas de rendimiento durante el entrenamiento del modelo.juicefs stats

Otras herramientas

JuiceFS también proporciona herramientas de creación de perfiles para la creación de perfiles de CPU y almacenamiento dinámico:

  • La herramienta de análisis de CPU analiza el cuello de botella de la velocidad de ejecución del proceso de JuiceFS, adecuada para usuarios que están familiarizados con el código fuente.
  • La herramienta de análisis de montón analiza el uso de la memoria, especialmente si el proceso de JuiceFS está usando mucha memoria. Es necesario utilizar una herramienta de análisis de montón para determinar qué funciones o estructuras de datos consumen grandes cantidades de memoria.

Métodos comunes para acelerar el entrenamiento de modelos de IA

Optimización de caché de metadatos

Puede optimizar el almacenamiento en caché de metadatos de dos formas, como se indica a continuación.

Ajuste el tiempo de espera para la caché de metadatos del kernel

Los parámetros, y corresponden a diferentes tipos de metadatos:--attr-cache--entry-cache--dir-entry-cache

  • attrRepresenta los atributos del archivo, como el tamaño, la hora de modificación y la hora de acceso.
  • entryRepresenta un archivo y atributos asociados en Linux.
  • dir-entryRepresenta un directorio y los archivos que contiene.

Estos parámetros controlan respectivamente el tiempo de espera de la caché de metadatos.

Para garantizar la coherencia de los datos, el valor de tiempo de espera predeterminado para estos parámetros es de solo 1 segundo. En un escenario de entrenamiento de modelos, los datos originales no se modifican. Por lo tanto, es posible extender el tiempo de espera de estos parámetros a días o incluso a una semana. Tenga en cuenta que la caché de metadatos no se puede invalidar activamente, solo se puede actualizar después de que haya expirado un período de tiempo de espera.

Optimice la memoria caché de metadatos a nivel de usuario para clientes de JuiceFS

Al abrir un archivo, el motor de metadatos normalmente recupera los últimos atributos del archivo para garantizar una coherencia sólida. Sin embargo, dado que los datos de entrenamiento del modelo generalmente no se modifican, este parámetro se puede habilitar y se puede establecer un tiempo de espera para evitar el acceso repetido al motor de metadatos cada vez que se abre el mismo archivo.--open-cache

Además, este parámetro controla el número máximo de archivos almacenados en caché. El valor predeterminado es 10 000, lo que significa que los metadatos de los 10 000 archivos abiertos más recientemente se almacenarán en la memoria caché como máximo. Este valor se puede ajustar según la cantidad de archivos en el conjunto de datos.--open-cache-limit

Optimización de caché de datos

El caché de datos de JuiceFS incluye el caché de la página del núcleo y el caché de datos locales:

  • La memoria caché de la página del núcleo no se puede ajustar a través de parámetros. Por lo tanto, reserve suficiente memoria libre en los nodos de cómputo para que JuiceFS pueda utilizarla por completo. JuiceFS no almacena datos en caché en el kernel si los recursos son escasos en los nodos de cómputo.
  • Los usuarios pueden controlar el almacenamiento en caché de datos locales y los parámetros de almacenamiento en caché se pueden ajustar de acuerdo con escenarios específicos.
    • --cache-sizeAjuste el tamaño de caché, el valor predeterminado es 100 GB, que es suficiente para la mayoría de los escenarios. Sin embargo, para los conjuntos de datos que ocupan un espacio de almacenamiento particularmente grande, el tamaño de la memoria caché debe ajustarse adecuadamente. De lo contrario, el espacio de caché de 100 GB puede llenarse muy rápidamente, lo que imposibilitará que JuiceFS almacene en caché más datos.
    • Otro parámetro que se puede usar con él es . Determina la cantidad de espacio libre en el disco de caché. El valor predeterminado es 0,1, lo que permite utilizar hasta el 90 % del espacio en disco para almacenar datos en caché.--cache-size--free-space-ratio

JuiceFS también admite el uso de varios discos de caché al mismo tiempo. Se recomienda utilizar todos los discos disponibles si es posible. Los datos se distribuirán uniformemente en varios discos a través del sondeo para lograr el equilibrio de carga y maximizar las ventajas de almacenamiento de varios discos.

Calentamiento de caché

Para mejorar la eficiencia del entrenamiento, puede usar el calentamiento de caché para acelerar las tareas de entrenamiento. JuiceFS admite el calentamiento de la memoria caché de metadatos y la memoria caché de datos locales en el lado del cliente. Este comando construye el caché por adelantado para que esté disponible cuando comience la tarea de entrenamiento, lo que mejora la eficiencia.juicefs warmup

aumentar el tamaño del búfer

El tamaño del búfer también afecta el rendimiento de lectura. De forma predeterminada, el tamaño del búfer es de 300 MB. Pero en escenarios de entrenamiento de alto rendimiento, esto puede no ser suficiente. Puede ajustar el tamaño del búfer según los recursos de memoria del nodo de entrenamiento.

En general, cuanto mayor sea el tamaño del búfer, mejor será el rendimiento de lectura. Pero no establezca el valor demasiado alto, especialmente en un entorno de contenedor con una memoria máxima limitada. Es necesario establecer el tamaño del búfer de acuerdo con la carga de trabajo real y encontrar un valor relativamente razonable. El uso del búfer se puede monitorear en tiempo real usando los comandos descritos anteriormente en este artículo.juicefs stats

Supongo que te gusta

Origin blog.csdn.net/weixin_56863624/article/details/130653222
Recomendado
Clasificación