paint-brush
Deep Lake,深度学习的Lakehouse:Deep Lake系统概述经过@dataology
123 讀數

Deep Lake,深度学习的Lakehouse:Deep Lake系统概述

太長; 讀書

研究人员介绍了 Deep Lake,这是一个用于深度学习的开源湖屋,它为深度学习框架优化了复杂数据存储和流媒体。
featured image - Deep Lake,深度学习的Lakehouse:Deep Lake系统概述
Dataology: Study of Data in Computer Science HackerNoon profile picture
0-item

作者:

(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,加利福尼亚州山景城,美国。

链接表

4. 深湖系统概述

如图 1 所示,Deep Lake 将原始数据和视图存储在 S3 等对象存储中,并以完整谱系实现数据集。流式传输、张量查询语言查询和可视化引擎可与深度学习计算一起执行或在浏览器上执行,而无需外部托管或集中服务。

4.1 摄入

4.1.1 提取。有时元数据可能已经驻留在关系数据库中。我们还使用 Airbyte[3] [22] 构建了一个 ETL 目标连接器。该框架允许插入任何受支持的数据源,包括 SQL/NoSQL 数据库、数据湖或数据仓库,并将数据同步到 Deep Lake。连接器协议将数据转换为列格式。


4.1.2 转换。为了显著加快数据处理工作流程并使用户无需担心块布局,Deep Lake 提供了并行执行 Python 转换的选项。转换接收数据集,在第一个维度上逐个样本迭代,并输出新数据集。用户定义的 Python 函数需要两个必需参数 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛、𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡,并用 @𝑑𝑒𝑒𝑝𝑙𝑎𝑘𝑒.𝑐𝑜𝑚𝑝𝑢𝑡𝑒 修饰。单个 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛 可以动态创建多个 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡𝑠。它支持一对一和一对多转换。转换也可以在不创建新数据集的情况下就地应用。


图 4:深湖数据集从空视图到物化视图的版本历史


在后台,调度程序批量处理对附近块进行操作的样本转换,并将它们调度到进程池中。或者,可以将计算委托给 Ray 集群 [53]。用户无需定义输入数据集,而是可以提供带有自定义对象的任意迭代器来创建摄取工作流。用户还可以将多个转换堆叠在一起并定义复杂的管道。

4.2 版本控制

Deep Lake 还满足了实验可重复性和遵守完整数据谱系的需求。数据集的不同版本存在于同一存储中,由子目录分隔。每个子目录都充当具有元数据文件的独立数据集。与非版本化数据集不同,这些子目录仅包含在特定版本中修改的块,以及每个张量的相应块集,其中包含所有修改块的名称。目录根目录中的版本控制信息文件以分支版本控制树的形式跟踪这些版本之间的关系。在访问特定版本的张量的任何块时,版本控制树从当前提交开始遍历,直到第一次提交。在遍历过程中,将检查每个版本的块集是否存在所需的块。如果找到该块,则停止遍历并检索数据。为了跟踪不同版本之间的差异,对于每个版本,每个张量还存储一个提交差异文件。这使得跨版本和分支的比较更快。此外,样本的 ID 是在数据集填充期间生成和存储的。这对于在合并操作期间跟踪相同的样本非常重要。Deep Lake 的版本控制接口是 Python API,它使机器学习工程师能够在数据处理脚本中对其数据集进行版本控制,而无需在 CLI 之间来回切换。它支持以下命令:


提交:创建数据集当前状态的不可变快照。


签出:签出至现有分支/提交,如果不存在则创建一个新的分支。


Diff :比较数据集两个版本之间的差异。


合并:合并两个不同版本的数据集,根据用户定义的策略解决冲突。

4.3 张量的可视化

数据可视化是 ML 工作流程的关键部分,尤其是当数据难以解析时。快速无缝的可视化可以加快数据收集、注释、质量检查和训练迭代。Deep Lake 可视化引擎提供了一个 Web 界面,可直接从源可视化大规模数据。它考虑张量的 htype 来确定可视化的最佳布局。首先显示主要张量(例如图像、视频和音频),而次要数据和注释(例如文本、class_label、bbox 和 binary_mask)则叠加。可视化工具还考虑元类型信息(例如序列),以提供数据的顺序视图,其中可以播放序列并跳转到序列的特定位置而无需获取整个数据,这与视频或音频用例相关。可视化工具满足了 ML 工作流程中的关键需求,使用户能够理解和排除数据故障,描述其演变,将预测与基本事实进行比较或并排显示多个图像序列(例如,相机图像和视差图)。

4.4 张量查询语言

查询和平衡数据集是训练深度学习工作流程的常见步骤。通常,这是在数据加载器内部使用采样策略或单独的预处理步骤来子选择数据集来实现的。另一方面,传统数据湖连接到外部分析查询引擎[66]并将数据帧流式传输到数据科学工作流程。为了解决格式和快速访问特定数据之间的差距,我们提供了一个用 C++ 实现的嵌入式类 SQL 查询引擎,称为张量查询语言(TQL)。示例查询如图 5 所示。虽然 SQL 解析器已经从 Hyrise [37] 扩展为设计张量查询语言,但我们实现了规划器和执行引擎,可以选择将计算委托给外部张量计算框架。查询计划生成张量操作的计算图。然后调度程序执行查询图。


图 5:按边界框预测误差顺序排列裁剪图像的示例查询,该误差通过用户定义函数 IOU(并集交集)测量。


查询的执行可以委托给外部张量计算框架(如 PyTorch [58] 或 XLA [64]),并有效利用底层加速硬件。除了标准 SQL 功能外,TQL 还实现数值计算。实现新查询语言有两个主要原因。首先,传统 SQL 不支持多维数组操作,例如计算图像像素的平均值或在特定维度上投影数组。TQL 通过添加 Python/NumPy 样式的索引、数组切片以及提供大量用于处理数组的便利函数来解决这个问题,其中许多是 NumPy 中支持的常见操作。其次,TQL 支持将查询与 Deep Lake 的其他功能(如版本控制、流引擎和可视化)进行更深入的集成。例如,TQL 允许查询特定版本或可能跨数据集的多个版本的数据。TQL 还支持特定指令来自定义查询结果的可视化或与数据加载器无缝集成以进行过滤流式传输。嵌入式查询引擎与客户端一起运行,无论是在远程计算实例上训练模型,还是在浏览器中通过 WebAssembly 编译。TQL 通过在多维列之上进行数值计算来扩展 SQL。它构建数据集视图,这些视图可以可视化或直接流式传输到深度学习框架。但是,查询视图可能很稀疏,这可能会影响流式传输性能。

4.5 物化

用于深度学习的大部分原始数据都以原始文件(以 JPEG 等格式压缩)的形式存储在本地或云端。构建数据集的常见方法是将指向这些原始文件的指针保存在数据库中,查询该指针以获取所需的数据子集,将过滤后的文件提取到机器,然后训练迭代文件的模型。此外,需要使用来源文件手动维护数据沿袭。Tensor Storage Format 使用链接张量简化了这些步骤 - 将指针(指向一个或多个云提供商的链接/URL)存储到原始数据。单个张量内的指针可以连接到多个存储提供商,从而允许用户获得存在于多个源中的数据的综合视图。Deep Lake 的所有功能(包括查询、版本控制和流式传输到深度学习框架)都可以与链接张量一起使用。但是,数据流的性能不会像默认张量那样理想。由于查询而创建的稀疏视图也存在类似的问题,由于块布局,这些视图的流式传输效率低下。此外,具体化将数据集视图转换为最佳布局,以便流式传输到深度学习框架中,从而更快地进行迭代。具体化涉及从链接或视图中获取实际数据,并有效地将其布局成块。在机器学习工作流程结束时执行此步骤可最大限度地减少数据重复,同时确保最佳流式传输性能和最少的数据重复,并具有完整的数据沿袭。

4.6 流数据加载器

随着数据集变得越来越大,通过网络从远程分布式存储进行存储和传输变得不可避免。数据流使训练模型无需等待所有数据都复制到本地机器。流式数据加载器确保数据获取、解压缩、应用转换、整理和数据移交给训练模型。深度学习数据加载器通常将获取和转换委托给并行运行的进程,以避免同步计算。然后,数据通过进程间通信 (IPC) 传输到主工作器,这会引入内存复制开销或使用具有一些可靠性问题的共享内存。相比之下,Deep Lake 数据加载器将高度并行的获取和 C++ 中的就地解压缩委托给每个进程,以避免全局解释器锁定。然后,它将内存中的指针传递给用户定义的转换函数并进行整理,然后将它们暴露给深度学习本机内存布局中的训练循环。当它仅使用本机库例程调用并相应地释放 python 全局解释器锁 (GIL) 时,转换会并行执行。结果,我们得到:


性能:以足够快的速度将数据传送到深度学习模型,以便 GPU 能够得到充分利用或成为计算瓶颈。


智能调度程序:动态区分 CPU 密集型作业与低密集型作业的优先级。


• 高效的资源分配:预测内存消耗,以避免因内存溢出而中断训练过程。



[3] 源代码可用:https://github.com/activeloopai/airbyte 的 @feature/connector/deeplake 分支