Перейти к основному содержимому
Перейти к основному содержимому

Набор данных Laion-400M

Набор данных Laion-400M содержит 400 миллионов изображений с английскими подписями к изображениям. В настоящее время Laion предоставляет еще больший набор данных, но работа с ним будет аналогичной.

Набор данных содержит URL изображения, векторные представления как для изображения, так и для подписи к изображению, коэффициент сходства между изображением и подписью, а также метаданные, например, ширину/высоту изображения, лицензию и флаг NSFW. Мы можем использовать набор данных, чтобы продемонстрировать поиск по приближенным ближайшим соседям в ClickHouse.

Подготовка данных

Векторные представления и метаданные хранятся в отдельных файлах в необработанных данных. Шаг подготовки данных загружает данные, объединяет файлы, преобразует их в CSV и импортирует в ClickHouse. Вы можете использовать следующий скрипт download.sh для этого:

Скрипт process.py определяется следующим образом:

Чтобы запустить процесс подготовки данных, выполните:

Набор данных разделен на 410 файлов, каждый файл содержит около 1 миллиона строк. Если вы хотите работать с меньшим подмножеством данных, просто измените пределы, например, seq 0 9 | ....

(Вышеуказанный скрипт на python очень медленный (~2-10 минут на файл), потребляет много памяти (41 ГБ на файл), и полученные файлы csv большие (по 10 ГБ каждый), поэтому будьте осторожны. Если у вас достаточно ОЗУ, увеличьте число -P1 для большего параллелизма. Если это всё равно слишком медленно, подумайте о том, чтобы разработать более эффективную процедуру загрузки - возможно, создать файлы .npy в формате parquet, а затем выполнить всю остальную обработку с помощью clickhouse.)

Создание таблицы

Чтобы создать таблицу без индексов, выполните:

Чтобы импортировать CSV файлы в ClickHouse:

Запустить поиск ближайших соседей методом грубой силы (без индекса ANN)

Чтобы выполнить поиск ближайших соседей методом грубой силы, выполните:

target - это массив из 512 элементов и клиентский параметр. Удобным способом получения таких массивов будет представлен в конце статьи. На данный момент мы можем выполнить вектор представления случайного изображения кота в качестве target.

Результат

Запуск поиска ANN с индексом ANN

Создайте новую таблицу с индексом ANN и вставьте данные из существующей таблицы:

По умолчанию индексы Annoy используют расстояние L2 в качестве метрики. Дополнительные настройки для создания и поиска индексов описаны в документации индекса Annoy. Давайте проверим это снова с тем же запросом:

Результат

Скорость заметно возросла за счет менее точных результатов. Это происходит потому, что индекс ANN предоставляет только приближенные результаты поиска. Обратите внимание, что в примере искались похожие векторные представления изображений, однако также возможно искать положительные векторные представления подписям изображений.

Создание векторных представлений с помощью UDF

Обычно нужно создавать векторные представления для новых изображений или новых подписей к изображениям и искать похожие пары изображение / подпись в данных. Мы можем использовать UDF для создания вектора target без выхода из клиента. Важно использовать ту же модель для создания данных и новых векторных представлений для поисков. Следующие скрипты используют модель ViT-B/32, которая также лежит в основе набора данных.

Векторные представления текста

Сначала сохраните следующий скрипт на Python в каталоге user_scripts/ вашего пути к данным ClickHouse и сделайте его исполняемым (chmod +x encode_text.py).

encode_text.py:

Затем создайте encode_text_function.xml в месте, на которое ссылается <user_defined_executable_functions_config>/path/to/*_function.xml</user_defined_executable_functions_config> в конфигурационном файле вашего сервера ClickHouse.

Теперь вы можете просто использовать:

Первый запуск будет медленным, потому что он загружает модель, но последующие запуски будут быстрыми. Мы можем затем скопировать результаты в SET param_target=... и легко написать запросы.

Векторные представления изображений

Векторные представления изображений можно создавать аналогично, но мы предоставим скрипту Python путь к локальному изображению вместо текста подписи к изображению.

encode_image.py

encode_image_function.xml

Затем выполните этот запрос: