paint-brush
Deep Lake, una casa de lago para el aprendizaje profundo: formato de almacenamiento tensorialpor@dataology
105 lecturas

Deep Lake, una casa de lago para el aprendizaje profundo: formato de almacenamiento tensorial

Demasiado Largo; Para Leer

Los investigadores presentan Deep Lake, una casa de lago de código abierto para el aprendizaje profundo, que optimiza el almacenamiento y la transmisión de datos complejos para marcos de aprendizaje profundo.
featured image - Deep Lake, una casa de lago para el aprendizaje profundo: formato de almacenamiento tensorial
Dataology: Study of Data in Computer Science HackerNoon profile picture
0-item

Autores:

(1) Sasun Hambardzumyan, Activeloop, Mountain View, CA, EE. UU.;

(2) Abhinav Tuli, Activeloop, Mountain View, CA, EE. UU.;

(3) Levon Ghukasyan, Activeloop, Mountain View, CA, EE. UU.;

(4) Fariz Rahman, Activeloop, Mountain View, CA, EE. UU.;

(5) Hrant Topchyan, Activeloop, Mountain View, CA, EE. UU.;

(6) David Isayan, Activeloop, Mountain View, CA, EE. UU.;

(7) Mark McQuade, Activeloop, Mountain View, CA, EE. UU.;

(8) Mikayel Harutyunyan, Activeloop, Mountain View, CA, EE. UU.;

(9) Tatevik Hakobyan, Activeloop, Mountain View, CA, EE. UU.;

(10) Ivo Stranic, Activeloop, Mountain View, CA, EE. UU.;

(11) Pescante Buniatyan, Activeloop, Mountain View, CA, EE. UU.

Tabla de enlaces

3. FORMATO DE ALMACENAMIENTO DEL TENSOR

Los conjuntos de datos de Deep Lake siguen una arquitectura de almacenamiento en columnas, con tensores como columnas, como se muestra en la Fig. 3. Cada tensor es una colección de fragmentos (blobs binarios) que contienen muestras de datos. Un mapa de índice asociado con cada tensor ayuda a encontrar el fragmento y el índice correctos de la muestra dentro de ese fragmento para un índice de muestra determinado.

3.1 Conjunto de datos

Una muestra en un conjunto de datos representa una sola fila indexada entre tensores paralelos. A diferencia de un formato de almacenamiento de documentos, los elementos de muestra son lógicamente independientes, lo que permite el acceso parcial a las muestras para ejecutar consultas de rendimiento o transmitir tensores seleccionados a través de la red a las instancias de entrenamiento de GPU. Se pueden agrupar varios tensores. Los grupos implementan anidamiento sintáctico y definen cómo se relacionan los tensores entre sí. El anidamiento sintáctico evita la complicación del formato para el diseño jerárquico de la memoria. Los cambios en el esquema del conjunto de datos también se rastrean a lo largo del tiempo con control de versiones, similar a los cambios en el contenido del conjunto de datos.

3.2 Tensores

Los tensores se escriben y se pueden agregar o modificar in situ. El acceso predeterminado a un índice o un conjunto de índices devuelve los datos como matrices NumPy [55]. En lugar de almacenar datos 1-D como se ve en Parquet [79] o series en Arrow [13], los tensores pueden acomodar datos n-dimensionales, donde normalmente la primera dimensión corresponde al índice o dimensión del lote. Los tensores pueden contener matrices con formas dinámicas, también llamadas tensores irregulares, a diferencia de otros formatos de matrices fragmentadas estáticamente como Zarr [52].

3.3 Tipos

Htype define las expectativas sobre las muestras en un tensor, como el tipo de datos (dtype como se ve en NumPy [55]), la forma, el número de dimensiones o la compresión. Los tensores escritos facilitan la interacción con marcos de aprendizaje profundo y permiten controles de cordura y un diseño de memoria eficiente. Al heredar de un tensor htype genérico, podemos construir tipos como imagen, video, audio, bbox, dicom y otros. Por ejemplo, un tensor con imagen htype esperaría que las muestras que se le agregaran tuvieran dtype como uint8 y una longitud de forma 3 (es decir, ancho, alto y número de canales). Ampliamos aún más la noción de htypes que permiten metatipos que admiten el almacenamiento de secuencias de imágenes en tensores (secuencia[imagen]), haciendo referencia a imágenes almacenadas de forma remota, mientras se mantiene el comportamiento regular de un tensor de imágenes (enlace[imagen]), o incluso posible soporte multiformato.


Figura 3: Cómo se almacena cada muestra (fila) en un conjunto de tensores de columnas con fragmentos de tamaño dinámico

3.4 Diseño de la memoria

Un conjunto de datos de Deep Lake contiene un archivo de procedencia en formato JSON y carpetas por tensor. Un tensor contiene fragmentos, codificador de fragmentos, codificador de mosaicos y metadatos de tensor. Opcionalmente, los tensores se pueden ocultar. Por ejemplo, los tensores ocultos se pueden utilizar para mantener versiones muestreadas de imágenes o preservar información de forma para consultas rápidas.


Los tensores se almacenan en fragmentos en el nivel de almacenamiento. Si bien la fragmentación con forma estática (inferida) evita mantener una tabla de mapa de fragmentos, introduce una sobrecarga significativa para el usuario durante la especificación del tensor, limitaciones de uso de compresión personalizada, almacenamiento infrautilizado para tensores con forma dinámica e ineficiencias en el posprocesamiento. Los fragmentos de Deep Lake se construyen en función del límite inferior y superior del tamaño del fragmento para adaptarse a un número limitado de muestras. Esto viene con la desventaja de tener un mapa de índice comprimido que preserva el índice de muestra para el mapeo de identificación de fragmentos por tensor y al mismo tiempo permite tamaños de fragmentos en el rango óptimo para la transmisión y al mismo tiempo admite muestras de formas mixtas. Se podría considerar el enfoque adoptado en este artículo como una compensación optimizada entre el mapa de páginas del sistema de archivos y el sistema de almacenamiento de matriz sin mapas definido por computadora. Por razones prácticas, un codificador de un solo fragmento se puede escalar a miles de millones de imágenes manteniendo un codificador de fragmentos de 150 MB por cada 1 PB de datos tensoriales. Se puede introducir una mayor escala fragmentando el codificador de fragmentos. Los fragmentos contienen información de encabezado, como rangos de bytes, formas de las muestras y los datos de la muestra en sí. Si una muestra es mayor que el tamaño del fragmento límite superior, como es el caso de las imágenes aéreas o de microscopía grandes, la muestra se divide en fragmentos a lo largo de las dimensiones espaciales. La única excepción al mosaico son los vídeos. Los vídeos se conservan gracias a la eficiente asignación de fotogramas a índices, la descompresión de solo fotogramas clave y las solicitudes basadas en rangos durante la transmisión.

3.5 Patrones de acceso

El formato de almacenamiento tensorial está optimizado para la inferencia y el entrenamiento de aprendizaje profundo, incluido el acceso secuencial y aleatorio. El acceso secuencial se utiliza para ejecutar consultas de escaneo, transformar tensores en otros tensores o ejecutar inferencia. Los casos de uso de acceso aleatorio incluyen múltiples anotadores que escriben etiquetas en la misma imagen o modelos que almacenan predicciones retrospectivas junto con el conjunto de datos. Mientras el modo estricto está deshabilitado, se pueden asignar índices fuera de los límites de un tensor, acomodando así tensores dispersos. Sin embargo, la asignación aleatoria a lo largo del tiempo producirá fragmentos de datos almacenados de manera ineficiente. Para corregir el diseño de los datos, implementamos un algoritmo de fragmentación sobre la marcha para optimizar el diseño de los datos. Uno de los patrones de acceso clave de Deep Lake es el acceso aleatorio a la secuencia para entrenar modelos de aprendizaje automático. Requiere acceso a pedidos aleatorios o personalizados mientras se transmiten fragmentos al proceso de capacitación. Esto se logra involucrando solicitudes basadas en rangos para acceder a subelementos dentro de fragmentos, ejecutando consultas complejas antes del entrenamiento para determinar el orden y manteniendo un búfer de datos recuperados y no utilizados. Esto evita tener un clúster de computación separado para ejecutar el algoritmo de reproducción aleatoria [50].


Cada tensor tiene sus propios fragmentos y el tamaño de fragmento predeterminado es 8 MB. Un único fragmento consta de datos de múltiples índices cuando los puntos de datos individuales (imagen, etiqueta, anotación, etc.) son más pequeños que el tamaño del fragmento. Por el contrario, cuando los puntos de datos individuales son mayores que el tamaño del fragmento, los datos se dividen en varios fragmentos (mosaico). Las excepciones a la lógica de fragmentación son los datos de vídeo.


El formato Deep Lake está optimizado para maximizar el rendimiento del procesamiento de GPU. Incluye captura previa de CPU, descompresión o decodificación, transformaciones y transferencia de memoria de GPU en el diseño esperado de un marco de aprendizaje profundo.

3.6 Proveedores de almacenamiento

Deep Lake se puede conectar a cualquier proveedor de almacenamiento, incluidos almacenamientos de objetos como AWS S3 [1], Google Cloud Storage (GCS) [3], sistemas de archivos compatibles con POSIX o almacenamiento local en memoria. Además, construye almacenamiento en caché de memoria encadenando varios proveedores de almacenamiento, por ejemplo, el caché menos utilizado recientemente (LRU) del almacenamiento S3 remoto con datos locales en memoria.


Este documento está disponible en arxiv bajo licencia CC 4.0.