Набор данных LAION 5b содержит 5.85 миллиарда векторов изображений и текста и связанную с ними метаинформацию об изображениях. Векторы были сгенерированы с использованием модели Open AI CLIPViT-L/14. Размерность каждого вектора составляет 768.
Этот набор данных можно использовать для моделирования проектирования, масштабирования и производительности для крупномасштабного, реального приложения векторного поиска. Набор данных может использоваться как для поиска по тексту, так и для поиска по изображениям.
Полный набор данных доступен в виде смеси файлов npy и Parquet на the-eye.eu.
ClickHouse предоставил подмножество из 100 миллионов векторов в корзине S3.
Корзина S3 содержит 10 файлов Parquet, каждый из которых заполнен 10 миллионами строк.
Рекомендуем пользователям сначала провести оценку размера, чтобы оценить требования к хранилищу и памяти для этого набора данных, обратившись к документации.
id — это просто возрастающее целое число. Дополнительные атрибуты могут использоваться в предикатах для понимания
поиска по сходству векторов в сочетании с постфильтрацией/предфильтрацией, как объяснено в документации.
Чтобы загрузить набор данных из всех файлов Parquet, выполните следующий SQL-запрос:
INSERT INTO laion_5b_100m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_*.parquet');
Загрузка 100 миллионов строк в таблицу займет несколько минут.
В качестве альтернативы, можно выполнить отдельные SQL-запросы для загрузки конкретного числа файлов/строк.
INSERT INTO laion_5b_100m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet');
INSERT INTO laion_5b_100m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_2_of_10.parquet');
⋮
Выполнить поиск по сходству векторов методом грубой силы
Поиск KNN (k - ближайшие соседи) или поиск методом грубой силы включает в себя расчет расстояния каждого вектора в наборе данных до поискового вектора и затем упорядочивание расстояний для получения ближайших соседей. Мы можем использовать один из векторов из самого набора данных в качестве поискового вектора. Например:
SELECT id, url
FROM laion_5b_100m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_100m 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 (с использованием векторного индекса).
При 100 миллионах строк вышеуказанный запрос без векторного индекса может занять несколько секунд/минут.
Запустите следующий SQL, чтобы определить и создать индекс сходства векторов в колонке vector таблицы laion_5b_100m:
ALTER TABLE laion_5b_100m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);
ALTER TABLE laion_5b_100m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;
Параметры и соображения производительности для создания индекса и поиска описаны в документации.
В приведенном выше операторе используются значения 64 и 512 соответственно для гиперпараметров HNSW M и ef_construction.
Пользователям необходимо внимательно подбирать оптимальные значения для этих параметров, оценивая время создания индекса и качество результатов поиска в соответствии с выбранными значениями.
Создание и сохранение индекса может занять несколько часов для полного набора данных в 100 миллионов, в зависимости от количества доступных ядер CPU и пропускной способности хранилища.
Векторы эмбеддингов набора данных LAION 5b были сгенерированы с использованием модели OpenAI CLIPViT-L/14.
Пример скрипта на Python представлен ниже, чтобы продемонстрировать, как программно сгенерировать
векторы эмбеддингов с использованием API CLIP. Вектор поискового эмбеддинга
затем передается в качестве аргумента функции cosineDistance() в запросе SELECT.
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_100m 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>")