Введение
Датасет 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 миллионов строк в таблицу займет несколько минут.
Выполните поиск векторного сходства полным перебором
Поиск методом k ближайших соседей (KNN) или полный перебор предполагает вычисление расстояния от каждого вектора в наборе данных до поискового эмбеддинг-вектора с последующей сортировкой расстояний для определения ближайших соседей. В качестве поискового вектора можно использовать один из векторов самого набора данных. Например:
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-запроса (с использованием векторного индекса). На 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 и пропускной способности хранилища.
Выполните 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, показывающий, как программно генерировать
эмбеддинг-векторы с помощью 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>")Результат поиска показан ниже:
