Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

Как мы локализовали систему рекомендаций и полюбили китайскую инфраструктуру

Отредактировано

Рассказываем, как мы «от запроса до ответа» сделали свою систему рекомендаций, которая будет удобной для покупателей.

1К открытий2К показов

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

В процессе локализации AliExpress Россия мы решили сделать свою систему рекомендаций, которая будет удобной для покупателей

Какой должна быть система рекомендаций

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

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

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

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

Что сделали мы

Мы сделали систему генерации кандидатов, которую используем как фильтр. После прогона товаров через неё у нас остаётся тысяча позиций, и их мы можем отранжировать в рантайме. Дальше мы уточняем прогноз товаров-кандидатов для пользователя. И получаем 40 актуальных позиций.

Итак, рассмотрим весь процесс «от запроса до ответа».

Как нам помогла Alibaba

Начнём с клиентской части. От пользователя приходит запрос в наш рекомендательный сервис, который нужно где-то хостить.

Для этого Alibaba разработала собственную serverless платформу — ТРР, с её помощью удобно тестировать и выпускать новые фичи. При увеличении нагрузки платформа быстро поднимает нужное количество машин. Количество кода в самом TPP минимальное, и всё решение укладывается условно в две функции: получить количество кандидатов и ранжировать.

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

У Alibaba есть своя графовая база данных, IGraph, которая поддерживает Key–value. Ещё она распределённая, и с ростом нагрузки увеличивает количество контейнеров, спокойно выдерживая до миллиона RPS на большую распродажу 11.11.

Теперь проранжируем кандидатов. Для этого нам нужен ранжирующий сервис, где мы будем хостить нашу модель. У Alibaba есть собственная платформа RTP, куда мы можем хостить большинство известных моделей, почти любые градиентные бустинги и нейронные сети. Она может работать в автоскейл-режиме, если растёт нагрузка.

Осталось разобраться с хранением данных и обучить модели. Для первой задачи у Alibaba есть библиотека MaxCompute, способная обрабатывать петабайты данных. Благодаря ей в SQL мы можем делать любой ETL, общаться и строить пайплайны через Python и Java и так далее.

Обучение моделей реализуется с помощью собственной платформы PAI. В ней можно делать ETL-процессы, удобно создавать градиентный бустинг, можно поднять Jupyter и работать в нём. Но она для нас не идеальна — почему, расскажу ниже.

Наши хотелки

С помощью сервисов Alibaba наша система заработала, но онлайн-метрики все ещё были ниже, чем у китайского офиса. Чтобы это исправить, мы реализовали несколько своих идей.

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

PAI не давала нам такой возможности, потому что при работе с ней у нас нет доступа к коробкам. А функционала, который мы могли использовать, не хватало для манипуляций.

Кроме того, у нас была проблема с поднятием контейнеров для собственного алгоритма. PAI осуществляет его через китайскую систему, а не Docker, которым мы пользуемся.

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

Наконец, нам бы хотелось обучать CatBoost, потому что он имеет удобный интерфейс для обучения на GPU, что ускоряет обучение. Также он имеет большой ассортимент ранжирующих лоссов, и к тому же мы к нему привыкли. Инструментами Alibaba это делать долго и муторно (и приходится разбираться с документацией на китайском). Проще оказалось создать свою систему.

Для внедрения наших хотелок мы заменили готовое решение коллаборативной фильтрации от Alibaba на наше собственное. Мы использовали open source библиотеку implicit, сделали форк от неё и написали собственное решение с небольшой оптимизацией вычислений. Работает система, естественно, в Docker-контейнере.

Ещё нам пришлось написать собственный сервис ранжирования, который носит имя IvRank — по имени одного из наших разработчиков. Он представляет собой Java-спринг сервер, развёрнутый в китайской инфраструктуре.

Мы создали для него Java-приложение, которое разворачивается на N машин (точное число указываем при создании). Сервис принимает на вход запрос, где указан пользователь и товары для него, и идёт в IGraph — там лежат фичи по товару и фичи по пользователю.

Дальше приложение отправляет фичи в CatBoost, который находится в оперативной памяти сервиса. Маршрутизацией трафика занимается само приложение.

Все эксперименты в обучении моделей, мы проводим через ML-Flow. Там же сохраняются артефакты. Поэтому для деплоя нам достаточно через своё консольное приложение ввести название моделей и соответствующую команду.

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

Что же получилось?

Всё это было похоже на квест со множеством загадок, написанных на китайском. Но мы справились.

И в итоге получили решение, которое находится в продакшене под постоянной нагрузкой. С качеством рекомендаций таким же высоким, как и у китайских коллег.

Следите за новыми постами
Следите за новыми постами по любимым темам
1К открытий2К показов