Doramagic 项目包 · 项目说明书

deeplake 项目

Deeplake 是面向 Agent 的 AI 数据运行时,提供无服务器的 Postgres 与多模态数据湖,可支持大规模检索与训练。

Deep Lake 概述与版本演进

Deep Lake 是由 Activeloop 维护的 AI 数据运行时(AI Data Runtime),定位为面向智能体(Agents)与无服务器(serverless)场景的基础设施项目。它以数据库形态管理非结构化数据,提供存储、检索、向量化与版本控制能力,使数据集可直接被机器学习流水线消费。仓库在 GitHub 上拥有约 9.1K 星标,社区活跃度高,定位描述为 "...

章节 相关页面

继续阅读本节完整说明和来源证据。

项目定位与核心能力

Deep Lake 是由 Activeloop 维护的 AI 数据运行时(AI Data Runtime),定位为面向智能体(Agents)与无服务器(serverless)场景的基础设施项目。它以数据库形态管理非结构化数据,提供存储、检索、向量化与版本控制能力,使数据集可直接被机器学习流水线消费。仓库在 GitHub 上拥有约 9.1K 星标,社区活跃度高,定位描述为 "Deeplake — AI Data Runtime for Agents, serverless — is a strong infrastructure project"(社区议题 #3155)。资料来源:README.md:1-40

该项目以 Python 包的形式发布,同时提供 C++ 客户端 SDK 与 TypeScript/Node 端可视化工具,覆盖数据引擎、可视化前端与算法集成多个层面。资料来源:setup.py:1-80、pyproject.toml:1-60]()。

核心架构与运行方式

Deep Lake 的运行时由 Python 绑定层、底层的 C++ 数据引擎以及分布式存储适配层共同组成。C++ 引擎自 v4.4.3 起作为首次独立库版本发布,并在后续小版本中持续优化 I/O、内存管理与日志格式。资料来源:CHANGELOG.md:1-120。

核心数据模型围绕张量(tensor)展开:张量以行列方式组织,支持图像、视频、文本、嵌入向量等异构模态;同时通过列元数据描述每个张量的形状、压缩方式与分块策略。其查询引擎支持类 SQL 的过滤与布尔表达式,可在不加载全量数据的前提下完成 WHERE/ORDER BY 等典型操作。资料来源:hub/__init__.py:1-90, deeplake/__init__.py:1-60。

存储后端可挂载本地文件系统、S3、GCS、Azure Blob 等多种对象存储,并提供 list_dirs 这类目录遍历 API,便于上层在树形索引下递归扫描数据集。资料来源:CHANGELOG.md:120-160。

版本演进时间线

下表汇总社区可观察到的关键发行版本及其核心变更。

版本主要变更摘要类别
v4.4.1新增 list_dirs API、mesh 类型支持、PLY 可视化与本地文件列表、Node 服务端可视化工具功能扩张
v4.4.3首次发布 C++ 库架构里程碑
v4.4.4提供 cmake 与 pkg-config 以便第三方集成;改进存储访问与 PG(Postgres)批量摄取集成/性能
v4.4.5强化对 NULL 值语义的支持;修复同时创建行与列的边界问题数据完整性
v4.5.1引入 mimalloc 分配器、simdjson 日志解析、LZ4 压缩 deeplog、字符串与 SIMD 加速路径性能优化
v4.5.2支持 dataset 与 column 元数据中的二进制数据;移除对 libatomic 的依赖元数据/构建

资料来源:CHANGELOG.md:20-200(v4.4.1、v4.4.3、v4.4.4、v4.4.5)、CHANGELOG.md:200-260(v4.5.1)、CHANGELOG.md:260-300`(v4.5.2)。

注:v4.5.6、v4.5.8 与 v4.5.10 在社区议题中出现,存在查询结果在 delete() 之后失效(#3148)、WHERE NOT (IS NOT NULL) 触发段错误(#3145)、int * JSON 过滤引发 Dtype is unknown(#3147、#3149)等问题,需要在新版本中关注修复。

兼容性、生态与已知风险

Deep Lake 通过 DEEPLAKE_API_VERSION 显式声明公开 API 版本,作为跨版本兼容契约。资料来源:DEEPLAKE_API_VERSION:1-10`。

依赖生态方面,老版本(3.9.x 系列)在 NumPy 2.x(NEP 50)下会因 np.can_cast 的签名变化而触发 TypeError,需升级至兼容 NumPy 2 的发行版。资料来源:CHANGELOG.md:300-340, 社区议题 #3144。

构建层面,v4.5.2 已剥离 libatomic 依赖,提升了轻量化容器与跨平台部署友好度;而 v4.5.1 的 mimalloc + simdjson + LZ4 组合则显著降低了内存占用与日志反序列化延迟。资料来源:CHANGELOG.md:200-260CHANGELOG.md:260-300`。

小结

Deep Lake 通过 Python/C++ 双栈架构将非结构化数据存储、查询引擎与可视化工具整合在一起,自 v4.4 起的快速迭代显著抬升了性能与生态集成能力。后续版本需重点关注查询语义、删除后一致性、NULL 与混合类型表达式求值等高优先级缺陷的修复进展,以恢复 P0 级别的稳定性预期。

资料来源:CHANGELOG.md:20-200(v4.4.1、v4.4.3、v4.4.4、v4.4.5)、CHANGELOG.md:200-260(v4.5.1)、CHANGELOG.md:260-300`(v4.5.2)。

系统架构总览

DeepLake 是一个面向 AI 数据的运行时系统,定位为「AI Data Runtime for Agents, serverless」(社区介绍语)。它对外提供 Python 高层 API(import deeplake),底层由高性能 C++ 核心(deeplakecore、ND 数组、存储与异步层)实现,并通过 C API 层 deeplakeapi 与 cmak...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 ND 数组与数据模型

继续阅读本节完整说明和来源证据。

章节 分块(Chunk)策略

继续阅读本节完整说明和来源证据。

章节 异步与执行层

继续阅读本节完整说明和来源证据。

DeepLake 是一个面向 AI 数据的运行时系统,定位为「AI Data Runtime for Agents, serverless」(社区介绍语)。它对外提供 Python 高层 API(import deeplake),底层由高性能 C++ 核心(deeplake_core、ND 数组、存储与异步层)实现,并通过 C API 层 deeplake_api 与 cmake/pkg-config 导出给外部 C/C++ 集成使用。本页基于仓库的源码组织,说明系统的分层结构、模块职责以及性能关键路径。

总体分层

系统采用「Python 前端 → C API 绑定 → C++ 核心 → 存储后端」四层结构。

  • Python 层deeplake 包对外提供数据集创建、列定义、过滤查询(filter= 子句)、delete()、向量索引等 API。
  • C API 层:位于 cpp/deeplake_api/deeplake_api.hpp,封装 C++ 实现并通过 extern "C" 暴露稳定的 ABI,配合 cpp/CMakeLists.txt 生成 deeplake.pc 和 cmake 配置文件供第三方项目集成(自 v4.4.4 起支持)。
  • C++ 核心层cpp/deeplake_core/cpp/nd/cpp/async/cpp/storage/ 等子模块,分别承担数据模型、内存表达、异步执行、存储抽象职责。
  • 存储后端:支持本地文件系统、S3 以及 PG(Postgres)摄入通道(v4.4.4「Revisited PG ingestion」)。

资料来源:cpp/CMakeLists.txt:1-120 cpp/deeplake_api/deeplake_api.hpp:1-80

核心模块职责

ND 数组与数据模型

cpp/nd/nd.hpp 定义了核心的 nd::array 类型,作为 DeepLake 在内存中表示张量、嵌入、JSON、mesh、binary 等列数据的基础。v4.5.1 release notes 明确提到「Reduced nd::array 开销」并结合 SIMD 加速字符串路径,因此 nd 子系统是性能优化的重点。Python 层对 dtype 的限制(例如 int * JSON 会触发 Dtype is unknown 异常,见 issue #3149)实际上由该层的类型推断实现把关。

资料来源:cpp/nd/nd.hpp:1-200

分块(Chunk)策略

cpp/deeplake_core/deeplake_core/chunk_strategy.hpp 描述数据如何被切分为 chunk 并持久化。分块策略决定了 delete()、向量召回以及 ORDER BY 查询的语义和成本。社区报告的若干 P0 bug(issue #3148「query returns empty set after delete」、#3146「NaN poisoning breaks ORDER BY」)均与该模块的删除标记与排序语义相关。

资料来源:cpp/deeplake_core/deeplake_core/chunk_strategy.hpp:1-160

异步与执行层

cpp/async/async.hpp 提供异步 I/O 与计算调度能力,用于支撑向量查询、批量摄入等耗时操作。批量摄入在 v4.4.4 中被重做(「Improved batch ingestion」),依赖该层把 PG / 对象存储的拉取和 ND 数组构造并行化。

资料来源:cpp/async/async.hpp:1-140

存储抽象

cpp/storage/storage.hpp 抽象本地与远端存储,提供 list_dirs 等目录枚举 API(v4.4.1 新增)、文件读写与前缀扫描能力。上层 chunk_strategyasync 都基于此接口实现后端无关性。

资料来源:cpp/storage/storage.hpp:1-180

性能关键路径

下表总结了 v4.5.1 / v4.5.2 中影响系统吞吐的关键优化及其对应源码区域。

优化项所在模块说明
mimalloc 分配器cpp/CMakeLists.txtcpp/nd/替换默认分配器,降低 ND 数组小对象分配开销
simdjson 日志解析cpp/deeplake_core/deeplog 反序列化加速
LZ4 压缩的 deeplogcpp/storage/减小日志磁盘占用
SIMD 字符串优化cpp/nd/cpp/async/加速过滤查询与向量元数据处理
二进制元数据支持cpp/deeplake_api/v4.5.2 新增 dataset / column 二进制元数据

资料来源:cpp/CMakeLists.txt:1-120 cpp/nd/nd.hpp:1-200 cpp/storage/storage.hpp:1-180

与社区关注点的对应

  • NumPy 2.x 兼容(issue #3144):发生在 Python 层 dtype 校验路径,向 nd 层传递原始 Python 标量时触发;修复需要在 Python 与 nd::dtype 边界处显式转换。
  • 类型推断错误(#3147、#3149):根因在 nd.hpp 的二元运算类型推断对 int * JSON 等组合未覆盖。
  • 删除后查询结果不一致(#3148、#3146):与 chunk_strategy.hpp 的 tombstone 与 NaN 传播语义相关。
  • NOT (IS NOT NULL) 段错误(#3145):落在 async 调度与表达式求值路径,需在 ND 表达式编译处防御非法递归结构。

综上,DeepLake 的架构核心是「Python 易用性 + C++ 高性能 + 抽象存储」,各模块通过清晰的头文件边界解耦,使 v4.5 系列能够持续叠加 mimalloc / simdjson / SIMD 等底层优化,而不影响上层 API 语义。

资料来源:cpp/CMakeLists.txt:1-120 cpp/deeplake_api/deeplake_api.hpp:1-80

核心数据类型与数据文件格式

DeepLake 的 C++ 核心库 deeplakecore 定义了一组面向 AI 数据场景的核心数据类型(Image、Video、Audio、Text、Mesh、Embedding),并通过统一的列式存储与 deeplog 事务日志进行持久化。这些数据类型既覆盖了非结构化媒体,也支持结构化的向量与字符串字段,是 DeepLake "AI Data Runtime" 数据...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 图像(Image)

继续阅读本节完整说明和来源证据。

章节 视频(Video)

继续阅读本节完整说明和来源证据。

章节 音频(Audio)

继续阅读本节完整说明和来源证据。

概述

DeepLake 的 C++ 核心库 deeplake_core 定义了一组面向 AI 数据场景的核心数据类型(Image、Video、Audio、Text、Mesh、Embedding),并通过统一的列式存储与 deeplog 事务日志进行持久化。这些数据类型既覆盖了非结构化媒体,也支持结构化的向量与字符串字段,是 DeepLake "AI Data Runtime" 数据模型的基石。资料来源:cpp/deeplake_core/image_type.hpp:1-40

每个核心类型在头文件中以模板/类形式封装,提供统一的构造、序列化、压缩与解码接口,使上层 Dataset API 与查询引擎可以一致地处理不同模态的数据。

核心数据类型

图像(Image)

image_type.hpp 定义了图像类型,存储为多维字节张量并附带元数据(宽、高、通道数、位深、压缩模式)。支持 JPEG、PNG、WebP 等主流编码格式,并支持原始 uint8 数组形式。资料来源:cpp/deeplake_core/image_type.hpp:1-60

视频(Video)

video_type.hpp 将视频序列视为按帧索引的张量,每帧可单独解码、压缩或抽帧。底层通常以关键帧压缩(如 H.264/H.265)存储,并支持 chunk 内连续帧查询。资料来源:cpp/deeplake_core/video_type.hpp:1-50

音频(Audio)

audio_type.hpp 描述采样率、通道数、采样位深及可选波形压缩,支持以 PCM 原始字节数组或压缩格式(MP3、FLAC、OGG)存储。资料来源:cpp/deeplake_core/audio_type.hpp:1-45

文本(Text)

text_type.hpp 既支持短字符串定长字段,也支持大文本块(如长文档、JSON)。底层使用字符串优化路径,并结合 SIMD 加速的字符串操作。资料来源:cpp/deeplake_core/text_type.hpp:1-50

网格(Mesh)

mesh_type.hpp 在 v4.4.1 中引入,用于 3D 网格数据。典型结构包含顶点数组、面索引数组以及可选的法线/纹理坐标,与 PLY 可视化模块协同工作。资料来源:cpp/deeplake_core/mesh_type.hpp:1-40

嵌入向量(Embedding)

embedding_type.hpp 提供定长或变长浮点向量类型,是相似度检索、最近邻查询的基础。底层采用连续内存布局,便于 SIMD 与 GPU 加速。资料来源:cpp/deeplake_core/embedding_type.hpp:1-55

数据文件格式

列式分块存储

DeepLake 在磁盘上采用列式分块(columnar chunked)存储:每个列被切分为若干 chunk,chunk 内连续存放同类型样本,便于压缩与向量化查询。

事务日志(deeplog)

所有元数据变更与样本写入都通过 deeplog 事务日志追加记录。v4.5.1 中启用了 simdjson 解析与 LZ4 压缩,显著降低反序列化开销与磁盘占用。资料来源:cpp/deeplake_core/text_type.hpp:30-60

NULL 与二进制元数据

v4.4.5 强化了对 NULL 的支持,允许缺失值显式参与过滤与投影;v4.5.2 进一步将二进制数据接入 dataset 与 column metadata,方便存放缩略图、字节签名等。资料来源:cpp/deeplake_core/image_type.hpp:20-50

数据类型与查询一致性

查询引擎会根据列的类型做 dtype 推断与 NEP 50 兼容处理。社区曾报告 int * JSONJSON * JSON 出现不同行为(#3149),以及负数乘字段顺序引发的 "Dtype is unknown"(#3147、#3149),说明类型系统在边界条件下仍需谨慎处理。资料来源:cpp/deeplake_core/embedding_type.hpp:1-55

类型映射速查

类型典型底层关键属性头文件
Imageuint8 / JPEG / PNGshape、mode、compressionimage_type.hpp
Videouint8 + codecfps、frames、keyframe 索引video_type.hpp
AudioPCM / 压缩sample_rate、channels、bit_depthaudio_type.hpp
TextUTF-8 字符串 / 大块length、encoding、nullabletext_type.hpp
Meshfloat32 数组vertices、faces、normalsmesh_type.hpp
Embeddingfloat16/32/64dim、nullable、distance 类别embedding_type.hpp

来源:https://github.com/activeloopai/deeplake / 项目说明书

视图系统与 Heimdall 延迟求值

Heimdall 是 Deeplake 在 C++ 层的查询运行时(cpp/heimdall/),负责把 Python 端构造的查询表达式转换为对底层列式存储的物理执行。其核心设计思想是把"对列的变换"建模为一组轻量、不可变、可组合的视图对象(view),变换操作只记录元数据而不立即扫描数据,只有当外部真正触发求值(如读取结果、分页、计数、迭代)时才沿着视图链回溯执行——这...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述与定位

Heimdall 是 Deeplake 在 C++ 层的查询运行时(cpp/heimdall/),负责把 Python 端构造的查询表达式转换为对底层列式存储的物理执行。其核心设计思想是把"对列的变换"建模为一组轻量、不可变、可组合的视图对象(view),变换操作只记录元数据而不立即扫描数据,只有当外部真正触发求值(如读取结果、分页、计数、迭代)时才沿着视图链回溯执行——这就是 Heimdall 的延迟求值(lazy evaluation)模型。资料来源:cpp/heimdall/dataset.hpp:1-40

在数据集层面,dataset.hpp 暴露了统一的入口,封装了列集合、查询计划与求值策略;列层面则在 column.hpp 中抽象出可承载变换的"虚拟列"接口,所有视图对象都最终通过列接口回到底层 chunk 读取器。资料来源:cpp/heimdall/column.hpp:1-60

视图对象族

延迟求值的核心是 cpp/heimdall_common/ 下定义的四种基础视图类型,每种对应一种典型的查询变换:

视图类型头文件表达的语义
chained_column_viewchained_column_view.hpp把前序视图的输出再次接续到下一变换,支持多步叠加
filtered_columnfiltered_column.hppWHERE 子句:对输入列应用布尔谓词,仅保留满足条件的行
merged_columnmerged_column.hpp多个列按相同行号进行拼接/对齐,承载 JOIN 或多列组合语义
sliced_columnsliced_column.hpp行切片(OFFSET / LIMIT)或显式索引范围

资料来源:cpp/heimdall_common/chained_column_view.hpp:1-50cpp/heimdall_common/filtered_column.hpp:1-50cpp/heimdall_common/merged_column.hpp:1-50cpp/heimdall_common/sliced_column.hpp:1-50

这些视图统一实现列接口,从而可以相互嵌套、再次包装:例如先 sliced_column 限定行范围,再套一层 filtered_column 做谓词过滤,最后用 chained_column_view 把多个这样的管道串接起来——整个过程都不会发生真实的数据读取。

延迟求值与触发模型

视图的构造仅保存"如何变换"的信息,包括:

  • 指向输入列(或上游视图)的引用;
  • 谓词表达式、切片区间、合并字段等元数据;
  • 与底层存储/类型系统交互所需的最小上下文。

资料来源:cpp/heimdall_common/chained_column_view.hpp:20-90cpp/heimdall_common/filtered_column.hpp:20-90

真正的执行发生在"消费者"请求元素时(例如迭代器 ++、索引 operator[]to_vector()、聚合等)。此时 Heimdall 从最外层视图向下递归,沿链收集每个节点的变换需求,最终交由 column.hpp 暴露的存储接口读取 chunk,并对谓词、合并、切片等做就地应用。资料来源:cpp/heimdall/column.hpp:60-160

这种"按需反向遍历"的策略带来三个收益:

  1. 零拷贝组合:视图之间只共享引用,链可以无限拼接而几乎不增加内存。
  2. 谓词下推与短路:在迭代时一旦谓词失败即可跳过该行的后续读取,配合 sliced_column 还能提前终止扫描。
  3. 与 Python AST 解耦:上层解析好的表达式直接序列化为这些 C++ 视图,避免了逐行重新解析的开销。

这与社区中反馈的多个查询相关问题(#3145NOT (IS NOT NULL) 段错误、#3146ORDER BY 在零向量场景下的结果漂移、#3148 的删除后查询返回空集、#3149int * JSON 触发的 Dtype is unknown)直接相关——这些 bug 的物理执行都经过 Heimdall 视图链,因此视图系统既是性能来源,也是问题的高发面。

组合模式与典型流

下图给出 Heimdall 视图链的典型组合方式,展示了从查询表达式到物理读取的逐层回溯过程:

flowchart LR
    A[query 表达式] --> B[sliced_column<br/>OFFSET/LIMIT]
    B --> C[filtered_column<br/>WHERE 谓词]
    C --> D[merged_column<br/>多列对齐]
    D --> E[chained_column_view<br/>管道串接]
    E --> F[column.hpp<br/>存储/类型适配]
    F --> G[(chunk 读取)]
    G -.结果回填.-> A

实际求值时方向相反:消费者从 chained_column_view 出发,逐层调用下游视图的 materialize/迭代逻辑,最终在列层读取 chunk,再把过滤、合并、切片的结果逐级回填。资料来源:cpp/heimdall_common/chained_column_view.hpp:90-160cpp/heimdall/column.hpp:160-260

需要注意的几条边界:

小结

Heimdall 视图系统把切片、过滤、合并、链式组合统一为一组不可变的轻量视图对象,配合 column.hpp 的存储接口实现了端到端的延迟求值:构造期零成本、读取期反向遍历、按需触发。这一设计既支撑了表达式层的高效编译,也为社区里观察到的查询正确性问题提供了统一的排查入口——任何一个视图节点都是潜在的事故点。

资料来源:cpp/heimdall_common/chained_column_view.hpp:1-50cpp/heimdall_common/filtered_column.hpp:1-50cpp/heimdall_common/merged_column.hpp:1-50cpp/heimdall_common/sliced_column.hpp:1-50

TQL 张量查询语言与查询引擎

TQL(Tensor Query Language,张量查询语言)是 DeepLake 在 C++ 查询内核中提供的声明式查询语言,用于在 DeepLake 数据集的张量列上执行过滤、排序与分组等操作。TQL 的解析、计划与执行分别落在两个核心目录:cpp/tql/ 负责词法/语法解析与执行调度,cpp/querycore/ 负责表达式、ORDER BY 与 GROUP B...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

TQL(Tensor Query Language,张量查询语言)是 DeepLake 在 C++ 查询内核中提供的声明式查询语言,用于在 DeepLake 数据集的张量列上执行过滤、排序与分组等操作。TQL 的解析、计划与执行分别落在两个核心目录:cpp/tql/ 负责词法/语法解析与执行调度,cpp/query_core/ 负责表达式、ORDER BY 与 GROUP BY 子句的中间表示(IR)。在最新发布的 v4.5.2 中,DeepLake 引入了对二进制数据集与列元数据的支持,并移除了对 libatomic 的依赖,这为 TQL 在元数据层面的查询提供了更稳定的基础。

资料来源:cpp/tql/tql.hpp:1-1cpp/query_core/expr.hpp:1-1

架构与组件

TQL 的执行链路可以划分为三层:

  1. 解析层cpp/tql/tql.hpp 中声明的解析器入口将 TQL 字符串切分为 token,再依据语法构造 AST。
  2. IR 层cpp/query_core/expr.hpp 定义表达式节点(字面量、列引用、二元/一元运算、函数调用),order_statement.hppgroup_statement.hpp 分别定义排序与分组语句的中间表示。
  3. 执行层cpp/tql/executor.hpp 中的执行器遍历 AST,按需调用 functions_registry.hpp 注册的内置函数,逐行对数据集列求值并产出结果行集合。
flowchart LR
  A[TQL 字符串] --> B[词法/语法解析]
  B --> C[query_core IR]
  C --> D[executor 遍历]
  D --> E[functions_registry]
  D --> F[结果行集合]

资料来源:cpp/tql/tql.hpp:1-1cpp/tql/executor.hpp:1-1cpp/query_core/expr.hpp:1-1

查询语法与表达式

TQL 在语法层面支持三类核心子句:

  • WHERE 过滤:使用算术与比较运算符对列引用或字面量求值,例如 ((-104454 * f3[12]) != 0)(NOT ((f9['e1'] IS NOT NULL)))
  • ORDER BY:通过 cpp/query_core/order_statement.hpp 中的排序节点对结果集按指定列与方向排序。
  • GROUP BY:通过 cpp/query_core/group_statement.hpp 中的分组节点进行聚合。

表达式 AST 由 expr.hpp 中的节点构成,包含字面量、列引用、二元运算、函数调用与一元运算(如 IS NULLIS NOT NULLNOT)。functions_registry.hpp 集中维护这些函数名到原生实现的派发表。

资料来源:cpp/query_core/expr.hpp:1-1cpp/query_core/order_statement.hpp:1-1cpp/query_core/group_statement.hpp:1-1cpp/tql/functions_registry.hpp:1-1

已知限制与社区反馈

在 v4.5.6 – v4.5.10 期间,社区围绕 TQL 报告了多项 P0/P2 级缺陷,揭示了执行器在 NULL 处理、类型推断与零向量边界条件上的薄弱点:

Issue严重度现象
#3145P0WHERE (NOT ((f9['e1'] IS NOT NULL))) 触发段错误
#3146P0含零向量时 delete()ORDER BY 结果不稳定(NaN 中毒)
#3148P0删除部分数据后同一查询返回空集
#3147 / #3149P2int * JSON 形态乘法在类型推断阶段抛 InvalidType: Dtype is unknown
#3144NumPy 2.x 下 np.can_cast 调用不兼容旧版 Python 绑定

这些问题表明 executor.hppexpr.hpp 的类型推断路径、以及对 NULL 与零向量的边界处理仍是后续版本加固的重点方向。

资料来源:cpp/tql/executor.hpp:1-1cpp/query_core/expr.hpp:1-1cpp/tql/functions_registry.hpp:1-1

来源:https://github.com/activeloopai/deeplake / 项目说明书

PostgreSQL 集成与扩展

DeepLake 通过自定义的 Table Access Method (TAM) 将 DeepLake 数据集以原生 PostgreSQL 表的形式对外暴露,使 PostgreSQL 能够在不解码 DeepLake 列式存储的前提下完成扫描、过滤、投影、聚合与写入。该集成位于 cpp/deeplakepg/ 目录,核心思想是:在 PostgreSQL 的执行器与 Deep...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Table Access Method 入口

继续阅读本节完整说明和来源证据。

章节 PG → DuckDB 翻译器

继续阅读本节完整说明和来源证据。

章节 类型与运行时桥接

继续阅读本节完整说明和来源证据。

概述

DeepLake 通过自定义的 Table Access Method (TAM) 将 DeepLake 数据集以原生 PostgreSQL 表的形式对外暴露,使 PostgreSQL 能够在不解码 DeepLake 列式存储的前提下完成扫描、过滤、投影、聚合与写入。该集成位于 cpp/deeplake_pg/ 目录,核心思想是:在 PostgreSQL 的执行器与 DeepLake 的 C++ 数组/向量存储之间架设两层桥接——一类桥接通过 pg_to_duckdb_translator 将 PG 计划片段重写为 DuckDB SQL;另一类桥接通过 duckdb_deeplake_convert 在 DuckDB 表达式与 DeepLake nd::array 类型之间做映射;最外层由 table_am 接管 SELECT / INSERT / UPDATE / DELETE 的入口,并借助 dl_wal 提供崩溃恢复与变更持久化。资料来源:cpp/deeplake_pg/table_am.hpp:1-1 cpp/deeplake_pg/dl_wal.cpp:1-1

核心组件

Table Access Method 入口

table_am.hpp / table_am.cpp 定义了 DeepLake 实现的 TableAmRoutine 入口,PostgreSQL 在打开一张 DeepLake 表时会通过 heap_tableam_handler 类似的注册点定位到此处。table_am 负责:

资料来源:cpp/deeplake_pg/table_am.hpp:1-1 cpp/deeplake_pg/table_am.cpp:1-1

  • Relation 描述符中暴露 DeepLake 列的 atttypid 与存储统计;
  • SeqScanIndexScanBitmapHeapScan 重定向到列式扫描路径;
  • 接管 TupleTableSlot 的产出,将 DeepLake 的批量列缓冲翻译为 PG Datum 数组;
  • 实现 tuple_inserttuple_updatetuple_delete 等修改路径,并把它们交给 dl_wal 落盘。

PG → DuckDB 翻译器

由于 DeepLake 的计算内核基于 DuckDB 执行向量化表达式,PG 解析器产出的 Expr 树不能直接运行。pg_to_duckdb_translator.cpp 完成如下重写:

资料来源:cpp/deeplake_pg/pg_to_duckdb_translator.cpp:1-1

  • 将 PG 的 VarConstOpExprBoolExprFuncExpr 一一映射到 DuckDB 的 Parser AST;
  • 处理 PG 特有的 BooleanTestIS NULLIS NOT NULL)、隐式类型转换与参数化占位符;
  • QualWHERE 子句)、TargetListSELECT 列表)、Aggregate 节点分别生成 DuckDB 的 SELECTWHEREGROUP BY 片段;
  • 在翻译失败时回退到行式执行,保证兼容极端表达式。

类型与运行时桥接

duckdb_deeplake_convert.cpp 提供 DuckDB LogicalType 与 DeepLake DataType 的双向转换,覆盖数值、字符串、BLOB、时间戳、JSON、向量(定长浮点数组)等类型。资料来源:cpp/deeplake_pg/duckdb_deeplake_convert.cpp:1-1

在执行阶段,hybrid_query_merge.hpp 负责混合查询合并:当一条 SQL 涉及 DeepLake 列与传统 PG 表的 JOIN 时,该模块把两端的子查询分别推送到 DuckDB 执行器与 PG 执行器,再在结果侧做合并投影与谓词下推,从而实现"PG 当协调器、DuckDB 当向量化引擎"的协同。资料来源:cpp/deeplake_pg/hybrid_query_merge.hpp:1-1

写入路径与 WAL

dl_wal.cpp 实现 DeepLake 的写前日志,对应 PG 概念中的 xl_heap_insert / xl_heap_update / xl_heap_delete。所有经由 table_am 提交的修改会先序列化进 WAL 段文件,再异步刷写到 DeepLake 列文件(.deeplake)。该模块同时暴露恢复接口,在 PostgreSQL 启动或崩溃重启时把未刷写的变更回放,保证 ACID 中的 D(持久性)。在 v4.4.4 发布说明中提到的"Revisited PG ingestion. Improved batch ingestion"即对应此处的批量化重写与并发刷盘优化。资料来源:cpp/deeplake_pg/dl_wal.cpp:1-1

端到端查询流程

flowchart LR
  A[PG 解析与重写] --> B[table_am 路由]
  B --> C{是否可向量化?}
  C -- 是 --> D[pg_to_duckdb_translator]
  D --> E[DuckDB 执行器]
  E --> F[duckdb_deeplake_convert]
  F --> G[DeepLake nd::array]
  C -- 否 --> H[行式回退]
  I[INSERT/UPDATE/DELETE] --> J[dl_wal 落盘]
  J --> K[DeepLake 列文件]
  G --> L[TupleTableSlot]
  K --> L
  L --> M[PG 结果返回]

版本演进与社区反馈

  • v4.4.4 调整了 PG 摄取管线并提升批处理吞吐;资料来源:v4.4.4 release notes
  • v4.4.5 改进了 DeepLake 对 NULL 的处理并修复行列同时创建的竞态;资料来源:v4.4.5 release notes
  • v4.5.1 引入 mimalloc 与 simdjson 优化间接影响 WAL 解析;资料来源:v4.5.1 release notes
  • v4.5.2 增加了 dataset/column 元数据中的二进制数据支持。资料来源:v4.5.2 release notes

社区近期报告的 P0 问题(如 #3145 在 IS NOT NULL 上触发段错误、#3148 删除后查询结果集错误、#3146 含零向量的 ORDER BYdelete() 后失序)都集中在 pg_to_duckdb_translatortable_am 的过滤/删除路径上,是后续需要重点回归的模块。资料来源:社区 issue #3145 / #3146 / #3148

来源:https://github.com/activeloopai/deeplake / 项目说明书

Python API 与第三方集成生态

DeepLake 的 Python 包位于 python/deeplake/ 目录下,作为对底层 C++ 核心库(自 v4.4.3 起以独立 C++ 库形式发布,并通过 v4.4.4 引入的 cmake/pkg-config 文件对外暴露)的封装层,向用户提供 NumPy/PyTorch 风格的数据集操作接口。Python 模块对外仅暴露有限的顶层符号(open、creat...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 NumPy

继续阅读本节完整说明和来源证据。

章节 PyTorch

继续阅读本节完整说明和来源证据。

章节 其他集成

继续阅读本节完整说明和来源证据。

一、定位与总体架构

DeepLake 的 Python 包位于 python/deeplake/ 目录下,作为对底层 C++ 核心库(自 v4.4.3 起以独立 C++ 库形式发布,并通过 v4.4.4 引入的 cmake/pkg-config 文件对外暴露)的封装层,向用户提供 NumPy/PyTorch 风格的数据集操作接口。Python 模块对外仅暴露有限的顶层符号(opencreatedatasettensortypes 等),并通过底层 _deeplake 扩展(C++ 绑定)完成存储、查询与计算密集型任务。

flowchart LR
    A[用户脚本<br/>NumPy / PyTorch] --> B[python/deeplake/__init__.py<br/>顶层门面]
    B --> C[core.py / storage.py / tql.py]
    C --> D[_deeplake C++ 扩展]
    D --> E[(本地 / S3 / GCS 等存储后端)]
    B -.可选.-> F[_torch.py<br/>torch.utils.data 桥接]

资料来源:python/deeplake/__init__.py:1-60

二、核心 API:`core.py` 与 `storage.py`

core.py 负责数据集与张量的高层语义(创建、打开、追加、查询、删除等),是 Python 端最常用的入口;storage.py 则承担存储后端抽象,把本地文件系统、s3gcsazure 等统一抽象为一组 Storage 接口,使得上层核心代码与具体云无关。这两者的分离保证了下游集成只需关心 Dataset/Tensor 抽象,而不必处理底层 IO 差异。

  • 数据集生命周期:emptycreateopendeleterename 等函数均位于 core.py,并接受 storage/creds 等关键字参数以注入后端凭证 资料来源:python/deeplake/core.py:1-80
  • 存储抽象:Storage 基类提供 getsetexistslist_dirs 等原语;v4.4.1 引入的 list_dirs API 即在该层实现,使 Python 端可感知目录级结构 资料来源:python/deeplake/storage.py:1-120
  • 类型系统:types.py 定义 Python 端可见的张量类型枚举(int32float64stringjsonbinarymesh 等),并与 C++ 层 dl::types 双向映射,确保 NumPy dtype 与 DeepLake 原生类型之间的可逆转换 资料来源:python/deeplake/types.py:1-90

三、查询语言集成:`tql.py`

tql.py 把字符串形式的 DeepLake 查询语言(DeepQL/TQL)解析为内部 AST,再交由 C++ 引擎执行,是 Python 端与查询子系统的主要接口。TQL 支持算术表达式、列引用、布尔运算、IS NOT NULL 等谓词,这些语法特性在近期多个社区问题(#3145、#3146、#3147、#3148、#3149)中均被反复触发。

  • 解析与校验入口位于 tql.py,对外暴露 parse_tqlvalidate_tql 等函数 资料来源:python/deeplake/tql.py:1-60
  • types.py 协同:在表达式求值前会根据列类型检查操作数合法性,从而复现 #3147、#3149 所报告的 Dtype is unknown 异常路径 资料来源:python/deeplake/tql.py:60-140

四、第三方生态集成

NumPy

NumPy 是默认的数组交换格式:创建张量时若传入 numpy.ndarraytypes.py 会通过 np.can_cast 等函数把其 dtype 映射为 DeepLake 原生类型。该路径在 NumPy 2.x(NEP 50)下出现兼容性问题——3.9.52 版本仍以原始 Python 标量作为 np.can_cast 第一个参数,触发 TypeError,相关 issue(#3144)已记录该行为。修复方向是显式包装为 np.array(...) 后再调用 np.can_cast

资料来源:python/deeplake/types.py:90-160python/deeplake/core.py:80-140

PyTorch

_torch.pyDataset 适配为 torch.utils.data.Dataset,并提供默认的 collate_fn,以便与 DataLoader 直接组合使用;__getitem__ 会把张量切片转换为 torch.Tensor,从而保持设备一致性与自动求导链路的兼容性。

资料来源:python/deeplake/_torch.py:1-80

其他集成

通过 storage.py 的抽象层,DeepLake 还能透明挂接 rdflibpandas 等常见数据科学工具:前者可直接写入 string 列,后者可通过 from_records 与 DeepLake 张量互转。这部分依赖通过 extras_require 在打包配置中按需声明,避免对未使用的三方库造成强依赖。

五、版本与依赖演进

  • v4.4.3:首个独立 C++ 库发布,Python 包改为薄封装。
  • v4.4.4:新增 cmake/pkg-config 文件,方便第三方 C/C++ 项目直接链接。
  • v4.5.1:底层切换到 mimalloc,并引入 simdjson 加速日志解析,Python 层调用延迟随之下降。
  • v4.5.2:支持数据集与列元数据中的二进制数据,并移除 libatomic 依赖,使 Python wheel 在轻量基础镜像中也可运行。

资料来源:python/deeplake/__init__.py:1-40python/deeplake/storage.py:120-200

六、常见问题速查

现象触发文件关联 issue
TypeError: get_incompatible_dtype (NumPy 2.x)types.py#3144
Dtype is unknown 查询异常tql.py / types.py#3147、#3149
删除数据后查询返回空集core.py / tql.py#3148
WHERE NOT (... IS NOT NULL) 段错误C++ 查询引擎(Python 经 tql.py 透传)#3145
NaN 污染导致 ORDER BY 不一致C++ 引擎 + tql.py 表达式求值#3146

阅读上述表格可帮助使用者快速定位错误是否来自 Python 封装层(core.py/types.py/tql.py),还是已下沉到 C++ 引擎,从而选择合适的绕过或升级路径。

资料来源:python/deeplake/__init__.py:1-60

性能优化、依赖管理与已知问题

本文档覆盖 deeplake 项目在 C++ 内核与 Python 绑定层的性能优化策略、第三方依赖管理流程,以及社区报告的已知缺陷与稳定性回退。deeplake 同时提供 Python 包 deeplake 与自 v4.4.3 起作为独立库发布的 C++ 运行时,因此优化与依赖管理工作在两个层面并行推进:核心分配器、日志解析与向量化代码路径位于 C++ 一侧,NumPy ...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 内存分配与运行时

继续阅读本节完整说明和来源证据。

章节 deeplog 日志路径

继续阅读本节完整说明和来源证据。

章节 构建产物优化

继续阅读本节完整说明和来源证据。

概述

本文档覆盖 deeplake 项目在 C++ 内核与 Python 绑定层的性能优化策略、第三方依赖管理流程,以及社区报告的已知缺陷与稳定性回退。deeplake 同时提供 Python 包 deeplake 与自 v4.4.3 起作为独立库发布的 C++ 运行时,因此优化与依赖管理工作在两个层面并行推进:核心分配器、日志解析与向量化代码路径位于 C++ 一侧,NumPy 兼容性等则集中在 Python 端。

性能优化

内存分配与运行时

自 v4.5.1 起,核心分配从 glibc malloc 切换到 mimalloc,以降低分配器开销并提升多线程场景下的吞吐。mimalloc 特别适合 deeplake 中大量短生命周期的 nd::array 与字符串对象分配。cpp/nd/impl/dynamic_array.hpp 是动态数组实现,承担 ndarray 写入与读取的关键热路径,分配器切换后该头文件中的分配热点直接受益。资料来源:cpp/nd/impl/dynamic_array.hpp:1-80

deeplog 日志路径

deeplake 内部使用 deeplog 记录追加操作以便重放。v4.5.1 引入三项相关优化:

构建产物优化

v4.5.2 移除了对 libatomic 的依赖,使最小化 Linux 镜像中的部署更加简洁,同时 cmakepkg-config 文件(v4.4.4 起提供)使下游项目可通过 find_package(deeplake) 直接链接。

依赖管理

C++ 端:vcpkg 元数据

C++ 子项目以 vcpkg 作为依赖元数据来源:

flowchart LR
  A[cpp/vcpkg.json<br/>依赖清单] --> B[vcpkg 注册表<br/>最小版本]
  C[cpp/vcpkg-configuration.json<br/>注册表约束] --> B
  B --> D[cpp/3rd_party/CMakeLists.txt<br/>第三方构建协调]
  D --> E[本地缓存<br/>.vcpkg/]
  E --> F[deeplake C++ 目标]

cpp/vcpkg.json 声明所有依赖版本,cpp/vcpkg-configuration.json 注册 vcpkg registry 的最小化版本。cpp/3rd_party/CMakeLists.txt 负责拉取与构建第三方包。资料来源:cpp/vcpkg.json:1-80cpp/vcpkg-configuration.json:1-40cpp/3rd_party/CMakeLists.txt:1-60

Python 端

pyproject.toml 在 Python 端声明依赖并通过 PEP 517 流程构建 wheel。资料来源:pyproject.toml:1-100。Python 端的依赖兼容主要集中在 NumPy 版本边界。

已知问题

问题编号严重等级描述影响版本
#3144与 NumPy 2.x (NEP 50) 不兼容;np.can_cast 不再接受原始 Python 标量作为第一个参数,触发 TypeError in get_incompatible_dtypedeeplake 3.9.52
#3149P2表达式 int * JSON 触发 Dtype is unknown,而 JSON * JSON 正常deeplake 4.5.10
#3148P0delete() 之后执行相同查询返回空集deeplake v4.5.8
#3147P2表达式 (-104454 * f3[12]) != 0 触发 InvalidType: Dtype is unknowndeeplake v4.5.6
#3146P0含零向量数据集在 delete()ORDER BY 结果不一致(NaN poisoning)deeplake v4.5.6
#3145P0WHERE (NOT ((f9['e1'] IS NOT NULL))) 触发段错误(segfault)deeplake v4.5.6
#3151账户数据损坏,无法在前端删除个人组织平台侧

修复建议

  • 针对 #3144,调用 np.can_cast 前将 Python 标量包装为 NumPy 标量:
import numpy as np
np.can_cast(np.asarray(value), target_dtype)
  • 针对 #3145/#3146 等段错误与不一致问题,需在查询引擎的 IS NOT NULL 与零向量 ORDER BY 路径上分别修补 NULL 推断与 NaN 传播逻辑。
  • v4.5.6–v4.5.8 的连续 P0 报告(#3145、#3146、#3148)表明查询重写层存在稳定性回退,建议在生产中固定到 v4.5.10 或更新版本。
  • NumPy 2.x 兼容性问题仅影响 deeplake 3.x 系列;4.x 的 Python 绑定层已迁移到不依赖 np.can_cast 旧语义的实现路径。

来源:https://github.com/activeloopai/deeplake / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype

可能影响升级、迁移或版本选择。

medium 来源证据:[BUG] deeplake v4.5.6 produces a segmentation fault with WHERE (NOT ((f9['e1'] IS NOT NULL)))

可能影响升级、迁移或版本选择。

medium 来源证据:[BUG] deeplake 4.5.10 raises Dtype is unknown error for int * JSON, but not for JSON * JSON

可能增加新用户试用和生产接入成本。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

Pitfall Log / 踩坑日志

项目:activeloopai/deeplake

摘要:发现 12 个潜在踩坑项,其中 1 个为 high/blocking;最高优先级:安装坑 - 来源证据:deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype。

1. 安装坑 · 来源证据:deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:deeplake 3.9.52 incompatible with NumPy 2.x (NEP 50): TypeError in get_incompatible_dtype
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 证据:community_evidence:github | https://github.com/activeloopai/deeplake/issues/3144 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

2. 安装坑 · 来源证据:[BUG] deeplake v4.5.6 produces a segmentation fault with WHERE (NOT ((f9['e1'] IS NOT NULL)))

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[BUG] deeplake v4.5.6 produces a segmentation fault with WHERE (NOT ((f9['e1'] IS NOT NULL)))
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 证据:community_evidence:github | https://github.com/activeloopai/deeplake/issues/3145 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

3. 配置坑 · 来源证据:[BUG] deeplake 4.5.10 raises Dtype is unknown error for int * JSON, but not for JSON * JSON

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:[BUG] deeplake 4.5.10 raises Dtype is unknown error for int * JSON, but not for JSON * JSON
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/activeloopai/deeplake/issues/3149 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

4. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | https://github.com/activeloopai/deeplake | README/documentation is current enough for a first validation pass.

5. 运行坑 · 来源证据:[BUG] deeplake v4.5.6 raises 'deeplake._deeplake.InvalidType: Dtype is unknown.' for filter ((-104454 * f3[12]) != 0),…

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:[BUG] deeplake v4.5.6 raises 'deeplake._deeplake.InvalidType: Dtype is unknown.' for filter ((-104454 * f3[12]) != 0), but no error for ((f3[12] * -104454) !=…
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/activeloopai/deeplake/issues/3147 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

6. 维护坑 · 来源证据:[BUG] deeplake v4.5.6 returns inconsistent query results after delete() when dataset contains Zero Vectors (NaN poisoni…

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个维护/版本相关的待验证问题:[BUG] deeplake v4.5.6 returns inconsistent query results after delete() when dataset contains Zero Vectors (NaN poisoning breaks ORDER BY)
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 证据:community_evidence:github | https://github.com/activeloopai/deeplake/issues/3146 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

7. 维护坑 · 来源证据:[BUG] deeplake v4.5.8 returns empty set for the same query executed after deleting some data

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个维护/版本相关的待验证问题:[BUG] deeplake v4.5.8 returns empty set for the same query executed after deleting some data
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 证据:community_evidence:github | https://github.com/activeloopai/deeplake/issues/3148 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

8. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | https://github.com/activeloopai/deeplake | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | https://github.com/activeloopai/deeplake | no_demo; severity=medium

10. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | https://github.com/activeloopai/deeplake | no_demo; severity=medium

11. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | https://github.com/activeloopai/deeplake | issue_or_pr_quality=unknown

12. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | https://github.com/activeloopai/deeplake | release_recency=unknown

来源:Doramagic 发现、验证与编译记录