5个版本 (3个重大更新)

0.16.1 2024年8月9日
0.16.0 2024年8月7日
0.15.0 2024年7月25日
0.13.0 2024年6月24日
0.12.3 2024年6月19日

#404机器学习

Download history 145/week @ 2024-06-15 153/week @ 2024-06-22 18/week @ 2024-06-29 100/week @ 2024-07-20 39/week @ 2024-07-27 182/week @ 2024-08-03 42/week @ 2024-08-10

每月363次下载

Apache-2.0

2MB
40K SLoC

Lance Logo

适用于ML的现代列式数据格式。2行代码将Parquet转换为Lance,实现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. 存储、查询和检查用于机器人或大型块(如图像、点云等)的深度嵌套数据。

Lance的关键特性包括

  • 高性能随机访问:比Parquet快100倍,同时不牺牲扫描性能。

  • 向量搜索:毫秒级找到最近邻,并将OLAP查询与向量搜索相结合。

  • 零拷贝、自动版本控制:无需额外基础设施即可管理数据的版本。

  • 生态系统集成:Apache Arrow、Pandas、Polars、DuckDB等,更多集成在路上。

[!提示] 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数据集,与1M个128D向量的结果进行基准测试。

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

avg_latency.png

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

avg_latency.png

与parquet相比

我们使用Oxford Pet数据集创建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。多个单一用途数据转换以及云存储与本地训练实例之间的同步复制已成为常见做法。

虽然现有的每种数据格式都在其最初设计的工作负载方面表现出色,但我们需要一种新的数据格式,专门针对多阶段机器学习开发周期,以减少数据孤岛。

比较机器学习开发周期各阶段的不同数据格式。

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

社区亮点

Lance目前正在由以下公司用于生产:

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

演示和演讲

依赖项

~91MB
~2M SLoC