Разгружаем GLM-5.3 при помощи младшей сестры, которая оказывается не так проста

В среду 26 августа Z.ai выложила веса GLM-5.3-Flash: 320 миллиардов параметров, из них 18 активных,миллион контекста, картинки и видео на входе, лицензия MIT. Узнал я об этом 28-го, и рукизачесались, благо пара карт была не в проде. Отправляем Клода искать квант в NVFP4, находим,понимаем, что vLLM ещё модель не умеет, но есть готовый пропатченный образ. Запускаем, радуемся,работает же... И тут я Клоду говорю: так, а как бы нам MTP и offload? Понимаем, что в этом образеникак, но работа по добавлению модели уже велась в отдельном PR. По аналогии с подъёмом GLM-5.2 всвоё время отправляем агента на fable: «собирай мне на апстриме плюс вот этот PR, и чтоб MTP иoffload работали». Через несколько часов получаем пару правок в апстрим, ещё одну в чужой PR ирабочий образ, который крутился в проде уже с понедельника, 31 августа. Чуть позже ещё пара правокудвоила нам KV: оказалось, его можно держать в fp8, и сразу вместо 2.5 миллиона токенов получаем4.9, при этом по всем тестам качество практически не страдает. Результат: уже десять дней в продешустрая, довольно умная модель с дешёвым KV, около 13 килобайт на токен. И на сегодняшний день унас в проде 5.3 в обеих версиях. Flash взяла на себя беглую работу с документами и зрение длябольшой GLM.

Без MTP и offload Flash работает, но обычно. MTP это когда модель предсказывает несколько следующихтокенов вперёд и проверяет их одним проходом: у нас стоит три спекулятивных токена. Offload этовыгрузка KV-кэша в оперативку: под кэш отдано 256 гигабайт. На портале с агентом человек уходит наобед и возвращается в тот же диалог на полмиллиона токенов: без выгрузки он ждёт минуту пересчёта снуля, с ней три с половиной секунды.

Сырые цифры: генерация в один поток около 180 токенов в секунду, на 32 параллельных запросах больше тысячи. При этом модель прекрасно живёт на двух карточках, а большому GLM надо минимум четыре. Такчто основную модель мы немного разгрузили: запросы вида «создай документ по такому-то шаблону» или«разберись, что тут в этом экселевском файле» Flash отлично берёт на себя. Для более глубокогоанализа пользователи всё равно предпочитают полный GLM-5.3.

Дальше пересказ клода как он мучился ;)

Offload не запускался. Сервер отказывался стартовать с текстом «включите префиксное кэширование, чтобы выровнять размеры блоков». Оно было включено. У модели три вида памяти на запрос: обычный KV-кэш attention-слоёв, состояние линейных слоёв и третий, крошечный буфер на четыре токена для индексера (это блок, который решает, на какие токены контекста смотреть разреженному вниманию; ключи он сжимает пачками по четыре, и незавершённой пачке нужно где-то ждать). Для менеджера памяти он выглядит как обычный кэш и попадает в общую проверку делимости, где четыре на 2304 не делится никогда. Фикс ушёл в ветку, из которой в vLLM собирают поддержку Flash: [ZJY0516/vllm#9](https://github.com/ZJY0516/vllm/pull/9), сама поддержка модели идёт в апстрим отдельным PR [#53906](https://github.com/vllm-project/vllm/pull/53906). Текст ошибки честно описывал, что проверка упала, и ничего не говорил почему. Официальный рецепт советует держать KV в fp8, и с ним сервер падал: стартовал, двадцать минут прогревал вычислительные графы и валился, флаг выбирает кернел, написанный под раскладку кэша моделей DeepSeek, а у Flash она другая, в её кэше нет позиционной части. Полная GLM-5.3 и 5.2 хранят кэш как DeepSeek, рецепт писали под них. После правок fp8 для KV заработал: на двух картах кэша хватает на 4.9 миллиона токенов, около 13.7 килобайта на токен. При миллионном окне это почти пять параллельных сессий с полным контекстом на двух картах, а внешний кэш в оперативке ловит около 72 процентов обращений. Флаги в итоге такие: `--tensor-parallel-size 2 --gpu-memory-utilization 0.95 --kv-cache-dtype fp8 --max-model-len 1048576`, MTP на три токена и `OffloadingConnector` с `cpu_bytes_to_use` на 256 гигабайт.

Claude Code, о том как он мучился ;)

Если кто захочет запустить на H200, образ тут:

docker pull ghcr.io/drakosha/vllm-openai:glm53-flash-main-20260903

Чуть более подробно, с блоком compose:

11