paint-brush
Deep Lake, un Lakehouse pour le Deep Learning : format de stockage Tensorpar@dataology
158 lectures

Deep Lake, un Lakehouse pour le Deep Learning : format de stockage Tensor

Trop long; Pour lire

Les chercheurs présentent Deep Lake, un Lakehouse open source pour l'apprentissage profond, optimisant le stockage et le streaming de données complexes pour les cadres d'apprentissage profond.
featured image - Deep Lake, un Lakehouse pour le Deep Learning : format de stockage Tensor
Dataology: Study of Data in Computer Science HackerNoon profile picture
0-item

Auteurs:

(1) Sasun Hambardzumyan, Activeloop, Mountain View, Californie, États-Unis ;

(2) Abhinav Tuli, Activeloop, Mountain View, Californie, États-Unis ;

(3) Levon Ghukasyan, Activeloop, Mountain View, Californie, États-Unis ;

(4) Fariz Rahman, Activeloop, Mountain View, Californie, États-Unis ;.

(5) Hrant Topchyan, Activeloop, Mountain View, Californie, États-Unis ;

(6) David Isayan, Activeloop, Mountain View, Californie, États-Unis ;

(7) Mark McQuade, Activeloop, Mountain View, Californie, États-Unis ;

(8) Mikayel Harutyunyan, Activeloop, Mountain View, Californie, États-Unis ;

(9) Tatevik Hakobyan, Activeloop, Mountain View, Californie, États-Unis ;

(10) Ivo Stranic, Activeloop, Mountain View, Californie, États-Unis ;

(11) Davit Buniatyan, Activeloop, Mountain View, Californie, États-Unis.

Tableau des liens

3. FORMAT DE STOCKAGE DU TENSEUR

Les ensembles de données Deep Lake suivent une architecture de stockage en colonnes, avec des tenseurs comme colonnes, comme le montre la figure 3. Chaque tenseur est une collection de morceaux - des blobs binaires qui contiennent les échantillons de données. Une carte d'index associée à chaque tenseur permet de trouver le bon morceau et le bon index de l'échantillon dans ce morceau pour un index d'échantillon donné.

3.1 Ensemble de données

Un échantillon dans un ensemble de données représente une seule ligne indexée sur des tenseurs parallèles. Contrairement à un format de stockage de documents, les exemples d'éléments sont logiquement indépendants, ce qui permet un accès partiel aux échantillons pour exécuter des requêtes performantes ou diffuser des tenseurs sélectionnés sur le réseau vers les instances de formation GPU. Plusieurs tenseurs peuvent être regroupés. Les groupes implémentent l'imbrication syntaxique et définissent la manière dont les tenseurs sont liés les uns aux autres. L'imbrication syntaxique évite les complications de format liées à la disposition hiérarchique de la mémoire. Les modifications apportées au schéma de l'ensemble de données sont également suivies au fil du temps grâce au contrôle de version, de la même manière que les modifications du contenu de l'ensemble de données.

3.2 Tenseurs

Les tenseurs sont typés et peuvent être ajoutés ou modifiés sur place. L'accès par défaut à un index ou à un ensemble d'index renvoie les données sous forme de tableaux NumPy [55]. Au lieu de stocker des données 1D comme vu dans Parquet [79] ou des séries dans Arrow [13], les tenseurs peuvent accueillir des données à n dimensions, où généralement la première dimension correspond à la dimension d'index ou de lot. Les tenseurs peuvent contenir des tableaux de forme dynamique, également appelés tenseurs irréguliers, par opposition à d'autres formats de tableaux fragmentés statiquement tels que Zarr [52].

3.3 Types

Htype définit les attentes sur les échantillons dans un tenseur tel que le type de données (dtype comme vu dans NumPy [55]), la forme, le nombre de dimensions ou la compression. Les tenseurs typés facilitent l'interaction avec les frameworks d'apprentissage en profondeur et permettent des contrôles d'intégrité et une disposition efficace de la mémoire. En héritant d'un tenseur générique htype, nous pouvons construire des types tels que image, vidéo, audio, bbox, dicom et autres. Par exemple, un tenseur avec une image htype s'attendrait à ce que les échantillons qui lui sont ajoutés aient un type de type uint8 et une longueur de forme de 3 (c'est-à-dire la largeur, la hauteur et le nombre de canaux). Nous développons davantage la notion de htypes permettant des méta-types prenant en charge le stockage de séquences d'images dans des tenseurs (sequence[image]), faisant référence à des images stockées à distance, tout en conservant le comportement régulier d'un tenseur d'image (lien[image]), ou même prise en charge possible de tous les formats.


Figure 3 : Comment chaque échantillon (ligne) est stocké dans un ensemble de tenseurs en colonnes avec des morceaux de taille dynamique

3.4 Disposition de la mémoire

Un ensemble de données Deep Lake contient un fichier de provenance au format JSON et des dossiers par tenseur. Un tenseur contient des fragments, un encodeur de fragments, un encodeur de tuiles et des métadonnées de tenseur. Les tenseurs peuvent éventuellement être masqués. Par exemple, les tenseurs cachés peuvent être utilisés pour conserver des versions sous-échantillonnées d'images ou pour conserver les informations de forme pour des requêtes rapides.


Les tenseurs sont stockés en morceaux au niveau du stockage. Bien que le découpage de forme statique (déduit) évite de maintenir une table de mappage de fragments, il introduit une surcharge utilisateur importante lors de la spécification du tenseur, des limitations d'utilisation de la compression personnalisée, un stockage sous-utilisé pour les tenseurs de forme dynamique et des inefficacités de post-traitement. Les morceaux de Deep Lake sont construits sur la base des limites inférieure et supérieure de la taille des morceaux pour s'adapter à un nombre limité d'échantillons. Cela s'accompagne d'un compromis consistant à disposer d'une carte d'index compressée qui préserve l'index de l'échantillon pour le mappage de l'identifiant de bloc par tenseur tout en permettant des tailles de bloc dans la plage optimale pour le streaming tout en acceptant des échantillons de forme mixte. On pourrait considérer l'approche adoptée dans cet article comme un compromis optimisé entre la mappe de pages du système de fichiers et le système de stockage de matrice sans carte défini par calcul. Pour des raisons pratiques, un seul encodeur de bloc peut être adapté à des milliards d'images tout en conservant un encodeur de bloc de 150 Mo pour 1 Po de données tensorielles. Une mise à l'échelle supplémentaire peut être introduite en fragmentant l'encodeur de fragments. Les morceaux contiennent des informations d'en-tête telles que les plages d'octets, les formes des échantillons et les exemples de données eux-mêmes. Si un échantillon est plus grand que la taille de morceau limite supérieure, ce qui est le cas pour les grandes images aériennes ou microscopiques, l'échantillon est divisé en morceaux dans toutes les dimensions spatiales. La seule exception au carrelage concerne les vidéos. Les vidéos sont préservées grâce à un mappage efficace des images vers les index, à la décompression des images clés uniquement et aux requêtes basées sur la plage lors de la diffusion.

3.5 Modèles d'accès

Le format de stockage tensoriel est optimisé pour l'apprentissage et l'inférence en profondeur, y compris l'accès séquentiel et aléatoire. L'accès séquentiel est utilisé pour exécuter des requêtes d'analyse, transformer des tenseurs en d'autres tenseurs ou exécuter des inférences. Les cas d'utilisation de l'accès aléatoire incluent plusieurs annotateurs écrivant des étiquettes sur la même image ou des modèles stockant des prédictions avec l'ensemble de données. Lorsque le mode strict est désactivé, des indices hors limites d'un tenseur peuvent être attribués, s'adaptant ainsi aux tenseurs clairsemés. Cependant, l’attribution aléatoire au fil du temps produira des blocs de données stockés de manière inefficace. Pour corriger la disposition des données, nous implémentons un algorithme de regroupage à la volée pour optimiser la disposition des données. L'un des principaux modèles d'accès de Deep Lake est l'accès aux flux aléatoires pour la formation des modèles d'apprentissage automatique. Il nécessite un accès aléatoire ou personnalisé lors de la diffusion de morceaux dans le processus de formation. Ceci est réalisé en impliquant des requêtes basées sur une plage pour accéder aux sous-éléments à l'intérieur des morceaux, en exécutant des requêtes complexes avant l'entraînement pour déterminer l'ordre et en maintenant un cache tampon de données récupérées et inutilisées. Cela évite d'avoir un cluster de calcul séparé pour exécuter l'algorithme de brassage [50].


Chaque tenseur a ses propres fragments et la taille par défaut des fragments est de 8 Mo. Un seul bloc est constitué de données provenant de plusieurs index lorsque les points de données individuels (image, étiquette, annotation, etc.) sont plus petits que la taille du bloc. À l’inverse, lorsque les points de données individuels sont plus grands que la taille du bloc, les données sont réparties entre plusieurs blocs (carrelage). Les exceptions à la logique de segmentation sont les données vidéo.


Le format Deep Lake est optimisé pour maximiser le débit du traitement GPU. Il inclut la prélecture du processeur, la décompression ou le décodage, les transformations et le transfert de mémoire GPU dans la disposition attendue d'un cadre d'apprentissage en profondeur.

3.6 Fournisseurs de stockage

Deep Lake peut être connecté à n'importe quel fournisseur de stockage, y compris les stockages d'objets tels qu'AWS S3 [1], Google Cloud Storage (GCS) [3], les systèmes de fichiers compatibles POSIX ou le stockage local en mémoire. De plus, il construit la mise en cache de la mémoire en enchaînant divers fournisseurs de stockage, par exemple le cache LRU (Least Récemment Utilisé) du stockage S3 distant avec des données locales en mémoire.


Cet article est disponible sur arxiv sous licence CC 4.0.