Files
local-transcriber/docs/gpu.md
T
Dmitriy Dementiev 136e93765c feat(auto): выбран ONNX по умолчанию без CUDA
- Зачем:
  - пользователям без NVIDIA нужен самый быстрый и читаемый CPU-профиль без дополнительных параметров.
- Что:
  - auto-политика изменена на CUDA при наличии nvidia-smi, иначе ONNX GigaAM RNN-T int8.
  - сохранён приоритет явных значений CLI и конфигурации для OpenVINO и FasterWhisper CPU.
  - обновлены тесты, README, PRD, ADR, GPU-документация и вывод benchmark.
- Проверка:
  - uv run pytest -q: 232 passed, 1 skipped.
  - uv lock --check и git diff --cached --check.
2026-08-12 10:45:05 +03:00

334 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Ускорение транскрипции
## Режимы `--device`
- `auto` (по умолчанию) — CUDA при наличии `nvidia-smi`, иначе ONNX на 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 реалтайм |
| Любой CPU без NVIDIA | `auto` / `onnx` | ONNX GigaAM RNN-T | 10-14x реалтайм* |
| Intel Arc iGPU / dGPU | `openvino-gpu` | OpenVINO GenAI (GPU) | TBD |
| Intel/AMD x86 CPU | `openvino-cpu` | OpenVINO GenAI (CPU) | 3-10x реалтайм* |
| Любой CPU, FasterWhisper | `cpu` | faster-whisper (CTranslate2) | ~1.5x реалтайм |
\* По результатам контрольных прогонов на 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`)
- **Быстрый профиль с низким WER**: явный `large-v3-turbo` + `int8`; для
читаемости и сохранности содержания `medium` остаётся предпочтительнее
- **Аудиодекодирование**: через 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 |
| large-v3-turbo | OpenVINO/whisper-large-v3-turbo-int8-ov | OpenVINO/whisper-large-v3-turbo-fp16-ov |
### Результаты тестирования OpenVINO
Актуальное сравнение OpenVINO 2026.3 на трёх русскоязычных встречах:
[medium, large-v3-turbo и GigaAM](benchmarks/2026-08-12-openvino-large-v3-turbo-comparison.md).
На Intel Core i7-11800H `large-v3-turbo` INT8 обработал 43:37 аудио за
365,5 секунды (7,16× RTFx) при WER 24,0%. FP16 занял 545,0 секунды и получил
WER 24,8%, поэтому для CPU рекомендуется INT8.
Реальные записи рабочих созвонов (русский, техтермины: 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с) — лучшее качество при выше скорости.
- **large-v3-turbo** — явный профиль для CPU с приоритетом скорости и низкого
WER. В проверенном наборе INT8 быстрее и численно точнее medium, но хуже по
независимой оценке читаемости и сохранности содержания; FP16 на CPU пользы
не показал.
## 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
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):
```bash
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](adr/005-parakeet-evaluation.md).
## 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.