Skip to main content

CLI for managing LLM inference on GPU workstations

Project description

vserve

A CLI for managing LLM inference on GPU workstations.

Download models. Auto-tune limits. Serve with one command. Multiple backends.

Python 3.12+ vLLM 0.19+ llama.cpp Tests License


Install

uv tool install vserve

Or with pip:

pip install vserve

For llama.cpp GGUF tuning support:

pip install 'vserve[llamacpp]'

Quick Start

vserve init                        # scan GPU, backends, CUDA, systemd — write config
vserve add                         # search HuggingFace, pick variant, download
vserve run <model>                 # auto-tune + interactive config + serve
vserve run <model> --tools         # enable tool calling (auto-detected)
vserve run <model> --backend llamacpp  # force a specific backend

Backends

vserve auto-detects the right backend from the model format:

Format Backend Engine
safetensors, GPTQ, AWQ, FP8 vLLM PagedAttention, continuous batching
GGUF llama.cpp CPU/GPU offload, quantized inference

No configuration needed — download a model and vserve run picks the right engine.

vLLM

The default for transformer models in safetensors format. Optimized for high-throughput serving with PagedAttention, KV cache management, and automatic batching.

  • Auto-tunes --max-model-len, --max-num-seqs, --kv-cache-dtype based on your GPU
  • Tool calling with parser auto-detection (Qwen, Llama, Mistral, DeepSeek, Gemma, GPT-OSS)
  • Systemd service management via vllm.service

llama.cpp

For GGUF quantized models. Serves via llama-server with an OpenAI-compatible API.

  • Auto-calculates --n-gpu-layers, --ctx-size, --parallel based on VRAM
  • Partial GPU offload — serve models that don't fully fit in VRAM
  • Tool calling via --jinja (no parser configuration needed)
  • Systemd service management via llama-cpp.service

What It Does

vserve manages the full lifecycle of serving LLMs on a GPU workstation:

  • Download — search HuggingFace, see available weight variants (FP8, NVFP4, BF16, GGUF) with sizes, download only what you need
  • Auto-tune — calculate exactly what context lengths and concurrency your GPU can handle, based on model architecture and available VRAM
  • Tool calling — auto-detects the correct parser from the model's chat template (vLLM) or uses --jinja (llama.cpp)
  • Run/Stop — interactive config wizard, systemd service management, health check with timeout
  • Fan control — temperature-based curve daemon with quiet hours, or hold a fixed speed
  • Multi-user — session-based GPU ownership prevents other users from disrupting your running model
  • Doctor — diagnose GPU, CUDA, backend, systemd issues with actionable fix suggestions

Commands

Command Description
vserve Dashboard — GPU, models, status
vserve init Auto-discover backends and write config
vserve list [name] List models with backend, tools, and limits
vserve add [model] Search and download from HuggingFace with variant picker
vserve rm <name> Remove a downloaded model
vserve tune [model] Calculate context/concurrency limits
vserve run [model] Configure and start serving (auto-tunes if needed)
vserve run <model> --tools Start with tool calling enabled
vserve run <model> --backend llamacpp Force a specific backend
vserve stop Stop the running server
vserve status Show current serving config
vserve fan [auto|off|30-100] GPU fan control with temp-based curve
vserve doctor Check system readiness
vserve cache clean [--all] Clean stale sockets and JIT caches
vserve version Show current version and check for updates
vserve update Update vserve to the latest version

All commands support fuzzy matchingvserve run qwen fp8 finds the right model.


Tool Calling

vLLM

Auto-detects the correct vLLM parser by reading the model's chat template:

Model Family Tool Parser Reasoning Parser
Qwen 2.5 hermes
Qwen 3 hermes qwen3
Qwen 3.5 qwen3_coder qwen3
Llama 3.1 / 3.2 / 3.3 llama3_json
Llama 4 llama4_pythonic
Mistral / Mixtral mistral mistral
DeepSeek V3 / R1 deepseek_v3 deepseek_r1
Gemma 4 gemma4 gemma4
GPT-OSS openai openai_gptoss

Detection is template-based (not model-name regex), so it works for fine-tunes and community uploads.

llama.cpp

Uses --jinja to read the model's chat template directly. No parser selection needed — one flag covers all model families.


Prerequisites

Requirement Check Install
NVIDIA GPU + drivers nvidia-smi nvidia.com/drivers
CUDA toolkit nvcc --version sudo apt install nvidia-cuda-toolkit
systemd (most Linux servers) See troubleshooting
sudo access for systemctl, fan control

For vLLM backend:

Requirement Check Install
vLLM 0.19+ vllm --version docs.vllm.ai

For llama.cpp backend:

Requirement Check Install
llama-server llama-server --version github.com/ggml-org/llama.cpp

Configuration

Auto-discovered on first run. Override at ~/.config/vserve/config.yaml:

# Shared
port: 8888

# vLLM
vllm_root: /opt/vllm
cuda_home: /usr/local/cuda
service_name: vllm
service_user: vllm

# llama.cpp (optional)
llamacpp_root: /opt/llama-cpp
llamacpp_service_name: llama-cpp
llamacpp_service_user: llama-cpp

Directory Layout

/opt/vllm/                     # vLLM backend
├── venv/bin/vllm              # Python venv
├── models/                    # safetensors models
├── configs/                   # limits + profiles
└── logs/

/opt/llama-cpp/                # llama.cpp backend
├── bin/llama-server           # compiled binary
├── models/                    # GGUF models
├── configs/                   # JSON configs
└── logs/

Fan Control

vserve fan              # show status, interactive menu
vserve fan auto         # temp-based curve with quiet hours
vserve fan 80           # hold at 80% (persistent daemon)
vserve fan off          # stop daemon, restore NVIDIA auto

The auto curve ramps with temperature and caps fan speed during quiet hours (configurable). Emergency override at 88C ignores quiet hours.


Architecture

vserve uses a Backend Protocol pattern. Each inference engine implements the same interface:

Backend Protocol
├── VllmBackend        — safetensors, AWQ, FP8, GPTQ
├── LlamaCppBackend    — GGUF
└── (future: SGLang, etc.)

The registry auto-detects the right backend from the model format. All CLI commands work through the protocol — no backend-specific code in the command layer.


Development

git clone https://github.com/Gavin-Qiao/vserve.git
cd vserve
uv sync --dev
uv run pytest tests/              # 318 tests
uv run ruff check src/ tests/     # lint
uv run mypy src/vserve/           # type check

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vserve-0.5.1a3.tar.gz (117.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vserve-0.5.1a3-py3-none-any.whl (60.8 kB view details)

Uploaded Python 3

File details

Details for the file vserve-0.5.1a3.tar.gz.

File metadata

  • Download URL: vserve-0.5.1a3.tar.gz
  • Upload date:
  • Size: 117.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vserve-0.5.1a3.tar.gz
Algorithm Hash digest
SHA256 3e20e68a3a54d7784761eccb81a793ce3577e689712642703535ed026ed4e318
MD5 501a3acd33c0fdd0bad95eb32d8a1dfa
BLAKE2b-256 f75009b0d77eec97b9bccf1cf52c0a198f6299a2ffe003f1735c5420db023b19

See more details on using hashes here.

Provenance

The following attestation bundles were made for vserve-0.5.1a3.tar.gz:

Publisher: publish.yml on Gavin-Qiao/vserve

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vserve-0.5.1a3-py3-none-any.whl.

File metadata

  • Download URL: vserve-0.5.1a3-py3-none-any.whl
  • Upload date:
  • Size: 60.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vserve-0.5.1a3-py3-none-any.whl
Algorithm Hash digest
SHA256 65d9a8a75cb0b1e0cde4b7e8faa734c985892aa2b79e53f1bf0113eb0cd39bf8
MD5 4c7ffa20781b84d1ae5c8ee84b2d24c0
BLAKE2b-256 e35e9c1a3c54b7cf62a2c6391a17f5faf8eb2643632241b0b336920326027070

See more details on using hashes here.

Provenance

The following attestation bundles were made for vserve-0.5.1a3-py3-none-any.whl:

Publisher: publish.yml on Gavin-Qiao/vserve

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page