The first on-premises AI workloads often coexist peacefully. A chat assistant occupies one model server, a nightly evaluation job uses spare capacity, and a data science team runs an occasional batch. Then adoption succeeds. More agents arrive, batch windows grow, several models must stay resident, and users discover that “the GPUs are healthy” can still mean a 40-second wait for the first token.
Finite local capacity changes the operating model. Cloud queues can sometimes expand into more instances at a price. An on-premises cluster must decide which work starts now, which waits, which uses a fallback, and which is refused before overload spreads through the platform.
That decision belongs to GPU admission control. It protects user-facing AI from batch saturation while giving offline work predictable access to the remaining capacity. It also makes scarcity explicit: priorities, reservations, quotas, and deadlines become governed policy rather than whoever submitted first—or whoever discovered the largest priority number.
Admission and scheduling are different decisions
A scheduler asks: where can this workload run? Admission control asks first: should this workload enter the runnable set now?
The difference matters for AI because a pod request such as “one GPU” says little about the service impact. The actual demand depends on model weights, quantization, context length, expected output, key-value cache, concurrency, batching policy, tensor parallelism, adapter loading, and whether another replica already holds the model in memory.
An admission layer translates workload intent into a normalized capacity claim. It can reserve a concurrency slot on an existing model server, allocate a GPU partition, queue a multi-GPU batch until all required devices are available, route to a smaller approved model, or reject a request whose deadline cannot be met.
Kubernetes remains useful underneath. Pod priority, preemption, quotas, placement, and projects such as Kueue provide strong cluster primitives. The AI control plane adds the model- and request-level semantics needed to use them safely.
Start with workload classes
Do not assign priority per team or per application ad hoc. Define a small set of classes based on user impact and execution behavior.
| Workload class | Typical examples | Admission objective | Interruption policy |
|---|---|---|---|
| Interactive | Chat, coding assistant, synchronous RAG | Protect time to first token and tail latency | Avoid interruption; keep warm capacity |
| Transactional agent | Multi-step tool workflow with a user waiting | Meet end-to-end deadline, preserve run state | Pause only at safe workflow boundaries |
| Asynchronous agent | Report generation, document processing | Complete within a stated deadline | Queue, checkpoint, and resume |
| Batch inference | Embedding, classification, evaluation | Maximize throughput within a window | Usually interruptible if checkpointed |
| Training or tuning | Fine-tuning and long experiments | Predictable reserved blocks | Interrupt only with tested checkpoint recovery |
Each submitted workload should declare its class, model or acceptable model set, estimated input and output size, maximum queue delay, completion deadline, resource shape, checkpoint capability, tenant, and cost center. Defaults should be conservative. A missing class must not silently become “highest priority.”
Separate priority from entitlement. A production service may have a high priority, but only an authorized platform policy should assign that class. Kubernetes warns that untrusted users able to create highest-priority pods can evict other work; an AI cluster faces the same priority-inflation risk at the request layer.
Protect invariants before optimizing utilization
Admission policy should begin with rules that must remain true even when demand spikes:
- reserve enough warm serving capacity for the interactive load the service promises;
- keep a headroom margin for variance, failover, and model reloads;
- cap concurrent sequences and token budgets per serving replica;
- prevent batch work from consuming the reserved interactive pool;
- bound queue length and queue age so overload cannot grow without limit;
- enforce tenant quotas and maximum borrowing from shared capacity;
- require checkpointability before marking a long job preemptible;
- reject or degrade deliberately when the requested deadline is impossible.
Only after those invariants are satisfied should the controller fill unused capacity with batch work. A cluster at 100% GPU utilization may look efficient while producing terrible user latency and leaving no room for a failed replica. The useful target is the highest utilization that continues to meet workload objectives, not the largest number on the dashboard.
The sizing process in estimating GPU requirements for local LLMs establishes the capacity envelope. Admission control enforces how that envelope is shared minute by minute.
Use reservations, borrowing, and queues together
A practical pool design assigns nominal quota to service classes or tenants and allows controlled borrowing when capacity is idle. Interactive service owns a protected reservation. Batch queues can borrow unused portions, but the loan is visible and reclaimable. Training may receive scheduled blocks rather than competing continually with inference.
Queue policy then determines who receives the next available unit. Pure first-in, first-out ordering can create head-of-line blocking when an old eight-GPU job prevents several smaller jobs from running. Pure best-fit improves utilization but can starve large work. Priority alone allows a busy high-priority tenant to dominate indefinitely.
Combine class priority with aging, quota, and fit. Let waiting work gain priority over time, limit how much any tenant can borrow, and reserve windows for large jobs that cannot otherwise assemble their resource shape. Kueue’s concepts—cluster queues, local tenant queues, resource flavors, fair sharing, quota borrowing, and workload priority independent of pod priority—provide a useful implementation vocabulary.
Record every admission decision: demand estimate, policy version, class, quota state, available capacity, reservation or queue selected, alternatives considered, and final result. When a team asks why its job waited, the answer should be evidence rather than an interpretation of scheduler logs.
Partitioning can make guarantees easier
Some latency-sensitive services need physical resource boundaries rather than a logical queue. Dedicated GPUs provide the clearest isolation and make model residency predictable. On supported NVIDIA GPUs, Multi-Instance GPU can divide a device into GPU instances with dedicated memory resources and memory quality of service; NVIDIA also documents performance, memory, bandwidth, and error-isolation advantages over streams or MPS for compatible configurations.
Use partitions when a smaller stable serving slice is more valuable than flexible access to a whole device. They can protect a lightweight classifier, embedding service, or modest model replica from a noisy neighbor. The tradeoffs are smaller fixed shapes, reconfiguration constraints, device and workload compatibility, and fragmentation when demand does not match the chosen profiles.
Partitioning does not replace the queue. The system still needs to decide who may enter each instance, how many concurrent requests it accepts, what happens at saturation, and whether capacity should be reconfigured. Treat dedicated GPUs, MIG, time sharing, and multi-process sharing as resource mechanisms selected by admission policy—not as the policy itself.
Preemption is the last lever
It is tempting to solve every interactive spike by evicting batch work. In practice, preemption has delay and waste. GPU memory must be released, a serving process may need to load a large model, and the interrupted job may lose progress. Kubernetes likewise notes a gap between choosing preemption victims and scheduling the higher-priority pod while graceful termination occurs.
Prefer this order of response:
- stop admitting new lower-priority work;
- use already reserved or warm capacity;
- reduce optional concurrency or batch size;
- route eligible requests to a smaller or already resident approved model;
- pause checkpointable jobs at a safe boundary;
- preempt only when the measured recovery path can meet the objective;
- shed low-value requests explicitly if the objective is no longer achievable.
Mark interruption behavior in the workload contract. “Batch” does not automatically mean disposable. An evaluation run might be repeatable but expensive; a fine-tuning job may recover cleanly from a checkpoint; a data transformation with external side effects may not be safe to replay at all.
Backpressure belongs at every layer
Admission control fails if upstream services can create unlimited pending work. Apply bounds at the API gateway, agent orchestrator, model server, and cluster queue. Use per-tenant request rates, maximum in-flight tokens, queue-length limits, deadlines, and cancellation propagation.
Deadlines are especially important for agent workflows. If a user-facing request has already exceeded its end-to-end limit, starting another expensive model step may waste capacity on an answer the caller will never use. Propagate the remaining deadline through every node and cancel downstream work when the initiating request ends.
Batching also needs class awareness. Continuous batching can improve throughput, but mixing very long and short generations can hurt tail latency. Bound prompt and output sizes, separate extreme contexts, and measure time to first token and inter-token latency by class. A single average latency hides exactly the contention admission control is meant to prevent.
The same principle applies to model loading. A request for a cold model may consume more time and memory than its inference. The controller should know which models are resident and prefer an eligible warm route when policy and quality allow it. Compliance-aware model routing describes how those alternatives remain constrained by data and governance rules.
Make the queue part of the SLO
Measure the user experience from submission, not from the moment a GPU begins work. Useful indicators include:
- percentage of interactive requests with queue delay below the target;
- percentage of successful responses with time to first token below the target;
- agent runs completed within their end-to-end deadline;
- batch jobs completed inside their promised window;
- rejected, degraded, and rerouted requests by reason;
- queue age and depth by class and tenant;
- quota use, borrowing, starvation time, and preemption waste;
- model load and GPU-memory-reclamation time;
- GPU utilization and headroom alongside—not instead of—service measures.
Define each indicator as good events divided by eligible events and give it an objective approved by service owners. This follows the SRE discipline used in the on-premises AI agent SLO guide: reliability targets become useful when they drive decisions. If the interactive latency budget is burning too quickly, the policy can stop batch borrowing, reduce concurrency, or switch eligible traffic before the service collapses.
Roll out admission policy in stages
Begin by observing. Classify current workloads, estimate demand, and log the decision the controller would make without enforcing it. Compare predicted memory and duration with actual use. This exposes bad declarations and workloads that routinely exceed their token or runtime estimates.
Next enforce bounds that are safe and easy to explain: queue limits, per-tenant concurrency, batch admission windows, and protected interactive reservations. Add borrowing only after nominal quotas are visible. Add preemption last, beginning with one checkpointed workload class and a recovery drill.
Test overload deliberately. Submit a batch surge, remove a GPU node, trigger a cold model load, create a long-context burst, and revoke a tenant’s priority entitlement. Verify that the queue stays bounded, interactive objectives degrade predictably rather than catastrophically, and every decision can be reconstructed.
How VDF AI fits the control loop
VDF AI Networks exposes the workflow context an infrastructure controller needs: model-routing decisions, node status, token use, cost, CPU/GPU utilization, timeouts, retries, and complete execution traces. Its fallback routing can direct eligible work to another approved model or recovery path when the preferred target is unavailable. The platform’s run history makes admission and degradation outcomes auditable at the workflow level.
Cluster queues, GPU partitions, quotas, and low-level scheduling remain infrastructure responsibilities. Connect their telemetry and decisions to the VDF execution identity so operators can follow one request from workflow priority through model route, queue, GPU service, and result. That shared trace turns GPU scarcity from an opaque infrastructure incident into a governed service decision.
The goal is not to make batch work unimportant. It is to give every workload a predictable contract: interactive users receive protected responsiveness, offline jobs receive fair and visible progress, and the organization can explain how finite local capacity was allocated.
Sources and further reading
- Kueue workload admission and queueing concepts
- Kubernetes pod priority and preemption
- NVIDIA Multi-Instance GPU concepts
- Google SRE Workbook: Implementing SLOs
- Capacity sourcing for on-premises GPU infrastructure
- Service-level objectives for on-premises AI agents
Need to protect interactive AI while batch demand grows? Book a VDF AI architecture review to turn workload classes, GPU reservations, queues, fallback routes, and service objectives into one operating policy.