GPU Backends.

Which llama.cpp backend ships bundled per platform, how to check what a machine actually detected, and how to swap in your own build.

Relay is alpha and unaccredited
Releases are pre-release versions on the 0.1.0-alpha.N → -beta.N → -rc.N → 0.1.0 ladder. The wire protocol between hub and node, the on-disk state layout and the CLI surface can all change without a deprecation period; /v1 tracks the OpenAI shape and is the most stable thing here. Nothing is accredited or covered by a compatibility promise.

Release archives bundle a real llama.cpp build

The tar.gz/zip release archives — and the install.sh one-liner that fetches them (bash, including Git Bash on Windows) — put a real llama.cpp build beside relay, pinned to an exact upstream release and sha256-verified before it is ever packaged. Nothing to compile yourself for relay serve/relay up to work.

Backend per platform

PlatformBackendNotes
Linux amd64/arm64VulkanOffloads to NVIDIA, AMD, or Intel — whichever GPU the machine has, via its own Vulkan driver
macOS amd64/arm64Metal
Windows amd64Vulkan

A GPU is required — there is no CPU-only path

Every machine in a pool, hub or node, needs a GPU device llama.cpp itself reports. relay serve and relay up each probe for one at startup and refuse to run without it — they don't degrade to CPU, they exit:

relay serve / relay up with no GPU device
relay needs a GPU on every machine: llama-server reports no GPU device — a
CPU-only llama.cpp build or a missing GPU driver (run `relay doctor`)

A unified-memory machine — a DGX Spark, or an Apple Silicon Mac — counts as a GPU here; the check is "does llama.cpp report a device," not "is it a discrete card."

CPU only in relay doctor's report means the same refusal
The llama-backend check below reporting CPU only isn't a slower supported mode — it's the exact condition that makes relay serve/relay up refuse to start. Point RELAY_LLAMA_BIN/RELAY_RPC_SERVER_BIN at a GPU build instead.
Vulkan/Metal are not necessarily the fastest option for your card
They are the cross-vendor/first-party choices that don't require bundling a vendor-specific runtime — a llama.cpp built with CUDA (NVIDIA) or ROCm (AMD) for your exact GPU can outperform them. Neither is bundled because their redistributable runtimes are enormous for one vendor's hardware alone — CUDA's alone is ~400MB per Windows archive.

Find out which one you actually have

relay doctor's llama-backend check runs the resolved llama-server binary's own --list-devices and reports exactly what it finds — e.g. Vulkan0: NVIDIA GeForce RTX 4090, or CPU only if no GPU backend loaded, either because the bundle for your platform doesn't have one or a GPU-capable bundle found no usable driver on this machine. relay doctor also reports whether the resolved binary matches this project's known-good hash table (llama-sha256) and the llama.cpp build it's validated against (llama-build).

bash
relay doctor [POOL_URL]

Only the release archive carries the bundle

Package installs (.deb/.rpm/.apk) put relay at /usr/bin/relay only — no bundled llama.cpp, since /usr/bin is a shared system directory. Use the tar.gz/zip archive (or install.sh) if you want the bundle, or install llama.cpp from your own distro's packages and let relay find it on PATH.

Same story building from source — go install or a plain git clone + make build carries no bundle either. Package managers, go install, and go build do not carry it, so on those relay serve falls back to llama-server on PATH and warns if it can't find one.

The source and releases open soon. Until then there is nothing to install.

Bring your own build

Install or build llama.cpp yourself with the backend you want (-DGGML_CUDA=ON, -DGGML_HIP=ON, etc., plus -DGGML_RPC=ON) and point relay at it — or replace the bundled binaries beside relay; either works, and an env override always wins.

VariableDefaultPurpose
RELAY_LLAMA_BINbundled pathPath to the llama.cpp server. Unset resolves to a llama-server bundled beside relay, then llama-server on PATH.
RELAY_RPC_SERVER_BINbundled pathPath to rpc-server on a node.

If you already had a llama-server/rpc-server on PATH before upgrading to a release that bundles its own, relay doctor's llama-shadow check (and a one-line startup log) tells you which one actually wins.

Bundle integrity

bash
relay doctor --bundle       # one redacted .zip for a bug report — version, doctor
                            # report, pool status, config and agent log
relay doctor --pin-llama    # record the resolved rpc-server/llama-server binaries
                            # as trusted (TOFU) for future checks

"Redacted" means every machine name, node name, model name, API key, join token, CA fingerprint, email address, and any run of 32 or more hex characters is swapped for a placeholder before the archive is written. The same value always gets the same placeholder throughout the bundle, so a log line naming a node and the status row for that node still read as the same machine once the real name is gone — only the identity is stripped, not the shape of the problem. A loopback address is left as-is; it identifies nobody. A final pass over the finished bundle checks that none of those original values survived, and relay doctor --bundle refuses to write the file if any did.