Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

LAION 5B 数据集

简介

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 万行数据加载到该表中需要几分钟。

构建向量相似度索引

运行以下 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 超参数 Mef_construction 分别设置为 64 和 512。 您需要通过评估索引构建时间和相应的搜索结果质量,谨慎选择这些参数的最优值。

对于包含 1000 万行的子集,构建和保存索引可能需要较长时间,具体取决于可用的 CPU 核心数量和存储带宽。

为搜索查询生成嵌入向量

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>")

上述搜索的结果如下:

向量相似度搜索结果
Navigation