Perplexity AI обошлась без отдельного движка встраиваний: три сервиса на одном GPU
Perplexity AI нейросеть использует для поиска три внутренних сервиса, Ivy, Tulip и ROSE, которые превращают один движок для больших языковых моделей в быструю систему встраиваний (embeddings) без отдельного инференс-сервера, и инженерная команда впервые описала, как именно это устроено.

Perplexity AI показала, что дорогой отдельный движок для встраиваний не нужен: можно переиспользовать ядра, уже написанные для языковой модели, и получить выигрыш в скорости за счёт CUDA-графов и асинхронной обработки. Для команд с ограниченным бюджетом на GPU это прямая экономия.
Инженерный блог Perplexity Engineering на этой неделе опубликовал разбор Fast Embeddings on GPUs. Материал раскрывает архитектуру, которая стоит за моделью pplx-embed и ранжирующими моделями в поиске Perplexity Search, Computer и API Platform. По данным публикации, основной выигрыш сегодня приходит не от самого GPU-вычисления, а от обвязки вокруг модели: управления CUDA-графами, асинхронного отслеживания результатов и пути запроса на языке Rust.
Какую задачу решает эта архитектура?
Встраивание (embedding) превращает текст в числовой вектор, по которому поисковый индекс находит похожие документы. Задача распадается на два режима.
- Пакетное встраивание (batch embedding) используется при построении или переиндексации векторной базы. Здесь важна пропускная способность, чтобы снизить стоимость.
- Онлайн-встраивание (online embedding) срабатывает в момент запроса пользователя. Здесь важна минимальная задержка, потому что запрос обычно короткий, всего несколько токенов (минимальных единиц текста, на которые модель разбивает входную строку).
Ранжирование документов после векторного поиска занимает промежуточное положение: приходят большие пакеты документов, нужен баланс скорости и пропускной способности.
Главное решение команды Perplexity AI: отдельный движок для встраиваний не строили. Модели встраиваний являются небольшими трансформерами, поэтому пакетный режим напоминает «префилл» (compute-bound операция), а онлайн-режим с короткими запросами напоминает «декод» (memory-bound операция). Команда переиспользует готовые ядра префилла и декода из стека для больших языковых моделей.
Что понадобится
- Доступ к GPU с архитектурой Hopper или Blackwell (в источнике упомянуты как «зрелое» оборудование, на котором инференс (процесс получения ответа от модели) уже сходится по производительности между движками).
- Язык Rust для шлюза и gRPC-сервера (Perplexity использует tokio и tonic).
- Python для ядра инференса и управления CUDA-графами.
- Библиотеки внимания: FlashInfer 2, FlashInfer 3 или FlashAttention 4.
- Понимание принципов CUDA-графов (CUDA graphs) и работы с закреплённой памятью (page-locked buffers).
- Время на изучение: 2-3 часа на разбор архитектуры, от нескольких дней на адаптацию под свой стек.
Пошаговая инструкция: как воспроизвести ключевые приёмы
-
Разделите путь запроса на три слоя. В архитектуре Perplexity AI это Ivy (Rust HTTP-шлюз), Tulip (gRPC-сервер планирования) и ROSE (Runtime-Optimized Serving Engine, движок инференса на Python). Ivy берёт на себя CPU-работу: парсинг JSON, токенизацию, шаблонизацию входа, разбивку пакетов и балансировку нагрузки между репликами. Tulip управляет очередями и формированием батчей. ROSE запускает ядра модели и управляет CUDA-графами.
-
Используйте простой планировщик. Tulip обрабатывает последовательности в порядке поступления (FCFS). Команда Perplexity обосновала это измерением: для небольших моделей встраиваний на типичных длинах последовательностей линейная стоимость плотных слоёв доминирует над квадратичной стоимостью внимания. Задержка пропорциональна количеству токенов, а не количеству последовательностей. Когда пакет насыщает GPU (около 512 токенов на модели менее миллиарда параметров), добавление новых последовательностей уже не даёт прироста.
-
Постройте CUDA-графы для всей модели целиком. На малых пакетах запуск ядер со стороны CPU может занимать больше времени, чем сама работа GPU. Perplexity захватывает все запуски ядер в один вызов драйвера. Точка перелома, где GPU-работа начинает превышать стоимость запуска, наступает при тысячах токенов и десятках последовательностей.
-
Примените ленивый захват (lazy capture). Графы нужно захватывать под каждую конфигурацию, поэтому длины токенов дополняются до корзин, кратных 64 или 256. Это порождает тысячи графов и минуты на захват. Решение: при первом попадании конфигурации запускается обычный (eager) прогрев, а захват и воспроизведение графа срабатывают на втором попадании.
# Псевдокод принципа lazy capture (по описанию из источника)
if config not in graph_cache:
eager_warmup(config) # первый вызов без графа
mark_for_capture(config)
else:
replay_graph(config) # второй и последующие вызовы
-
Верните LazyTensor вместо блокирующего результата. Вместо того чтобы функция
step()блокировала процесс до завершения работы GPU, ROSE возвращает объект LazyTensor, который отслеживает закреплённый буфер хоста, асинхронное копированиеcudaMemcpyAsyncи CUDA-событие. Это позволяет асинхронной задаче на Rust ожидать пакет N, пока CPU ставит в очередь пакет N+1. -
Выбирайте бэкенд внимания под конкретную модель. По данным публикации, FlashAttention 4 в целом быстрее, но FlashInfer 3 обгоняет его на моделях семейства Qwen при очень длинных последовательностях. ROSE не создаёт KV-кэш для моделей встраиваний и использует варианты «рваного» (ragged) внимания, чтобы избежать паддинга.
Как Perplexity измеряла результат?
Бенчмарки проведены против vLLM v0.22.0 в формате BF16 на реальных весах и входных данных из оценочных наборов. Прогрев подтвердил расхождение косинусного сходства в пределах 0,1%. Четыре набора тестов:
- Встраивания с низкой задержкой (пакет 1; 128, 512, 4096 токенов)
- Ранжирование с низкой задержкой (пакет 5, 25, 50 при 512 токенах)
- Встраивания с высокой пропускной способностью (пакет 100, четыре параллельных процесса)
- Встраивания с высокой конкурентностью (от 1 до 16 параллельных запросов, включая токенизацию в Ivy и сетевые накладные расходы)
Допустим, вы строите поисковый индекс на 10 миллионов документов для внутренней базы знаний. Вместо отдельного сервера для встраиваний вы берёте существующий инференс-стек с ядрами префилла и декода, настраиваете CUDA-графы с ленивым захватом и получаете пакетную индексацию без дополнительной инфраструктуры. При запросе пользователя тот же движок обрабатывает короткий запрос в онлайн-режиме, а LazyTensor позволяет CPU готовить следующий пакет, пока GPU ещё считает текущий.
- Захват CUDA-графов при старте целиком. Жадный (eager) захват всех конфигураций добавляет минуты к запуску. Ленивый захват решает проблему, но за счёт повышенной задержки p99 на старте. Учитывайте это при планировании SLA.
- Попытка оптимизировать планировщик для встраиваний. Сложный планировщик не нужен, если модель меньше миллиарда параметров и задержка пропорциональна токенам, а не последовательностям. Преждевременная сложность здесь не помогает.
- Фиксация одного бэкенда внимания. FlashAttention 4 не всегда лучший выбор. На длинных последовательностях с моделями Qwen FlashInfer 3 работает быстрее. Тестируйте под свою модель.
- Использование KV-кэша для встраиваний. ROSE намеренно не создаёт KV-кэш и использует ragged-варианты внимания. Кэш для встраиваний бесполезен и добавляет накладные расходы.
Что делать с этим прямо сейчас, по ролям?
Разработчику, который строит embedding-сервис в РФ. Импортные ограничения на GPU Hopper и Blackwell делают каждую карту дорогой. Техники из публикации Perplexity (CUDA-графы, lazy capture, LazyTensor) снижают нагрузку на имеющееся железо. Адаптировать подход можно на любых NVIDIA GPU с поддержкой CUDA-графов, выигрыш растёт на малых пакетах, где CPU-оверхед запуска ядер особенно заметен.
Автору Дзена и контент-маркетологу. Perplexity AI нейросеть использует эти встраивания для поиска и ранжирования источников. Если ваш контент попадает в индекс Perplexity Search, качество встраиваний определяет, найдут ли вашу статью. Чем точнее вектор, тем меньше шансов, что релевантный материал потеряется.
Предпринимателю. Сервисы Ivy, Tulip и ROSE являются внутренними. Но модель pplx-embed доступна через Embeddings API Perplexity. Если вы строите продукт с семантическим поиском и не хотите разворачивать свой стек, API даёт готовое решение. Из российских аналогов для встраиваний можно рассмотреть модели от Сбера и Яндекса, хотя прямого аналога pplx-embed с открытым API на момент публикации нет.
Публикация Perplexity ценна не столько архитектурой (три сервиса на Rust и Python не уникальны), сколько конкретными числами и принципами. Правило «задержка пропорциональна токенам, а не последовательностям» для моделей менее миллиарда параметров сэкономит часы экспериментов тем, кто сейчас строит свой embedding-стек. Ленивый захват CUDA-графов, простая идея, но я не встречал её в документации других открытых движков в таком явном виде. Честная оговорка: Perplexity не раскрывает абсолютные цифры задержек и пропускной способности в публикации, показаны только сравнительные графики против vLLM. Повторить результат на GPU поколения Ampere или старше может не получиться, архитектура описана для Hopper и Blackwell.
Главный вывод из разбора Perplexity AI: не стройте отдельный движок для встраиваний, если у вас уже есть инференс-стек для языковой модели. Переиспользуйте ядра, добавьте ленивый захват CUDA-графов и асинхронный возврат результатов, и задержка на малых пакетах упадёт без нового железа.
Подпишитесь на dzen.guru
Разбираем архитектуры, инструменты и практики ИИ для тех, кто работает с контентом и технологиями в РФ
Подписаться
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также
Apple Neural Engine без документации: 163 MIL-файла в macOS заменяют закрытую спецификацию
Apple Neural Engine (ANE) позволяет запускать языковые модели на устройствах Apple без участия GPU и CPU, но документации по работе с ним почти нет: приходится…

Google Gemini занизил запасы воды и еды: троих туристов пришлось спасать на горе Шаста
Три туриста попали в беду на горе Шаста в Калифорнии после того, как полностью доверили планирование восхождения чат-боту Google Gemini, и этот случай стал…

Hermes Desktop запускает локальные модели нейросети в один клик: настройка не нужна
Hermes Desktop от Nous Research читает характеристики компьютера, сама выбирает подходящую открытую модель нейросети и настраивает запуск без единой ручной…
Комментарии