DEV Community

Runcrate
Runcrate

Posted on

Whisper large-v3 hours of audio per dollar on four GPUs: RTX 5090, L40S, RTX A6000 and H100, five setups measured

How many hours of audio can Whisper large-v3 transcribe for a dollar? It depends on the GPU, but it depends even more on how you run it. I rented four GPUs on Runcrate today (2026-10-28), an RTX 5090, an L40S, an RTX A6000 and an H100 PCIe, ran the same 2.5 hours of English talks through five Whisper setups on each, measured speed and word error rate, and deleted every machine when the results were on disk.

Short version: batched faster-whisper with the turbo model transcribed 315 hours of audio per hour on the RTX 5090, about 267 hours of audio per dollar, at a 3.1% word error rate. Plain sequential large-v3 with beam search, the way most tutorials start, was 6.6x slower than the same weights batched on that GPU and had a higher error rate (5.7% against 3.2%).

Setup

  • GPUs (one per machine), on-demand price at launch time: RTX 5090 32 GB (Austin, US, $1.18 per hour), L40S 48 GB (Kansas City, US, $1.14), RTX A6000 48 GB (US Midwest, $0.66), H100 PCIe 80 GB (US Midwest, $3.86).
  • Audio: the long-form TED talk test set from the distil-whisper project (distil-whisper/tedlium-long-form): 11 full TED talks, 8,905 s (2 h 28 min) of 16 kHz English, with reference transcripts.
  • Five setups, each in its own process:
    • faster-whisper 1.2.1 (CTranslate2 4.8.4), BatchedInferencePipeline, batch 16, with large-v3 in fp16, large-v3 in int8 (int8_float16), and large-v3-turbo in fp16;
    • transformers 4.57.1 pipeline("automatic-speech-recognition"), large-v3 in fp16, 30 s chunks, batch 16, SDPA attention;
    • faster-whisper large-v3 in fp16, plain model.transcribe (sequential, beam 5), the setup most tutorials start with.
  • Measured: wall time to transcribe all 11 talks after a one-minute warm-up (model load excluded), speed as a multiple of real time, word error rate over all talks with Whisper's English text normalizer, and peak GPU memory from nvidia-smi sampled every 0.5 s.
  • torch 2.8.0+cu128, Python 3.12, on all four machines.

The commands

Launch (the instance_type_id comes from GET /api/v1/instances/types):

curl -s https://www.runcrate.ai/api/v1/instances \
  -H "Authorization: Bearer $RUNCRATE_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"whisper-l40s","instance_type_id":"<id from /instances/types>",
       "ssh_key_id":"<your key id>","max_runtime_minutes":80}'
Enter fullscreen mode Exit fullscreen mode

On the machine:

curl -LsSf https://astral.sh/uv/install.sh | sh && export PATH=$HOME/.local/bin:$PATH
uv venv --python 3.12 /opt/env && . /opt/env/bin/activate
uv pip install torch faster-whisper 'transformers==4.57.1' accelerate soundfile pandas pyarrow jiwer --torch-backend=cu128
# CTranslate2 needs the cuBLAS and cuDNN that came with torch on its library path
export LD_LIBRARY_PATH=$(python -c "import os, nvidia.cublas, nvidia.cudnn; print(os.path.join(nvidia.cublas.__path__[0],'lib')+':'+os.path.join(nvidia.cudnn.__path__[0],'lib'))"):$LD_LIBRARY_PATH
for CFG in fw_large_v3_fp16_b16 fw_large_v3_int8_b16 fw_turbo_fp16_b16 hf_large_v3_fp16_b16 fw_large_v3_fp16_seq; do
  python whisper_bench.py $CFG > results/$CFG.json
done
Enter fullscreen mode Exit fullscreen mode

The two faster-whisper modes in whisper_bench.py:

from faster_whisper import WhisperModel, BatchedInferencePipeline
model = WhisperModel("large-v3", device="cuda", compute_type="float16")  # or "int8_float16"
# batched
segs, _ = BatchedInferencePipeline(model=model).transcribe(audio, language="en", batch_size=16)
# sequential
segs, _ = model.transcribe(audio, language="en", beam_size=5)
text = " ".join(s.text for s in segs)
Enter fullscreen mode Exit fullscreen mode

Then DELETE /api/v1/instances/<id> and a check that the instance list is empty.

Results

faster-whisper large-v3-turbo, fp16, batch 16

GPU $/hour x realtime WER Peak GPU memory Audio hours per $ $ per 1,000 audio hours
RTX 5090 1.18 315x 3.1% 4.6 GiB 267 $3.75
L40S 1.14 192x 3.1% 4.5 GiB 168 $5.94
RTX A6000 0.66 121x 3.1% 4.4 GiB 183 $5.45
H100 PCIe 3.86 196x 3.1% 4.6 GiB 51 $19.65

faster-whisper large-v3, fp16, batch 16

GPU $/hour x realtime WER Peak GPU memory Audio hours per $ $ per 1,000 audio hours
RTX 5090 1.18 171x 3.2% 10.2 GiB 145 $6.89
L40S 1.14 109x 3.2% 10.3 GiB 96 $10.43
RTX A6000 0.66 72x 3.2% 9.8 GiB 109 $9.15
H100 PCIe 3.86 118x 3.2% 10.0 GiB 30 $32.80

faster-whisper large-v3, int8, batch 16

GPU $/hour x realtime WER Peak GPU memory Audio hours per $ $ per 1,000 audio hours
RTX 5090 1.18 172x 3.2% 8.4 GiB 146 $6.86
L40S 1.14 109x 3.2% 8.3 GiB 95 $10.49
RTX A6000 0.66 73x 3.2% 8.1 GiB 110 $9.08
H100 PCIe 3.86 119x 3.1% 8.3 GiB 31 $32.36

transformers large-v3, fp16, batch 16

GPU $/hour x realtime WER Peak GPU memory Audio hours per $ $ per 1,000 audio hours
RTX 5090 1.18 47x 2.9% 27.9 GiB 40 $25.05
L40S 1.14 23x 2.9% 27.6 GiB 20 $48.93
RTX A6000 0.66 19x 2.9% 27.5 GiB 29 $34.92
H100 PCIe 3.86 36x 2.9% 27.9 GiB 9 $106.93

faster-whisper large-v3, fp16, sequential, beam 5

GPU $/hour x realtime WER Peak GPU memory Audio hours per $ $ per 1,000 audio hours
RTX 5090 1.18 26x 5.7% 5.6 GiB 22 $45.74
L40S 1.14 19x 5.5% 5.5 GiB 17 $60.00
RTX A6000 0.66 10x 6.0% 5.4 GiB 15 $65.35
H100 PCIe 3.86 19x 5.5% 5.6 GiB 5 $207.53

"Audio hours per $" is the speed divided by the hourly price, so it assumes the GPU is kept busy. The four machines were billed $2.23 in total for the whole run, including boot, installs and downloads: $0.30 (RTX 5090), $0.39 (L40S), $0.35 (RTX A6000) and $1.19 (H100 PCIe).

What surprised me

  1. The RTX 5090 was the fastest GPU here, ahead of the H100 PCIe, in every setup: 171x against 118x for batched large-v3, 315x against 196x for turbo. At about a third of the hourly price it gave 4.3 to 5.2x the audio per dollar. The batched pipeline also does audio decoding, voice activity detection and feature extraction on the CPU, so the GPU is not the only limit; I did not profile where the time went on each machine.
  2. int8 gave no speedup on any of the four GPUs. It saved about 1.8 GiB of memory and changed the error rate by 0.1 points at most. If memory is not your problem, fp16 is as good.
  3. Turbo was 1.7 to 1.8x faster than large-v3 at the same error rate (3.1% against 3.2%) on this English set. Turbo keeps large-v3's encoder and cuts the decoder from 32 layers to 4.
  4. Sequential beam-5 transcription was the worst on both speed and accuracy. 5.5 to 6.0% WER against 3.2% for the same weights batched, and 5.7 to 7.1x slower. On the L40S the first 250 characters of the first talk were identical in all three large-v3 setups, so the gap comes from later in the talks; long-form sequential decoding conditions each window on the text before it, which is a known source of repeated or dropped passages. I did not diff the transcripts line by line.
  5. transformers had the best error rate (2.9%) and the highest cost. 3 to 5x slower than batched faster-whisper with the same weights, and 28 GiB peak memory against 10 GiB.

What to take from it

  • For bulk English transcription, batched faster-whisper with turbo is the setup to start from, and a consumer-class 32 GB card did it at about $3.75 per 1,000 hours of audio here.
  • Don't pay for int8 conversion or an H100 to make Whisper faster. Batching is the large win, and the model choice (turbo) the second.
  • If the last 0.3 points of WER matter more than cost, the transformers pipeline was the most accurate in this test.

Caveats

  • One run per setup, per machine, on one day. Treat differences under about 10% as noise.
  • One English test set of TED talks: clean, single-speaker audio. Noisy calls, accents or other languages will give different error rates, and turbo is known to lose more accuracy than large-v3 on some languages.
  • Peak memory comes from nvidia-smi, which includes what the frameworks reserve, not only what they use.
  • The CPU, disk and network differ between the four machines (6 to 20 vCPUs), and the batched pipeline uses the CPU, so part of the GPU-to-GPU difference may come from the rest of the machine.
  • Prices are on-demand at launch time and move daily.

Reproduce it

  1. Create an API key and add an SSH key (POST /api/v1/ssh-keys).
  2. Pick a GPU from GET /api/v1/instances/types and launch with the curl above, max_runtime_minutes set as a safety net.
  3. Run the block above, copy results/ back, delete the instance.

If you want to run it yourself: runcrate.ai

Written by the Runcrate team, with AI assistance. The numbers come from the run described above; raw logs are kept with the post.

Top comments (0)