来源: examples/vector_database

使用 VectorDB 和 OpenAI CLIP 构建大规模图像搜索#

VectorDB with SkyPilot

步骤 0:设置环境#

安装以下先决条件

  • SkyPilot:确保您已安装 SkyPilot 并且 sky check 成功。有关说明,请参阅 SkyPilot 文档

  • Hugging Face Token:要从 Hugging Face Hub 下载数据集,您需要您的 token。按照以下步骤配置您的 token。

~/.env 中设置 Huggingface token

HF_TOKEN=hf_xxxxx

或设置环境变量 HF_TOKEN

步骤 1:使用 OpenAI CLIP 计算图像数据的向量#

您需要将图像转换为向量表示(嵌入),以便将它们存储在向量数据库中。像 OpenAI 的 CLIP 这样的模型学习强大的表示,将图像和文本映射到相同的嵌入空间。这使得语义相似性计算成为可能,使得像“一张云的照片”这样的查询能够匹配相关的图像。

使用以下命令启动一个任务,该任务处理您的图像数据集并计算 CLIP 嵌入

python3 batch_compute_vectors.py

这将自动查找可用机器来计算向量。预计

...
(clip-batch-compute-vectors, pid=2523) 2025-01-27 23:57:27,387 - root - INFO - Saved partition 2 to /output/embeddings_90000_100000.parquet_part_2/data.parquet
(clip-batch-compute-vectors, pid=2523) 2025-01-27 23:59:39,720 - root - INFO - Saved partition 3 to /output/embeddings_90000_100000.parquet_part_3/data.parquet
(clip-batch-compute-vectors, pid=2523) 2025-01-28 00:01:56,707 - root - INFO - Saved partition 4 to /output/embeddings_90000_100000.parquet_part_4/data.parquet
(clip-batch-compute-vectors, pid=2523) 2025-01-28 00:04:12,200 - root - INFO - Saved partition 5 to /output/embeddings_90000_100000.parquet_part_5/data.parquet
(clip-batch-compute-vectors, pid=2523) 2025-01-28 00:06:25,009 - root - INFO - Saved partition 6 to /output/embeddings_90000_100000.parquet_part_6/data.parquet
...

您还可以使用 sky jobs queuesky jobs dashboard 查看任务状态。下图显示我们的任务在不同区域启动

SkyPilot Dashboard

步骤 2:根据计算出的嵌入构建向量数据库#

获得图像嵌入后,您需要一个专门的引擎来大规模执行快速相似性搜索。在此示例中,我们使用 ChromaDB 存储和查询嵌入。此步骤将步骤 1 中的嵌入导入到向量数据库中,以便对数百万个向量进行实时或近实时搜索。

从嵌入构建数据库

sky jobs launch build_vectordb.yaml 

这会分批处理生成的 clip 嵌入,产生输出

(vectordb-build, pid=2457) INFO:__main__:Processing /clip_embeddings/embeddings_0_500.parquet_part_0/data.parquet
Processing batches: 100%|██████████| 1/1 [00:00<00:00,  1.19it/s]
Processing files:  92%|█████████▏| 11/12 [00:02<00:00,  5.36it/s]INFO:__main__:Processing /clip_embeddings/embeddings_500_1000.parquet_part_0/data.parquet
Processing batches: 100%|██████████| 1/1 [00:02<00:00,  2.39s/it]
Processing files: 100%|██████████| 12/12 [00:05<00:00,  2.04it/s]/1 [00:00<?, ?it/s]

步骤 3:提供构建好的向量数据库服务#

为了提供构建好的数据库服务,您需要暴露一个 API 端点,以便其他应用程序(或您的本地客户端)可以调用它来执行语义搜索。查询允许您确认数据库正在工作,并检索给定文本查询的语义匹配项。您可以将此端点集成到更大的应用程序中(例如图像搜索引擎或推荐系统)。

提供构建好的数据库服务

sky launch -c vecdb_serve serve_vectordb.yaml

它运行托管的向量数据库服务。或者,您可以运行

sky serve up serve_vectordb.yaml -n vectordb

这会将您的向量数据库作为服务部署到云实例上,并允许您通过公共端点与其交互。Sky Serve 提供自动健康检查和服务的扩缩容。

查询构建好的数据库,

如果您通过 sky launch 运行,使用

sky status --ip vecdb_serve

已部署的集群。

如果您通过 sky serve 运行,您可以运行

sky serve status vectordb --endpoint

获取服务的端点地址。

Image Search Website

包含的文件#