125 个版本 (15 个重大更新)
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.0.1-alpha0 | 2022 年 7 月 28 日 |
#11 在 机器学习 中排名
3,362 次每月下载
用于 6 个 crate(4 个直接使用)
3.5MB
83K SLoC
Lance 数据格式的 Rust 实现
一种新的列式数据格式,用于数据科学和机器学习
安装
使用 cargo 安装
cargo install lance
示例
创建数据集
假设 batches
是一个 Arrow SchemaRef
use lance::{dataset::WriteParams, Dataset};
let write_params = WriteParams::default();
let mut reader = RecordBatchIterator::new(
batches.into_iter().map(Ok),
schema
);
Dataset::write(reader, &uri, Some(write_params)).await.unwrap();
读取
let dataset = Dataset::open(path).await.unwrap();
let mut scanner = dataset.scan();
let batches: Vec<RecordBatch> = scanner
.try_into_stream()
.await
.unwrap()
.map(|b| b.unwrap())
.collect::<Vec<RecordBatch>>()
.await;
取
let values: Result<RecordBatch> = dataset.take(&[200, 199, 39, 40, 100], &projection).await;
向量索引
假设 "embeddings" 是一个 FixedSizeListArray
use ::lance::index::vector::VectorIndexParams;
let params = VectorIndexParams::default();
params.num_partitions = 256;
params.num_sub_vectors = 16;
// this will Err if list_size(embeddings) / num_sub_vectors does not meet simd alignment
dataset.create_index(&["embeddings"], IndexType::Vector, None, ¶ms, true).await;
动机
为什么我们需要一个新的数据科学和机器学习格式?
1. 可重现性是必需的
版本控制和实验支持应该内置到数据集中,而不是需要多个工具。
它还应该高效,且不需要在创建新版本时进行昂贵的复制。
我们在 Lance 中称之为“零拷贝版本控制”。这使得版本控制数据变得容易,而不会增加存储成本。
2. 云存储现在是默认的
对于数据科学和机器学习,远程对象存储现在是默认的,云的性能特性与本地存储有根本的不同。
Lance 格式已优化以适应云原生。使用 Lance 进行过滤后取值等常见操作,比 Parquet 快一个数量级,尤其是在处理机器学习数据时。
3. 向量必须是第一类公民,而不是一个独立的事物。
大多数合理的规模工作流程不需要增加专用数据库的复杂性和成本来计算向量相似度。Lance 将优化的向量索引集成到列式格式中,因此无需额外的基础设施即可实现低延迟的 Top-K 相似度搜索。
4. 开放标准是必须的。
DS/ML 生态系统极其丰富,数据必须能够轻松地跨不同语言、工具和环境访问。Lance 将 Apache Arrow 集成为其主要接口,这意味着转换到/从转换为两行代码,转换后您的代码无需更改,且没有任何锁定,强迫您为供应商的计算付费。我们需要开源软件,而不是伪开源软件。
依赖关系
~62–91MB
~1.5M SLoC