简介
LAION 5b 数据集包含 58.5 亿个图像-文本嵌入向量及
相关的图像元数据。这些嵌入向量由 Open AI CLIP 模型 ViT-L/14 生成。每个嵌入向量的
维度均为 768。
该数据集可用于对大规模真实世界向量搜索应用的设计、容量规划和性能进行建模。该数据集既可用于文本到图像搜索,也可用于 图像到图像搜索。
数据集详情
完整数据集可使用 opendatalab/laion5b-downloader 下载。
ClickHouse 在一个公网 S3 bucket 中提供了包含 1000 万个向量的子集。
该子集存储在一个 Parquet 文件中。
我们建议用户先参考文档进行容量评估,以估算该数据集所需的存储和内存。
步骤
创建表
创建 laion_5b_10m 表,用于存储嵌入向量及其关联属性:
CREATE TABLE laion_5b_10m
(
id UInt32,
image_path String,
caption String,
NSFW Nullable(String) default 'unknown',
similarity Float32,
LICENSE Nullable(String),
url String,
key String,
status LowCardinality(String),
width Int32,
height Int32,
original_width Int32,
original_height Int32,
exif Nullable(String),
md5 String,
vector Array(Float32) CODEC(NONE)
) ENGINE = MergeTree ORDER BY (id)id 只是一个递增的整数。其他属性可用于谓词,以便了解文档中所述的结合后过滤/前过滤的向量相似性搜索。
加载数据
要加载数据集,请执行以下 SQL 语句:
INSERT INTO laion_5b_10m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet', NOSIGN);将 1000 万行数据加载到该表中需要几分钟。
运行穷举向量相似性搜索
KNN (k 近邻) 搜索或暴力搜索需要计算数据集中每个向量 与查询嵌入向量之间的距离,然后对距离进行排序以找出最近邻。我们可以使用数据集中的某个向量 本身作为查询向量。例如:
SELECT id, url
FROM laion_5b_10m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
LIMIT 20
The vector in the row with id = 9999 is the embedding for an image of a Deli restaurant.记下该查询的延迟,以便与使用 ANN (向量索引) 的查询延迟进行比较。 在 1000 万行数据的情况下,上述未使用向量索引的查询可能需要数秒至数分钟才能完成。
构建向量相似度索引
运行以下 SQL,在 laion_5b_10m 表的 vector 列上定义并构建向量相似度索引:
ALTER TABLE laion_5b_10m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);
ALTER TABLE laion_5b_10m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;有关索引创建和搜索的参数及性能注意事项,请参阅文档。
上述语句中,HNSW 超参数 M 和 ef_construction 分别设置为 64 和 512。
您需要通过评估索引构建时间和相应的搜索结果质量,谨慎选择这些参数的最优值。
对于包含 1000 万行的子集,构建和保存索引可能需要较长时间,具体取决于可用的 CPU 核心数量和存储带宽。
执行 ANN 搜索
构建向量相似度索引后,向量搜索查询会自动使用该索引:
SELECT id, url
FROM laion_5b_10m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
LIMIT 20首次将向量索引加载到内存中可能需要几秒到几分钟。
为搜索查询生成嵌入向量
LAION 5b 数据集的嵌入向量使用 OpenAI CLIP 模型 ViT-L/14 生成。
下面提供了一个 Python 示例脚本,演示如何通过 CLIP API 以编程方式生成
嵌入向量。随后,将搜索嵌入向量作为参数传递给 SELECT 查询中的 cosineDistance() 函数。
要安装 clip 包,请参阅 OpenAI GitHub 仓库。
import torch
import clip
import numpy as np
import sys
import clickhouse_connect
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-L/14", device=device)
# Search for images that contain both a dog and a cat
text = clip.tokenize(["a dog and a cat"]).to(device)
with torch.no_grad():
text_features = model.encode_text(text)
np_arr = text_features.detach().cpu().numpy()
# Pass ClickHouse credentials here
chclient = clickhouse_connect.get_client()
params = {'v1': list(np_arr[0])}
result = chclient.query("SELECT id, url FROM laion_5b_10m ORDER BY cosineDistance(vector, %(v1)s) LIMIT 100",
parameters=params)
# Write the results to a simple HTML page that can be opened in the browser. Some URLs may have become obsolete.
print("<html>")
for r in result.result_rows:
print("<img src = ", r[1], 'width="200" height="200">')
print("</html>")上述搜索的结果如下:
