Вертикальная мобильность: Инференс от MVP до нагрузки в триллион параметров — Ситаншу Гупта, CoreWeave
AAI Engineer
컴퓨터/소프트웨어AI/미래기술
스크립트
00:00:00Всем добрый день. Меня зовут Ситаншу, я из Corvi. Сегодня я буду говорить о вертикальной
00:00:19мобильности. Название звучит довольно громко, но по сути я буду
00:00:26рассказывать о нашей платформе инференса в Corvi, которую мы создаем для обслуживания
00:00:30как маленьких, так и больших моделей и самых разных рабочих нагрузок. Коротко обо мне: я присоединился
00:00:38к Corvi всего около четырех месяцев назад и возглавляю здесь направление инференса. А до этого
00:00:44я руководил всем направлением обучения в AWS Annapurna Labs, а еще раньше — инференсом
00:00:49и обучением в Sambanova. Так что у меня солидный опыт в этой сфере. Мой рассказ
00:00:56будет построен так: я объясню используемые нами модели потребления,
00:01:00и на их основе покажу, как мы сформулировали требования к платформе, чтобы
00:01:04нам не приходилось постоянно переписывать её с нуля, а можно было планомерно развивать
00:01:09нашу систему обслуживания инференса. Также поговорим о том, почему производительность играет здесь ключевую роль.
00:01:14Думаю, кое-что из этого может перекликаться с предыдущей темой, которую здесь обсуждали.
00:01:20Модели потребления. У нас есть две основные модели. Первая — serverless (бессерверная),
00:01:29в рамках которой клиентам и пользователям вообще не нужно беспокоиться об управлении
00:01:35оборудованием, администрировании кластеров, оркестрации или о чем-либо подобном.
00:01:40Есть API, есть интерфейс: вы заходите, платите за токены и получаете готовую к работе модель.
00:01:47Самое важное здесь — это широкий выбор моделей в каталоге, к которым у клиента
00:01:54есть доступ. Я сначала расскажу о выделенных ресурсах (dedicated), а затем вернусь к serverless,
00:02:01потому что у бессерверной модели есть одна уникальная особенность. Выделенный сервис инференса (dedicated),
00:02:05который мы предоставляем, больше подходит клиентам, желающим точно знать, какое железо они используют,
00:02:11однако развертывание модели лежит на их стороне. Они используют наш сервис и наши слои оркестрации,
00:02:18но запуск модели остается за ними. Производительность модели также зависит от них — главное,
00:02:25чтобы наша платформа предоставляла необходимые возможности и настройки. Возвращаясь к serverless,
00:02:30один из интересных моментов здесь заключается в том, что типичная проблема бессерверных систем — это “беспокойный сосед” (noisy neighbor),
00:02:38когда, если все одновременно шлют запросы к одной и той же модели, у вас могут регулярно вылетать таймауты
00:02:43в зависимости от объёма ресурсов за этой моделью. Поэтому еще одна функция, которую мы предлагаем для serverless,
00:02:48— это так называемая зарезервированная пропускная способность (provisioned throughput). Если вы как клиент знаете свой профиль трафика
00:02:55и передадите нам эти данные, мы сможем выделить под вас персональную мощность
00:03:00на уровне инфраструктуры. Вам по-прежнему не нужно думать, на каком именно железе всё работает,
00:03:04главное, что соблюдаются ваша пропускная способность и SLA.
00:03:07Это ещё одна опция в рамках бессерверной модели, где оплата всё так же идет за токены,
00:03:12но при этом вы гарантированно защищены от проблемы “беспокойного соседа”.
00:03:19Давайте кратко разберем несколько типов рабочих нагрузок и их профилей,
00:03:27с которыми мы сталкиваемся. Соотношение между ними постоянно меняется, хотя агентские системы (agentic)
00:03:32сейчас на самом пике. Агентские нагрузки и чаты довольно похожи: у них обычно очень большая длина
00:03:39входной последовательности (input sequence) и очень маленькая длина выходной. Главная же разница между ними в том,
00:03:43что многошаговые диалоги (multi-turn) в агентских системах требуют сверхнизкой задержки, в отличие от чатов, где после ответа
00:03:50пользователю нужно время, чтобы прочитать его и обдумать следующий шаг. Так что здесь есть
00:03:56свои особенности. И это ключевое отличие в конечном счете сводится
00:04:01к нюансам управления KV-кэшем. Но оба этих типа работают в реальном времени. Еще один пример задач реального времени —
00:04:09голосовые и видеопотоки, требующие непрерывного стриминга и критичные к задержкам. Для агентских систем и чатов
00:04:16требования в основном касаются пропускной способности, а не задержки, тогда как голосовой и видеопоток
00:04:23абсолютно чувствительны к latency. Что касается пакетной обработки (batch), то здесь требования SLA максимально
00:04:32мягкие. Задержки допустимы в секунды и минуты, а у некоторых клиентов — даже в часы.
00:04:37Они говорят: “Дайте нам окно обработки на 10–12 часов, мы загрузим всё, что есть,
00:04:44а вы обработаете, когда будут свободные мощности”. И эти пакетные нагрузки играют важную роль
00:04:52в определении архитектурных решений, которые мы закладываем в стек. Представьте
00:04:59эти четыре разных профиля нагрузки. Во временном измерении вам нужно умело манипулировать
00:05:04их характеристиками, чтобы выжать максимум из имеющейся инфраструктуры.
00:05:12Я опишу на верхнем уровне, как устроен наш стек прямо сейчас, и разберу
00:05:19путь прохождения запроса. Для обеих моделей, serverless и dedicated, в правой части
00:05:24экрана видно, что на стороне платформы запрос поступает в control plane для
00:05:31авторизации, ограничения частоты запросов (rate limiting), учета использования и т. д. — чтобы корректно формировать счета.
00:05:37Также здесь задействован мониторинг (observability), чтобы контролировать соблюдение зафиксированных в SLA условий.
00:05:45Ниже, на уровне самой платформы, я схематично показал, что у нас есть различные
00:05:52движки инференса: vLLM, SGLang и TensorRT-LLM, но за этим кроется еще множество деталей, о которых я упомяну.
00:06:00А еще ниже, в зеленом блоке, показаны самые разные типы аппаратных ресурсов.
00:06:09Платформа должна быть достаточно гибкой, чтобы распределять нагрузки
00:06:15между различными поколениями эти GPU — в частности, графических процессоров NVIDIA,
00:06:21которые мы используем. Давайте рассмотрим пару примеров. Допустим, запрос отправляется
00:06:31со стороны клиента из приложения, ноутбука или через агента. Он попадает на шлюз (gateway).
00:06:36Попав на шлюз, он, как я уже говорил, проходит через аутентификацию на уровне control plane,
00:06:42после чего уходит в ветку serverless или dedicated. В случае с serverless
00:06:48оплата идет за токены, поэтому здесь отслеживается объем потребления — не само содержимое,
00:06:53а именно количество токенов, так как мы строго соблюдаем политику нулевого хранения данных (ZDR).
00:06:59В зависимости от типа доступа — мультиарендного (multi-tenancy) или зарезервированного (provisioned),
00:07:05роутер понимает, нужно ли направить запрос к сфокусированным инстансам,
00:07:12выделенным под клиентов с гарантированной пропускной способностью, либо в общий пул.
00:07:17Роутер в этой цепочке выполняет важнейшую роль, поскольку именно он отвечает за
00:07:26принятие решений с учетом состояния KV-кэша (kvcache-aware routing). Почему это так важно? Потому что, как я отметил
00:07:31при разборе профилей нагрузки, агентские сценарии требуют огромной длины входного
00:07:39контекста. И основная часть этого контекста — порядка 80-90%, в зависимости от компании
00:07:44и специфики клиента — совпадает в самых разных запросах.
00:07:51Поэтому нет никакого смысла заново выполнять этап pre-fill для одной и той же информации.
00:07:57Pre-fill крайне ресурсоемок и затратен по вычислительной мощности, поэтому чем чаще вы попадаете в кэш,
00:08:04тем больше экономно расходуете ресурсы. Именно поэтому в ценах на токены у провайдеров есть стандартный тариф
00:08:11на входные токены и ощутимо более дешевый — на закэшированные. Caching здесь критически важен.
00:08:18Как именно разделять аппаратные ресурсы, зависит от конфигурации платформы,
00:08:26и мы даем возможность выбирать подходящий вариант. Можно настроить дезинтеграцию фаз pre-fill и decode (P/D disaggregation),
00:08:31если это оправдано задачей, либо отказаться от нее, так как дезинтеграция pre-fill и decode выгодна далеко не всегда.
00:08:41Рассмотрим другой сценарий. Посмотрим, что происходит в случае с dedicated-клиентом.
00:08:48Выделенный клиент также идет через шлюзы, которые изолированы специальным образом.
00:08:55Оплата при этом привязана не к токенам, а к фактическому времени использования каждого GPU в час.
00:09:03Запросы идут через приватный шлюз, что полностью исключает проблему “беспокойного соседа”.
00:09:09Логика роутера здесь аналогична: при наличии похожих запросов максимально задействуется кэш.
00:09:18В зависимости от конфигурации развертывания на своих выделенных GPU
00:09:24клиент сам решает, нужна ли ему раздельная обработка pre-fill и decode.
00:09:29Он может выбрать движок: vLLM, SGLang или TensorRT-LLM. Исходя из объема зарезервированных
00:09:35мощностей, клиент решает, поднять ли единый сервис с возможностью масштабирования
00:09:42на весь кластер, либо развернуть несколько разных моделей и инстансов.
00:09:47Также стоит упомянуть о важной особенности роутера:
00:09:54он поддерживает работу с гетерогенной инфраструктурой в разных зонах и регионах.
00:09:59Балансировка нагрузки в таких условиях — задача весьма непростая.
00:10:04Поэтому приоритетный порядок, которому мы обычно следуем, — это локальность KV-кеша, а затем перенаправление на наименее загруженный узел.
00:10:16Вот так. Еще один вариант прохождения запросов,
00:10:21который может быть не до конца виден на схеме — это пакетные задачи (batch).
00:10:25Для пакетной обработки мы используем имеющиеся мощности клиента. К примеру,
00:10:31тот же dedicated-клиент днем выполняет интерактивные задачи реального времени,
00:10:37а вечером и ночью хочет запустить пакетные вычисления. Те же самые мощности
00:10:43можно перераспределить по расписанию под batch-нагрузки. В нашем API есть методы управления масштабированием,
00:10:51и если по графику заложено уменьшение интерактивных ресурсов,
00:10:56система высвобождает их и отдает под ночную пакетную обработку.
00:11:05Я уже немало рассказал об оптимизации KV-кэша, но хочу еще раз подчеркнуть этот момент,
00:11:10поскольку это один из наиболее интересных аспектов. Чем чаще вы попадаете в кэш,
00:11:19то избавитесь от затрат на префилл — самый дорогой этап.
00:11:26Повторное использование KV-кэша в агентах на разных шагах взаимодействия
00:11:31тоже экономит ресурсы, ведь во входном контексте много одинаковых префиллов.
00:11:38Возьмём, к примеру, чаты. Выгрузка KV-кэша здесь крайне важна,
00:11:43поскольку между репликами пользователей проходит довольно много времени.
00:11:49И если мы полностью удалим кэш нашей беседы,
00:11:57следующий вопрос в том же чате будет обрабатываться дольше.
00:12:02Поэтому вместо удаления кэша и повторного префилла применяются техники...
00:12:08Мы используем свои разработки, а из внешних известны LM Cache и Mooncake.
00:12:17Суть в том, что мы сбрасываем KV-кэш в высокоскоростное хранилище,
00:12:21сохраняя эти префиллы. И когда приходит очередной запрос в рамках этого чата,
00:12:28кэш моментально загружается обратно в HBM.
00:12:37Что касается рычагов оптимизации производительности...
00:12:41Мы уже обсудили PD DSAG. Но есть также квантование и спекулятивное декодирование.
00:12:48И грамотный выбор степени и стратегий параллелизации невероятно важен.
00:12:54Два главных инструмента, с которыми мы работаем — квантование до NVFP4 и spec dec.
00:13:01Мы предлагаем функцию обучения спекулятивных моделей на данных клиента,
00:13:07что повышает процент принятых токенов и существенно увеличивает
00:13:12пропускную способность генерации. Этот процесс происходит асинхронно:
00:13:20получаем данные, обучаем спекулятор и внедряем его в окружение клиента,
00:13:26если есть такая задача. Здесь представлены три скриншота —
00:13:32это результаты работы нашей команды за последний месяц. Видно, как мы быстро
00:13:39возглавили лидерборд по Kimi 2.6 и 2.7. Данные взяты из Artificial Analysis.
00:13:46Но, возвращаясь к предыдущей сессии: можно ли этому верить? Поэтому для GLM у меня
00:13:52данные из OpenRouter. Artificial Analysis тестирует очень специфические нагрузки.
00:13:58OpenRouter же показывает реальный трафик пользователей. Вот график Weights & Biases.
00:14:05Брендинг отличается, но Weights & Biases — это, по сути, Cirrascale. Мы купили их
00:14:09около года назад. И как видите, скорость нашего развёртывания практически
00:14:16сопоставима с показателями Fireworks Fast. Но главное, на чём я хочу
00:14:21сделать акцент — это лежащие в основе методы оптимизации. Это критически важно,
00:14:27потому что в конечном счёте мы стремимся дать клиенту наилучшее соотношение цены и качества.
00:14:36Краткий итог: единая платформа — вот на чём я хотел сделать акцент.
00:14:44Две модели потребления: Serverless и Dedicated. При этом для Serverless
00:14:49доступны два варианта оплаты: Pay-as-you-go и Provisioned Throughput,
00:14:53а суммарный эффект достигается за счёт оптимизации всего стека.
00:15:01На этом всё. Всем спасибо!
커뮤니티 글
아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!
이 영상에 대해 글쓰기