Перейти к содержанию

Запуск локальной LLM

На GPU с 32 GB VRAM удобно запускать LLM двумя способами: через vLLM или через llama.cpp.

Способ Когда использовать
vLLM Нужен быстрый OpenAI-compatible API для AWQ/GPTQ моделей
llama.cpp Нужны GGUF-модели и простой запуск без большого Python-стека

Для 32 GB VRAM берите 4-bit или 8-bit модели. Dense-модель 35B в FP16/BF16 обычно не помещается.

Быстрый выбор модели

Ориентиры ниже получены на RTX 5090 32 GB в llama.cpp: llama-bench, flash attention, batch 2048, ubatch 512. TG tok/s - скорость генерации, VRAM 32K - память на контексте 32K.

Сценарий Модель и квант Тип TG tok/s VRAM 32K Max ctx
Максимальная скорость Qwen3.6-35B-A3B Q4_K_M MoE 274.8 21.8 GB 256K
Длинный контекст и RAG Qwen3.6-27B Q4_K_M Dense 76.5 18.7 GB 128K+
Длинный контекст и RAG, Unsloth-квант Qwen3.6-27B UD-Q4_K_XL Dense 73.8 19.5 GB 128K+
Код и агентные задачи Devstral Small 2 Q4_K_M Dense 96.9 19.3 GB 64K
Код и агентные задачи, Unsloth-квант Devstral Small 2 UD-Q4_K_XL Dense 96.1 19.5 GB 64K
Короткие быстрые задачи Gemma 4 26B UD-Q4_K_XL MoE 222.5 18.3 GB 256K
Общий dense-вариант Mistral Small 3.1 Q4_K_M Dense 101.5 19.3 GB 64K

Что брать на практике:

  • нужен быстрый чат или API со стримингом - Qwen3.6-35B-A3B Q4_K_M;
  • нужен RAG, суммаризация длинных документов или code review больших файлов - Qwen3.6-27B Q4_K_M или UD-Q4_K_XL;
  • нужен кодовый помощник - Devstral Small 2, лучше UD-Q4_K_XL, если есть подходящий GGUF;
  • нужна высокая скорость на коротком контексте - Gemma 4 26B, но не используйте ее для длинного контекста, если важна точность.

Как выбрать квант

Q4_K_M - стандартный безопасный выбор. Он есть почти у всех GGUF-моделей.

UD-Q4_K_XL - динамический квант от Unsloth. В тестах он почти не отличался по скорости от Q4_K_M, но занимал на 100-750 MB больше VRAM. Его имеет смысл брать, если хотите лучший квант без заметной потери скорости.

Подключение и порты

SSH-команду возьмите из блока Данные для подключения в карточке сервера.

Пример:

ssh root@203.0.113.10 -p 42000

Для API смотрите блок Проброшенные порты.

В нем есть две важные колонки:

  • Внешний - порт, который открывается снаружи;
  • Контейнер - порт внутри пода, на котором должен слушать сервис.

Например: vLLM слушает контейнерный порт 9000, а в карточке указано Внешний 42002 -> Контейнер 9000. Значит, снаружи API будет доступен через порт 42002.

Подробнее: Порты и веб-сервисы.

Где хранить модели

Работайте внутри /workspace:

cd /workspace

Создайте папки:

mkdir -p models logs

Модели, кэши и логи держите в /workspace.

Токен Hugging Face

Публичные модели обычно скачиваются без токена.

Токен нужен, если:

  • Hugging Face ограничивает скачивание;
  • модель gated/private;
  • вы скачиваете много больших файлов.

Указать токен:

export HF_TOKEN="hf_xxx"

Для vLLM:

export HF_HOME=/workspace/.hf-cache
mkdir -p "$HF_HOME"

Для llama.cpp:

export LLAMA_CACHE=/workspace/.llama-cache
mkdir -p "$LLAMA_CACHE"

Если модель скачивается слишком долго, проверьте скорость сети:

npm i -g internometr
internometr json

Пример результата:

{"download":883.4,"upload":945.7,"ping":7,"jitter":2}

Запуск через vLLM

Создать окружение

cd /workspace
uv venv .venv-qwen
source .venv-qwen/bin/activate
uv pip install -U pip
uv pip install -U vllm --torch-backend auto

Выбрать модель

Стабильный вариант:

QWEN_MODEL="Qwen/Qwen3-32B-AWQ"

Если нужна Qwen-family модель класса 35B, можно попробовать community AWQ-чекпойнт:

QWEN_MODEL="Chunity/Qwen3.6-35B-A3B-AutoRound-AWQ-4bit"

35B community-вариант лучше считать экспериментальным. Если упираетесь в VRAM, переходите на Qwen/Qwen3-32B-AWQ.

Запустить vLLM-сервер

cd /workspace
source .venv-qwen/bin/activate

export HF_HOME=/workspace/.hf-cache
export QWEN_MODEL="Qwen/Qwen3-32B-AWQ"

vllm serve "$QWEN_MODEL" \
  --host 0.0.0.0 \
  --port 9000 \
  --dtype auto \
  --quantization awq \
  --max-model-len 16384 \
  --gpu-memory-utilization 0.90 \
  --reasoning-parser qwen3

Если не хватает VRAM, уменьшите контекст:

--max-model-len 8192

Для экспериментального 35B AWQ-варианта:

cd /workspace
source .venv-qwen/bin/activate

export HF_HOME=/workspace/.hf-cache
export QWEN_MODEL="Chunity/Qwen3.6-35B-A3B-AutoRound-AWQ-4bit"

vllm serve "$QWEN_MODEL" \
  --host 0.0.0.0 \
  --port 9000 \
  --dtype auto \
  --quantization awq_marlin \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.88 \
  --max-num-seqs 1 \
  --trust-remote-code \
  --reasoning-parser qwen3

На RTX 5090 32 GB этот 35B AWQ-вариант с --max-model-len 16384 может упасть с CUDA out of memory во время KV/cudagraph profiling. Для single-user inference рабочая быстрая конфигурация: --max-model-len 8192, --quantization awq_marlin, --gpu-memory-utilization 0.88, --max-num-seqs 1, без --enforce-eager. Это оставляет torch.compile и CUDA graphs включенными. Если нужен batching или быстрый аварийный запуск после OOM, можно временно вернуть --enforce-eager, но single-request decode будет заметно медленнее.

Проверить vLLM API

Проверить список моделей:

curl http://127.0.0.1:9000/v1/models

Проверить chat completion:

curl http://127.0.0.1:9000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3-32B-AWQ",
    "messages": [
      {
        "role": "user",
        "content": "Напиши короткую инструкцию по проверке GPU в Linux."
      }
    ],
    "temperature": 0.2,
    "max_tokens": 512,
    "chat_template_kwargs": {
      "enable_thinking": false
    }
  }'

Для Qwen reasoning-моделей параметр chat_template_kwargs.enable_thinking=false нужен, если хотите получить обычный ответ в message.content. Без него модель может писать рассуждение в поле reasoning, а content останется пустым при малом max_tokens.

Запуск через llama.cpp

Собрать llama.cpp с CUDA

cd /workspace
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp

cmake -B build \
  -DGGML_CUDA=ON \
  -DCMAKE_BUILD_TYPE=Release

cmake --build build --config Release -j --target llama-server llama-cli

Если /workspace/llama.cpp уже существует:

cd /workspace/llama.cpp
git pull
cmake -B build \
  -DGGML_CUDA=ON \
  -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j --target llama-server llama-cli

Выбрать модель

Выберите модель из таблицы выше и найдите для нее GGUF-репозиторий на Hugging Face.

Для максимальной скорости можно начать с Qwen3.6-35B-A3B:

LLAMA_MODEL="Infatoshi/Qwen3.6-35B-A3B-GGUF:Q4_K_M"

Это MoE-модель: 35B параметров всего и примерно 3B активных параметров на токен. В замерах она дала около 275 tok/s на генерации.

Если нужен более надежный длинный контекст, берите Qwen3.6-27B в Q4_K_M или UD-Q4_K_XL. Если подходящего GGUF нет под рукой, используйте стабильный официальный fallback:

LLAMA_MODEL="Qwen/Qwen3-32B-GGUF:Q4_K_M"

Запустить llama.cpp server

cd /workspace/llama.cpp
export LLAMA_CACHE=/workspace/.llama-cache
export LLAMA_MODEL="Infatoshi/Qwen3.6-35B-A3B-GGUF:Q4_K_M"

./build/bin/llama-server \
  -hf "$LLAMA_MODEL" \
  --host 0.0.0.0 \
  --port 9000 \
  -ngl 99 \
  -c 32768 \
  -fa on \
  --jinja \
  --reasoning off

Если не хватает VRAM, уменьшите контекст:

-c 16384

Для официального 32B fallback:

cd /workspace/llama.cpp
export LLAMA_CACHE=/workspace/.llama-cache
export LLAMA_MODEL="Qwen/Qwen3-32B-GGUF:Q4_K_M"

./build/bin/llama-server \
  -hf "$LLAMA_MODEL" \
  --host 0.0.0.0 \
  --port 9000 \
  -ngl 99 \
  -c 32768 \
  -fa on \
  --jinja \
  --reasoning off

Проверить llama.cpp API

Проверить список моделей:

curl http://127.0.0.1:9000/v1/models

Проверить chat completion:

curl http://127.0.0.1:9000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer no-key" \
  -d '{
    "model": "Infatoshi/Qwen3.6-35B-A3B-GGUF:Q4_K_M",
    "messages": [
      {
        "role": "user",
        "content": "Напиши короткую инструкцию по проверке GPU в Linux."
      }
    ],
    "temperature": 0.2,
    "max_tokens": 512
  }'

CLI-проверка без сервера

cd /workspace/llama.cpp
export LLAMA_CACHE=/workspace/.llama-cache

./build/bin/llama-cli \
  -hf "Infatoshi/Qwen3.6-35B-A3B-GGUF:Q4_K_M" \
  -ngl 99 \
  -c 8192 \
  -fa on \
  --jinja \
  -p "Напиши один абзац о том, что такое llama.cpp."

Запуск в фоне

Для долгого запуска используйте tmux.

Создать сессию:

tmux new -s llm

Внутри сессии запустите vLLM или llama.cpp.

Отключиться от tmux, не останавливая процесс:

Ctrl+B
D

Вернуться:

tmux attach -t llm

Пример запуска vLLM с логом:

cd /workspace
source .venv-qwen/bin/activate
mkdir -p logs

vllm serve "Qwen/Qwen3-32B-AWQ" \
  --host 0.0.0.0 \
  --port 9000 \
  --dtype auto \
  --quantization awq \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.90 \
  2>&1 | tee /workspace/logs/vllm.log

Пример запуска llama.cpp с логом:

cd /workspace/llama.cpp
mkdir -p /workspace/logs

./build/bin/llama-server \
  -hf "Infatoshi/Qwen3.6-35B-A3B-GGUF:Q4_K_M" \
  --host 0.0.0.0 \
  --port 9000 \
  -ngl 99 \
  -c 32768 \
  -fa on \
  --jinja \
  --reasoning off \
  2>&1 | tee /workspace/logs/llama-cpp.log

Подробнее: Фоновые процессы через tmux.

Проверка GPU

Во время запуска модели проверьте GPU:

nvidia-smi

Смотреть в реальном времени:

watch -n 1 nvidia-smi

Частые ошибки

CUDA out of memory

Проверьте VRAM:

nvidia-smi

Что сделать:

  • уменьшить context length: --max-model-len 16384 для vLLM или -c 16384 для llama.cpp;
  • использовать Q4/AWQ модель;
  • остановить лишние процессы;
  • перейти с 35B community-варианта на 32B fallback.

Сервис не открывается снаружи

Проверьте, что сервер запущен на 0.0.0.0:

ss -lntp

Если ss не найден:

apt update
apt install -y iproute2

Если видно 127.0.0.1:9000, сервис доступен только внутри пода.

Проверьте, что открываете внешний порт из карточки сервера. Если в карточке указано Внешний 42002 -> Контейнер 9000, снаружи нужен порт 42002.

Hugging Face не скачивает модель

Укажите токен:

export HF_TOKEN="hf_xxx"

После этого повторите команду запуска.

llama.cpp работает на CPU

Проверьте сборку:

/workspace/llama.cpp/build/bin/llama-server --version

Пересоберите с CUDA:

cd /workspace/llama.cpp
cmake -B build -DGGML_CUDA=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j --target llama-server llama-cli