vLLM cpu-offload-gb: перенести часть весов в RAM и проверить эффект
На странице · 3 разделов
Параметр `--cpu-offload-gb` позволяет vLLM хранить часть весов модели в оперативной памяти (RAM), а не только в памяти видеокарты; число задаёт предел в GiB на GPU, не гарантированный объём переноса. Сравните запуск одной модели с нулём и ненулевым значением, журнал фактического переноса, занятость памяти и время одинаковых ответов. Это не перенос KV-кеша и не гарантия устранения ошибки нехватки памяти.
Модель почти помещается в видеопамять, но сервер vLLM не стартует? --cpu-offload-gb может оставить часть весов модели в оперативной памяти (RAM) и обращаться к ней во время ответа. Значение — предел переноса в GiB (примерно гигабайтах памяти) на каждую видеокарту (GPU), а не обещание освободить столько же видеопамяти. Это не универсальное лечение ошибки нехватки памяти (out of memory): помимо весов память нужна для выполнения и истории запроса. s1 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 s5 s6
Как подготовить один проверяемый запуск?
Сначала убедитесь, что nvidia-smi видит GPU, и начните с базового гайда vLLM. В отдельном окружении Python, после установки 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 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 s4 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 s2
Что считать результатом, а не просто принятым флагом?
Запишите версию и полный журнал обеих попыток. При ненулевом переносе ищите строку Total CPU offloaded parameters с ненулевым значением; в чужом отчёте по V2 именно её сопоставили с загрузкой весов на GPU, но точный текст лога и величина могут меняться между версиями. В отдельном терминале после готовности сервера вызовите curl -fsS http://127.0.0.1:8000/v1/models и убедитесь, что видна нужная модель. Этот список не доказывает, что ответ модели уже получен или сколько весов перенесено. s4 s6 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 s5
Что делать, если память не освободилась или запуск снова упал?
Проверьте ненулевое значение в журнале, версию и модель, а не только факт приёма флага. У пользователей Model Runner V2 старый аргумент мог молча игнорироваться: исправление PR #51413 вошло до тега v0.32.0, но issue #51396 формально оставался открытым на момент чтения. В комментариях авторы сообщали об успешном переносе на своих сборках, один отдельно уточнил разницу между v0.27.1 и v0.29.0; это не доказательство работы на вашем железе или наш прогон v0.32.0. Для WSL2 в другом авторском тесте потребовалась отдельная настройка pinned memory; сюда её не переносим как универсальный шаг. s6 s7 s8
При новой ошибке нехватки памяти остановитесь и сравните весь журнал: ограничения GPU, RAM, выбранный размер контекста и другие процессы. Перенос весов отличается от настройки доли памяти GPU и от переноса KV-кеша — памяти для уже обработанных частей текста; последний не уменьшает размер самих весов. Не открывайте сервер наружу ради проверки. Если упираетесь именно в историю длинных запросов, изучите перенос KV-кеша отдельно. s1 s2
Источники
- vLLM v0.32.0 — параметры vllm serve — revision v0.32.0. Получено 01.11.2026.
- vLLM v0.32.0 — исходный код OffloadConfig — revision v0.32.0. Получено 01.11.2026.
- vLLM v0.32.0 — требования и установка на GPU — revision v0.32.0. Получено 01.11.2026.
- vLLM v0.32.0 — запуск OpenAI-совместимого сервера — revision v0.32.0. Получено 01.11.2026.
- Qwen3-0.6B — карточка и лицензия на закреплённой ревизии — revision c1899de289a04d12100db370d81485cdf75e47ca; README и LICENSE на одной ревизии сохранены; веса и запуск не скачивались.. Получено 01.11.2026.
- vLLM issue #51396 и комментарий о собственном тесте V2 — Прочитаны body и все комментарии; сообщение автора, не редакционный прогон.. Получено 01.11.2026.
- vLLM PR #51413 — поддержка переноса весов в Model Runner V2 — revision a671679e9f04742aecb2c9b35cd513a024c1321f; Merge SHA — предок v0.32.0 по compare API; копии и SHA в research/raw.. Получено 01.11.2026.
- vLLM issue #56283 и уточняющий комментарий автора — Автор уточнил, что v0.27.1 игнорировал аргумент, а v0.29.0 дал ненулевой перенос на его стенде; не тест v0.32.0.. Получено 01.11.2026.
- PyPI — vllm 0.32.0, опубликованный пакет. Получено 01.11.2026.