К содержанию
Работа

GPU-ускорение рекомендательной системы магазина электроники

Проприетарный рекомендательный движок крупного магазина электроники считал персональные оценки для сотен тысяч покупателей и тысяч товарных позиций — полный пересчёт матрицы занимал на CPU несколько минут. Мы перенесли вычислительное ядро на CUDA и получили несколько секунд, ускорение в десятки раз. Алгоритм заказчика при этом остался прежним: изменилась архитектура исполнения, а не логика выдачи.

Главный экран проекта Нажмите, чтобы рассмотреть

Интерфейс воссоздан по описанию; исходные экраны не публикуются.

GPU-ускорение рекомендательной системы магазина электроники 01 / 03
GPU-ускорение рекомендательной системы магазина электроники — Главный экран проекта
Клиент
Интернет-магазин
Индустрия
Электронная коммерция
Срок
4 месяца
Команда
3 человека

Задача

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

Ограничение было не в качестве модели, а в стоимости обновления. CPU-реализация выполняла значительную часть работы последовательно и многократно обходила одни и те же данные — сопоставление признаков, вычисление весов, агрегацию промежуточных результатов, отбор Top-N. С ростом клиентской базы стоимость полного пересчёта увеличивалась почти пропорционально размеру матрицы, то есть проблема со временем усугублялась сама.

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

Решение

Профилирование и граница переноса. Сначала измерили, где именно уходит время, и выделили вычислительное ядро, занимавшее основную часть расчёта. На GPU уехало только оно. Подготовка входных данных и оркестрация остались на CPU: переносить всё подряд означало бы получить сложную систему с тем же временем ответа.

Компактное представление разреженных данных. Матрица взаимодействий «клиент — товар» разрежена: подавляющее большинство ячеек пусты. Хранить её целиком в видеопамяти бессмысленно, поэтому взаимодействия преобразовали в компактный формат — это одновременно уменьшило объём копирования и сняло часть бессмысленных чтений.

Разбиение на независимые блоки. Расчёт разложили по блокам пользователей и товарных кандидатов: каждый CUDA-блок обрабатывает свою часть матрицы, потоки внутри блока параллельно считают оценки. Независимость блоков — то, что позже позволило масштабировать решение на несколько устройств без общей синхронизации.

Раскладка памяти. Данные в памяти GPU расположены так, чтобы соседние потоки читали последовательные участки. Часто используемые параметры алгоритма помещены в быструю память, промежуточные значения агрегируются внутри блока. Именно эта перестройка, а не сам факт переноса циклов на видеокарту, дала основной эффект.

Top-N на стороне GPU. Редукции и первичный отбор лучших кандидатов выполняются до возврата результата. На CPU приходит небольшой список рекомендаций, а не вся рассчитанная матрица оценок — объём передаваемых данных уменьшился на порядки. Для GPU-задач это типичная ловушка: быстрое ядро легко обесценивается дорогой обратной передачей.

Перекрытие передачи и счёта. Работа разделена по CUDA streams: пока один пакет считается, следующий уже загружается в видеопамять, а результат предыдущего возвращается на сервер. Неизменившиеся части каталога и признаков кэшируются на GPU между пересчётами, что дополнительно сокращает копирование.

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

Деградация вместо падения. Система контролирует переполнение памяти и в ответ уменьшает пакет или выполняет неподдерживаемую операцию на CPU. Благодаря этому один и тот же код работает на разных поколениях видеокарт, и под каждый сервер не нужна своя версия алгоритма.

CPU-реализация как эталон. Старая версия осталась источником истины для проверки. На фиксированных наборах пользователей результаты сравнивались по трём признакам: численные значения с допустимой погрешностью, состав Top-N и порядок рекомендаций. Отдельные тесты закрывали граничные случаи — пустую историю клиента, новые товары, крайне популярные позиции, большие разреженные сегменты и повторяемость результата от запуска к запуску.

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

Результат

Полный расчёт рекомендаций сократился с нескольких минут на CPU до нескольких секунд на GPU — ориентировочно в десятки раз. Магазин смог обновлять персональные предложения для сотен тысяч клиентов заметно чаще, и выдача перестала отставать от текущего поведения покупателя и состояния каталога.

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

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

7 шагов переноса вычислительного ядра: от профилирования до кэша на GPU
Минуты → секунды время полного пересчёта матрицы рекомендаций
Сотни тысяч клиентов и тысячи товарных позиций размер матрицы
4 месяца срок работы команды из 3 человек
Состав проекта

Что вошло в решение

Решения и компетенции, которые использовали в проекте. По ссылкам — подробный состав каждого направления.

Ещё

Похожие проекты

Всё портфолио
Artik — интернет-магазин печати на заказ с онлайн-конструктором
Работа OneCore Media

Artik — интернет-магазин печати на заказ с онлайн-конструктором

Artik — канадская платформа заказа одежды, спортивной формы и промопродукции с индивидуальным нанесением. У обычного магазина цена привязана к SKU; здесь она собирается из тиража, цвета основы, размерной сетки, числа зон печати и количества красок в каждой из них. Поэтому магазин соединён с онлайн-конструктором макетов и производственным контуром типографии в один сквозной путь — от выбора футболки до задания в цех.

Интернет-магазин
MagentoPHPMySQL
CanMedDirect — интернет-магазин медицинских расходных материалов
Работа OneCore Media

CanMedDirect — интернет-магазин медицинских расходных материалов

CanMedDirect — канадский интернет-магазин медицинских расходных материалов для домашнего ухода, длительной терапии и восстановления после процедур. Внешне это обычный интернет-магазин, но покупатель здесь ищет не «повязку», а конкретный артикул производителя нужного диаметра, в нужной упаковке и совместимый с уже используемой системой. Магазин строился вокруг этой точности: каталог, поиск, совместимость, страховые документы и direct billing.

Интернет-магазин
PHPMagentoMySQL
Forpost — B2B-платформа оптовой торговли с Click2Buy и POS для торговых представителей
Работа OneCore Media

Forpost — B2B-платформа оптовой торговли с Click2Buy и POS для торговых представителей

Единый цифровой контур канадского оптового дистрибьютора товаров для дома и сада. Публичный сайт знакомит с брендом и ассортиментом, Click2Buy обслуживает самостоятельный B2B-заказ, POS работает в руках торгового представителя в шоуруме и на выставке. Три канала стоят на одних SKU, ценах, остатках, клиентах и заказах, поэтому продажа сейлза не превращается в отдельную ручную таблицу.

Интернет-магазинКорпоративные порталы
MagentoPHP
Первый разговор — бесплатно

Расскажите, что хотите изменить

За одну встречу уточним задачу и предложим следующий шаг, даже если вам нужен другой подрядчик.

Что будет на встрече
  1. 01 Опишите задачу своими словами
  2. 02 Уточним цель и ограничения
  3. 03 Предложим решение и следующий шаг
длительность 45–60 мин