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

#1000 in 机器学习

Download history 670/week @ 2024-05-02 1005/week @ 2024-05-09 877/week @ 2024-05-16 528/week @ 2024-05-23 1068/week @ 2024-05-30 830/week @ 2024-06-06 953/week @ 2024-06-13 904/week @ 2024-06-20 472/week @ 2024-06-27 968/week @ 2024-07-04 924/week @ 2024-07-11 769/week @ 2024-07-18 792/week @ 2024-07-25 1146/week @ 2024-08-01 1011/week @ 2024-08-08 577/week @ 2024-08-15

每月3,617次下载
用于 15 个crate(9个直接使用)

Apache-2.0

245KB
5.5K SLoC

Lance Logo

适用于机器学习的现代列式数据格式。只需两行代码即可从Parquet转换,实现100倍更快的随机访问、向量索引、数据版本控制等功能。 与pandas、DuckDB、Polars和pyarrow兼容,并正在添加更多集成。

文档博客DiscordTwitter

CI Badge Docs Badge crates.io badge Python versions badge


Lance是一种针对机器学习工作流程和数据集进行优化的现代列式数据格式。Lance非常适合

  1. 构建搜索引擎和特征存储。
  2. 需要高性能I/O和洗牌的大型机器学习训练。
  3. 存储、查询和检查深层嵌套数据,适用于机器人学或图像、点云等大型数据块。

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数据集对1M个128D向量的结果进行了基准测试

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

avg_latency.png

  1. ANN总是召回率和性能之间的权衡

avg_latency.png

与Parquet的比较

我们使用Oxford Pet数据集创建Lance数据集,对Lance与Parquet和原始图像/XMLs的性能进行了初步测试。对于分析查询,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,一个适用于机器学习应用的无服务器、低延迟向量数据库
  • 自动驾驶汽车公司,用于大规模的多模态数据的存储、检索和处理。
  • 电子商务公司,用于十亿规模以上的向量个性化搜索。
  • 等等。

演示和演讲

依赖关系

~21-37MB
~607K SLoC