Всем привет!

Меня зовут Кирилл, больше десяти лет я разрабатываю облака и инфраструктуру. Но последние пару месяцев в рамках R&D я достаточно много занимаюсь инференсом: платформами для него, конфиденциальными вычислениями и оптимизацией всего, что вокруг. В частности проектом - Serverless GPU с механиками примерно как у Modal или RunPod FlashBoot.

Одна из самых болезненных вещей здесь - холодный старт моделей. Каждый MLOps инженер, кто ждал перезапуск пода с vLLM / SGLang по 30 минут знает о чем я говорю.

Это особенно актуально, если вы делаете инференс на нескольких облачных провайдерах и спотовом GPU рынке, где может случиться прерывание vm или контейнера. Так что способность быстро запускаться - must have в таких условиях, особенно если вы даете своим клиентам опцию Dedicated Inference.

Хорошие новости - чтобы решить эту проблему около месяца назад я начал работу над open-source проектом warmctl, о нём сегодня в посте.

Проблема холодно старта

Если микросервис на Go стартует за 500 мс, то время старта Deepseek 4.1 с TP=8 на 8xB300 может легко занять минут 20-30, причем это будет повторяться всякий раз: на перезапуск самого хоста, случайный рестарт vLLM или SGLang из-за ошибки, добавление новой реплики - все это будет каждый раз съедать кучу времени. Да и простой такого железа даже на 20 минут в час пик под нагрузкой - это очень дорого

https://warmctl.io

https://warmctl.io

Может показаться, что веса моделей весят 300+ гигабайт, вот они и грузятся минут по 20-30. Но нет, дело не в этом.

В GPU облаках по типу Nebius, CoreWeave или Together AI - везде стоят СХД от VAST / Weka либо собственные HPC решения, которые дают по 15 GB/s на GPU ноду - этого достаточно чтобы загрузить даже GLM 5.3 секунд за 15-20. Загрузка весов моделей до 1 ТБ и data loading на правильной инфраструктуре даже on-prem не является проблемой.

Учитывая, что 8xB300 стоит как крыло от самолета, поставить за пару тысяч долларов хорошую сетевую карту и закрыть этот вопрос - крайне рационально. Если на вашем GPU кластере не стоят хотя бы 200 Gbit/s - что то явно не так.

Так что же происходит все эти 10-20 минут ?

На data loading приходится всего около 5-7% времени, все остальное - это компиляции kernels, сборка CUDA графов, автотюнинг GEMM и многое многое другое, включая запуск самого vLLM, который например представляет собой кучу процессов, общающихся по ZMQ в качестве транспорта.

На рынке очень много разного GPU-железа, еще больше различных версий CUDA и драйверов, куча параметров инференса самой модели - при запуске значительная часть времени уходит на оптимизацию и прогрев вычислений под конкретную комбинаторику железа, софта и настроек. Всё это нужно, чтобы потом модель быстро обрабатывала запросы. Это очень хорошо.

Часть этой работы уже умеют кэшировать: например, vLLM сохраняет результаты компиляции kernels и использует их при следующих запусках. Но кэш скомпилированных kernels ещё не сохраняет готовое состояние всего движка. Остаются инициализация процессов и CUDA-контекстов, выделение памяти, захват CUDA-графов и другие этапы подготовки runtime. Все равно много времени тратится впустую.

Идея: GPU Checkpoint & Restore + OCI

Раз прогретое состояние каждый раз одинаковое - не нужно получать его каждый раз на каждой GPU ноде, где вы запускаете инференс. Это бессмысленно - в production скорей всего у вас фиксирована версия драйвера, параметры модели и сама модель, а так же железо и окружение на котором выполняется инференс.

Достаточно один раз запустить vLLM или SGLang с нужными параметрами, дождаться, пока он прогреется и выполнит все необходимые оптимизации, снять с него снимок и дальше тиражировать этот снимок, например в формате OCI.

Основа для этого уже есть:

  • CRIU умеет сохранять и восстанавливать деревья Linux-процессов. На нём построен checkpoint/restore контейнеров в Kubernetes (KEP-2008).

  • cuda-checkpoint от NVIDIA делает то же самое для состояния процесса на GPU.

Так и появился warmctl - open-source инструмент для снимка и восстановления инференс движков на базе CRIU и CUDA Checkpoint (на самом деле еще DMTCP, но об этом в следующий раз)

Он дает возможность сделать снепшот прогретого vLLM и SGLang (planned) вместе с состоянием всех GPU, файловой системы, состояния NCCL и тд, а затем восстанавливать его на произвольном числе хостов, добавляя тем самым реплики. Все последующие запуски будут пропускать этап прогрева и при этом не терять ни капли в проихводительности.

Сам снимок warmctl упаковывает в OCI-образ. Его можно версионировать, хранить и распространять через ваш OCI Registry - так же, как обычные Docker-образы. Причем там достаточно много инвестировано в параллельную загрузку и эффективную упаковку этого образа (пропуск zero pages, сжатие, etc), чтобы быть максимально эффективным даже на этом этапе.

Всю цепочку можно уложить в 4 шага: модель с Hugging Face → запуск vLLM и прогрев в Gitlab → OCI-образ снимка → инференс из восстановленной копии. Все очень просто и достаточно компактно, причем работает как на обычных виртуалках, так и в контейнерной среде по типу RunPod или даже в Managed Kubernetes внутри KServe в вашем облачном провайдере.

Благодаря OCI - отдельная инфраструктура не нужна, получается самый настоящий cloud-native.

Как этим пользоваться

Все очень просто. Весь warmctl - это CLI, очень похожая на docker.

Как и писал выше - берёте любую модель с Hugging Face и любой CI, хоть GitHub Actions. Выпекаете снимок вашей любимой open-weight модели с нужными вами настройками один раз в OCI формате и отправляете его в ваш registry.

Это буквально три команды:

hf download <model>
warmctl build <...>
warmctl push <...>

Это делается один раз. Дальше на каждом GPU узле для восстановления из снимка выполните:

warmctl up <image>

Это всё. Команды похожи на Docker: build, push, pull, up, ps, down.

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

https://warmctl.io/catalog/

https://warmctl.io/catalog/

Там примерно 21 открытая модель, прогретая мною на H100, H200, B200, B300, L40S и RTX PRO 6000.

Установка и простой тест на qwen3-8b через публичный каталог выглядит примерно так:

curl -fsSL https://warmctl.io/install.sh | sh
warmctl doctor        # проверит Docker, NVIDIA runtime и драйвер
warmctl catalog       # покажет модели, которые можно поднять на этом узле
warmctl up qwen3-8b   # скачает образ и запустит сервер на :8000

Тесты: Запуск GLM-5.3-Flash на 8×H100

Первую версию warmctl я тестировал на инфраструктуре Nebius и их NFS. Новая реплика GLM-5.3-Flash на 8×H100 запускалась примерно за 37 секунд вместо 650 на их Managed Kubernetes кластере. Полный разбор этого бенчмарка можно найти в блоге:

https://warmctl.io/blog/boosting-dedicated-inference/

https://warmctl.io/blog/boosting-dedicated-inference/

Ещё несколько замеров других моделей. Как можно заметить, восстановление работает даже на TP>1 и больших MoE моделях:

Модель

GPU

Холодный старт

warmctl up

GLM-5.3-Flash

8×H100

650 с

37 с

Nemotron 3.5 Super

4×H100

208 с

24 с

Qwen3.8-27B

1×RTX PRO 6000

215 с

11 с

Qwen3-8B

1×L40S

134 с

9 с

Тесты: Запуск Qwen 3.8 180B на 3 нодах H200

Кроме того я экспериментировал запуская и восстанавливая с сетевого тома три реплики Qwen 3.8 на 180B параметров на RunPod, где в отличие от классических vm - исключительно контейнерная среда без какого либо privileged режима, который обычно требует CRIU.

Поэтому пришлось поддержкать второй бэкенд DMTCP для checkpoint & restore CPU нагрузок, который умеет работать через LD_PRELOAD без каких либо зависимостей на linux kernel механики. В результате получилось запустить с нуля до трех реплик и первого токена за 30 секунд. Демо запуска с сетевого тома RunPod можно посмотреть тут:

Заключение

Проект планирую развивать и дальше, на активной стадии разработки. В планах безусловно поддержка SGLang, как второго по популярности движка, а так же поддержка не только NVIDIA, но и AMD для того, чтобы закрыть инференс на MI300X и тд

Код открыт под Apache-2.0: github.com/TensorRails/warmctl. Если вашей модели или видеокарты нет в каталоге, напишите в комментариях, добавим.