Skip to main content

Put your GPU to use

Your GPU is idle right now. lmstack turns it into a coding endpoint your editor talks to like any other provider — no cloud tokens, no rate limits, no data leaving the box.

Bring a DGX Spark, a gaming desktop, or the AMD laptop you already own. The default catalog comes up on 8 GiB of VRAM. More than that and the skill notices and offers you a bigger model.

Start here

You need four things on the control host — the machine you write code on:

  • picurl -fsSL https://pi.dev/install.sh | sh
  • Ansibleuv tool install ansible-core
  • tmux — your package manager (apt install tmux, brew install tmux, etc.)
  • A GPU host — this machine, or one you can SSH to

Then, inside pi (or Claude Code, or opencode), paste this:

install the lmstack skill from https://ric03uec.github.io/lmstack/install

Followed by:

use the lmstack skill to give me a starting point

The skill takes it from there — probe, classify, show you the diff, hand you any sudo commands, run the playbooks, wire pi at your new endpoint. Point it at a remote box by giving an SSH target instead of localhost.

If you would rather do it yourself, the Quickstart is the same work, done by hand.

What actually gets built

control host — where you write code
┌─────────────────────────────────────────────────────────────┐
│ pi · Claude Code · opencode │
│ pi-config/ — one provider entry per host, and the same │
│ model alias on both, so switching is a flag not a rewrite │
└──────────────────────────────┬──────────────────────────────┘
│ OpenAI-compatible + master key
┌───────────────┴───────────────┐
│ │
┌──────────────▼──────────────┐ ┌──────────────▼──────────────┐
│ h1-nvidia — NVIDIA + CUDA │ │ h2-amd — AMD, or localhost │
├─────────────────────────────┤ ├─────────────────────────────┤
│ LiteLLM :4000 │ │ LiteLLM :4000 │
│ routing · keys · usage │ │ routing · keys · usage │
│ │ │ │ │ │
│ ┌────▼──────────────────┐ │ │ ┌────▼──────────────────┐ │
│ │ vLLM :8001 │ │ │ │ llama.cpp :8001 │ │
│ │ qwen2.5-coder-7b │ │ │ │ qwen2.5-coder-7b │ │
│ │ CUDA · AWQ 4-bit │ │ │ │ Vulkan · GGUF Q4_K_M │ │
│ └───────────────────────┘ │ │ └───────────────────────┘ │
│ │ │ │
│ Postgres — no ports at all │ │ Postgres — no ports at all │
└─────────────────────────────┘ └─────────────────────────────┘

Read it in three layers.

The boundary. Only :4000 leaves either box. Engines bind 127.0.0.1 and Postgres publishes nothing at all, so the gateway is the only thing an attacker on your LAN can reach — and tests/render_test.sh fails the build if a template ever stops doing that. Putting the host on Tailscale rather than opening a firewall port is the recommended way in.

The gateway. LiteLLM holds the routing table, the master key, and the usage UI. It is what makes two very different engines look like one OpenAI-compatible provider, and it is why the control host needs no per-engine knowledge.

The engines. One container per active model, numbered from :8001. Adding a model to active_models adds a container; the VRAM budget check is what stops you adding one that will not fit.

The two hosts are not a cluster. Nothing balances between them and they do not know about each other — they are two independent boxes your editor can point at, which is why moving a workload between them is a --provider change.

What it is for

Running a coding model on your own GPU, and having your editor treat it like any other provider. Two host roles ship working:

Host roleHardwareEngineWhy
h1-nvidiaNVIDIA + CUDAvLLMThroughput, and the most mature tool-call parsing.
h2-amdAMD iGPU, APU, or dGPU — including the laptop you are reading this onllama.cpp (Vulkan)Vulkan runs on the AMD hardware you already have. ROCm supports a narrow list of cards.

Both expose the alias qwen2.5-coder-7b. Moving a workload from a DGX to a laptop is a --provider change and nothing else.

The floor is 8 GiB

The default catalog is sized so that the first make up succeeds on an 8 GiB card. That constraint drove real decisions — AWQ 4-bit rather than FP16 weights on NVIDIA, Q4_K_M rather than Q8 on AMD — and they are documented where they were made, in each model's YAML.

On unified-memory AMD APUs the useful figure is the GTT budget, not the BIOS VRAM carve-out. A laptop reporting "2 GiB of VRAM" usually has around 30 GiB available. The probe works this out rather than asking you.

What this is not

It is not a production serving platform. There is no autoscaling, no multi-node scheduling, no authentication beyond a single LiteLLM master key, and no attempt at high availability. It is a development stack: one box, a couple of models, an endpoint that stays up.

It also will not run on CPU. Inference without a GPU is slow enough to look broken, so the installer refuses rather than giving you something you would blame on the repo.

Where to go next

  • Install the skill — the page you paste at your agent, and how to do it by hand.
  • The skill — what the installer does at each phase, and what it refuses to do.
  • Quickstart — the same work done explicitly, without an agent.
  • Troubleshooting — when the endpoint does not answer.