Набор данных 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 (без индекса 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
Затем выполните этот запрос: