55 个版本 (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 日

#116机器学习

Download history 640/week @ 2024-04-21 601/week @ 2024-04-28 720/week @ 2024-05-05 1060/week @ 2024-05-12 584/week @ 2024-05-19 740/week @ 2024-05-26 968/week @ 2024-06-02 784/week @ 2024-06-09 796/week @ 2024-06-16 701/week @ 2024-06-23 542/week @ 2024-06-30 1021/week @ 2024-07-07 655/week @ 2024-07-14 928/week @ 2024-07-21 591/week @ 2024-07-28 1364/week @ 2024-08-04

3,633 每月下载量
用于 9 个 crate(直接使用 4 个)

Apache-2.0

405KB
9K 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 和 shuffles 的大规模 ML 训练。
  3. 存储、查询和检查用于机器人或图像、点云等大型 blob 的深层嵌套数据。

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 数据集,以 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 开发周期,以减少和消除数据孤岛。

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

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

社区亮点

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

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

演示和演讲

依赖项

~40–56MB
~1M SLoC