This is the reference version of a survey I did for my own project, written so it is useful to someone who is not running CoderAI. If you have one or more machines with GPUs and want an OpenAI-compatible endpoint in front of them, these are the self-hosted orchestrators that exist in September 2026, what each one actually does across machines, and which one to pick for which situation. Star counts are from the GitHub API on 2026-09-20; feature cells are from the projects' own README and docs, linked at the end. Where I could not confirm something the cell says so instead of guessing.
The table
| Stars | Modalities | Multi-machine | Auto-discovery | Cache-aware routing | Ops console | Cloud burst | Non-LLM fan-out | Training | Kubernetes | Platforms | Signed images | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Ollama | 181k | text, vision, embeddings | no | no | no | no | no | no | no | community charts | Linux, macOS, Windows | no |
| llama.cpp (llama-server) | 129k | text, vision, embeddings, rerank | RPC layer/row split | no | slot cache per server | no | no | no | no | no | everything | no |
| vLLM | 92k | text, vision, embeddings | TP/PP over Ray | no | prefix caching per instance | Prometheus metrics | no | no | no | yes (production-stack) | Linux, CUDA/ROCm/others | no |
| LiteLLM (proxy) | 59k | routes anything | routes between endpoints | no | no | keys, budgets, spend | routes to clouds | no | no | Helm | anywhere (runs no model) | no |
| LocalAI | 49k | text, image, video, audio, embeddings, rerank | P2P federated, llama.cpp sharding, ds4 layer split | libp2p + shared token | prefix-cache-aware across replicas (v3) | per-key usage, users | no | no | no | Helm | Linux, macOS; Docker | cosign |
| exo | 47k | text (image behind a flag) | pipeline + tensor parallel, RDMA over TB5 | libp2p, zero-config | no | dashboard | no | no | no | no | macOS (MLX); Linux CPU-only | no |
| Xinference | 9.6k | text, embeddings, rerank, image, audio | supervisor/workers; vLLM/SGLang multi-node | no | shared KV across replicas (vLLM) | users, keys (enterprise) | no | no | no | Helm | Linux; Docker | no |
| GPUStack | 5.7k | text, image, audio, embeddings, rerank | llama-box RPC, vLLM/SGLang/TRT-LLM TP+PP | no | no | users, keys, metering, Grafana | no | no | no | Helm | Linux workers; 9 accelerator vendors | no |
| NVIDIA Dynamo / llm-d | 8.1k / 4.6k | text | disaggregated prefill/decode, KV-aware routing | no | KV-aware routing | Prometheus | no | no | no | required | NVIDIA, Linux | no |
| SkyPilot / dstack | 10.6k / 2.3k | runs your job | schedules across clusters | no | no | jobs, costs | yes, jobs | no | runs your trainer | yes | any cloud + on-prem | n/a |
| CoderAI | new | text, image, video, audio, TTS, STT, embeddings, rerank, OCR | nodes as engines, llama.cpp RPC layer/row, vLLM on Ray, SGLang | mDNS + shared token | prefix-cache-aware across engines and nodes | Prometheus, per-key usage, node logs | yes, per model, budgeted | yes | distributed LoRA | no | Linux CUDA+Vulkan; Windows via WSL2 | cosign |
Modalities: what the server itself generates, not what a plugin can reach. Multi-machine: whether one model, or one request, can use more than one box. Cache-aware routing: whether a follow-up turn is sent where its KV/prefix cache already is. Cloud burst: whether the server can obtain a rented GPU by itself. Non-LLM fan-out: whether one image/audio/embedding request is split over machines. Petals (last commit 2024) and Hugging Face TGI (archived March 2026) are omitted.
What each one is for
Ollama and Open WebUI — the default, for one machine
One binary, ollama pull, an answer. A library of models with sane defaults, a
Modelfile format, and, with Open WebUI in front, a chat product a non-engineer can use. It is the
right answer for a laptop or one desktop. It is one machine, one model at a time, and there is
no cluster story at all beyond Open WebUI round-robining several Ollama URLs; if that is what you
need, stop reading here.
llama.cpp and vLLM — the engines everyone else wraps
Both are orchestrators only in the narrow sense that they can span machines: llama.cpp with
rpc-server on each box and --rpc on the server (layer split by default, row
split for tensor parallel on a fast link), vLLM with Ray for tensor and pipeline parallelism.
Neither manages models, users, placement or anything beyond one model per process. They are
what LocalAI, GPUStack, Xinference and CoderAI run underneath, and if you only ever need one
model, running the engine directly is simplest.
LiteLLM — a router, not a runtime
It sits in front of a hundred providers and your own endpoints with keys, budgets and spend tracking, and never runs a model. It is the piece you put in front of any of the others when several teams share them, and it is often mistaken for a self-hosting solution; it is not one.
LocalAI — the closest thing to "all of it"
OpenAI-compatible API over text, image, video, audio and embeddings, each backend a gRPC
service in its own OCI image, no GPU required, Helm charts, and — since June 2026 — a real
distributed mode: --p2p generates a shared token, instances discover each other
over libp2p/EdgeVPN, requests federate to the least loaded node or a llama.cpp model is sharded
across workers, and a NATS-based "v3" router is aware of VRAM and of prefix caches. Backend
images are cosign-signed. What it does not do: rent a GPU, split a non-LLM request over
machines, train. Its raw LLM throughput trails a dedicated engine by some tens of percent
because the generality costs. If you want breadth with a large community and do not need
escalation, this is the mainstream pick.
exo — a stack of Macs as one computer
Zero-config discovery, ring/pipeline/tensor partitioning proportional to each device's memory, MLX underneath, and RDMA over Thunderbolt 5 on recent macOS for tensor parallelism that genuinely scales (3.2× on four devices is their number). It is also, in September 2026, CPU-only on Linux with NVIDIA and AMD "under development", and it serves language models (image generation behind a feature flag). If your hardware is Apple Silicon, nothing else comes close; if it is not, exo is not for you yet.
GPUStack and Xinference — the enterprise consoles
Both are supervisor-plus-workers with a web console, both are backed by companies, and both are what I see actually deployed as clusters in Asia. GPUStack is the more operational: users and roles, API keys with metering, Prometheus and Grafana, automatic recovery of failed models, Ray worker logs in the UI, llama-box (llama.cpp RPC) and vLLM/SGLang/TensorRT-LLM with tensor and pipeline parallelism, and support for nine accelerator vendors including Ascend, Hygon and MThreads. Workers are Linux only. Xinference covers more model types (speech, image, rerank) with a built-in registry, shared KV across vLLM replicas, and an enterprise edition with the multi-tenant features. Neither discovers nodes, bursts to a cloud, splits non-LLM work, or trains. If you run a department's GPUs and need to show someone a dashboard, pick one of these.
NVIDIA Dynamo and llm-d — the datacenter fabrics
Disaggregated prefill and decode, KV-cache-aware routing, multi-tier KV storage, on Kubernetes, on NVIDIA. They solve problems that begin at a rack and are the wrong tool below it. Included because "KV-aware routing" is the idea the smaller projects are now borrowing.
SkyPilot and dstack — bursting jobs, not requests
Both schedule jobs across on-prem Kubernetes and every cloud, and burst to the cloud when the on-prem cluster is full, finding the cheapest capacity. They are excellent at that and are not inference servers: you bring vLLM, they place it. If you need an endpoint that decides per request whether to run locally or rent, neither is that.
CoderAI — escalation, and every modality distributed
My own, so read with that in mind. One OpenAI-compatible endpoint over text, image, video, TTS, STT, diarization, embeddings, rerank and OCR, with the engine chosen per model (llama.cpp on CUDA and Vulkan in one box, transformers, vLLM, ktransformers and three pure-C engines). The multi-machine layer looks like GPUStack's (nodes as engines, llama.cpp RPC with layer or row split, vLLM on Ray, SGLang multi-node) plus LocalAI's zero-config (one shared token, mDNS discovery, prefix-cache routing) and ops (Prometheus, per-key usage, node logs, cosign-signed images). The parts nobody else has are the three-tier escalation — a model runs on your card, then on a machine you own, then on a RunPod GPU rented by the second with a price cap and a budget, chosen per model and switchable to "only when busy" — the fan-out of image, video, embedding, speech, transcription and OCR requests over every machine that has the model, a video pipeline relayed part by part, and LoRA/QLoRA training data-parallel across nodes from the same server. What it lacks: Kubernetes, Apple Silicon, a model catalogue, and a community; and its multi-machine paths are tested against fakes and localhost, not yet across a real cable.
Pick by situation
- One machine, want it to just work: Ollama (+ Open WebUI).
- One model, maximum throughput, many users: vLLM directly, LiteLLM in front if teams share it.
- A stack of Macs: exo. Nothing else is close on Apple Silicon.
- Everything (image, audio, video too) on Linux, big community, no cloud: LocalAI.
- A department's GPUs with users, keys and dashboards: GPUStack; Xinference if you need its wider model registry.
- A rack on Kubernetes: Dynamo or llm-d, with SkyPilot or dstack for the bursting of jobs.
- A few machines you own plus a rented card when they are not enough, every modality, one endpoint: CoderAI. Also the only one here that trains a LoRA across your boxes.
Sources
ollama/ollama · llama.cpp RPC README · vLLM distributed serving · BerriAI/litellm · LocalAI P2P / federated inference · mudler/LocalAI · exo-explore/exo · xorbitsai/inference · gpustack/gpustack · GPUStack inference backends · ai-dynamo/dynamo · llm-d introduction · SkyPilot on Kubernetes · dstack · CoderAI docs/cluster.md. Star counts: GitHub API, 2026-09-20. Corrections welcome — open an issue on the CoderAI repo and I will fix the table.