- Добавлена секция CPU бэкенда: int8_float32 как рекомендация, тюнинг потоков - Объяснение разницы качества OpenVINO vs CTranslate2 (pipeline декодирования) - Секция CUDA: int8_float32/int8_float16 как альтернатива для тестирования - Обновлена таблица OpenVINO моделей (medium fp16) - Обновлены таблицы скорости и качества Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
243 lines
14 KiB
Markdown
243 lines
14 KiB
Markdown
# Ускорение транскрипции
|
||
|
||
## Режимы `--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](https://huggingface.co/OpenVINO) (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 (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`
|
||
|
||
```bash
|
||
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 рекомендуется
|
||
задать число потоков равным числу **физических ядер** (не виртуальных):
|
||
|
||
```bash
|
||
OMP_NUM_THREADS=8 transcribe meeting.mp4 --device cpu --compute-type int8_float32
|
||
```
|
||
|
||
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`, и для большинства случаев это оптимальный выбор.
|
||
|
||
Однако `large-v3` с `int8` на GPU может давать **галлюцинации** на длинных записях
|
||
(зафиксировано: повтор фраз ×25, потеря контента). Причина — чистый int8 без float
|
||
аккумулятора теряет точность в глубокой модели.
|
||
|
||
**Альтернатива для тестирования:**
|
||
|
||
| compute_type | Ожидаемый эффект |
|
||
|---|---|
|
||
| `float16` | **Дефолт** — отлично работает |
|
||
| `int8_float32` | Потенциально быстрее float16, качество на уровне float32. Не протестировано — ждём feedback |
|
||
| `int8_float16` | int8 веса + float16 аккумулятор. Может быть быстрее int8_float32 при приемлемом качестве |
|
||
| `int8` | Быстрый, но рискует галлюцинациями на large-v3 и длинных записях |
|
||
|
||
Если у вас есть NVIDIA GPU и вы протестировали `int8_float32` / `int8_float16` —
|
||
поделитесь результатами через [issues](https://github.com/dementev-dev/local-transcriber/issues).
|
||
|
||
## Настройка по платформам
|
||
|
||
### Linux / WSL2 (x86_64)
|
||
|
||
Библиотека cuBLAS ставится автоматически (зависимость `nvidia-cublas-cu12` подтягивается при установке).
|
||
Дополнительных шагов не требуется.
|
||
|
||
> На ARM (aarch64) cuBLAS через pip недоступен — нужен системный CUDA toolkit.
|
||
|
||
### Windows
|
||
|
||
Нужен системный **CUDA 12** (ctranslate2 4.7 не совместим с CUDA 11 и 13):
|
||
|
||
```bash
|
||
winget install -e --id Nvidia.CUDA --version 12.9 # требует запуска от имени администратора
|
||
```
|
||
|
||
После установки перезапустите терминал.
|
||
|
||
## Совместимость GPU
|
||
|
||
| GPU | VRAM | medium float16 | large-v3 float16 | Рекомендация |
|
||
|-----|------|---------------|-----------------|--------------|
|
||
| RTX 3060 | 6 GB | ✅ | ✅ | medium float16 (дефолт) |
|
||
| RTX 4050 | 6 GB | ✅ | ✅ | medium float16 |
|
||
| Quadro M3000M | 4 GB | ✅ | ⚠️ tight | medium float16 или int8 |
|
||
|
||
## Ожидаемая скорость
|
||
|
||
Замеры на RTX 3060 Laptop (6 GB) и Intel CPU (WSL2):
|
||
|
||
| Конфигурация | 16 мин файл | 42 мин файл | Отн. скорость |
|
||
|-------------|-------------|-------------|---------------|
|
||
| GPU + medium float16 | ~35с | ~133с | ~19x реалтайм |
|
||
| GPU + large-v3 float16 | ~90с | ~350с | ~7x реалтайм |
|
||
| **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 реалтайм |
|
||
|
||
\* Замер на AMD Ryzen 7 8845H (8 потоков), файл 14:41. На эталонном 16-мин файле — TBD.
|
||
|
||
## Результаты тестирования качества
|
||
|
||
Тесты проведены на реальных записях рабочих созвонов (русский язык, технические термины:
|
||
SQL, PostgreSQL, Greenplum, Airflow, ClickHouse, Docker, CDR, GTP, MAP).
|
||
|
||
| Конфигурация | Качество (длинная запись, 42 мин) | Проблемы |
|
||
|---|---|---|
|
||
| large-v3 int8 GPU | Плохо | Галлюцинации (фразы ×25), потеря контента |
|
||
| large-v3 float16 GPU | Отлично | — |
|
||
| medium float16 GPU | Хорошо | Редкие мелкие ляпы в терминах |
|
||
| medium int8_float32 CPU | Отлично | Качество ≈ float32, на уровне облачных сервисов |
|
||
| medium float32 CPU | Хорошо | Сопоставимо с large-v3 int8, без галлюцинаций |
|
||
| large-v3 int8 CPU | Хорошо | Без галлюцинаций (на коротких файлах) |
|
||
|
||
### Ключевые выводы
|
||
|
||
1. **Указание языка (`--language ru`) критично** — auto-detect может ошибиться и выдать мусор
|
||
2. **float16/float32 стабильнее int8** — особенно на записях >20 минут
|
||
3. **medium + float16 на GPU — лучший баланс** скорости и качества для повседневного использования
|
||
4. **large-v3 + float16 на GPU** — для максимального качества важных записей
|
||
5. **CPU: int8_float32 — лучший баланс** — 1.5x быстрее float32 при том же качестве
|
||
6. **OpenVINO быстрее, но CPU бэкенд качественнее** — разница в pipeline декодирования
|
||
(temperature fallback, фильтры галлюцинаций), а не в квантизации
|
||
|
||
## Troubleshooting
|
||
|
||
### CUDA не обнаружен
|
||
|
||
Убедитесь, что `nvidia-smi` возвращает информацию о GPU. Драйвер NVIDIA предоставляет `libcuda.so.1`,
|
||
без которого CUDA не работает — его нельзя поставить через pip.
|
||
|
||
### Windows: ошибка при загрузке модели на GPU
|
||
|
||
GPU на Windows требует **CUDA 12** (ctranslate2 4.7 не совместим с CUDA 11 и 13). Установите:
|
||
```bash
|
||
winget install -e --id Nvidia.CUDA --version 12.9 # требует запуска от имени администратора
|
||
```
|
||
После установки перезапустите терминал.
|
||
|
||
### ARM (aarch64)
|
||
|
||
cuBLAS через pip недоступен на ARM — нужен системный CUDA toolkit.
|