Image

Как я экономлю на инференсе LLM-модели в облаке и не теряю в качестве

Если вы читаете этот текст, скорее всего, вы уже пробовали запустить LLM самостоятельно и, вполне вероятно, столкнулись с одной из типичных проблем:

«Заказал GPU, загрузил модель, а она не влезла, хотя по расчетам памяти должно было хватить».

«Платим за A100, а реально используем лишь 30% ее мощности».

Привет, на связи Павел, ML-инженер в Cloud.ru. Я прошел через эти проблемы сам, поэтому не понаслышке знаю, как это может раздражать.

Сегодня на примере настройки фреймворка VLLM покажу, как запускать крупные языковые модели без переплат за GPU. Мы разберемся, как VLLM распределяет vRAM, какие его параметры действительно влияют на потребление памяти и производительность, и как с их помощью гибко управлять балансом между затратами, скоростью и качеством модели.

54d5573421062f328c9a261865302b63

Чтобы эффективно управлять стоимостью инференса, важно понимать, из чего складывается работа LLM во время вывода. В отличие от стадии обучения, на этапе инференса не нужно выделять память под градиенты функции ошибки — это существенно снижает потребление видеопамяти. Тем не менее, нагрузка остается высокой и состоит из нескольких ключевых компонентов:

  • Веса модели — основная часть данных, хранящая обученные параметры.

  • KV-cache (Key-Value cache) — кеш промежуточных результатов механизма внимания, критичный для генерации последовательных токенов.

  • Буферы вычислений и CUDA Graphs — временные структуры, используемые для оптимизации скорости выполнения.

Давайте рассмотрим каждый из этих элементов подробнее.

Веса модели

Это наиболее очевидная часть — сами параметры модели. Размер весов модели можно оценить по количеству параметров и формату данных:

  • FP32 — 4 байта на параметр

  • BF16/FP16 — 2 байта на параметр

  • INT8 — 1 байт на параметр

  • INT4 (квантование) — 0.5 байта на параметр

Например, модель Llama-3 8B в формате BF16 занимает примерно:

8 * 10^9 параметров × 2 байта = 16 ГБ

Если же мы хотим более точно понимать размер модели в момент запуска, не скачивая веса, нужно знать размер и тип данных каждого тензора — эта информация хранится в начале GGUF-файла в разделе с метаданными. Перемножив размеры тензоров, мы получим количество чисел в каждом тензоре. А умножив затем тип данных на количество чисел в тензоре, узнаем, сколько места занимает один слой. Делаем так для всех слоев, складываем значения и получаем размер всей модели.

Для точной оценки без загрузки весов можно использовать transformers с init_empty_weights(). Под капотом веса модели будут размещены на meta-устройстве, особенностью которого является то, что каждый тензор PyTorch будет содержать информацию о размере и типе данных, но не будет выделять память под сами тензоры.

from transformers import AutoModel, AutoConfig from accelerate import init_empty_weights model_config = AutoConfig.from_pretrained(«meta-llama/Meta-Llama-3-8B») with init_empty_weights(): model = AutoModel.from_config(model_config)

KV-cache

KV-cache — это кеш, в котором хранятся вычисленные ключи (K) и значения (V) для каждого токена в контексте. Он позволяет избежать пересчета внимания на каждом шаге, но сильно увеличивает потребление памяти, особенно при длинных диалогах.

В VLLM используется PagedAttention, где память под KV-cache выделяется блоками и выделяется в последнюю очередь: после размещения весов модели, построения CUDA-графов и других компонентов. VLLM делит оставшуюся память на блоки, а затем проверяет, хватит ли их для указанной длины контекста. Формула вычисления размера одного блока выглядит следующим образом:

размер блока = 2 × block_size × num_kv_heads × head_size × num_hidden_layers × dtype_num_bytes

Где:

  • block_size — количество токенов в одном блоке (по умолчанию 16),

  • num_kv_heads — количество «голов» внимания для KV-cache,

  • head_size — размер одной «головы» внимания модели,

  • num_hidden_layers — количество скрытых слоев,

  • dtype_num_bytes — количество байт на одно число в формате KV-cache (2 для float16).

Опираясь на это, посчитаем размер блока и всего KV-сache, например, для Qwen3-32B. Его config.json выглядит следующим образом:

«hidden_size»: 5120, «num_attention_heads»: 64, «num_key_value_heads»: 8, «num_hidden_layers»: 64, «max_position_embeddings»: 40960, «head_dim»: 128, // если такого поля нет, то ==> hidden_size / num_attention_heads = 5120 / 64 = 80

Пусть head_size = 128, dtype_bytes = 2 (bfloat16):

Размер одного блока = 2 × 16 × 8 × 128 × 2 = 65,536 байт = 64 КБ

Количество блоков = ceil(длина_контекста / block_size) = ceil(40 960 / 16) = 2 560

Общий объем KV-cache на один слой:

2 560 × 64 КБ = 160 МБ

На первый взгляд — мало. Но это на слой.

Полный размер KV-cache = размер одного блока × количество слоев × количество блоков

160 МБ × 64 слоя = 10 ГБ

Это уже значительная часть памяти. Для Qwen3-32B с 40K контекста нужно заложить еще ~10 ГБ только под KV-cache.

Буферы вычислений и CUDA Graphs

VLLM для ускорения использует CUDA Graphs, которые предварительно «запекают» последовательность GPU-операций. Это снижает задержку, но требует дополнительной памяти.

Размер буферов можно оценить по формуле:

буферы ≈ context_length × (hidden_size + intermediate_size) × dtype_bytes

Для Qwen3-32B:

  • hidden_size = 5 120

  • intermediate_size = 25 600 (в FFN)

  • dtype_bytes = 2

  • context_length = 40 960

Буферы ≈ 40 960 × (5 120 + 25 600) × 2 ≈ 40 960 × 30 720 × 2 ≈ 2 ГБ

Overhead и системные накладные расходы

На системные нужды (администрирование памяти, библиотеки, контейнеры) стоит заложить 5–10% от общего объема vRAM.

Итоговая формула потребления vRAM

Общая память = веса модели + KV-cache + буферы вычислений + overhead (~5%)

Для Qwen3-32B (BF16):

  • веса: 64 ГБ (32B × 2),

  • KV-cache (40К): ~10 ГБ,

  • буферы: ~2 ГБ,

  • итого: ~80 ГБ.

Из чего складывается цена инференса

Цена за использование модели напрямую зависит от типа GPU, количества потребляемой vRAM и времени работы модели. Формула выглядит следующим образом:

итоговая стоимость = vRAM (ГБ) × цена 1 ГБ vRAM GPU + (запросы (в млн) × 12.8 ₽/1 млн запросов) + KV-cache (ГБ) × 0.013 ₽/(ГБ×ч)

Попробуем посчитать цену одного инстанса Qwen3-32B без сжатий и с полным контекстом. Я делаю это в облачном сервисе для запуска и развертывания ML- и DL-моделей:

$(80 times 4.35 + (5 times 12.8) + 66 times 0.013) times 1 = 412.858 ₽

Где:

  • 80 ГБ — количество vRAM в конфигурации GPU,

  • 4.35 ₽ — цена за использование 1 ГБ GPU в час,

  • 5 — запросы в миллионах,

  • 66 ГБ — объем файлов весов модели,

  • 1 — время в часах работы инференса.

Самый простой способ платить меньше — сократить время использования модели. В облаке есть режим serverless: когда модель простаивает, она уходит в сон, и оплата за этот период не начисляется. Когда появляются новые запросы — модель автоматически запускается заново.

На изображении ниже можно увидеть параметры масштабирования. Если минимальное количество экземпляров равно нулю, то модель будет работать в serverless-режиме, иначе минимум одна реплика модели всегда будет существовать.

e252a74ad2774d820529a1cb3643f6d3

При увеличении нагрузки возможно масштабирование модели вверх (будут запускаться дополнительные инстансы модели), вплоть пока количество моделей не достигнет максимального количества экземпляров. После того как нагрузка снизится, количество экземпляров снизится до минимального количества.

Второй вариант — уменьшить потребление видеопамяти. Об этом мы и поговорим подробно дальше.

Как уменьшить цену и не потерять в качестве

Уменьшение контекста модели

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

Для этого в параметрах запуска модели нужно настроить параметр max_model_len, выставив его таким образом, чтобы он был больше, чем суммарный объем входных запросов в модель и ее возможный ответ. На изображении ниже показано, как это выглядит при создании инференса VLLM в облаке.

003dc6ab13b24757bd2a11f5e3010a76

Использование квантованных моделей

В этом случае мы уменьшаем размер занимаемой vRAM непосредственно за счет сжатия весов модели. Изначально большинство моделей используют формат bfloat16, то есть 16 бит = 2 байта на один параметр. При квантовании этот параметр можно сжать вплоть до 1 бита на параметр, но я не рекомендую использовать квантование менее 4 бит на параметр — дальше качество сильно падает. Ниже изображены все GGUF квантизации модели Qwen-32b и сколько места будут занимать веса модели.

58b46a39e25fe5b4a631f7e779ddf054

Используя квантование в 4 бита, мы можем снизить объем, занимаемый весами модели, вплоть до 4 раз — с 64 ГБ до ~18 ГБ.

VLLM может произвести квантование модели на лету, но для более высокого качества лучше использовать уже квантованные модели. Для них есть готовый раздел на Hugging Face. Он находится в правой боковой панели. Нажав на Quantization, вы увидите все квантизации модели.

Для примера возьмем ту же qwen/Qwen3-32B-FP8.

f713c67a6b42a5e7b3a9c40cf8ab90e2

Квантование KV-cache

Помимо квантования самих весов, можно также квантовать и блоки KV-cache. Вместо 16 бит (bfloat16) их можно привести к формату FP8, тем самым снизив расходы на KV-cache в 2 раза: с 10 ГБ до 5 ГБ. При этом квантование KV-cache почти не ухудшает метрики модели и может применяться как к квантованным, так и к базовым моделям.

На изображении ниже можно увидеть список всех поддерживаемых форматов квантизации kv-cache в VLLM.

d5082b55b039fc34f0177769f7a93fa0

В общей сложности, применив квантование модели в FP8 и квантование KV-cache, можно запустить модель с полным контекстом на 40 ГБ vRAM, вместо изначальных 80 ГБ.

Что в итоге

Запуск LLM-моделей в облаке может быть достаточно гибким и эффективным — все зависит от того, насколько осознанно подходить к управлению ресурсами. На примере Qwen3-32B мы увидели, что изначальные требования к памяти (около 80 ГБ) ведут к высокой стоимости инференса — более 400 руб. в час при постоянной нагрузке.

Используя комбинацию простых, но мощных оптимизаций, можно сократить расходы в 2 раза и более, не сильно теряя при этом в качестве генерации:

  • квантование весов модели до FP8 сокращает объем;

  • квантование KV-cache до FP8 уменьшает потребление памяти под кеш;

  • оптимизация длины контекста — при необходимости дальнейшей экономии можно снизить max_model_len, особенно если полный контекст в 40К токенов не нужен;

  • serverless-режим позволяет платить только за активное время работы модели, а в периоды простоя полностью исключать затраты.

Экономить на инференсе LLM — не значит жертвовать качеством. Достаточно понимать, из чего складывается потребление памяти, и использовать доступные инструменты: квантование, управление контекстом и гибкое масштабирование.

С этими подходами вы можете запускать мощные модели даже в ограниченном бюджете — быстро, эффективно и без потерь.

Источник: habr.com

✅ Найденные теги: Как, новости

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Фото сгенерированных лиц: исследование показывает, что люди не могут отличить настоящие лица от сгенерированных
Нейросети построили капитализм за трое суток: 100 агентов Claude заперли…
Скетч: цифровой осьминог и виртуальный мир внутри компьютера с человечком.
Сцена с жестами пальцами, где один жест символизирует "VPN", а другой "KHP".
‼️Paramount купила Warner Bros. Discovery — сумма сделки составила безумные…
Скриншот репозитория GitHub "Claude Scientific Skills" AI для научных исследований.
Структура эффективного запроса Claude с элементами задачи, контекста и референса.
Эскиз и готовая веб-страница платформы для AI-дизайна в современном темном режиме.
ideipro logotyp
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

Учёные из Университета штата Северная Каролина представили композит нового поколения, способный самостоятельно восстанавливаться после серьёзных повреждений.  Речь идёт о модифицированном армированном волокном полимере (FRP), который не просто сохраняет прочность при малом весе, но и способен «залечивать» внутренние…

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых