Адаптация InferSim для моделирования нагрузки на промышленные GPU под специфические задачи

Привет, SE7EN! Меня зовут Дмитрий, я отвечаю за развитие продукта LLMaaS. Сегодня я хочу поделиться опытом проектирования инфраструктуры под ML-инференс. Мы столкнулись с классической дилеммой: как рассчитать потребности в железе для запуска больших языковых моделей (LLM) в реалиях текущего российского рынка. Ошибка в расчетах чревата серьезными финансовыми потерями — стоимость ускорителей сейчас такова, что любая неоптимальная закупка может критически ударить по бюджету команды. Вместо изобретения велосипеда мы решили адаптировать открытый симулятор InferSim от Alibaba, и сейчас я расскажу, что из этого вышло.

Что такое InferSim и в чем его преимущество

InferSim — это Python-симулятор, предназначенный для оценки критических метрик LLM-инференса: TTFT (Time To First Token), TPOT (Time Per Output Token) и общей пропускной способности (токенов в секунду). Поскольку инструмент разработан командой, стоящей за созданием vLLM, он обладает глубокой экспертизой в данной предметной области.

Ключевая особенность симулятора — двухэтапная методология:

  • Этап 1 (офлайн): запуск микро-бенчмарков на целевом оборудовании (с использованием инструментов вроде FlashInfer или sglang). Это позволяет сформировать профиль производительности — своего рода таблицу MFU (Model FLOPs Utilization), отражающую реальную отдачу GPU при конкретных операциях и размерностях.

  • Этап 2 (онлайн): расчет задержек на базе полученных MFU и аналитических моделей. После завершения первого этапа доступ к физическому GPU больше не требуется — оценить производительность системы, например, на базе H200, можно даже с обычного ноутбука.

Такой подход обеспечивает гораздо более высокую точность, чем попытки теоретического расчета пропускной способности памяти. Например, на этапе генерации (Decode) система часто упирается не столько в вычислительные мощности, сколько в работу с KV-кешем, и InferSim учитывает это максимально корректно. Эвристики были отточены на обширной базе тестов H800, H20 и GB200.

Однако «из коробки» поддержка ограничена рядом топовых ускорителей. Нам же требовалось интегрировать Metax C500 64GB и модель Qwen3-32B с её особенностями GQA, поэтому нам пришлось доработать исходный код.

Сначала мы добавили поддержку Metax C500. В файле hardware/gpu.py параметры ускорителей представлены в виде датаклассов. Мы внесли соответствующие спецификации:

c500 = GPU(
    fp16_tflops=280,            # оценочные данные согласно спецификации
    fp8_tflops=560,             # двукратное преимущество относительно FP16
    mfu=0.35,                   # эмпирическая гипотеза для уточнения
    mem=64,                     # емкость HBM2e на карту
    mem_bw=1800,                # пропускная способность памяти (ГБ/с)
    nvlink_bw=450 / 2,          # оценка пропускной способности MetaXLink
    rdma_bw=40 * 0.8,           # оптимистичная оценка RDMA
)

После внесения c500 в словарь gpu_map стала возможна симуляция с параметрами --device-type C500 --world-size 2. Несмотря на то, что параметры FLOPS пришлось оценивать (ввиду отсутствия официальных данных от MetaX), коэффициент mfu=0.35 показал результаты, максимально близкие к нашим замерам в реальных условиях.

Конфигурация модели: Qwen3-32B

Следующим шагом стала подготовка конфигурационного файла модели. InferSim ориентируется на стандартный config.json из экосистемы Hugging Face. Наш 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. Расчет прост: 5120 / 64 = 80. Ошибка в этом параметре приведет к неверному расчету нагрузки на KV-кеш и, как следствие, к неверной оценке параллелизма.

Интерактивная визуализация через Streamlit

Для удобства работы с результатами мы интегрировали симулятор со Streamlit. Это позволило отказаться от ручного анализа логов в пользу наглядного веб-интерфейса.

Алгоритм работы прост:

  1. Python-скрипт инициирует запуск main.py с нужными аргументами через subprocess.

  2. Результаты парсятся, извлекая метрики TTFT, TPOT и пропускную способность.

  3. Данные визуализируются с помощью matplotlib непосредственно в браузере.

Теперь любой участник команды может оперативно подобрать параметры GPU, количество карт и размер батча. Мы сразу видим влияние изменений, например, при активации квантования (--use-fp8-kv). Это экономит часы рутинной работы.

Интерфейс Streamlit для симуляции
Пользовательский интерфейс на Streamlit

Практическая польза в условиях дефицита

Рынок GPU сегодня — это сложная логистическая задача. Покупка оборудования «вслепую» — кратчайший путь к ошибке. Благодаря доработанному InferSim мы смогли:

  • Корректно сопоставить производительность одного H200 и связки из двух Metax C500. Выяснилось, что при высоких требованиях к параллельности 128 ГБ VRAM у двух C500 перевешивают преимущество в чистой скорости одного H200.

  • Найти оптимальный размер decode batchsize, избежав ошибок OOM и сохранив при этом высокую пропускную способность.

Безусловно, симулятор не дает 100% гарантий из-за зависимости от качества входных бенчмарков, но он отлично справляется с задачей исключения грубых просчетов.

Заключение

InferSim стал для нас незаменимым инструментом при планировании инвестиций в железо. В условиях высокой стоимости и дефицита оборудования возможность «прогнать» десятки конфигураций за вечер стоит дорогого. Это позволяет принимать взвешенные архитектурные решения на основе цифр, а не интуитивных догадок.

Приглашаю коллег тестировать наш инструмент и делиться опытом в комментариях!

Ссылки

Оригинальный репозиторий: https://github.com/alibaba/InferSim.

Наш форк с доработками: https://github.com/DmitriyKhodykin/InferSim

Подробнее об экономических аспектах закупки: https://habr.com/ru/articles/1026438/

 

Источник

Читайте также