diff --git a/docs/gpu.md b/docs/gpu.md index 6f1a49b..55ff673 100644 --- a/docs/gpu.md +++ b/docs/gpu.md @@ -37,7 +37,7 @@ OpenVINO ускоряет inference на x86 процессорах (Intel и AM | tiny | OpenVINO/whisper-tiny-int8-ov | — | | base | — | OpenVINO/whisper-base-fp16-ov | | small | OpenVINO/whisper-small-int8-ov | — | -| medium | OpenVINO/whisper-medium-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 @@ -77,6 +77,83 @@ OpenVINO ускоряет inference на x86 процессорах (Intel и AM - **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) @@ -115,9 +192,12 @@ winget install -e --id Nvidia.CUDA --version 12.9 # требует запус | **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. + ## Результаты тестирования качества Тесты проведены на реальных записях рабочих созвонов (русский язык, технические термины: @@ -128,6 +208,7 @@ SQL, PostgreSQL, Greenplum, Airflow, ClickHouse, Docker, CDR, GTP, MAP). | 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 | Хорошо | Без галлюцинаций (на коротких файлах) | @@ -137,6 +218,9 @@ SQL, PostgreSQL, Greenplum, Airflow, ClickHouse, Docker, CDR, GTP, MAP). 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