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机器学习

Download history 694/week @ 2024-04-22 587/week @ 2024-04-29 759/week @ 2024-05-06 1085/week @ 2024-05-13 574/week @ 2024-05-20 776/week @ 2024-05-27 1052/week @ 2024-06-03 765/week @ 2024-06-10 825/week @ 2024-06-17 730/week @ 2024-06-24 910/week @ 2024-07-01 933/week @ 2024-07-08 703/week @ 2024-07-15 982/week @ 2024-07-22 566/week @ 2024-07-29 885/week @ 2024-08-05

每月下载量 3,176
12 个crate中使用(直接使用8个)

Apache-2.0

84KB
1.5K SLoC

Lance Logo

现代 ML 列式数据格式。通过 2 行代码从 Parquet 转换,实现 100 倍的随机访问速度、向量索引、数据版本控制等。 与 pandas、DuckDB、Polars 和 pyarrow 兼容,更多集成在路上。

文档博客DiscordTwitter

CI Badge Docs Badge crates.io badge Python versions badge


Lance 是一种现代列式数据格式,针对 ML 工作流程和数据集进行了优化。Lance 完美适用于

  1. 构建搜索引擎和特征存储。
  2. 需要高性能 IO 和 shuffle 的大规模 ML 训练。
  3. 存储、查询和检查深度嵌套数据,例如机器人或图像、点云等大型 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_64arm)和GPU(Nvidia (cuda)Apple Silicon (mps))。

编码:为了同时实现快速列式扫描和亚线性点查询,Lance使用自定义编码和布局。

嵌套字段:Lance将每个子字段存储为单独的列,以支持如“找到检测到猫的图像”之类的有效过滤。

版本控制:可以使用Manifest记录快照。目前,我们支持通过追加、覆盖和索引创建自动创建新版本。

快速更新(路线图):将通过写前日志支持更新。

丰富的二级索引(路线图)

  • 用于在多个标签/注释字段上进行模糊搜索的倒排索引。

基准测试

我们使用SIFT数据集,将我们的结果与128D的1M向量进行了基准测试

  1. 对于100个随机采样的查询向量,我们得到<1ms的平均响应时间(在2023 m2 MacBook Air上)

avg_latency.png

  1. ANNs总是在召回率和性能之间进行权衡

avg_latency.png

与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/PetastormTFRecord。多个单一用途的数据转换以及云存储与本地训练实例之间的同步副本已成为一种常见的做法。

尽管现有的数据格式在其最初设计的负载上表现出色,但我们需要一种针对多阶段ML开发周期定制的全新数据格式,以减少数据孤岛。

ML开发周期每个阶段不同数据格式的比较。

Lance Parquet & ORC JSON & XML TFRecord 数据库 仓库
分析 不错
特征工程 不错 不错
训练 不错 不适用 不适用
探索 不错
基础设施支持 丰富 丰富 不错 有限 丰富 丰富

社区亮点

Lance目前正被以下生产环境中使用

  • LanceDB,一个用于机器学习应用的无服务器、低延迟向量数据库
  • 一家为大型存储、检索和处理多模态数据的自动驾驶汽车公司。
  • 一家为数十亿规模向量个性化搜索的电商平台。
  • 等等。

演示和演讲

依赖项

~14-22MB
~291K SLoC