# vLLM cpu-offload-gb: перенести часть весов в RAM и проверить эффект

Источник: https://modelium.tech/zhurnal/vllm-cpu-offload-weights/

Параметр `--cpu-offload-gb` позволяет vLLM хранить часть весов модели в оперативной памяти (RAM), а не только в памяти видеокарты; число задаёт предел в GiB на GPU, не гарантированный объём переноса. Сравните запуск одной модели с нулём и ненулевым значением, журнал фактического переноса, занятость памяти и время одинаковых ответов. Это не перенос KV-кеша и не гарантия устранения ошибки нехватки памяти.

Модель почти помещается в видеопамять, но сервер vLLM не стартует? `--cpu-offload-gb` может оставить часть **весов модели** в оперативной памяти (RAM) и обращаться к ней во время ответа. Значение — предел переноса в GiB (примерно гигабайтах памяти) **на каждую видеокарту (GPU)**, а не обещание освободить столько же видеопамяти. Это не универсальное лечение ошибки нехватки памяти (`out of memory`): помимо весов память нужна для выполнения и истории запроса. [s1](#src-s1) [s2](#src-s2)

**Уровень: инженерный.** Нужны Linux, уже работающий NVIDIA GPU и навыки работы с терминалом; в документации v0.32.0 указаны Python 3.11–3.14 и GPU с compute capability от 7.5. На Windows без WSL эта установка не поддерживается. Инструкция сверена по документации и исходному коду **1 ноября 2026 года**, но Modelium **не запускал vLLM, GPU или модель**. Выбранная Qwen3-0.6B — небольшой учебный пример для проверки механизма; она может уже помещаться целиком в вашу видеопамять. Ни файл весов, ни чужое тестовое железо не дают нам минимального объёма RAM/VRAM именно вашего стенда. [s3](#src-s3) [s5](#src-s5) [s6](#src-s6)

## Как подготовить один проверяемый запуск?

Сначала убедитесь, что `nvidia-smi` видит GPU, и начните с [базового гайда vLLM](/zhurnal/vllm/). В отдельном окружении Python, после установки `uv` по [официальной инструкции](https://docs.astral.sh/uv/), команды `uv venv --python 3.12 --seed --managed-python` и `source .venv/bin/activate` создают и активируют окружение. Затем `uv pip install 'vllm==0.32.0' --torch-backend=auto` устанавливает фиксированную версию вместо перемещающегося `latest`. Сверьте результат через `vllm --version`. Установка пакета, служебных ядер и скачивание модели требуют сети и свободного места; точный минимум для вашей комбинации здесь не измерен. Не переносите этот рецепт на AMD, Mac или WSL без отдельной проверки их веток документации. [s3](#src-s3) [s9](#src-s9)

Запустите **первую попытку без переноса** в терминале: `vllm serve Qwen/Qwen3-0.6B --revision c1899de289a04d12100db370d81485cdf75e47ca --cpu-offload-gb 0 --host 127.0.0.1 --port 8000 --max-model-len 2048`. Модель загружается из конкретной ревизии на Hugging Face. Если сервер не поднимается, сохраните точную ошибку; не называйте любой сбой нехваткой видеопамяти. `127.0.0.1` ограничивает API данным компьютером. Если сервер готов, выполните учебный запрос ниже и запишите время ответа, затем остановите эту попытку `Ctrl+C` до второго запуска — порт нельзя занять дважды. [s1](#src-s1) [s4](#src-s4) [s5](#src-s5)

Теперь запустите **ту же модель на том же GPU** с единственным изменением `--cpu-offload-gb 0.5`: `vllm serve Qwen/Qwen3-0.6B --revision c1899de289a04d12100db370d81485cdf75e47ca --cpu-offload-gb 0.5 --host 127.0.0.1 --port 8000 --max-model-len 2048`. Это пробный верхний предел в GiB на один GPU, не рекомендуемый минимум RAM и не обещание, что перенесётся ровно 0,5 GiB. В режиме UVA сервер обращается к весам в оперативной памяти во время ответа, поэтому на медленной связи с видеокартой ответ может замедлиться. [s1](#src-s1) [s2](#src-s2)

## Что считать результатом, а не просто принятым флагом?

Запишите версию и полный журнал обеих попыток. При ненулевом переносе ищите строку `Total CPU offloaded parameters` с **ненулевым** значением; в чужом отчёте по V2 именно её сопоставили с загрузкой весов на GPU, но точный текст лога и величина могут меняться между версиями. В отдельном терминале после готовности сервера вызовите `curl -fsS http://127.0.0.1:8000/v1/models` и убедитесь, что видна нужная модель. Этот список **не** доказывает, что ответ модели уже получен или сколько весов перенесено. [s4](#src-s4) [s6](#src-s6) [s8](#src-s8)

Для учебного запроса отправьте `curl -fsS http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"Qwen/Qwen3-0.6B","messages":[{"role":"user","content":"Назови одним словом столицу Франции. /no_think"}],"max_tokens":32,"stream":false}'`. Ответ модели не выдумываем: проверьте, что HTTP-запрос завершился, в JSON есть `choices`, а содержимое соответствует вопросу. Повторите тот же запрос несколько раз **на обоих режимах**, сохранив время каждого ответа и занятость GPU (`nvidia-smi`) на одном стенде. Это сравнение на ваших условиях, не опубликованный нами benchmark; даже одинаковый ответ не доказывает одинаковую скорость или освобождение заданного объёма памяти. [s4](#src-s4) [s5](#src-s5)

## Что делать, если память не освободилась или запуск снова упал?

Проверьте ненулевое значение в журнале, версию и модель, а не только факт приёма флага. У пользователей Model Runner V2 старый аргумент мог молча игнорироваться: исправление PR #51413 вошло до тега v0.32.0, но issue #51396 формально оставался открытым на момент чтения. В комментариях авторы сообщали об успешном переносе на своих сборках, один отдельно уточнил разницу между v0.27.1 и v0.29.0; **это не доказательство работы на вашем железе или наш прогон v0.32.0**. Для WSL2 в другом авторском тесте потребовалась отдельная настройка pinned memory; сюда её не переносим как универсальный шаг. [s6](#src-s6) [s7](#src-s7) [s8](#src-s8)

При новой ошибке нехватки памяти остановитесь и сравните **весь** журнал: ограничения GPU, RAM, выбранный размер контекста и другие процессы. Перенос весов отличается от [настройки доли памяти GPU](/zhurnal/vllm-gpu-memory-utilization/) и от [переноса KV-кеша](/zhurnal/vllm-kv-offloading/) — памяти для уже обработанных частей текста; последний не уменьшает размер самих весов. Не открывайте сервер наружу ради проверки. Если упираетесь именно в историю длинных запросов, [изучите перенос KV-кеша отдельно](/zhurnal/vllm-kv-offloading/). [s1](#src-s1) [s2](#src-s2)

## Источники

1. [vLLM v0.32.0 — параметры vllm serve](https://docs.vllm.ai/en/v0.32.0/cli/serve/) — получено 2026-11-01
2. [vLLM v0.32.0 — исходный код OffloadConfig](https://github.com/vllm-project/vllm/blob/v0.32.0/vllm/config/offload.py) — получено 2026-11-01
3. [vLLM v0.32.0 — требования и установка на GPU](https://docs.vllm.ai/en/v0.32.0/getting_started/installation/gpu/) — получено 2026-11-01
4. [vLLM v0.32.0 — запуск OpenAI-совместимого сервера](https://docs.vllm.ai/en/v0.32.0/getting_started/quickstart/) — получено 2026-11-01
5. [Qwen3-0.6B — карточка и лицензия на закреплённой ревизии](https://huggingface.co/Qwen/Qwen3-0.6B/tree/c1899de289a04d12100db370d81485cdf75e47ca) — получено 2026-11-01
6. [vLLM issue #51396 и комментарий о собственном тесте V2](https://github.com/vllm-project/vllm/issues/51396) — получено 2026-11-01
7. [vLLM PR #51413 — поддержка переноса весов в Model Runner V2](https://github.com/vllm-project/vllm/pull/51413) — получено 2026-11-01
8. [vLLM issue #56283 и уточняющий комментарий автора](https://github.com/vllm-project/vllm/issues/56283) — получено 2026-11-01
9. [PyPI — vllm 0.32.0, опубликованный пакет](https://pypi.org/project/vllm/0.32.0/) — получено 2026-11-01
