От ANN к точному KNN на GPU: как Ozon улучшил рекомендации
Ozon заменил приближённый поиск ближайших соседей (ANN) на точный KNN, выполняемый на GPU. Это решение уже работает в продакшене для десятков миллионов пользователей и сотен миллионов товаров, повышая релевантность рекомендаций и конверсию. Каждый процент улучшения recall здесь конвертируется в реал

Ozon заменил приближённый поиск ближайших соседей (ANN) на точный KNN, выполняемый на GPU. Это решение уже работает в продакшене для десятков миллионов пользователей и сотен миллионов товаров, повышая релевантность рекомендаций и конверсию. Каждый процент улучшения recall здесь конвертируется в реальные деньги.
Рекомендательные системы Ozon построены на двухэтапной архитектуре: сначала грубый отбор кандидатов (retrieval), затем точное ранжирование (ranking). Ранее на первом этапе использовался ANN-индекс — алгоритм HNSW из библиотеки FAISS. Однако по мере роста ассортимента и нагрузки точность ANN перестала устраивать: снижался recall, и часть релевантных товаров не попадала в финальную выдачу. Инженеры решили заменить ANN на точный KNN, выполняемый на GPU, чтобы обеспечить строгий топ-K ближайших соседей для каждого пользователя при сохранении приемлемой задержки.
Предыстория и контекст
Переход от ANN к точному KNN — мировой тренд в recommendation systems. Крупные игроки, такие как Pinterest и Spotify, уже экспериментируют с GPU-ускорением retrieval. Для e-commerce это особенно актуально: каждый пропущенный релевантный товар — потерянная конверсия. Ozon использует двухуровневую архитектуру рекомендаций. Первый уровень — retrieval: из каталога в сотни миллионов товаров отбираются тысячи кандидатов. Второй — ranking: глубокая модель ранжирует их. Если на первом этапе recall неидеален, даже лучший рангер не сможет показать пользователю то, что пропущено.
ANN-индексы (например, HNSW) дают приближённый результат. Они жертвуют точностью ради скорости. Для Ozon с его масштабом даже 1% потери recall означал миллионы упущенных покупок в год. Поэтому команда решила кардинально изменить подход.
Как работает точный KNN на GPU?
Точный KNN означает, что для каждого пользователя вычисляется расстояние до каждого товара (или до всех товаров в подвыборке) и выбираются K ближайших. Это O(NM) операций, где N — число пользователей, M — число товаров. На CPU такое неподъёмно, но GPU с тысячами ядер справляется за счёт параллелизма. Команда Ozon реализовала кастомное CUDA-ядро для вычисления косинусного расстояния. Векторы пользователей и товаров хранятся в памяти GPU. За один проход вычисляются все пары, затем выполняется top-K selection (также на GPU). Это позволило уложиться в latency, сопоставимый с ANN, но с гарантией точности.
Технические подробности реализации
Архитектура решения включает несколько ключевых компонентов. Во-первых, эмбеддинги пользователей и товаров обновляются раз в несколько часов — это позволяет переиспользовать GPU-память. Во-вторых, используется batch processing: запросы пользователей группируются и обрабатываются одним вызовом CUDA-ядра. Для top-K selection применяется алгоритм bitonic sort на GPU — он даёт детерминированный результат за O(log^2 K). Это быстрее, чем полная сортировка всех расстояний. Также реализована оптимизация shared memory для уменьшения latency.
В ходе A/B-тестов на реальном трафике точный KNN показал прирост recall@100 на 3–5% по сравнению с ANN. При этом latency осталась в пределах 15–20 мс на батч из 1000 пользователей. Для пользователей это означает более релевантные рекомендации без замедления загрузки страницы.
Какие риски и сложности возникли?
Переход на точный KNN потребовал решения нескольких проблем. Во-первых, объём GPU-памяти: для хранения эмбеддингов всех товаров (сотни миллионов векторов размерностью 128–256) нужно десятки гигабайт. Ozon использует несколько GPU и распределённое хранение. Во-вторых, latency: хотя GPU быстр, передача данных между CPU и GPU может стать узким местом. Инженеры оптимизировали pipeline, минимизировав копирования. В-третьих, детерминизм: ANN мог давать разные результаты при перезапуске, что затрудняло A/B-тестирование. Точный KNN лишён этого недостатка.
Кого затронет и как
Изменение касается всех пользователей Ozon, так как рекомендательные блоки есть на главной, в карточке товара и в корзине. Более точные рекомендации ведут к росту конверсии и среднего чека. Для бизнеса это прямая выгода: увеличение выручки без дополнительных затрат на трафик. Для разработчиков рекомендательных систем статья Ozon — ценный кейс. Он показывает, что отказ от готовых ANN-индексов в пользу точного KNN на GPU оправдан при достаточном масштабе. Российские компании, работающие с большими векторными пространствами, могут взять этот опыт на вооружение. Конкуренты Ozon (Wildberries, Яндекс.Маркет) тоже активно улучшают свои рекомендации. Возможно, они последуют этому примеру, что подстегнёт гонку технологий в российском e-commerce.
Что будет дальше
Ozon планирует развивать GPU-инфраструктуру для рекомендаций. В ближайших планах — внедрение точного KNN для других сценариев: поиск похожих товаров, персонализация контента. Также рассматривается использование более эффективных форматов хранения векторов (например, int8 квантование) для снижения требований к памяти GPU. В более долгосрочной перспективе возможен переход на полностью GPU-ориентированный пайплайн, где и retrieval, и ranking выполняются на GPU без промежуточной передачи данных на CPU. Это позволит ещё снизить latency и повысить throughput.
Итог
Переход Ozon от ANN к точному KNN на GPU — пример того, как инженерная оптимизация даёт измеримый бизнес-результат. Увеличение recall на 3–5% при сохранении latency — это не просто цифры, а миллионы дополнительных покупок. Для индустрии это ещё одно подтверждение, что GPU-ускорение retrieval становится стандартом для крупных recommendation systems.