LanceDB:应对数据复杂性的可靠之选

LanceDB 基于开源列式数据格式 Lance 构建,具有一些使其对 AI/ML 颇具吸引力的有趣特性。例如,LanceDB 支持显式和隐式向量化,并能够处理各种数据类型。LanceDB 与领先的机器学习框架集成,例如 PyTorch 和 TensorFlow。更酷的是,LanceDB 的快速近邻搜索,它使用近似最近邻算法能够高效地检索相似的向量。所有这些结合在一起,创造了一个快速、易于使用且轻量级到可以部署在任何地方的向量数据库。
LanceDB 能够查询 S3 兼容的对象存储中的数据。这种组合对于构建高性能、可扩展和云原生 ML 数据存储和检索系统而言是最佳选择。MinIO 为等式带来了性能和无与伦比的灵活性,涵盖各种硬件、位置和云环境,使其成为此类部署的自然选择。
完成本教程后,您将准备好使用 LanceDB 和 MinIO 来应对任何数据挑战。
什么是 Lance?
Lance 文件格式是一种针对 ML 工作流和数据集优化的列式数据格式。它旨在易于快速地进行版本控制、查询和用于训练,并且适用于各种数据类型,包括图像、视频、3D 点云、音频和表格数据。此外,它还支持高性能随机访问: Lance 报告基准测试 表明查询速度比 Parquet 快 100 倍。Lance 的速度部分归因于它使用 Rust 实现,以及其云原生设计,其中包括零拷贝版本控制和优化的向量运算等功能。
其 主要功能 之一是可以执行向量搜索,允许用户在不到 1 毫秒的时间内找到 最近邻,并将 OLAP 查询与向量搜索结合起来。Lance 格式的其他生产应用包括:用于 ML 应用的边缘部署低延迟向量数据库;自动驾驶汽车公司中对多模态数据的大规模存储、检索和处理;以及电子商务公司中数十亿级以上的向量个性化搜索。Lance 文件格式的部分吸引力在于它与流行的工具和平台(如 Pandas、 DuckDB、Polars 和 Pyarrow)的兼容性。即使您不使用 LanceDB,您仍然可以在您的数据堆栈中利用 Lance 文件格式。
为 AI 和机器学习而构建
像 LanceDB 这样的向量数据库由于其高效的 解耦存储 和计算架构以及对高维数据向量表示的检索,为 AI 和机器学习应用提供了独特的优势。以下是一些关键用例
自然语言处理 (NLP)
语义搜索:根据含义而非仅仅根据关键词查找与查询类似的文档或段落。这为聊天机器人回复、个性化内容推荐和知识检索系统提供了支持。
问答:通过基于语义相似性查找相关文本段落来理解和回答复杂问题。
主题建模:发现大型文本集合中的潜在主题,可用于文档聚类和趋势分析。
计算机视觉
图像和视频检索:根据视觉内容搜索相似的图像或视频,这对于基于内容的图像检索、产品搜索和视频分析至关重要。
物体检测和分类:通过高效地检索类似的训练数据来提高物体检测和分类模型的准确性。
视频推荐:根据之前观看的视频的视觉内容推荐相似的视频
在市场上众多向量数据库中,LanceDB 特别适合 AI 和机器学习,因为它支持对 S3 兼容存储进行查询。您的数据无处不在,您的数据库也应该无处不在。
构建成功架构
将 MinIO 与 LanceDB 结合使用可以带来诸多好处,包括
- 可扩展性和性能:MinIO 的云原生设计专为可扩展性和高性能存储和检索而构建。通过利用 MinIO 的可扩展性和性能,LanceDB 可以高效地处理大量数据,使其非常适合现代 ML 工作负载。
- 高可用性和容错性:MinIO 具有高可用性、不可变性和高持久性。这确保了存储在 MinIO 中的数据受到硬件故障的保护,并提供高可用性和容错性,这对像 LanceDB 这样数据密集型应用至关重要。
- 主动-主动复制:多站点主动-主动复制支持在多个 MinIO 部署之间进行近乎同步的数据复制。此稳健流程确保了高持久性和冗余性,使其成为保护关键生产环境中数据的理想选择。
MinIO 和 LanceDB 的组合为管理和分析大规模 ML 数据集提供了高性能、可扩展的云原生解决方案。
要求
要按照本教程进行操作,您需要使用 Docker Compose。您可以使用 Docker Desktop 单独或一起安装 Docker Engine 和 Docker Compose 二进制文件。最简单的选项是安装 Docker Desktop。
通过运行以下命令确保 Docker Compose 已安装
docker compose version
您还需要安装 Python。您可以从 此处 下载 Python。在安装过程中,请务必选中将 Python 添加到系统 PATH 的选项。
或者,您可以选择创建虚拟环境。创建虚拟环境以隔离依赖项是一个好习惯。为此,请打开终端并运行
python -m venv venv
激活虚拟环境
在 Windows 上
.\venv\Scripts\activate
在 macOS/Linux 上
source venv/bin/activate
入门
首先从 此处 克隆项目。完成后,在终端窗口中导航到您下载文件的文件夹并运行
docker-compose up minio
这将启动 MinIO 容器。您可以导航到“http://172.20.0.2:9001”以查看 MinIO 控制台。
使用用户名和密码 minioadmin:minioadmin
登录。
接下来,运行以下命令创建一个名为 lance
的 MinIO 存储桶。
docker compose up mc
此命令在 shell 中执行一系列 MinIO 客户端 (mc) 命令。
以下是每个命令的细分
until (/usr/bin/mc config host add minio http://minio:9000 minioadmin minioadmin) do echo '...waiting...' && sleep 1; done:此命令重复尝试配置名为 minio
的 MinIO 主机,并使用指定的参数(端点、访问密钥和密钥),直到成功为止。在每次尝试期间,它都会回显等待消息并暂停 1 秒。
/usr/bin/mc rm -r --force minio/lance;:此命令强制删除(删除)MinIO 中 lance
存储桶中的所有内容。
/usr/bin/mc mb minio/lance;:此命令在 MinIO 中创建一个名为 lance
的新存储桶。
/usr/bin/mc policy set public minio/lance;:此命令将 lance
存储桶的策略设置为公开,允许公开读取访问。
exit 0;:此命令确保脚本以状态代码 0 退出,表示执行成功。
LanceDB
不幸的是,LanceDB 没有原生 S3 支持,因此您必须使用类似 boto3 的工具来连接到您创建的 MinIO 容器。随着 LanceDB 的成熟,我们期待着原生 S3 支持,这将使用户体验更加出色。
下面的示例脚本将帮助您入门。
使用 pip 安装所需的包。创建一个名为 requirements.txt 的文件,其中包含以下内容
lancedb~=0.4.1
boto3~=1.34.9
botocore~=1.34.9
然后运行以下命令来安装这些包
pip install -r requirements.txt
如果您的创建 MinIO 容器的方法与上面概述的不同,则需要更改您的凭据。
将下面的脚本保存到一个文件中,例如 lancedb_script.py
。
import lancedb
import os
import boto3
import botocore
import random
def generate_random_data(num_records):
data = []
for _ in range(num_records):
record = {
"vector": [random.uniform(0, 10), random.uniform(0, 10)],
"item": f"item_{random.randint(1, 100)}",
"price": round(random.uniform(5, 100), 2)
}
data.append(record)
return data
def main():
# Set credentials and region as environment variables
os.environ["AWS_ACCESS_KEY_ID"] = "minioadmin"
os.environ["AWS_SECRET_ACCESS_KEY"] = "minioadmin"
os.environ["AWS_ENDPOINT"] = "https://:9000"
os.environ["AWS_DEFAULT_REGION"] = "us-east-1"
minio_bucket_name = "lance"
# Create a boto3 session with path-style access
session = boto3.Session()
s3_client = session.client("s3", config=botocore.config.Config(s3={'addressing_style': 'path'}))
# Connect to LanceDB using path-style URI and s3_client
db_uri = f"s3://{minio_bucket_name}/"
db = lancedb.connect(db_uri)
# Create a table with more interesting data
table = db.create_table("mytable", data=generate_random_data(100))
# Open the table and perform a search
result = table.search([5, 5]).limit(5).to_pandas()
print(result)
if __name__ == "__main__":
main()
此脚本将使用随机生成的数据创建一个 Lance 表,并将其添加到您的 MinIO 存储桶中。再次提醒,如果您没有使用上一节中介绍的方法创建存储桶,则需要在运行脚本之前创建。请记住将上面的示例脚本更改为与您的 MinIO 存储桶名称匹配。
最后,脚本在不将表移出 MinIO 的情况下打开该表,并使用 Pandas 进行搜索并打印结果。
脚本的结果应类似于以下结果。请记住,每次生成的数据都是随机的。
vector item price _distance
0 [5.1022754, 5.1069164] item_95 50.94 0.021891
1 [4.209107, 5.2760105] item_100 69.34 0.701694
2 [5.23562, 4.102992] item_96 99.86 0.860140
3 [5.7922664, 5.867489] item_47 56.25 1.380223
4 [4.458882, 3.934825] item_93 9.90 1.427407
拓展您的应用
您可以通过多种方式在此教程提供的基础上构建,以创建高性能、可扩展且面向未来的 ML/AI 架构。您拥有两个尖端且开源的构建块 - MinIO 对象存储和 LanceDB 向量数据库 - 将其视为您赢得 ML/AI 锦标赛 的入场券。
不要止步于此。LanceDB 提供了各种各样的 示例 和教程,以扩展您在此教程中构建的内容,包括最近宣布的关于 使用向量数据库构建生成式 AI 解决方案 的 Udacity 课程。特别值得关注的是 此 示例,用于与您的文档进行聊天。我们致力于打破障碍,让您充分利用数据。
请向我们展示您正在构建的内容,如果您在探索过程中需要指导,请随时发送邮件至 hello@minio.io 或加入我们在 Slack 上的圆桌讨论。