Отзыв на основе содержания — это относительно распространенная стратегия отзыва в рекомендательных системах. Обычно отзыв этикеток основан на пользователях или товарах или отзывах на основе возраста и региона пользователей. Как правило, реализация этой стратегии основана на программном обеспечении с открытым исходным кодом. Эластичный. Хотя результаты отзыва разумны, новизна и неожиданность отзыва относительно невелики. Например, отзыв через метку «Энди Лау» в основном напоминает предметы, содержащие слова Энди Лау, и вряд ли вспоминает предметы из «Рассвета», «Джеки Ченга» и других четырех небесных королей. В последние годы, с успешным применением технологий word2vec, item2vec, graph2vec и других, метод вызова векторов элементов через векторы элементов также стал широко используемой стратегией отзыва в рекомендательных системах. Эта статья посвящена построению службы векторного поиска с помощью программного обеспечения с открытым исходным кодом Vearch и успешно реализует функцию поиска изображений.
вводить
В последнее время я занимаюсь рекомендательной оптимизацией небольших видео, и цель оптимизации — выход на экран на душу населения. Согласно опыту рекомендаций предыдущего информационного потока, я надеюсь вспомнить более релевантные небольшие видеоролики на основе записи воспроизведения пользователя для потребления пользователем. Рекомендуемая сцена небольшого видео чем-то похожа на более популярную Douyin, то есть автоматически воспроизводится короткое видео (около 5-30 секунд), а небольшое видео в основном занимает весь экран. Пользователи могут ставить лайки и делиться этим небольшим видео. , Комментарий, если вам не нравится, вы можете провести пальцем вверх, чтобы посмотреть следующее короткое видео. Учитывая, что фактором, определяющим, хочет ли пользователь смотреть видео, вряд ли будет название видео в двух строках под видео, больше факторов заключается в том, может ли обложка видео вызвать интерес у пользователя. На основе такой предыстории проекта я хотел построить сервис для поиска изображений по изображению, чтобы вспоминать обложку небольших видеороликов.
Поскольку я использовал gRPC для инкапсуляции Faiss для создания службы отзыва векторов раньше, и я уже выполнял проект классификации изображений, все изображения преобразуются в векторы в качестве входных данных классификатора, поэтому для этого нужно сделать две вещи. :
- Предварительно обработайте изображение и преобразуйте его в вектор фиксированной длины.
- Введите вектор каждого изображения в Faiss и используйте его для выполнения задачи поиска вектора.
например, сообщение в блогеИспользование Faiss в проектеВ статье автор использует алгоритм SIFT для извлечения признаков изображения, которые соответствуют 128-мерному вектору. Вектор признаков каждого изображения вводится в Faiss для вызова похожих векторов. например, сообщение в блогеПрактика серверов Faiss на основе gRPC, техническая команда MXPlayer обновила службу отзыва векторов пользователей/элементов, первоначально разработанную на основе инфраструктуры Flask, с помощью gRPC, и QPS стресс-теста на одной машине был более чем в 2 раза выше, чем раньше. Первоначальный план состоял в том, чтобы использовать сервис Faiss на основе gRPC до волшебного изменения, чтобы удовлетворить потребности текущего бизнес-сценария, но случайно нашел программное обеспечение с открытым исходным кодом Vearch of JD.
Состав услуги
Служба поиска изображений состоит из двух частей: служба векторного поиска, предоставляемая Vearch, и извлечение признаков изображения в векторы признаков, предоставляемая подключаемым модулем Vearch python-algorithm-plugin.
Сервис векторного поиска - Поиск
Vearch — это отказоустойчивая распределенная система для высокопроизводительного поиска сходства в крупномасштабных векторах глубокого обучения. Его ядром является векторный поиск, который называется Gamma engine на основе Faiss. Но в дополнение к векторному поиску Gamma также может хранить документы, содержащие скаляры, и выполнять быстрое индексирование и фильтрацию этих скалярных полей. Грубо говоря, поддерживаются как скаляры, так и векторы, в то время как общие, такие как Elasticsearch, поддерживают только скаляры. Faiss может создать службу поиска векторов только для одной машины, в то время как Varch использует Gamma в качестве механизма поиска векторов, использует протокол Raft для хранения нескольких копий и предоставляет компоненты Master и Router для создания эластичной распределенной системы для поиска сходства векторов. Его архитектурная схема выглядит следующим образом:На рисунке представлены три основных компонента: Master, Router, PartitionServer, функции которых следующие:
- Мастер отвечает за управление схемой и координацию исходных данных и ресурсов на уровне кластера.
- Маршрутизатор предоставляет RESTful API для добавления, удаления, изменения и запроса, маршрутизации и пересылки запросов и объединения результатов.
- PartitionServer в основном реализует хранилище с несколькими копиями на основе протокола raft, а специальные возможности хранения, индексирования и извлечения предоставляются механизмом Gamma.
Из вышеизложенного мы можем узнать, что Gamma для Vearch — это то же самое, что Lucene для Elasticsearch.
Служба обработки изображений — плагин поиска
Сервис обработки изображений Vearch также предоставляет соответствующий плагинpython-algorithm-plugin. Цель Vearch — построить устойчивую распределенную систему для высокопроизводительного поиска сходства. Текст, изображения и видео могут быть преобразованы в векторы, поэтому команда Vearch предоставляет соответствующие плагины для лучшей интеграции в Vearch. Для изображений плагин обеспечивает обнаружение объектов, извлечение признаков и поиск сходства. Логика его обработки следующая:Логика заключается в извлечении векторных признаков из изображений, сохранении их в движке Vearch Gamma и предоставлении услуг по поиску.
Сервисное строительство
Служба поиска изображений состоит из двух служб, одна из которых представляет собой службу векторного поиска, предоставляемую Vearch, а другая — извлечение признаков изображения в виде вектора, предоставляемое подключаемым модулем Vearch.python-algorithm-pluginпоставка.
vearch
VearchОн написан на Go, а его основной движок Gamma написан на C++ (в конце концов, Faiss также разработан на C++), так что установка и развертывание сервиса относительно просты и грубы, поскольку зависимые пакеты lib (Faiss, Gamma , RocksDB), а также есть Поиск скомпилированных бинарных файлов, используемый непосредственно для автономного режима./vearch -conf config.toml
Запустите службу, а для служб кластера передайте последний параметр команды./vearch -conf config.toml ps/router/master
настроить.
Однако из-за слишком низкой версии нашего онлайн-сервера Gcc и отсутствия среды Go и других факторов мы используем метод Docker. Ввиду детального понимания того, как служба Faiss превратилась в отказоустойчивую распределенную систему под названием Vearch, исходный код компилируется и устанавливается.
# 下载源码
git clone https://github.com/vearch/vearch
# 切换到镜像编译目录
cd vearch/cloud
# 打包环境镜像 vearch/vearch_env:3.2.2,将gcc,git,faiss,rocksdb,go等安装好
# 这步打包比较慢,可以直接使用官方镜像 docker pull vearch/vearch_env:3.2.2
sh compile_env.sh
# 使用 vearch_env 编译二进制文件 vearch,主要是拉取 gamma 源码进行编译
sh compile.sh
# 打包 vearch/vearch:3.2.2, 将打包好的二进制文件vearch和依赖的库放到镜像中。
# 可以直接使用官方镜像 docker pull vearch/vearch:3.2.2
sh build.sh
В официальной упаковке образа еще есть место для оптимизации, для упаковки рекомендуется использовать исходный код Centos и подготовить исходные файлы, такие как Faiss, RocksDB и Go.
Обработка изображения
Готового образа Docker для службы обработки изображений нет, а пакет образа, предоставленный в репозитории Github, имеет проблемы.Для упаковки можно использовать следующий репозиторий.
# 下载源码(使用修正后的 Dockfile 文件)
git clone -b study https://github.com/haojunyu/python-algorithm-plugin
# 切换到镜像目录并打包镜像 vearch/images:3.2.2
# 可以直接使用打包好的镜像 docker pull haojunyu/vimgs:3.2.2
cd python-algorithm-plugin && docker build -t haojunyu/vimgs:3.2.2 .
начало роя
Поскольку обе службы упакованы в образы Docker, команды используются непосредственно здесь.docker stack deploy -c docker-compose.yml vearch
Для запуска службы содержимое docker-compose.yml выглядит следующим образом:
version: '3.3'
services:
vearch:
image: vearch/vearch:3.2.2
ports:
- "8817:8817"
- "9001:9001"
volumes:
- ./config.toml:/vearch/config.toml
- ./data:/datas
- ./logs:/logs
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
logging:
driver: "json-file"
options:
max-size: "1g"
imgs:
image: haojunyu/vimgs:3.2.2
ports:
- "4101:4101"
volumes:
- ./python-algorithm-plugin/src/config.py:/app/src/config.py
- ./images/imgs:/app/src/imgs
command: ["bash", "../bin/run.sh", "image"]
deploy:
mode: replicated
replicas: 3
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
Примечание: файл монтирования python-algorithm-plugin/src/config.py — это файл конфигурации службы обработки изображений.Как правило, вам нужно изменить только следующие четыре конфигурации в зависимости от вашей ситуации:
-
port
Относится к порту службы обработки изображений, по умолчанию 4101. -
gpus
Указывает, использует ли служба графический процессор, по умолчанию не равно -1. -
master_address
иrouter_address
Относится к службам мастера и маршрутизатора службы Vearch.
Использование службы
Потому что сервис изображений и сервис Vearch сильно интегрированы. Как правило, служба изображений вызывается напрямую, вектор изображения вводится в Vearch и передается службе изображений для обработки. Подробное описание работы Vearch можноСправочная документация.
сервисный мониторинг
# 这里master_server指vearch主节点及其对应端口:localhost:8817
# 查看集群状态
curl -XGET http://master_server/_cluster/stats
# 查看健康状态
curl -XGET http://master_server/_cluster/health
# 查看端口状态
curl -XGET http://master_server/list/server
# 清除锁(在创建表时会对集群加锁,若在此过程中,服务异常,会导致锁不能释放,需要手动清除才能新建表。)
curl -XGET http://master_server/clean_lock
# 副本扩容缩容
curl -XPOST -H "content-type: application/json" -d'
{
"partition_id":1,
"node_id": 1,
"method": 0
}
' http://master_server/partition/change_member
Библиотеки и пространственные операции
Концепция библиотеки и пространства аналогична концепции базы данных и таблицы в mysql.
- библиотечные операции
# 查看及群众所有的库
curl -XGET http://master_server/list/db
# 创建库
curl -XPUT -H "content-type:application/json" -d '{
"name": "sv_month"
}
' http://master_server/db/_create
# 查看库
curl -XGET http://master_server/db/$db_name
# 删除库(库下存在表空间则无法删除)
curl -XDELETE http://master_server/db/$db_name
# 查看指定库下所有表空间
curl -XGET http://master_server/list/space?db=$db_name
- операции с табличным пространством
# 在库sv_month下创建表空间test(针对image)
curl -XPUT -H "content-type: application/json" -d '{
"name":"test",
"partition_num":1,
"replica_num":1,
"engine":{
"name":"gamma",
"index_size":70000,
"max_size":10000000,
"id_type":"String",
"retrieval_type":"IVFPQ",
"retrieval_param":{
"metric_type":"InnerProduct",
"ncentroids":256,
"nsubvector":32
}
},
"properties":{
"itemid":{
"type":"keyword",
"index":true
},
"feature1":{
"type":"vector",
"dimension":512,
"model_id":"vgg16",
"format":"normalization"
}
}
}' http://image_server:4101/space/sv_month/_create
манипуляция данными
- вставка данных
# 插入本地图片数据到表空间中
curl -XPOST -H "content-type: application/json" -d' {
"itemid":"COCO_val2014_000000123599",
"feature1":{
"feature":"../images/COCO_val2014_000000123599.jpg"
}
} ' http://image_server:4101/sv_month/test/AW63W9I4JG6WicwQX_RC
- поиск данных
# 查询相似结果
curl -H "content-type: application/json" -XPOST -d '{
"query": {
"sum": [ {
"feature":"../images/COCO_val2014_000000123599.jpg", "field":"feature1"
}]
}
}' http://image_server:4101/sv_month/test/_search
Сервисный эффект и онлайн
Эффект
После того, как сервис будет успешно построен, нужно проверить эффект от поиска изображений по изображению, причем выявление эффекта изначально основано на ручном труде, а в конце на данных онлайн-индикатора. В отношении качества услуги в начале создания услуги должны быть ожидания, такие как:
- Идентичные изображения близки к 100% похожим
- Один и тот же тип должен давать одинаковые результаты, например, поиск щенков для щенков, поиск автомобилей для автомобилей и т. д.
Ниже приведен скриншот эффекта поиска картинок по изображению:
В целом эффект довольно хороший.
онлайн
Существует несколько способов выхода в онлайн по рекомендуемой стратегии:
- Прямой сервис онлайн, например, сортировка моделей. Этот метод требует, чтобы служба поддерживала высокий параллелизм, высокую производительность и высокую доступность.
- Онлайн-вызов + кеш, как поиск контента. Этот метод требует, чтобы служба поддерживала высокую производительность и высокую доступность, а кеш имеет высокую вероятность попадания.
- Результаты записываются в кэш в автономном режиме, и такие результаты, как cf, Popular и т. д., могут быть рассчитаны заранее.
После импорта в общей сложности 90 000 данных видео, недавно добавленных за последние 7 дней и опубликованных за последние 30 дней, данные были импортированы в службу Vearch в автономном режиме, что не могло выдержать в среднем 48 запросов в секунду. на два ведра, а затем для решения онлайн-задачи использовался второй метод. Третьим способом запускается стратегия поиска вектора изображения, соответствующая пользовательскому вектору (среднее значение вектора воспроизводимого изображения).
использованная литература
- Использование Faiss в проекте
- faiss-web-service
- Практика серверов Faiss на основе gRPC
- Распределенная система векторного поиска Jingdong vearch
- vearch китайская документация
- гамма ядра двигателя vearch
- плагин для обработки изображений vearch
- Страница поиска изображений
Если эта статья полезна для вас или вас интересуют технические статьи, вы можете подписаться на общедоступный аккаунт WeChat: Technical Tea Party, вы можете получать соответствующие технические статьи как можно скорее, спасибо!
Эта статья опубликована на многопостовой платформеArtiPubавтоматическая публикация