Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Датасет LAION 5B

Введение

Датасет LAION 5b содержит 5,85 миллиарда эмбеддингов пар «изображение—текст» и связанные с ними метаданные изображений. Эмбеддинги были сгенерированы с помощью модели Open AI CLIP ViT-L/14. Размерность каждого эмбеддинг-вектора — 768.

Этот датасет можно использовать для моделирования вопросов проектирования, подбора размера и производительности крупномасштабного приложения векторного поиска из реального мира. Датасет можно использовать как для поиска изображений по тексту, так и для поиска изображений по изображению.

Сведения о датасете

Полный датасет можно скачать с помощью opendatalab/laion5b-downloader.

ClickHouse также предоставил подмножество из 10 миллионов векторов в публичном бакете S3. Подмножество хранится в одном файле 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);

Загрузка 10 миллионов строк в таблицу займет несколько минут.

Создайте индекс векторного сходства

Выполните следующий SQL-запрос, чтобы создать и построить индекс векторного сходства для столбца vector таблицы laion_5b_10m:

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 соответственно. Необходимо тщательно подобрать оптимальные значения этих параметров, оценивая время построения индекса и качество результатов поиска, соответствующие выбранным значениям.

Построение и сохранение индекса для подмножества из 10 миллионов строк может занять значительное время в зависимости от количества доступных ядер CPU и пропускной способности хранилища.

Создайте эмбеддинги для поискового запроса

Эмбеддинг-векторы набора данных LAION 5b были сгенерированы с использованием модели OpenAI CLIP ViT-L/14.

Ниже приведён пример скрипта на Python, показывающий, как программно генерировать эмбеддинг-векторы с помощью API CLIP. Затем поисковый эмбеддинг-вектор передаётся в качестве аргумента функции cosineDistance() в SELECT-запросе.

Чтобы установить пакет 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