Sonex Labs

How many voice calls fit on one 24 GB GPU? What sets the limit, and how to measure it

Teams that move a voice agent off hosted APIs usually start on a 24 GB card such as NVIDIA's L4 or A10, or a consumer RTX 4090, and the first question is how many calls it will carry. There is no general answer, because the limit depends on which model runs on the card and what shares it. NVIDIA's own tables for one L4 show the spread: an English streaming speech-to-text model keeps up with up to 83 streams, while a multilingual code-switching model manages 3. On a 24 GB card the limit is usually set first by memory (the model weights plus a cache for every live conversation), then by whether the serving software batches calls together, and finally by whether each model still keeps up with live audio at the 95th percentile. The only reliable number is one you measure on your own calls.

Calls per 24 GB GPU: How many voice calls fit on one 24 GB GPU? What sets the limit, and how to measure it
Written by
Anmol Agarwal
Published
Last updated
Reading time
13 min read
On this page
  1. Why there is no single calls-per-GPU number
  2. Memory comes first: weights, the KV cache and what the engine reserves
  3. Batching decides whether extra calls share the card or queue
  4. Real-time factor: whether each stream keeps up with live audio
  5. Why planning figures and vendor claims disagree
  6. How to measure concurrency on your own 24 GB card
  7. Questions people ask
  8. 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.

Batching decides whether extra calls share the card or queue

Once the models fit, the next question is whether the software serves several calls in the same pass over the weights. Generating each new token is limited by how fast weights move out of memory, not by arithmetic, so serving several conversations in one pass costs little more than serving one. NVIDIA explains that batching spreads the cost of loading the weights across requests, while each request still needs its own KV cache, which is why memory caps the batch.

Some setups do not batch at all. In livekit/agents issue 7764, opened on 12 October 2026, LiveKit's Hugging Face plugin served sessions on one worker one at a time, because of a lock on each loaded model (issue 7764). With a 0.5-billion-parameter model on an Apple M4, time to first token was 99 ms for one session alone and 1,568 ms for the third of three simultaneous sessions. A queue like that turns every extra call into dead air for the others. The Pipecat vs LiveKit comparison for phone agents covers the framework side of that choice.

Long prompts cause a quieter version of the same problem. Reading a long prompt, called prefill, is heavy work, and while it runs it can hold up token generation for every other call. vLLM's chunked prefill splits long prompts into pieces and mixes them with generation steps. Its guide notes that a smaller token budget per step favours steady generation, while a larger one favours a fast first token (vLLM optimisation guide). If a shared card serves both live calls and long batch jobs, cap the batch prompts or give the live calls priority.

Sessions are not requests: Little's law

LLM benchmarks count requests in flight, while a voice agent cares about sessions, meaning live calls. Little's law links the two: the number of items in a system equals the rate they arrive times how long each stays. A call keeps the LLM busy only while a reply is being generated, so each session occupies a slot for a small share of each minute.

Take 4 turns a minute, 0.4 seconds to the first token and 60 output tokens at 10 ms each. The share is 4 × (0.4 + 60 × 0.01) ÷ 60, about 6.7%. If a card could hold 50 requests in flight within your latency target, the theoretical ceiling would be 50 ÷ 0.067, about 750 sessions.

Voice-specific tests land far below that. Daily, the company behind Pipecat, reports a maximum of 44 agent processes on each NVIDIA B200 for PhoneLLM, a 30-billion-parameter mixture-of-experts model with about 3.5 billion parameters active per token. It found that figure by raising concurrency until a time-to-first-token target was breached (Daily, August 2026). The model and card differ from the arithmetic above, so the gap is not a precise ratio, but it is more than ten-fold.

The reasons are structural. Callers' turns arrive in bursts, voice prompts are long and resent on every turn, and voice latency targets are judged at the 95th percentile rather than on average. Plan from measured voice sessions, and treat the Little's-law figure as a ceiling that tuning might approach but will not pass.

import math

def llm_duty(turns_per_min, ttft_s, out_tokens, itl_s):
    """Share of each minute one call keeps the LLM busy."""
    return turns_per_min * (ttft_s + out_tokens * itl_s) / 60

def gpus_needed(peak_calls, sessions_per_gpu, headroom=0.2, spares=1):
    return math.ceil(peak_calls * (1 + headroom) / sessions_per_gpu) + spares

duty = llm_duty(turns_per_min=4, ttft_s=0.4, out_tokens=60, itl_s=0.01)
print(f"LLM duty per call: {duty:.1%}")                              # 6.7%
print(f"Ceiling at 50 requests in flight: {50 / duty:.0f} calls")    # 750
print("GPUs for 80 peak calls at 44 per GPU:", gpus_needed(80, 44))  # 4
Little's-law ceiling and a GPU count for one model. Replace the inputs with your measured turn rate, latencies and sessions per GPU.

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.

Published concurrency by model and card, as each source reports it. Only the first four rows are on a 24 GB card.
Model and cardConcurrencyLatency at that load
STT, Parakeet-CTC-0.6B English, L4 24 GB, 160 ms chunksSource: NVIDIA Riva83 streams listed as maximum; 48 tabulated90 ms average, 123 ms p95 at 48
STT, Parakeet-CTC-1.1B English, L4 24 GB, 160 ms chunksSource: NVIDIA Riva49 listed as maximum215 ms average, 370 ms p95 at 48
STT, Parakeet-CTC-1.1B multilingual code-switching, L4 24 GBSource: NVIDIA Riva43 listed as maximum220 ms at 32; 3.6 s at 48
STT, Parakeet-RNNT-1.1B multilingual code-switching, L4 24 GB, 320 ms chunksSource: NVIDIA Riva3 listed as maximum23.6 s average at 8
TTS, Magpie Multilingual, L40S 48 GBSource: NVIDIA TTS NIM32 streams tested133 ms average, 160 ms p95 first chunk
TTS, Orpheus 3B, H100 40 GB partitionSource: Baseten16 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 NIM25 / 50 / 100 requests618 / 705 / 778 ms to first token
LLM, PhoneLLM 30B mixture-of-experts, B200Source: Daily44 agent processeskept 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.

Flow chart for sizing concurrent calls per GPU on a 24 GB card for STT, TTS and LLM voice models
The order to size a 24 GB GPU for voice calls: memory first, then measured concurrency per model and together, then headroom.

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

  1. NVIDIA Riva: ASR performance tables (L4 on-prem results)Official
  2. NVIDIA TTS NIM: performance (Magpie TTS Multilingual)Official
  3. NVIDIA NIM: LLM benchmarks (Llama-3.1-8B-Instruct)Official
  4. NVIDIA technical blog: Mastering LLM techniques, inference optimisation (KV cache size)Official
  5. Llama-3.1-8B-Instruct config.json (layers, key-value heads)Secondary
  6. vLLM docs: optimisation and tuning (preemption, chunked prefill, CUDA graphs)Official
  7. vLLM source: cache config (gpu_memory_utilization default)Official
  8. Baseten: Orpheus TTSOfficial
  9. Daily: announcing Pipecat PhoneLLM alpha 1 (27 August 2026)Official
  10. Softcery: self-hosted voice AI stack (3 July 2026)Secondary
  11. io.net: how to run Whisper speech to text at scale on cloud GPUsSecondary
  12. Cerebrium: concurrent voice sessions per GPU (30 July 2026)Secondary
  13. Dograh: GPU sizing for a self-hosted voice agent (18 August 2026)Secondary
  14. Dograh: self-hosting Whisper for real-time streaming (18 August 2026)Secondary
  15. livekit/agents issue 7764: serve concurrent sessions with batched generation (HF plugin)Secondary
  16. 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

Questions about your calling setup?

Tell us what you call about, where and in which languages.