Привет, Хабр! Меня зовут Дмитрий, я занимаюсь развитием продукта LLMaaS и сегодня хочу поделиться своим опытом моделирования загрузки оборудования для ML-инференса. Перед нами встала классическая задача: понять, сколько и какого железа закупать под большие языковые модели в условиях нашего сурового российского рынка. Ошибаться нельзя — цены на ускорители сегодня таковы, что одна незапланированная «стройка» может оставить команду без зарплаты. Решили не изобретать велосипед с нуля, а допилить открытый симулятор InferSim от Alibaba. О том, что у нас получилось, и пойдёт речь.
Что такое InferSim и почему он крут
InferSim — это Python-симулятор, который умеет вычислять ключевые метрики LLM-инференса: TTFT (время до первого токена), TPOT (время на каждый следующий токен) и пропускную способность в токенах в секунду. Авторы — ребята из Alibaba, они же разрабатывают vLLM, так что в LLM-инференсе разбираются очень хорошо.
Главная фишка симулятора — двухфазная архитектура:
Фаза 1 (офлайн): на целевом железе прогоняются микро-бенчмарки (через FlashInfer, sglang), которые снимают слепки реальной производительности: сколько флопсов GPU может выдать на типичных операциях внимания и матричных умножениях. Получается таблица MFU (Model FLOPs Utilization) для каждой комбинации «операция/размерность/GPU».
Фаза 2 (онлайн): сам симулятор на основе этих MFU и аналитических моделей вычисляет задержки. Больше никакого доступа к живому GPU не нужно — можно на лаптопе прикинуть, сколько H200 потянет пользователей.
Такая схема даёт гораздо более точные предсказания, чем чисто теоретические прикидки по пропускной способности памяти. Например, в фазе Decode модель часто упирается не в арифметику, а в загрузку KV-кеша, и InferSim это честно учитывает. Эвристики нарабатывались на основе большого количества реальных прогонов на H800, H20, GB200, так что им можно доверять.
Но есть нюанс: из коробки поддерживается только несколько «топовых» GPU и несколько моделей. Нам же нужны были Metax C500 64GB и Qwen3-32B с её хитрым GQA. Поэтому мы взяли напильник.
Первым делом нужно было объяснить симулятору, что такое Metax C500. В файле hardware/gpu.py все характеристики GPU хранятся в виде dataclass-экземпляров. Мы просто добавили новый:
c500 = GPU( fp16_tflops=280, # оценочно, по спецификациям fp8_tflops=560, # обычно в 2 раза выше FP16 mfu=0.35, # начальная гипотеза, позже уточним mem=64, # объём HBM2e на одной карте mem_bw=1800, # пропускная способность HBM2e (ГБ/с) nvlink_bw=450 / 2, # односторонняя пропускная способность MetaXLink (оценка) rdma_bw=40 * 0.8, # RDMA (оптимистично) )
После этого c500 попадает в словарь gpu_map, и можно запускать симуляцию с ключом --device-type C500 --world-size 2. Да, все параметры, кроме объёма памяти, пришлось оценивать — ребята из MetaX не публикуют точные значения FLOPS. Но для первого приближения хватило. Практика показала, что mfu=0.35 даёт разумные цифры, близкие к нашим реальным замерам.
Конфиг модели: Qwen3-32B без сюрпризов
Следующий шаг — конфигурационный файл модели. InferSim ожидает стандартный Hugging Face config.json. Мы приготовили qwen3_32b_config.json:
{ "model_type": "qwen3", "hidden_size": 5120, "num_hidden_layers": 64, "num_attention_heads": 64, "num_key_value_heads": 8, "head_dim": 80, "intermediate_size": 25600, "vocab_size": 151936, "max_position_embeddings": 40960 }
Самое важное здесь — правильно указать head_dim: 80, а не 128, как иногда ошибочно пишут. Расчёт элементарный: head_dim = hidden_size / num_attention_heads = 5120 / 64 = 80. Ошибка на этом этапе приведёт к завышению расхода KV-кеша и совершенно неверным оценкам параллелизма.
Визуализация: восхитительный Streamlit
Симулятор работает быстро, но каждый раз парсить глазами текстовый вывод, особенно когда нужно перебрать десятки комбинаций длин промптов и ответов, — то ещё удовольствие. Мы подружили InferSim с Streamlit, и получился лёгкий веб-инструмент для интерактивного подбора параметров.
Идея простая:
Скрипт на Python вызывает
main.pyс переданными через subprocess аргументами.Парсит stdout, вытаскивая из знакомых строк значения
TTFT (ms),TPOT (ms),Throughput (TGS:tok/GPU/s).Сохраняет результаты в Pandas DataFrame и рисует графики
matplotlibпрямо в браузере.
В Streamlit добавили выпадающие списки для выбора GPU, количества карт (world_size), модели, а также слайдеры для входных и выходных токенов. При изменении любого параметра автоматически запускается симуляция, и через пару секунд видим три графика: TTFT, TPOT и пропускную способность. Красота!

Теперь даже коллеги, далёкие от командной строки, могут прикинуть, сколько параллельных пользователей потянет связка из двух Metax на Qwen3-32B. Ответ часто удивляет: оказывается, памяти хватает на 42 одновременных запроса, а вот время ответа становится ~34 секунды, что для чат-бота уже «за гранью». Можно экспериментировать с квантизацией (--use-fp8-kv) и сразу видеть эффект.
Зачем это всё в суровой реальности
Российский рынок GPU сегодня напоминает квест: ускорители дороги, доступны не все, сроки поставок плавают. Покупать «на глаз» — почти гарантированно промахнуться. Либо возьмёте слишком слабое железо и пользователи разбегутся, либо переплатите за избыточную производительность, которую некуда применить.
Мы опробовали допиленный InferSim при планировании закупки под промышленный инференс. Он позволил:
Адекватно сравнить H200 (одна карта) и Metax C500 (две карты) для нашего сценария с длинными промптами. Оказалось, что по чистой скорости один H200 уделывает двух Metax, но если важна максимальная параллельность, связка из двух C500 выглядит интереснее за счёт 128 ГБ суммарной памяти.
Подобрать оптимальный
decode batchsize, чтобы не уйти в OOM и не потерять в throughput.
Конечно, симулятор не даёт 100% точности — всё упирается в качество бенчмарков. Для Metax мы использовали приближённые оценки, поэтому реальность может немного отличаться. Но даже такая модель спасает от грубых ошибок.
Вместо заключения
InferSim — один из тех инструментов, которые сложно переоценить, когда готовишь закупку под инференс. Он, конечно, не заменяет полноценный бенчмарк на живом железе, но от грубых ошибок защищает отлично. А грубая ошибка в нашем деле — это, например, взять два ускорителя под модель, которая и на одном помещается, или, наоборот, купить карты, которые не вытянут нужное количество параллельных пользователей.
В условиях, когда железо дорогое, дефицитное и достаётся с трудом, такой инструмент становится настоящей палочкой-выручалочкой. Экспертизы по планированию GPU для LLM на рынке сегодня немного — слишком быстро всё меняется. InferSim позволяет «проиграть» десятки сценариев за вечер и принять взвешенное решение, а не тыкать пальцем в небо.
Если будете пробовать — делитесь впечатлениями, будем рады обсудить нюансы в комментариях.
Ссылки
Репозиторий живёт на GitHub, ссылка на оригинал: https://github.com/alibaba/InferSim.
Ссылка на наши доработки: https://github.com/DmitriyKhodykin/InferSim
Описание экономический стороны вопроса рассматривал тут: https://habr.com/ru/articles/1026438/