Вы когда-нибудь покупали промышленный GPU вслепую? Я да. И каждый раз это было как игра в русскую рулетку с бюджетом отдела. Однажды мы закупили партию L40s под инференс Mixtral 8x22B, а через месяц поняли: мощность есть, а latency такой, что пользователи успевали сходить за кофе, пока модель генерировала ответ. Ошибка стоила $120 000. И это мягко говоря.
Проблема в том, что типичный подход «купим побольше, а там разберёмся» — дорогой и неэффективный. Особенно в российских реалиях, где легальные поставки H100 перекрыты, а на рынке рулят «серые» A100, китайские Moore Threads и перегретые L20. Как заранее понять, сколько пользователей выдержит одна карта? Где bottleneck: память или compute? Ответ даёт симуляция. И лучший opensource-инструмент для этого — InferSim от Alibaba.
Почему InferSim и что с ним не так?
InferSim — это двухфазный симулятор. Первая фаза (profiling) собирает микро-бенчмарки: сколько времени занимает attention, feed-forward, embedding на конкретном GPU. Вторая (simulation) генерирует метрики: TTFT (time to first token), TPOT (tokens per output token), MFU (model flops utilization). По сути, можно виртуально прогнать любой LLM через железо, которое ещё не куплено.
Нюанс: из коробки InferSim заточен под эталонные китайские дата-центры с H800 и бешеной пропускной способностью NVLink. У нас — сборная солянка из карт, подключенных через PCIe 3.0 и общающихся по Ethernet. Оригинальные профили дают погрешность 30-40%. Нам придётся дорабатывать симулятор под своё железо.
Важно: InferSim не умеет моделировать связки из разных GPU (например, A100 + L20 в одной ноде). В этой статье будем считать, что кластер однородный. Разнородные конфигурации — тема отдельного расследования.
Пошаговый план: как адаптировать InferSim под российские GPU
1 Установка и первичный запуск
InferSim лежит на GitHub Alibaba. Клонируем репозиторий, ставим зависимости. Лучше использовать Python 3.11+ и CUDA 12.4 (актуально на апрель 2026).
git clone https://github.com/alibaba/infersim.git
cd infersim
pip install -r requirements.txt
python -m infersim --helpПопробуйте запустить встроенную модель на тестовом профиле — всё должно отработать. Если нет — проверьте, что nvidia-smi видит карты.
2 Запуск микро-бенчмарков
Нам нужен свой профиль для конкретного GPU. Создаём конфиг для бенчмаркинга. Пример для L20 (48GB, Ada Lovelace):
# benchmark_config.yaml
gpu: "NVIDIA L20"
model: "Qwen2.5-32B-Instruct"
batch_sizes: [1, 4, 8, 16, 32]
input_lengths: [128, 512, 1024]
output_lengths: [256, 512, 1024]
precision: "fp16"Запускаем сбор:
python -m infersim.profiler --config benchmark_config.yaml --output l20_profile.jsonЭто займёт несколько часов. На выходе получим файл с таймингами каждой операции. Совет: не выключайте тепловые троттлинги — они часть реальности. Если карта греется до 85°C на длинных прогонах, профиль это покажет.
3 Доработка симулятора: правим профили под российскую сеть
Теперь самое интересное. У нас узкий межсерверный канал (10GbE вместо 800GB/s NVLink). InferSim по умолчанию считает, что все GPU общаются с бесконечной пропускной способностью. Придётся вручную добавить penalty на пересылку тензоров.
Открываем l20_profile.json и добавляем секцию network_latency:
{
"gpu_name": "NVIDIA L20",
"network_bandwidth_gbps": 10,
"network_latency_us": 50,
"tensor_parallel_overhead": 0.15
}Поле tensor_parallel_overhead (15%) — это моя эмпирическая добавка для шины PCIe 3.0 x16. Без неё симуляция будет показывать TTFT в 2 раза лучше реальности. Проверено на стенде из 4-GPU фермы на X299.
Грабли: если вы используете китайские GPU (например, Moore Threads MT300), в профиле нужно заменить измерение памяти на HBM2e. Референсных значений нет — замеряйте сами. Иначе MFU упадёт на 20% из-за неверного времени загрузки кэша.
4 Симуляция и анализ метрик
Запускаем симуляцию с созданным профилем:
python -m infersim.simulator --profile l20_profile.json --model-config qwen32b.json --serve-config serve_config.yamlНа выходе — таблица с метриками. Пример для одного GPU L20, Qwen2.5-32B (int8), batch=1:
| Метрика | Значение | Допустимо? |
|---|---|---|
| TTFT (prefill) | 1.2 с | Высоковато |
| TPOT (decode) | 32 мс/токен | Норма |
| MFU | 38% | Низкий |
Как видите, TTFT вышел 1.2 с — для real-time чата это провал (должно быть < 500 мс). Причина: долгий prefill на маленьком batch. Решение: увеличить batch до 4. Дальше можно подбирать количество GPU через моделирование, не покупая железо.
5 Калибровка под реальную нагрузку
Симуляция — это всё же модель. Обязательно сверьтесь с реальными замерами на тестовом инференсе. Запустите Llama 3.2 90B (самая популярная модель 2026 года) на вашем L20 и замерьте actual TTFT. Если расхождение > 15%, вернитесь к профилю и проверьте параметры compute_capability и memory_bandwidth.
В моём опыте, чтобы попасть в 10%, пришлось три раза перемерять bandwidth GPU при помощи bandwidthTest из CUDA Samples и вручную вписать среднее значение. Автоматический сбор часто занижает bandwidth из-за фоновых процессов.
Частые ошибки и как их не допустить
- Забыли про NUMA. InferSim не знает о привязке GPU к CPU нодам. На двухсокетных системах (особенно на AMD EPYC) задержка межсокетного обмена может быть 300 нс вместо 80 нс. Последствия — TPOT скачет. Решение: в профиле добавьте флаг
numa_aware: trueи укажите topology. - Не учитываете снижение частоты из-за температуры. Российские ЦОДы не всегда имеют идеальное охлаждение. Если карты работают при 85°C, частоты падают на 10-15%. В профиле можно задать
thermal_throttle_percent: 0.15. Это спасёт от переоценки производительности. - Смешиваете batch modes. InferSim ожидает, что все запросы приходят в один batch. На практике бывает continuous batching (vLLM). Укажите в конфиге
batching: continuous— это изменит симуляцию.
Неочевидный совет: зачем вам симуляция, если есть облако?
Да, можно арендовать GPU в облаке и померить. Но, во-первых, это стоит денег уже на этапе планирования (час L20 — от $1.5). Во-вторых, вы не сможете легко перебрать десятки сценариев: разное количество пользователей, разные модели, различные степени квантизации. Симуляция даёт рычаг: меняете один параметр и через минуту видите, как меняются метрики. Это как шахматы, где можно ходить вслепую, не теряя фигуры.
Кстати, если вы всё же предпочитаете облачную аренду для финальной проверки, присмотритесь к агрегатору GPU-инстансов — там часто есть промокоды на первую аренду. Проверка одного сценария обойдётся в пару тысяч рублей. А вот на VPS для мелких экспериментов можно сэкономить, если модель небольшая.