On this page
- Why there is no single calls-per-GPU number
- Memory comes first: weights, the KV cache and what the engine reserves
- Batching decides whether extra calls share the card or queue
- Real-time factor: whether each stream keeps up with live audio
- Why planning figures and vendor claims disagree
- How to measure concurrency on your own 24 GB card
- Questions people ask
- Sources
Why there is no single calls-per-GPU number
A cascaded voice agent runs three models, and each uses a GPU in a different rhythm. Speech-to-text (STT) works for the whole call, because it has to listen to every second of audio. Text-to-speech (TTS) works only while the agent speaks. The large language model (LLM) works in short bursts, for the second or so it takes to read the conversation and write each reply.
So "calls per GPU" has a separate answer for each model, and another when two or three of them share one card. A card that carries many STT streams may carry far fewer LLM conversations, and putting both on it lowers each figure, because they compete for the same memory and memory bandwidth.
The card matters too. The common 24 GB data-centre cards in voice work are the L4 and the A10, and the RTX 4090 is the usual consumer card. Many published TTS and LLM figures, though, come from 48 GB cards such as the L40S or 80 GB cards such as the H100. A figure from a larger card is an upper bound for a 24 GB one, not an estimate of it.
Sonex Labs sells hosted speech and language model APIs and runs its own models on GPUs, so it has a stake in how self-hosting looks. This article does not use Sonex's own capacity figures. It relies on public measurements, says where they come from, and shows how to measure your own.
Memory comes first: weights, the KV cache and what the engine reserves
On a 24 GB card, memory usually runs out before compute does. Everything has to fit at once: the weights of every model on the card, a cache for every conversation in progress, and the working memory the serving software sets aside for itself. When the total does not fit, the model either fails to load or starts pushing calls out of memory under load.
Model weights
The rough size of a model's weights is its parameter count times the bits stored per weight, divided by 8 to give bytes. An 8-billion-parameter model at 16 bits is about 16 GB, at 8 bits about 8 GB and at 4 bits about 4 GB. Quantisation, storing weights at fewer bits, is therefore the usual way to make room on a 24 GB card.
Treat the paper figure as a floor. Quantised models usually keep some layers, such as the token embeddings, at higher precision, and the runtime adds buffers of its own. Load the model in the engine you will actually run and read the memory it reports, rather than planning from the parameter count.
The KV cache, which grows with every live call
An LLM keeps a key-value (KV) cache for each conversation: the intermediate results for every token it has already read, so it does not recompute them on each new word. NVIDIA gives the size per token as 2 × layers × (attention heads × head dimension) × bytes per value. For Llama 2 7B at 16 bits, a single 4,096-token conversation needs about 2 GB (NVIDIA, LLM inference optimisation).
Newer models share keys and values across groups of heads, which shrinks the cache. Llama 3.1 8B has 32 layers and 8 key-value heads of dimension 128 (model config), so at 16 bits it needs 2 × 32 × 8 × 128 × 2 bytes, or 128 KiB per token. That is a quarter of Llama 2 7B's cost per token.
Here is what that means on a 24 GB card, as arithmetic rather than a measurement. Suppose 8 GB goes to 8-bit weights and about 12 GB is left for the cache after the engine's own reserve. That holds roughly 12 × 10⁹ ÷ 131,072, or about 91,000 tokens. At 4,000 tokens per call, a long system prompt plus a few minutes of conversation, that is the context of about 22 calls held in memory at once. Storing the cache at 8 bits instead of 16 roughly doubles it.
That is a memory ceiling, not a call count. Calls between turns do not need their cache on the card, and engines can evict and rebuild it, at a cost in latency. When the cache runs short under load, vLLM, a widely used open-source serving engine, preempts requests and recomputes them later, which shows up as sudden slow replies (vLLM optimisation guide).
What the serving engine sets aside
Serving engines claim most of the card when they start. vLLM pre-allocates GPU memory up to a set fraction, 0.92 by default in its current code (vLLM cache config). That suits a card the LLM has to itself. If a TTS or STT model shares the card, the fraction has to come down, or the second model has no room to load.
CUDA graphs, which record the GPU's sequence of operations once and replay it on every step, speed up token generation but need memory of their own to capture. vLLM's eager mode skips them, trading steady-state speed for memory and faster start-up. On a full 24 GB card, the graph capture step is a common point to run out of memory, so test start-up with every model loaded.
Real-time factor: whether each stream keeps up with live audio
Speech models face a constraint that chat models do not: live audio arrives at its own pace. The real-time factor (RTF) is processing time divided by audio duration, so an RTF below 1 means a model processes audio faster than it is spoken. NVIDIA reports the inverse, RTFX, the seconds of audio handled per second of computation. A card that serves streams at the pace callers speak can only keep up while its total throughput at least matches the number of streams.
NVIDIA's Riva tables for the L4 show what happens at the limit (NVIDIA Riva ASR performance). Take Parakeet-CTC-1.1B multilingual code-switching, a model that follows callers who switch languages mid-sentence. With 160 ms audio chunks, 32 streams average 220 ms of latency, and throughput is 31.5 RTFX, matching the streams. At 48 streams throughput stalls at 39.5 RTFX, below the 48 needed, and average latency jumps to 3.6 seconds. The card has fallen behind, and every further second of audio joins a queue.
That pattern is the clearest signal in any load test: latency stays flat and then climbs steeply within a small change in load. Run up to that point and stop one step short of it. The last load before latency breaks your target is the stream count to plan with.
How STT figures change with the model
NVIDIA tests on one clean English recording from LibriSpeech, a corpus of read audiobooks, with a client that sends audio at real-time pace. So its figures are best cases for phone traffic. Even so, the spread between models on the same L4 is wide. Parakeet-CTC-0.6B, an English model, is listed at a maximum of 83 effective streams in low-latency mode. At 48 streams it averages 90 ms and 123 ms at the 95th percentile.
The larger English Parakeet-CTC-1.1B is listed at 49 streams, at 215 ms average and 370 ms 95th percentile with 48. The multilingual code-switching Parakeet-RNNT-1.1B is listed at 3 streams with 320 ms chunks; at 8 streams its average latency is 23.6 seconds. Code-switched calls such as Hinglish or Spanish-English can therefore need many times more STT hardware than English benchmarks suggest.
Phone audio arrives at 8 kHz, but most speech models expect 16 kHz and resample it first, so they do the same work per second either way. The narrowband audio changes accuracy rather than compute, as the guide to 8 kHz phone audio and 16 kHz speech models explains.
How TTS figures differ
For TTS the pressure point is the first chunk of audio, because a caller hears the delay before the agent's first word. Baseten states that Orpheus, a 3-billion-parameter open TTS model, must generate about 83 audio tokens a second per stream to play in real time. On an H100 partition with 40 GB of memory it reports 16 concurrent real-time streams with variable traffic and 24 with steady traffic (Baseten). The gap between those two figures is the cost of bursty demand.
NVIDIA's Magpie TTS Multilingual on a 48 GB L40S averages a 32 ms first chunk for one stream and 133 ms with 32 streams, at 160 ms for the 95th percentile (NVIDIA TTS NIM performance). Its test sends each new request only once the previous one has finished, so the streams are busier than an agent that speaks only part of the time. Neither vendor publishes these figures for a 24 GB card.
| Model and card | Concurrency | Latency at that load |
|---|---|---|
| STT, Parakeet-CTC-0.6B English, L4 24 GB, 160 ms chunksSource: NVIDIA Riva | 83 streams listed as maximum; 48 tabulated | 90 ms average, 123 ms p95 at 48 |
| STT, Parakeet-CTC-1.1B English, L4 24 GB, 160 ms chunksSource: NVIDIA Riva | 49 listed as maximum | 215 ms average, 370 ms p95 at 48 |
| STT, Parakeet-CTC-1.1B multilingual code-switching, L4 24 GBSource: NVIDIA Riva | 43 listed as maximum | 220 ms at 32; 3.6 s at 48 |
| STT, Parakeet-RNNT-1.1B multilingual code-switching, L4 24 GB, 320 ms chunksSource: NVIDIA Riva | 3 listed as maximum | 23.6 s average at 8 |
| TTS, Magpie Multilingual, L40S 48 GBSource: NVIDIA TTS NIM | 32 streams tested | 133 ms average, 160 ms p95 first chunk |
| TTS, Orpheus 3B, H100 40 GB partitionSource: Baseten | 16 streams (variable traffic), 24 (steady) | real time, about 83 tokens/s per stream |
| LLM, Llama-3.1-8B at 8-bit, L40S 48 GB, 1,000 tokens in and outSource: NVIDIA NIM | 25 / 50 / 100 requests | 618 / 705 / 778 ms to first token |
| LLM, PhoneLLM 30B mixture-of-experts, B200Source: Daily | 44 agent processes | kept under a time-to-first-token target |
Why planning figures and vendor claims disagree
Beside the measured tables sit planning figures, and they vary widely. Softcery, a consultancy, models 20 to 50 TTS streams and 100 to 200 STT streams per A10G-class GPU, and labels them "pending a load test" (Softcery, July 2026). io.net's guide to running Whisper at scale advises one GPU per 20 to 40 concurrent streams, using its small or medium models for speed (io.net). Cerebrium, which sells GPU hosting, says one A10 on its own fleet handles roughly 160 to 180 STT connections and about 180 TTS conversations, without describing the test (Cerebrium, July 2026).
For a whole agent on one card the public guidance is much lower. Dograh's sizing table, which it calls "directional starting points", puts a 24 to 48 GB workstation GPU running an 8 to 11-billion-parameter LLM with streaming TTS at single-digit concurrent sessions (Dograh, sizing). Its Whisper guide warns that a clean single-stream test "can still fall apart at 10 concurrent connections" (Dograh, Whisper).
Part of the spread is real: lighter models and looser latency targets carry more streams. The rest is definition. A "stream" may mean a connection held open, audio processed in real time, or a request sent back to back, and the latency may be an average or a 95th percentile. Before comparing two figures, check the model, the card, the audio, the latency target and whether anything else shared the GPU.
How to measure concurrency on your own 24 GB card
Measure in the order the limits bite. Start with memory. Load every model you plan to put on the card, in the serving engine you will run, and note the memory each reports, including how many KV-cache tokens the LLM engine says it has room for. If the models do not fit together with a working margin, no load test will rescue the plan.
Then test each model alone with traffic that looks like your calls. Use recorded calls in your real language mix, not clean English audio, send audio at real-time pace, and make turns arrive in bursts the way callers' turns do. Raise concurrency step by step and record the 95th-percentile latency that matters for each model: final transcript time for STT, first audio chunk for TTS and time to first token for the LLM. For speech models, also check that throughput keeps pace with the number of streams.
The last load before any model breaks its target is that model's number. Then run all the models together on the same card, because shared memory bandwidth slows each of them, and expect the combined figure to be lower than any single one. Finally, size the fleet with headroom for peaks and at least one spare card, using the code earlier in this article. If the result looks expensive, the guide to what self-hosted voice AI really costs compares it with API prices.
A measured stream count is the input every cost comparison needs. The hourly prices for L4, L40S and H100 GPUs turn it into a cost per call-minute, and critical utilisation shows how busy the card must be to beat an API. Many teams keep a small self-hosted base and send traffic peaks to an API. For the LLM stage, a hosted option such as the Vyas LLM API for voice agents leaves capacity planning for that stage to the provider.
Questions people ask
The memory budget is the same as an L4's, since both have 24 GB. The licence is the bigger question: NVIDIA's GeForce driver licence says the software "is not licensed for datacenter deployment" and also bars commercial hosting services. Read the current terms, or ask a lawyer, before you build a hosted service on consumer cards.
Sources
- NVIDIA Riva: ASR performance tables (L4 on-prem results)Official
- NVIDIA TTS NIM: performance (Magpie TTS Multilingual)Official
- NVIDIA NIM: LLM benchmarks (Llama-3.1-8B-Instruct)Official
- NVIDIA technical blog: Mastering LLM techniques, inference optimisation (KV cache size)Official
- Llama-3.1-8B-Instruct config.json (layers, key-value heads)Secondary
- vLLM docs: optimisation and tuning (preemption, chunked prefill, CUDA graphs)Official
- vLLM source: cache config (gpu_memory_utilization default)Official
- Baseten: Orpheus TTSOfficial
- Daily: announcing Pipecat PhoneLLM alpha 1 (27 August 2026)Official
- Softcery: self-hosted voice AI stack (3 July 2026)Secondary
- io.net: how to run Whisper speech to text at scale on cloud GPUsSecondary
- Cerebrium: concurrent voice sessions per GPU (30 July 2026)Secondary
- Dograh: GPU sizing for a self-hosted voice agent (18 August 2026)Secondary
- Dograh: self-hosting Whisper for real-time streaming (18 August 2026)Secondary
- livekit/agents issue 7764: serve concurrent sessions with batched generation (HF plugin)Secondary
- NVIDIA GeForce software licence (sections 2.7 and 2.8)Official
Change log: 24 Oct 2026, Rewritten for publication. Removed Sonex's own GPU setup and memory figures and the promise of a Sonex calls-per-card figure. Corrected the NVIDIA L4 STT figures: 48 streams is the highest load tabulated for the English models, not their maximum (83 and 49), and the code-switching model listed at 8 streams is in fact overloaded there (23.6 s average; listed maximum 3). Added the KV-cache arithmetic, engine memory reserve, batching, real-time factor and a measurement method




