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 は、1,000 万件のベクトルのサブセットをパブリック S3 バケットで公開しています。 このサブセットは 1 つの 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);

1,000 万行をテーブルに読み込むには、数分かかります。

ベクトル類似度索引を構築する

以下の 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 を使用しています。 索引のビルド時間と検索結果の品質を評価し、これらのパラメータに最適な値を慎重に選択する必要があります。

1,000 万行のサブセットでは、利用可能な 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