Глава по системной инженерии рекомендаций создает службу поиска изображений

машинное обучение

Отзыв на основе содержания — это относительно распространенная стратегия отзыва в рекомендательных системах. Обычно отзыв этикеток основан на пользователях или товарах или отзывах на основе возраста и региона пользователей. Как правило, реализация этой стратегии основана на программном обеспечении с открытым исходным кодом. Эластичный. Хотя результаты отзыва разумны, новизна и неожиданность отзыва относительно невелики. Например, отзыв через метку «Энди Лау» в основном напоминает предметы, содержащие слова Энди Лау, и вряд ли вспоминает предметы из «Рассвета», «Джеки Ченга» и других четырех небесных королей. В последние годы, с успешным применением технологий word2vec, item2vec, graph2vec и других, метод вызова векторов элементов через векторы элементов также стал широко используемой стратегией отзыва в рекомендательных системах. Эта статья посвящена построению службы векторного поиска с помощью программного обеспечения с открытым исходным кодом Vearch и успешно реализует функцию поиска изображений.

вводить

В последнее время я занимаюсь рекомендательной оптимизацией небольших видео, и цель оптимизации — выход на экран на душу населения. Согласно опыту рекомендаций предыдущего информационного потока, я надеюсь вспомнить более релевантные небольшие видеоролики на основе записи воспроизведения пользователя для потребления пользователем. Рекомендуемая сцена небольшого видео чем-то похожа на более популярную Douyin, то есть автоматически воспроизводится короткое видео (около 5-30 секунд), а небольшое видео в основном занимает весь экран. Пользователи могут ставить лайки и делиться этим небольшим видео. , Комментарий, если вам не нравится, вы можете провести пальцем вверх, чтобы посмотреть следующее короткое видео. Учитывая, что фактором, определяющим, хочет ли пользователь смотреть видео, вряд ли будет название видео в двух строках под видео, больше факторов заключается в том, может ли обложка видео вызвать интерес у пользователя. На основе такой предыстории проекта я хотел построить сервис для поиска изображений по изображению, чтобы вспоминать обложку небольших видеороликов.

Поскольку я использовал gRPC для инкапсуляции Faiss для создания службы отзыва векторов раньше, и я уже выполнял проект классификации изображений, все изображения преобразуются в векторы в качестве входных данных классификатора, поэтому для этого нужно сделать две вещи. :

  1. Предварительно обработайте изображение и преобразуйте его в вектор фиксированной длины.
  2. Введите вектор каждого изображения в 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 для создания эластичной распределенной системы для поиска сходства векторов. Его архитектурная схема выглядит следующим образом:Vearch架构图На рисунке представлены три основных компонента: 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

Сервисный эффект и онлайн

Эффект

После того, как сервис будет успешно построен, нужно проверить эффект от поиска изображений по изображению, причем выявление эффекта изначально основано на ручном труде, а в конце на данных онлайн-индикатора. В отношении качества услуги в начале создания услуги должны быть ожидания, такие как:

  1. Идентичные изображения близки к 100% похожим
  2. Один и тот же тип должен давать одинаковые результаты, например, поиск щенков для щенков, поиск автомобилей для автомобилей и т. д.

Ниже приведен скриншот эффекта поиска картинок по изображению:animal beauty beauty2 car

В целом эффект довольно хороший.

онлайн

Существует несколько способов выхода в онлайн по рекомендуемой стратегии:

  1. Прямой сервис онлайн, например, сортировка моделей. Этот метод требует, чтобы служба поддерживала высокий параллелизм, высокую производительность и высокую доступность.
  2. Онлайн-вызов + кеш, как поиск контента. Этот метод требует, чтобы служба поддерживала высокую производительность и высокую доступность, а кеш имеет высокую вероятность попадания.
  3. Результаты записываются в кэш в автономном режиме, и такие результаты, как cf, Popular и т. д., могут быть рассчитаны заранее.

После импорта в общей сложности 90 000 данных видео, недавно добавленных за последние 7 дней и опубликованных за последние 30 дней, данные были импортированы в службу Vearch в автономном режиме, что не могло выдержать в среднем 48 запросов в секунду. на два ведра, а затем для решения онлайн-задачи использовался второй метод. Третьим способом запускается стратегия поиска вектора изображения, соответствующая пользовательскому вектору (среднее значение вектора воспроизводимого изображения).

использованная литература

  1. Использование Faiss в проекте
  2. faiss-web-service
  3. Практика серверов Faiss на основе gRPC
  4. Распределенная система векторного поиска Jingdong vearch
  5. vearch китайская документация
  6. гамма ядра двигателя vearch
  7. плагин для обработки изображений vearch
  8. Страница поиска изображений

Если эта статья полезна для вас или вас интересуют технические статьи, вы можете подписаться на общедоступный аккаунт WeChat: Technical Tea Party, вы можете получать соответствующие технические статьи как можно скорее, спасибо!技术茶话会

Эта статья опубликована на многопостовой платформеArtiPubавтоматическая публикация