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

Набор данных 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 и вставьте данные из существующей таблицы:

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

Результат

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

Создание эмбеддингов с помощью UDFs

Обычно нужно создать эмбеддинги для новых изображений или новых подписей к изображениям и искать похожие пары изображение / подпись в данных. Мы можем использовать 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

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