whisper.cpp на CPU

В своем пет-проектe TasK.Ai-Aid.pro для распознания аудио я использую whisper.cpp, запуская его на CPU, без использования GPU. В связи с этим мне было важно знать, как я могу более эффективно использовать whisper.cpp.

В этой статье я хочу поделится своими исследованиями влияния количества потоков на производительность whisper.cpp при запуске на CPU, без использования GPU.

Конфигурация оборудования

Для оценки производительности whisper.cpp я использовал свой домашний мини-компьютер MINISFORUM UM890 Pro. На момент тестирования (апрель 2025 г) аппаратная конфигурация была следующей:

Сценарий теста

Whisper.cpp — это порт модели Whisper от OpenAI, реализованный на C/C++ и предназначенный для локального распознавания речи. Проект поддерживает множество оптимизаций для современных процессоров.

Для измерения производительности использовалась версия whisper.cpp v1.7.4 с лучшей по качеству на тот момент моделью ggml‑large‑v3. Распознавание проводилось на одной русскоязычной аудио‑записи длиной 277‑секунд (4 мин 37 сек).

Команда запуска из корневой папки whisper.cpp:

build/bin/whisper-cli \
  -m models/ggml-large-v3.bin \
  -f ../../segment.ogg \
  --language ru \
  --split-on-word \
  --max-len 80 \
  --output-json-full \
  -otxt \
  -t 8

Пояснение ключей

Ключ Значение Комментарий
-m models/ggml-large-v3.bin Модель Large v3 Максимальная точность, но самая ресурсоёмкая
-f ../../segment.ogg Входной файл Тестовый аудиосегмент
--language ru Русский язык Исключает фазу автоопределения языка
--split-on-word Деление по словам Минимизирует обрыв слов в концах сегментов
--max-len 80 Макс. длина сегмента Оптимум для субтитров и читаемости
--output-json-full Полный JSON-вывод Все токены, вероятности и тайминги
-otxt Текстовый вывод Удобен для оценки результатов
-t 8 Потоков CPU Количество используемых потоков (в тесте варьировалось от 1 до 16)

Тут подробная информация по ключам запуска.

Для каждого значения числа потоков от 1 до 16 запускался один прогон, а для конфигураций с 8 и 9 потоками дополнительно измерялись несколько прогонов для проверки стабильности результатов. Время измерялось в секундах с помощью встроенной статистики Whisper.

Результаты

Таблица

В таблице ниже представлены усреднённые показатели времени обработки файла, ускорения в пересчете на один поток, скорость обработки в сравнении с реальной длительностью файла

Количество потоков Время обработки файла (сек) Ускорение (в раз) Скорость обработки (× реального времени)
1 1169.6 1.00 0.24
2 611.1 1.91 0.45
3 417.6 2.80 0.66
4 322.6 3.63 0.86
5 265.6 4.40 1.04
6 235.0 4.98 1.18
7 214.8 5.45 1.29
8 197.9 5.91 1.40
9 202.4 5.78 1.37
10 201.5 5.80 1.37
11 198.8 5.88 1.39
12 194.9 6.00 1.42
13 195.7 5.98 1.42
14 200.1 5.84 1.38
15 210.3 5.56 1.32
16 229.9 5.09 1.20

Ускорение = Время обработки одним потоком / Время обработки t потоками
Скорость обработки = Длительность аудио / Время обработки

📈 Графики

1. Зависимость ускорения от числа потоков

2. Время обработки и скорость относительно числа потоков

Пояснения к графикам

  1. Рост ускорения до 8 потоков близок к идеальному — прирост почти линейный (до 5.9×).
  2. После 8–10 потоков начинается плато, видимо вызванное конкуренцией за ресурсы.
  3. Максимальная скорость обработки ≈ 1.4× реального времени (аудио длиной 277 с обрабатывается за ≈ 198 с) на 8-ми потоках.
  4. Начиная с 12–16 потоков наблюдается обратный эффект — рост времени из-за переключения контекстов и падения эффективности.

Анализ: какой закон описывает поведение

  • Колонка «Ускорение» подчиняется закону Амдала, где последовательная часть кода ограничивает дальнейший прирост. Для whisper.cpp примерно P≈0.95P ≈ 0.95P≈0.95, что даёт максимальное ускорение около 6–7× при бесконечном числе потоков.

  • Если же разделить аудио на части и распознавать их независимыми экземплярами whisper.cpp, то задача может масштабироваться по закону Густафсона – Барсиса, и ускорение может расти почти линейно (до 16× и выше при многопоточном батчинге).

Практические рекомендации

  • Для оптимального баланса скорости — использовать -t 8.
  • При обработке длинных файлов лучше разделить аудио на сегменты и распознавать их параллельно.
  • Для ускорения без потери качества можно держать модель в RAM-диске или использовать серверную реализацию whisper.cpp.

Выводы

  1. whisper.cpp на Ryzen 9 8945HS способен работать почти в реальном времени на самой тяжелой модели Large v3 (≈ 1.4× RT).
  2. Эффективность масштабирования хорошо согласуется с законом Амдала — до 8 потоков рост почти идеальный.
  3. Для массовых задач (батч-распознавание, подкасты, видео) лучше использовать несколько параллельных экземпляров модели.