Как мы автоматизировали модерацию карточек товаров с помощью Computer Vision в Wildberries

Как мы автоматизировали модерацию карточек товаров с помощью Computer Vision в Wildberries

Привет! Я Дмитрий Колесников, Team Lead DS-команды «Платформа модерации» в Wildberries & Russ. В этой статье по мотивам моего доклада на HighLoad расскажу, как нам удалось превратить сотни моделей Computer Vision в единый масштабируемый пайплайн, который ежедневно обрабатывает 15 млн карточек товаров — это более 50 млн изображений и 500 тыс. видео.

О чём эта статья

  • Архитектура CV-системы модерации: унификация моделей через TensorRT и DALI, переход к шаблонной архитектуре «общий бэкбон — лёгкие головы», построение ансамбля в Triton для снижения нагрузки и ускорения деплоя.
  • Процесс создания моделей: от постановки задачи до автоматизированного ретроскоринга и запуска в продакшен, включая прогнозирование нагрузки и использование Visual Language Models для проверки предсказаний.

Это не просто кейс — это готовая инженерная система, которую можно масштабировать под любые задачи модерации.

Дисклеймер: в статье нет сложной математики (все DL-концепции объяснены просто) и описания NLP-модерации — речь только о компьютерном зрении.

Масштабы Wildberries

  • 10 стран присутствия — и число растёт;
  • 81 млн уникальных пользователей в месяц;
  • Более 20 млн заказов в сутки;
  • Свыше 1 млрд запросов в день обрабатывает внутренняя IT-инфраструктура.

Что такое модерация и зачем она нужна

Главная цель — обеспечение безопасности площадки. В частности:

  1. Автоматическое выявление запрещённых товаров и контента: никотин, оружие, медикаменты, товары для взрослых без пометки 18+ и т.д.
  2. Поддержка честной конкуренции среди продавцов: все работают на равных условиях.
  3. Соблюдение законов разных стран: с каждым новым рынком появляются локальные ограничения, требующие отдельной настройки моделей.

Ежедневно через модерацию проходит около 15 млн карточек товаров — это 50–75 млн изображений и 500 тыс. видео.

Как работает команда модерации

Мы — молодая продуктовая DS-команда, построившая с нуля масштабируемую систему модерации. На ранних этапах каждый разработчик создавал отдельный сервис под свою модель. Это позволяло быстро экспериментировать, но создавало проблемы при росте: дублирование кода, разнородные архитектуры, сложности в поддержке.

Каждая новая модель требовала полного цикла: от исследования архитектуры до написания бэкенд-сервиса. С ростом объёмов стало ясно — нужно переходить к системе, способной масштабироваться без пропорционального роста затрат.

Первые улучшения: Triton Inference Server

Мы начали с Triton Inference Server — проверенного решения для запуска моделей. Его преимущества:

  1. Единый API для моделей из любых фреймворков.
  2. Разделение бэкенда (CPU) и инференса (GPU), что упрощает масштабирование.
  3. Автобатчинг: Triton объединяет асинхронные запросы в батчи, повышая пропускную способность.

Унификация в Triton: переход на TensorRT

Сначала модели в Triton были в разных форматах (PyTorch, ONNX), что приводило к разной производительности и сложностям в поддержке. Мы постепенно перевели все модели на TensorRT — фреймворк от NVIDIA для оптимизации моделей под конкретное железо.

Преимущества TensorRT:

  • Ускорение инференса в 1.5 раза и более за счёт оптимизации вычислительного графа.
  • Поддержка квантизации: снижение потребления GPU-памяти и рост RPS. Мы использовали fp16-квантизацию, сохранив качество приросте производительности.

Процесс конвертации: PyTorch → ONNX → TensorRT. Все модели переведены на этот конвейер.

Стандартизация препроцессинга: DALI и Triton Ensemble

Препроцессинг изображений (ресайз, нормализация, перевод в fp16) изначально выполнялся на бэкенде. Это создавало сильную связь между бэкендом и моделью: при смене модели нужно было обновлять оба компонента.

Решение: перенести препроцессинг в Triton с помощью DALI — инструмента от NVIDIA для создания GPU-ускоренных пайплайнов.

Преимущества DALI:

  • Операции выполняются на GPU, повышая пропускную способность.
  • Поддержка батчей и стандартных трансформаций.
  • Компилируемый пайплайн, встроенный в Triton.

Теперь препроцессинг и инференс — зона ответственности DS-команды. Всё объединено в Triton Ensemble: сначала DALI-препроцессинг, затем TensorRT-модель. Ответ (Y) отправляется на бэкенд для принятия решения.

Рефакторинг бэкенда: от микросервисов к унифицированным сервисам

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

Мы объединили сервисы с похожей логикой в единые решения. Это позволило:

  • Свести все запросы к одному шлюзу.
  • Улучшить логирование и мониторинг.
  • Создать единую админку для управления моделями.

В админке можно:

  • Редактировать конфигурации (хранятся в MongoDB).
  • Видеть все модели в одном интерфейсе.
  • Включать/выключать модели, менять пороги, приоритеты и режимы.

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

Высокая нагрузка: вызовы и решения

С ростом числа моделей возросли требования к ресурсам:

  1. Количество моделей росло, требуя больше GPU-памяти.
  2. Каждая модель занимала около 1.75 ГБ VRAM (свыше 85 млн параметров), а моделей стало десятки.

На 100 моделей — около 175 ГБ VRAM. Один A100 имеет 80 ГБ, значит, нужно минимум 3 GPU — дорого и неэффективно.

Почему такие большие модели? Контент Wildberries очень разнообразен:

  • Фото разного качества — от студийных до снимков «на телефон».
  • Разный фон, освещение, ракурсы.
  • Много визуального шума и ИИ-генерированных изображений.

Обычные CNN плохо справляются. Мы перешли к ViT (Vision Transformers) — они лучше работают на разнородном контенте и реже дают ложные срабатывания.

Ещё одна проблема — сетевая нагрузка. Если одно фото отправляется на 100 моделей, это 100 идентичных запросов с тяжёлым payload. RPS падает с ростом числа моделей — критично при 15 млн карточек в день.

Решение: единый ансамбль моделей

Мы поставили две задачи:

  • Отправлять фото один раз и получать ответы от всех моделей — убрать сетевую нагрузку.
  • Унифицировать общие операции на уровне инференса — повысить RPS.

Решение: один вызов Triton → один раз препроцессинг → ответы от всех моделей. Это снижает сетевую нагрузку и повышает RPS за счёт параллелизма.

Но VRAM по-прежнему растёт — каждая модель требует памяти. Нужно было оптимизировать и это.

Архитектура «бэкбон и головы»

Любая нейросеть состоит из двух частей:

  1. Бэкбон (backbone) — выделяет признаки из изображения (95–99% параметров).
  2. Голова (head) — принимает решение на основе признаков (1–5% параметров).

Идея: сделать единый бэкбон для всех моделей, а обучать только лёгкие головы. Это позволяет заморозить 85 млн параметров и обучать лишь 250–500 тыс. на каждой задаче.

Но бэкбон должен быть универсальным — он не должен быть привязан к одной задаче.

Как выбрать универсальный бэкбон

Обычно модели обучаются на задачу (например, «кошка или собака»). Признаки становятся специфичными. Такой бэкбон не подходит для модерации — нужно понимать весь контекст, а не только центр объекта.

Решение — использовать CLIP: модель, обучающаяся на парах «текст + изображение». Она учится сопоставлять описание и картинку, формируя универсальное представление.

CLIP обучалась на ~2 млрд пар из интернета. Мы взяли её Image Encoder в качестве бэкбона — он выдаёт признаки, пригодные для любых задач модерации.

Архитектура голов

Голова — это маленькая модель, решающая простую задачу. Мы выбрали бинарную классификацию: «да» (нарушение) или «нет».

Пример: голова для сигар выдаёт вероятность 0.97. Если порог — 0.6, изображение блокируется.

Финальный ансамбль в Triton

В Triton организован единый ансамбль:

  1. DALI-препроцессинг.
  2. Общий бэкбон (CLIP Image Encoder).
  3. Множество лёгких голов, работающих параллельно.

Один запрос — один проход бэкбона — десятки ответов от голов.

Преимущества:

  1. Снижена сетевая нагрузка: фото отправляется один раз.
  2. Повышен RPS: тяжёлая часть (бэкбон) работает один раз, головы параллельны.
  3. Экономия VRAM: каждая новая голова добавляет до 30 МБ памяти.

Результаты оптимизации

VRAM: до и после
Раньше каждая модель добавляла ~1.75 ГБ. Теперь — до 30 МБ. Экономия нарастает с числом моделей.

RPS: до и после
Теперь добавление новых голов почти не влияет на пропускную способность — они очень быстрые.

Преимущества подхода с головами

  1. Масштабируемость: головы «весят» мало (в среднем 15 МБ VRAM) и почти не снижают RPS.
  2. Меньше переобучения: мало параметров — меньше шансов выучить шум. Голова находит более устойчивые закономерности.
  3. Шаблонный код обучения: фиксированный бэкбон и типы голов позволяют стандартизировать процесс. Сейчас обучение запускается из UI.
  4. Быстрое обучение: меньше параметров + предобученный бэкбон = меньше эпох и быстрый запуск.

Теперь можно разбивать задачи: например, отдельные головы для сигар, сигарет, вейпов и кальянов. Если одна деградирует — переобучаем только её, не затрагивая другие.

Пайплайн разработки модели

Процесс создания новой модели:

  1. Получение ТЗ от менеджеров: обсуждение кейсов, определение нарушений.
  2. Разбиение на подзадачи: одна большая модель → несколько независимых голов.
  3. Выбор типа модели: зависит от задачи.

Типы моделей:

  • Image-based (ViT): анализ отдельных фото и кадров. Основной тип.
  • Video-based (VideoMAE): анализ последовательности кадров. Используется, когда нарушение — это действие (например, открытие двери).
  • Object detection: определение местоположения объекта. Например, для распознавания лиц и логотипов. Сначала детектор находит объект, затем он векторизуется и сравнивается с базой (например, Nike).

Обучение модели: ClearML-пайплайн

После сбора датасета запускается автоматизированный пайплайн в ClearML:

  1. Подготовка данных: аугментации, разделение на train/test с учётом пропорций.
  2. Обучение головы: тренировка на предобученном бэкбоне.
  3. Анализ качества: оценка на тестовой выборке.
  4. Конвертация в TensorRT: оптимизация под целевое железо.

Всё происходит в UI: нажал кнопку — получил готовую модель.

Ретроскоринг: проверка на реальных данных

Распределение нарушений в обучающей выборке отличается от реального (на Wildberries многие нарушения встречаются реже 0.01%). Чтобы оценить поведение модели в проде, проводится ретроскоринг — запуск модели на исторических данных.

Есть UI-инструмент: запускаешь ретроскоринг и сразу видишь результаты. Можно сделать предразметку и получить precision-аналитику. Это помогает подобрать порог и спрогнозировать число TP и FP.

Ретроскоринг также позволяет оценить нагрузку на ручную модерацию и необходимость LLM-ассессмента.

Настройка правил и порогов

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

При 50–100 млн изображений в день ложные срабатывания неизбежны. Поэтому используются дополнительные проверки:

  1. Ручная модерация: асессоры проверяют срабатывания.
  2. LLM-ассессмент: автоматическая проверка с помощью языковых моделей.

Как работает LLM-ассессмент

Современные Visual Language Models могут анализировать изображения. Загружаем фото и спрашиваем: «Есть ли нарушение?» Ответ — 1 (да) или 0 (нет).

Но LLM слишком медленные, чтобы обрабатывать весь поток. Поэтому на них отправляются только срабатывания — то, что уже заблокировала CV-модель.

LLM работает как классификатор токенов: мы получаем не только ответ, но и вероятность. Это помогает отсеять ложные срабатывания и повысить итоговый precision.

Как устроена модерация

Процесс:

  1. Берётся карточка товара, извлекаются фото и кадры видео.
  2. Каждый кадр проходит через Triton Ensemble.
  3. Модели выдают предсказания.
  4. Принимается решение: блокировка, hide (скрытие в стране), blur (размытие, например, для 18+).

В зависимости от настройки, срабатывания идут на ручную модерацию или LLM-ассессора.

Итоги

  1. Построена масштабируемая система модерации на базе Computer Vision.
  2. Созданы унифицированные сервисы с удобными админками.
  3. Шаблонизация пайплайна снизила Time to Market для новых моделей.
  4. Появилась возможность прогнозировать нагрузку на ручную модерацию и LLM-ассессмент до запуска модели.
Читать оригинал