Рекомендательные системы (RecSys) переживают архитектурный сдвиг. Традиционные подходы, основанные на поиске ближайших соседей в пространстве эмбеддингов (embedding-similarity), уступают место генеративным рекомендациям (Generative Recommenders, GR). В GR задача формулируется как предсказание следующего действия или элемента в последовательности, аналогично next-token prediction в LLM. Это позволяет использовать законы масштабирования трансформеров, объединять этапы поиска и ранжирования в одной модели и естественным образом интегрироваться с экосистемой LLM.
01Почему старые подходы ломаются на масштабе
Классические RecSys сталкиваются с критическими проблемами при работе с огромными объемами данных:
- Объем данных: Истории пользователей (катастрофически разреженные матрицы взаимодействий) не помещаются в HBM GPU. Это создает узкие места при обучении и инференсе.
- Длинный хвост (Long-tail): Большинство товаров имеют мало взаимодействий. Вероятностное распределение смещено в сторону популярных товаров, что дает слабый градиент для нишевых позиций.
- Проблема холодного старта: Для новых пользователей или товаров нет истории взаимодействий. Эмбеддинги приходится выводить из косвенных признаков, что часто снижает качество рекомендаций.
- Строгие требования к латентности: В отличие от LLM, где можно терпеть задержку декодирования, RecSys должен ранжировать тысячи кандидатов за миллисекунды для миллионов пользователей онлайн.
02Архитектуры HSTU и Semantic IDs
Существует два основных подхода к реализации GR, оптимизированных для NVIDIA GPU:
1. Hierarchical Sequential Transduction Units (HSTU)
Введенный Meta, HSTU рассматривает историю пользователя как последовательность переплетенных элементов (товары, действия: клик, лайк), упорядоченных по времени. В отличие от стандартных трансформеров, HSTU:
- Использует относительное смещение внимания (relative attention bias).
- Применяет elementwise gating перед проекцией выхода.
- Позволяет эффективно моделировать длинные последовательности взаимодействий.
2. Semantic IDs (SIDs)
Разработанный Google, этот подход решает проблему огромного словаря товаров. Вместо предсказания конкретного ID товара, модель предсказывает «семантический ID» — токен из иерархически кластеризованного набора. Архитектуры используют SIDs для:
- Эффективного ранжирования через логиты выхода.
- Использования beam search для генерации нескольких кандидатов за один проход.
- Улучшения обобщения для семантически похожих товаров.
03Инструменты NVIDIA: recsys-examples и nv-embedding-cache
Для внедрения этих архитектур NVIDIA предоставляет репозиторий recsys-examples и библиотеку nv-embedding-cache (NVE). Они решают проблему управления памятью и пропускной способностью.
DynamicEmb: Гибкие эмбеддинги
Статические таблицы эмбеддингов неэффективны, так как большая часть памяти тратится на редко используемые товары. DynamicEmb заменяет их на оптимизированную хеш-таблицу с приоритетным вытеснением (score-based eviction). Она живет в HBM, позволяя масштабироваться за пределы одной GPU. Реализация использует TorchRec и fused CUDA kernels для эффективного обучения и инференса.
nv-embedding-cache (NVE)
Это многоуровневое кэширование, которое работает как drop-in replacement для слоев PyTorch Embedding. Оно поддерживает:
- Секционирование (sharding) таблиц.
- Параллельный поиск и вытеснение.
- Низкую латентность для production-нагрузок.
04Практическая настройка и запуск
Для начала работы с примерами из репозитория NVIDIA потребуется окружение с PyTorch и поддержкой CUDA. Ниже приведен базовый сценарий клонирования и подготовки окружения.
Клонирование репозитория с примерами:
git clone https://github.com/NVIDIA/recsys-examples.git
cd recsys-examplesУстановка зависимостей (предполагается использование conda/venv и CUDA 12.x):
pip install -r requirements.txt
# Для работы с DynamicEmb и TorchRec
pip install torchrecПример инициализации модели HSTU с использованием DynamicEmb (псевдокод архитектуры):
from recsys_examples.models import HSTUModel
from recsys_examples.embedding import DynamicEmb
# Инициализация динамических эмбеддингов для пользователей и товаров
user_emb = DynamicEmb(num_embeddings=1000000, embedding_dim=64)
item_emb = DynamicEmb(num_embeddings=5000000, embedding_dim=64)
# Создание модели HSTU
model = HSTUModel(
user_emb_layer=user_emb,
item_emb_layer=item_emb,
seq_len=50,
hidden_dim=256
)05Кому подойдёт / что запустится
| Компонент | Требования к железу | Целевая нагрузка |
|---|
