作者:
(1) Sasun Hambardzumyan,Activeloop,加利福尼亚州山景城,美国;
(2) Abhinav Tuli,Activeloop,美国加利福尼亚州山景城;
(3) Levon Ghukasyan,Activeloop,美国加利福尼亚州山景城;
(4)Fariz Rahman,Activeloop,美国加利福尼亚州山景城;
(5) Hrant Topchyan,Activeloop,美国加利福尼亚州山景城;
(6)David Isayan,Activeloop,美国加利福尼亚州山景城;
(7)Mark McQuade,Activeloop,美国加利福尼亚州山景城;
(8) Mikayel Harutyunyan,Activeloop,美国加利福尼亚州山景城;
(9) Tatevik Hakobyan,Activeloop,加利福尼亚州山景城,美国;
(10) Ivo Stranic,Activeloop,加利福尼亚州山景城,美国;
(11)Davit Buniatyan,Activeloop,加利福尼亚州山景城,美国。
Deep Lake 数据集采用列式存储架构,以张量作为列,如图 3 所示。每个张量都是块的集合 - 包含数据样本的二进制 blob。与每个张量关联的索引图有助于针对给定的样本索引找到该块中的正确样本块和索引。
数据集中的样本表示跨并行张量的单行索引。与文档存储格式相反,样本元素在逻辑上是独立的,这使得可以部分访问样本以运行高性能查询或通过网络将选定的张量流式传输到 GPU 训练实例。可以对多个张量进行分组。组实现语法嵌套并定义张量如何相互关联。语法嵌套避免了分层内存布局的格式复杂性。与数据集内容更改类似,数据集架构的更改也会通过版本控制随时间跟踪。
张量是有类型的,可以就地添加或修改。对索引或一组索引的默认访问会将数据返回为 NumPy 数组 [55]。张量可以容纳 n 维数据,而不是像 Parquet [79] 或 Arrow [13] 中的系列那样存储 1 维数据,其中第一维通常对应于索引或批处理维度。与其他静态分块数组格式(如 Zarr [52])不同,张量可以包含动态形状的数组(也称为不规则张量)。
Htype 定义了对张量中样本的期望,例如数据类型(如 NumPy [55] 中的 dtype)、形状、维数或压缩。类型化张量使与深度学习框架的交互变得简单,并支持健全性检查和高效的内存布局。通过从通用张量 htype 继承,我们可以构建图像、视频、音频、bbox、dicom 等类型。例如,具有图像 htype 的张量将期望附加到它的样本具有 uint8 dtype 和长度为 3 的形状(即宽度、高度和通道数)。我们进一步扩展了 htypes 的概念,允许元类型支持在张量中存储图像序列(sequence[image]),引用远程存储的图像,同时保持图像张量的常规行为(link[image]),甚至可能支持跨格式。
Deep Lake 数据集包含 JSON 格式的来源文件和每个张量的文件夹。张量包含块、块编码器、图块编码器和张量元数据。张量可以选择性地隐藏。例如,隐藏的张量可用于维护图像的下采样版本或保留形状信息以进行快速查询。
张量在存储级别以块的形式存储。虽然静态(推断)形状的分块避免了维护块映射表,但它会在指定张量时引入大量用户开销、自定义压缩使用限制、动态形状张量的未充分利用的存储以及后处理效率低下。Deep Lake 块是根据块大小的下限和上限构建的,以适应有限数量的样本。这需要权衡,一方面需要使用压缩索引图来保留每个张量的样本索引到块 ID 的映射,另一方面需要使块大小处于流式传输的最佳范围内,同时容纳混合形状的样本。人们可以将本文中采用的方法视为文件系统页面映射和计算定义的无映射阵列存储系统之间的优化权衡。出于实际原因,单个块编码器可以扩展到数十亿张图像,同时为每 1PB 张量数据保持 150MB 的块编码器。可以通过分片块编码器来引入进一步的扩展。块包含标头信息,例如字节范围、样本形状和样本数据本身。如果样本大于块大小上限(大型航空或显微镜图像就是这种情况),则样本将跨空间维度平铺成块。平铺的唯一例外是视频。由于高效的帧到索引的映射、仅关键帧的解压缩以及流式传输时的基于范围的请求,视频得以保留。
张量存储格式针对深度学习训练和推理进行了优化,包括顺序和随机访问。顺序访问用于运行扫描查询、将张量转换为其他张量或运行推理。随机访问用例包括多个注释者将标签写入同一图像或模型,将反向预测与数据集一起存储。在禁用严格模式时,可以分配张量的越界索引,从而适应稀疏张量。但是,随着时间的推移,随机分配将产生存储效率低下的数据块。为了修复数据布局,我们实现了一个动态重新分块算法来优化数据布局。Deep Lake 的关键访问模式之一是用于训练机器学习模型的混洗流访问。在将块流式传输到训练过程中时,它需要随机或自定义顺序访问。这是通过涉及基于范围的请求来访问块内的子元素、在训练之前运行复杂查询以确定顺序以及维护已获取和未使用数据的缓冲区缓存来实现的。这样就避免了为运行 shuffling 算法而设立单独的计算集群 [50]。
每个张量都有自己的块,默认块大小为 8MB。当单个数据点(图像、标签、注释等)小于块大小时,单个块由来自多个索引的数据组成。相反,当单个数据点大于块大小时,数据将拆分为多个块(平铺)。视频数据是分块逻辑的例外。
Deep Lake 格式经过优化,可最大程度提高 GPU 处理的吞吐量。它包括深度学习框架预期布局中的 CPU 预取、解压缩或解码、转换和 GPU 内存传输。
Deep Lake 可以插入任何存储提供商,包括 AWS S3 [1]、Google Cloud Storage (GCS) [3] 等对象存储、POSIX 兼容文件系统或本地内存存储。此外,它通过将各种存储提供商链接在一起来构建内存缓存,例如 - 远程 S3 存储的最近最少使用 (LRU) 缓存与本地内存数据。