Open source · Go, Python · MIT

llm-inference-platform

A Kubernetes control plane for serving large language models. A Go operator reconciles anInferenceService custom resource into a running vLLM deployment, and the gateway in front of it routes on data classification before anything else.

Why autoscaling on GPU utilisation is wrong

The default instinct is to scale inference pods on GPU utilisation, the way you would scale a web service on CPU. It fails, and it fails in the worst direction. Token decode is bound by memory bandwidth, not by compute. Under load the queue grows and latency climbs while utilisation stays flat or drops, because the device is waiting on memory rather than burning cycles. An autoscaler watching utilisation does exactly what it was told and scales the deployment down at the moment it is most needed.

This platform scales on queue depth and p95 time-to-first-token through KEDA. Those are the signals that actually move when a model is saturating.

Design decisions

Stack: Go, Kubernetes 1.34+, controller-runtime, CRDs, CEL admission, KEDA, DRA, vLLM, Python, FastAPI gateway. MIT licensed.
github.com/lake-of-dreams/llm-inference-platform

There is a longer write-up of the autoscaling problem inthe blog post on queue depth versus GPU utilisation. The operator discipline comes from Oracle Verrazzano.