62 个版本 (8 个重大变化)
新 0.16.1 | 2024 年 8 月 9 日 |
---|---|
0.15.0 | 2024 年 7 月 25 日 |
0.10.5 | 2024 年 3 月 20 日 |
0.9.2 | 2023 年 12 月 30 日 |
0.8.18 | 2023 年 11 月 30 日 |
#45 在 机器学习
每月下载量 3,176
在 12 个crate中使用(直接使用8个)
84KB
1.5K SLoC
现代 ML 列式数据格式。通过 2 行代码从 Parquet 转换,实现 100 倍的随机访问速度、向量索引、数据版本控制等。 与 pandas、DuckDB、Polars 和 pyarrow 兼容,更多集成在路上。
Lance 是一种现代列式数据格式,针对 ML 工作流程和数据集进行了优化。Lance 完美适用于
- 构建搜索引擎和特征存储。
- 需要高性能 IO 和 shuffle 的大规模 ML 训练。
- 存储、查询和检查深度嵌套数据,例如机器人或图像、点云等大型 blob。
Lance 的关键特性包括
-
高性能随机访问: 无需牺牲扫描性能,比 Parquet 快 100 倍。
-
向量搜索: 毫秒级查找最近邻,并将 OLAP 查询与向量搜索结合。
-
零拷贝,自动版本控制: 无需额外基础设施即可管理数据的版本。
-
生态系统集成: Apache Arrow、Pandas、Polars、DuckDB 等更多集成在路上。
[!TIP] Lance 正在积极开发中,我们欢迎贡献。有关更多信息,请参阅我们的 贡献指南。
快速入门
安装
pip install pylance
要安装预览版本
pip install --pre --extra-index-url https://pypi.fury.io/lancedb/ pylance
【提示】预览版本比完整版本发布更频繁,包含最新特性和错误修复。它们接受与完整版本相同的测试级别。我们保证它们至少会公开发布和可供下载6个月。当您想锁定到特定版本时,请优先选择稳定版本。
转换为Lance
import lance
import pandas as pd
import pyarrow as pa
import pyarrow.dataset
df = pd.DataFrame({"a": [5], "b": [10]})
uri = "/tmp/test.parquet"
tbl = pa.Table.from_pandas(df)
pa.dataset.write_dataset(tbl, uri, format='parquet')
parquet = pa.dataset.dataset(uri, format='parquet')
lance.write_dataset(parquet, "/tmp/test.lance")
读取Lance数据
dataset = lance.dataset("/tmp/test.lance")
assert isinstance(dataset, pa.dataset.Dataset)
Pandas
df = dataset.to_table().to_pandas()
df
DuckDB
import duckdb
# If this segfaults, make sure you have duckdb v0.7+ installed
duckdb.query("SELECT * FROM dataset LIMIT 10").to_df()
向量搜索
下载sift1m子集
wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz
tar -xzf sift.tar.gz
将其转换为Lance
import lance
from lance.vector import vec_to_table
import numpy as np
import struct
nvecs = 1000000
ndims = 128
with open("sift/sift_base.fvecs", mode="rb") as fobj:
buf = fobj.read()
data = np.array(struct.unpack("<128000000f", buf[4 : 4 + 4 * nvecs * ndims])).reshape((nvecs, ndims))
dd = dict(zip(range(nvecs), data))
table = vec_to_table(dd)
uri = "vec_data.lance"
sift1m = lance.write_dataset(table, uri, max_rows_per_group=8192, max_rows_per_file=1024*1024)
构建索引
sift1m.create_index("vector",
index_type="IVF_PQ",
num_partitions=256, # IVF
num_sub_vectors=16) # PQ
搜索数据集
# Get top 10 similar vectors
import duckdb
dataset = lance.dataset(uri)
# Sample 100 query vectors. If this segfaults, make sure you have duckdb v0.7+ installed
sample = duckdb.query("SELECT vector FROM dataset USING SAMPLE 100").to_df()
query_vectors = np.array([np.array(x) for x in sample.vector])
# Get nearest neighbors for all of them
rs = [dataset.to_table(nearest={"column": "vector", "k": 10, "q": q})
for q in query_vectors]
目录结构
目录 | 描述 |
---|---|
rust | 核心Rust实现 |
python | Python绑定(pyo3) |
docs | 文档源 |
Lance的独特之处
在这里,我们将突出Lance设计的一些方面。有关更多详细信息,请参阅完整的Lance设计文档。
向量索引:用于在嵌入空间中进行相似性搜索的向量索引。支持CPU(x86_64
和arm
)和GPU(Nvidia (cuda)
和Apple Silicon (mps)
)。
编码:为了同时实现快速列式扫描和亚线性点查询,Lance使用自定义编码和布局。
嵌套字段:Lance将每个子字段存储为单独的列,以支持如“找到检测到猫的图像”之类的有效过滤。
版本控制:可以使用Manifest记录快照。目前,我们支持通过追加、覆盖和索引创建自动创建新版本。
快速更新(路线图):将通过写前日志支持更新。
丰富的二级索引(路线图)
- 用于在多个标签/注释字段上进行模糊搜索的倒排索引。
基准测试
向量搜索
我们使用SIFT数据集,将我们的结果与128D的1M向量进行了基准测试
- 对于100个随机采样的查询向量,我们得到<1ms的平均响应时间(在2023 m2 MacBook Air上)
- ANNs总是在召回率和性能之间进行权衡
与Parquet相比
我们使用牛津宠物数据集创建了一个Lance数据集,以对Lance与Parquet和原始图像/XML进行比较初步的性能测试。对于分析查询,Lance比读取原始元数据的性能好50-100倍。对于批量随机访问,Lance比Parquet和原始文件都好100倍。
为什么还要构建另一种数据格式?!
机器学习开发周期包括以下步骤
graph LR
A[Collection] --> B[Exploration];
B --> C[Analytics];
C --> D[Feature Engineer];
D --> E[Training];
E --> F[Evaluation];
F --> C;
E --> G[Deployment];
G --> H[Monitoring];
H --> A;
人们使用不同的数据表示来适应不同阶段,这取决于性能或工具的限制。学术界主要使用XML/JSON进行注释,并使用压缩图像/传感器数据用于深度学习,这使得它们难以集成到数据基础设施中,并且通过云存储进行训练速度较慢。而工业界使用数据湖(基于Parquet的技术,例如Delta Lake、Iceberg)或数据仓库(AWS Redshift或Google BigQuery)来收集和分析数据,他们必须将数据转换为训练友好的格式,如Rikai/Petastorm或TFRecord。多个单一用途的数据转换以及云存储与本地训练实例之间的同步副本已成为一种常见的做法。
尽管现有的数据格式在其最初设计的负载上表现出色,但我们需要一种针对多阶段ML开发周期定制的全新数据格式,以减少数据孤岛。
ML开发周期每个阶段不同数据格式的比较。
Lance | Parquet & ORC | JSON & XML | TFRecord | 数据库 | 仓库 | |
---|---|---|---|---|---|---|
分析 | 快 | 快 | 慢 | 慢 | 不错 | 快 |
特征工程 | 快 | 快 | 不错 | 慢 | 不错 | 好 |
训练 | 快 | 不错 | 慢 | 快 | 不适用 | 不适用 |
探索 | 快 | 慢 | 快 | 慢 | 快 | 不错 |
基础设施支持 | 丰富 | 丰富 | 不错 | 有限 | 丰富 | 丰富 |
社区亮点
Lance目前正被以下生产环境中使用
- LanceDB,一个用于机器学习应用的无服务器、低延迟向量数据库
- 一家为大型存储、检索和处理多模态数据的自动驾驶汽车公司。
- 一家为数十亿规模向量个性化搜索的电商平台。
- 等等。
演示和演讲
- Lance深度解析。2023年7月。
- Lance:一种新的列式数据格式,Scipy 2022,德克萨斯州奥斯汀。2022年7月。
依赖项
~14-22MB
~291K SLoC