Skip to content

Latest commit

 

History

History
319 lines (230 loc) · 19.4 KB

File metadata and controls

319 lines (230 loc) · 19.4 KB

Ускорение транскрипции

Режимы --device

  • auto (по умолчанию) — CUDA → OpenVINO GPU → OpenVINO CPU → CPU (первый доступный)
  • cuda — строго NVIDIA GPU, ошибка если недоступен
  • openvino — авто-выбор OpenVINO GPU или CPU
  • openvino-gpu — строго Intel GPU через OpenVINO
  • openvino-cpu — строго CPU через OpenVINO (ускорение 2-4x на x86)
  • cpu — строго CPU (faster-whisper/CTranslate2)

Какой бэкенд на каком оборудовании

Оборудование Рекомендуемый --device Бэкенд Ожидаемая скорость
NVIDIA GPU (6+ GB VRAM) auto / cuda faster-whisper (CTranslate2) 7-19x реалтайм
Intel Arc iGPU / dGPU auto / openvino-gpu OpenVINO GenAI (GPU) TBD
Intel/AMD x86 CPU auto / openvino-cpu OpenVINO GenAI (CPU) 3-6x реалтайм*
Любой CPU (fallback) cpu faster-whisper (CTranslate2) ~1.5x реалтайм
Apple Silicon (macOS) cpu faster-whisper (CTranslate2) ~2x реалтайм

* По результатам тестирования на Intel и AMD CPU. Реальная скорость зависит от CPU и модели.

OpenVINO

OpenVINO ускоряет inference на x86 процессорах (Intel и AMD) через оптимизированные инструкции (AVX2, AVX-512, VNNI, AMX). Ставится автоматически на Linux и Windows (x86_64/AMD64).

  • Модели: предконвертированные из HuggingFace (int8/fp16)
  • Дефолт: medium + int8 (для large-v3 автоматически выбирается fp16)
  • Аудиодекодирование: через PyAV (бандлит FFmpeg), системный ffmpeg не нужен

Доступные OpenVINO модели

Модель int8 fp16
tiny OpenVINO/whisper-tiny-int8-ov
base OpenVINO/whisper-base-fp16-ov
small OpenVINO/whisper-small-int8-ov
medium OpenVINO/whisper-medium-int8-ov OpenVINO/whisper-medium-fp16-ov
large-v3 OpenVINO/whisper-large-v3-int8-ov OpenVINO/whisper-large-v3-fp16-ov

Результаты тестирования OpenVINO

Реальные записи рабочих созвонов (русский, техтермины: SQL, PostgreSQL, LDAP, DLP и др.).

Скорость (эталонный файл 16 мин, OpenVINO, medium int8):

CPU medium int8 large-v3 fp16 CPU float32 (baseline)
Intel Ultra 7 255H 122с 411с
AMD Ryzen 7 8845H 185с 416с 734с
Intel i7-11800H (WSL2) 171-205с 658с

Ускорение vs CPU float32: 3-6x в зависимости от CPU.

OpenVINO small int8 (Intel i7 WSL2):

Файл small int8 medium int8
16 мин 93с 171с
42 мин 153с (~16x реалтайм) 413с

Качество (сравнение на одном файле, 16 мин, OpenVINO int8/fp16, Intel CPU):

small int8 medium int8 large-v3 fp16
Время (16 мин) 93с 171с 416с
Время (42 мин) 153с 413с
Ключевые слова искажения ("бокап", "рецензия") единичные ляпы корректно
Пунктуация слабая базовая хорошая
Галлюцинации нет нет нет

Рекомендации по выбору модели

  • small — для быстрого сканирования большого объёма видео по маске (*.mp4). Ошибки в отдельных словах; для обработки ИИ (МОМ, конспект) рискованно — "рецензия" вместо "лицензия" может исказить смысл.
  • medium — для повседневного использования и обработки ИИ. Ключевые термины верные, единичные ляпы не влияют на смысл конспекта. Оптимальный баланс скорости и качества.
  • large-v3 — для важных записей, где нужна дословная точность. Лучшая пунктуация и связность. На OpenVINO (416с) быстрее, чем medium на чистом CPU (734с) — лучшее качество при выше скорости.

CPU бэкенд (CTranslate2 / faster-whisper)

При --device cpu используется faster-whisper на основе CTranslate2. Этот бэкенд медленнее OpenVINO, но обеспечивает лучшее качество благодаря развитому pipeline декодирования.

Рекомендуемый compute_type: int8_float32

transcribe meeting.mp4 --device cpu --compute-type int8_float32

int8_float32 — int8 квантизация весов с float32 аккумулятором. Даёт 1.5x ускорение vs float32 при сопоставимом качестве (протестировано на русском языке с техтерминами).

compute_type Скорость* Качество Когда использовать
int8_float32 ~460с Отлично Рекомендуется — лучший баланс
float32 ~880с Отлично (эталон) Если важна максимальная точность
int8 быстрее Хорошо, но бывают галлюцинации Не рекомендуется для длинных записей

* Замеры на AMD Ryzen 7 8845H, medium, запись 14:41, 8 потоков.

Оптимизация потоков

CTranslate2 по умолчанию использует 4 потока. На многоядерных CPU рекомендуется задать число потоков равным числу физических ядер (не виртуальных):

transcribe meeting.mp4 --device cpu --compute-type int8_float32 --threads 8

Замеры (Intel i7-11800H, 8 ядер / 16 потоков, medium int8_float32, 16 мин файл):

--threads Время Ускорение
0 (дефолт = 4) 320с baseline
8 (физ. ядра) 277с +13%

SMT/Hyper-Threading не помогает — 16 потоков на 8-ядерном CPU медленнее, чем 8.

Почему CPU бэкенд качественнее OpenVINO

При одной и той же модели (medium) CTranslate2 даёт заметно лучше распознавание, чем OpenVINO. Разница не в квантизации, а в pipeline декодирования:

Механизм CTranslate2 (faster-whisper) OpenVINO GenAI
Temperature fallback ✅ до 5 попыток с ростом temperature ❌ один проход
Фильтр по compression_ratio ✅ отсекает повторы ❌ нет
Фильтр по log_prob ✅ отсекает неуверенные сегменты ❌ нет
no_speech_threshold ✅ детекция тишины ❌ нет
VAD (Silero) ✅ опционально ❌ нет
condition_on_previous_text ✅ с умным сбросом ⚠️ базовый

Эти эвристики критичны для русской разговорной речи с паузами и перебивками.

Выбор между OpenVINO и CPU

Сценарий Рекомендация
Быстрый черновой транскрипт --device openvino-cpu (int8, ~240с)
Качественный транскрипт для суммаризации --device cpu --compute-type int8_float32 (~460с)
Максимальная точность --device cpu --compute-type float32 (~880с)

CUDA: compute_type и качество

На NVIDIA GPU дефолт — float16, и для большинства случаев это оптимальный выбор.

Результаты тестирования compute_type на GPU (RTX 3060 Laptop, 6 GB)

Скорость (файл 16 мин, русский язык):

Модель float16 int8_float32 int8_float16
medium 53с (~18x) 64с (~15x) 54с (~18x)
large-v3 86с (~11x) 113с (~8.5x) 125с (~7.7x)

Скорость (файл 46 мин, русский язык):

Модель float16
medium 127с (~22x реалтайм)
large-v3 271с (~10x реалтайм)

Качество (файл 16 мин):

Модель float16 int8_float32 int8_float16
medium Отлично Отлично (≈float16) Хорошо (1-2 ошибки)
large-v3 Хорошо (ед. галлюцинации) Плохо (повтор "Ага" ×18) Неприемлемо (мусор, иероглифы)

Качество (файл 46 мин):

Модель float16 Проблемы
medium Отлично Единичные ляпы ("email" вместо "ML"), стабилен
large-v3 Плохо Галлюцинации на 3+ языках (китайский, арабский), повторы фраз, "Аминь" вместо "Угу"

Выводы по CUDA compute_type

  • float16 — оптимальный дефолт: самый быстрый и стабильный
  • int8_float32 не дал выигрыша: на 20% медленнее float16, качество для medium сопоставимо, для large-v3 — деградация
  • int8_float16: по скорости ≈ float16 для medium, но large-v3 даёт мусор
  • int8: рискует галлюцинациями на large-v3 и длинных записях (повтор фраз ×25)
  • medium устойчивее к квантизации, чем large-v3 — все варианты compute_type дают приемлемый результат
  • large-v3 на длинных записях (>20 мин): галлюцинации даже с float16 — medium надёжнее

Настройка по платформам

Linux / WSL2 (x86_64)

Библиотека cuBLAS ставится автоматически (зависимость nvidia-cublas-cu12 подтягивается при установке). Дополнительных шагов не требуется.

На ARM (aarch64) cuBLAS через pip недоступен — нужен системный CUDA toolkit.

Windows

Нужен системный CUDA 12 (ctranslate2 4.7 не совместим с CUDA 11 и 13):

winget install -e --id Nvidia.CUDA --version 12.9   # требует запуска от имени администратора

После установки перезапустите терминал.

Совместимость GPU

GPU VRAM CC medium float16 large-v3 float16 Рекомендация
RTX 3060 6 GB 8.6 medium float16 (дефолт)
RTX 4050 6 GB 8.9 medium float16
Quadro M3000M 4 GB 5.0 --device cpu или openvino

Quadro M3000M и другие GPU с CC < 7.0 (Maxwell, Pascal): CUDA не работает — float16 требует CC ≥ 7.0, float32 падает с ошибкой (CTranslate2 4.x не включает sm_50/sm_60 в пребилды). Используйте --device cpu --compute-type int8_float32 или --device openvino.

Ожидаемая скорость

Замеры на RTX 3060 Laptop (6 GB) и Intel CPU (WSL2):

Конфигурация 16 мин файл 46 мин файл Отн. скорость
GPU + medium float16 53с 127с ~18-22x реалтайм
GPU + large-v3 float16 86с 271с ~10-11x реалтайм
GPU + medium int8_float32 64с ~15x реалтайм
GPU + medium int8_float16 54с ~18x реалтайм
OpenVINO + small int8 93с 153с ~10-16x реалтайм
OpenVINO + medium int8 171-205с 413с ~4-6x реалтайм
OpenVINO + large-v3 fp16 416с ~2.3x реалтайм
CPU + medium int8_float32 ~460с* ~2x реалтайм
CPU + medium float32 658с (11 мин) ~26 мин ~1.5x реалтайм
CPU + large-v3 int8 839с (14 мин) ~37 мин ~1:1 реалтайм

* Замер CPU int8_float32 на AMD Ryzen 7 8845H (8 потоков), файл 14:41.

Результаты тестирования качества

Тесты проведены на реальных записях рабочих созвонов (русский язык, технические термины: SQL, PostgreSQL, Greenplum, Airflow, ClickHouse, Docker, CDR, GTP, MAP).

Конфигурация Качество (короткие, ≤16 мин) Качество (длинные, >40 мин) Проблемы
medium float16 GPU Отлично Отлично Единичные ляпы в терминах ("email" вместо "ML")
medium int8_float32 GPU Отлично Качество ≈ float16, но на 20% медленнее
medium int8_float16 GPU Хорошо 1-2 ошибки
large-v3 float16 GPU Хорошо Плохо Галлюцинации на длинных записях (мусор на 3+ языках)
large-v3 int8_float32 GPU Плохо Повтор фраз ("Ага" ×18), искажения
large-v3 int8_float16 GPU Неприемлемо Мусор, китайские/арабские символы, потеря текста
large-v3 int8 GPU Плохо Плохо Галлюцинации (фразы ×25), потеря контента
medium int8_float32 CPU Отлично Качество ≈ float32, на уровне облачных сервисов
medium float32 CPU Отлично Хорошо Эталон качества
large-v3 int8 CPU Хорошо Без галлюцинаций (на коротких файлах)

Ключевые выводы

  1. Указание языка (--language ru) критично — auto-detect может ошибиться и выдать мусор
  2. medium + float16 на GPU — лучший баланс скорости и качества для любых записей
  3. large-v3 ненадёжен на длинных записях (>20 мин) — галлюцинации даже с float16; medium стабильнее на любой длине
  4. medium устойчив к квантизации — все варианты compute_type дают приемлемый результат; large-v3 деградирует катастрофически при любом int8
  5. CPU: int8_float32 — лучший баланс — 1.5x быстрее float32 при том же качестве
  6. OpenVINO быстрее, но CPU бэкенд качественнее — разница в pipeline декодирования (temperature fallback, фильтры галлюцинаций), а не в квантизации

Потенциальные направления развития

Качественный pipeline для OpenVINO

Сейчас качественный pipeline декодирования (temperature fallback, фильтры галлюцинаций, VAD) доступен только через CTranslate2, т.е. на CPU и NVIDIA CUDA. Пользователи Intel Arc и AMD Radeon получают скорость OpenVINO, но без защиты от галлюцинаций.

Решение: реализовать temperature fallback, compression_ratio и log_prob фильтры поверх OpenVINO GenAI WhisperPipeline. Эти эвристики — логика на Python (~50-100 строк), не зависящая от inference engine. Это даст Intel Arc / AMD GPU то же качество, что сейчас есть только у CUDA-пользователей.

CUDA: int8_float32 / int8_float16 — протестировано

На CPU int8_float32 показал качество на уровне float32 при 1.5x ускорении. На GPU (RTX 3060) результат другой: для medium int8_float32 даёт сопоставимое качество, но на 20% медленнее float16 — выигрыша нет. Для large-v3 любой int8 вариант (включая int8_float32) вызывает галлюцинации — float32 аккумулятор не спасает глубокую модель на GPU. Вывод: float16 остаётся оптимальным дефолтом для CUDA.

NVIDIA Parakeet TDT — проверено, отклонено

Оценивалась гипотеза: multilingual Parakeet TDT 0.6B v3 через onnx-asr может обойти Whisper medium int8 на x86 CPU. На двух 15-минутных отрывках реальных русских ИТ-встреч (Intel i7-11800H) Parakeet показал 2.7x преимущество по скорости и -35% RAM, но качество ниже — систематическая редукция тихих реплик менти до Mm-hmm, вставки кусков польского/испанского, сильное искажение ИТ-терминов. Попытка тюнинга Silero VAD threshold не помогла — проблема inherent для модели на тихой русской речи.

Код бэкенда не вмержен в master; эксперимент сохранён в ветке feature/parakeet-backend. Подробности и когда стоит пересмотреть — ADR-005.

Troubleshooting

CUDA не обнаружен

Убедитесь, что nvidia-smi возвращает информацию о GPU. Драйвер NVIDIA предоставляет libcuda.so.1, без которого CUDA не работает — его нельзя поставить через pip.

Windows: ошибка при загрузке модели на GPU

GPU на Windows требует CUDA 12 (ctranslate2 4.7 не совместим с CUDA 11 и 13). Установите:

winget install -e --id Nvidia.CUDA --version 12.9   # требует запуска от имени администратора

После установки перезапустите терминал.

ARM (aarch64)

cuBLAS через pip недоступен на ARM — нужен системный CUDA toolkit.