Author SHA1 Message Date
Dmitriy DementievandClaude Opus 4.6 8ae74d2748 docs(gpu): потенциальные направления — quality pipeline для OpenVINO, CUDA int8_float32
Зафиксированы два направления развития:
- temperature fallback и фильтры галлюцинаций для OpenVINO бэкенда
- тестирование int8_float32/int8_float16 на CUDA

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 11:00:31 +03:00
Dmitriy DementievandClaude Opus 4.6 248f260005 docs(gpu): CPU int8_float32, сравнение pipeline-ов, CUDA рекомендации
- Добавлена секция 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>
2026-03-24 10:45:17 +03:00
Dmitriy DementievandClaude Opus 4.6 413cb3e6d8 feat(openvino): добавить medium fp16 модель как опцию
OpenVINO/whisper-medium-fp16-ov доступна через --compute-type fp16.
На CPU fp16 эмулируется программно (медленно), но на Intel Arc GPU
даёт аппаратное ускорение через XMX. Не меняет дефолты.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:48:29 +03:00
Dmitriy DementievandClaude Opus 4.6 9d41b893c3 docs(readme): добавить int8_float32 в таблицу compute_type
Бенчмарк показал: int8_float32 даёт 1.5x ускорение на CPU при сохранении
качества float32. Добавлен как рекомендуемый вариант для CPU.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:04:24 +03:00
4 changed files with 105 additions and 475 deletions
+1
View File
@@ -243,6 +243,7 @@ language = "en"
|-----|--------|----------|----------|--------------------| |-----|--------|----------|----------|--------------------|
| `float16` | CUDA | ~4.5-5 GB | Отлично | **По умолчанию для CUDA** | | `float16` | CUDA | ~4.5-5 GB | Отлично | **По умолчанию для CUDA** |
| `int8_float16` | CUDA | ~4.7 GB | Отлично | GPU от 6 GB, альтернатива float16 | | `int8_float16` | CUDA | ~4.7 GB | Отлично | GPU от 6 GB, альтернатива float16 |
| `int8_float32` | CPU | Среднее | Отлично | **Рекомендуется для CPU** — 1.5x быстрее float32 при том же качестве |
| `int8` | CUDA / OpenVINO | Низкое | Хорошо, но бывают галлюцинации | **По умолчанию для OpenVINO** | | `int8` | CUDA / OpenVINO | Низкое | Хорошо, но бывают галлюцинации | **По умолчанию для OpenVINO** |
| `fp16` | OpenVINO | Низкое | Отлично | OpenVINO large-v3 (выбирается автоматически) | | `fp16` | OpenVINO | Низкое | Отлично | OpenVINO large-v3 (выбирается автоматически) |
| `float32` | CPU | Среднее | Отлично | **По умолчанию для CPU** | | `float32` | CPU | Среднее | Отлично | **По умолчанию для CPU** |
-123
View File
@@ -1,123 +0,0 @@
# Бенчмарк: качество и скорость транскрипции
**Дата**: 2026-03-23
## Цель
Сравнить качество распознавания нашего приложения (local-transcriber) с облачным
сервисом Whisper.ai, подобрать оптимальную конфигурацию бэкенд/модель/compute_type.
## Тестовый стенд
- **CPU**: AMD Ryzen 7 8845H w/ Radeon 780M (3.80 GHz), 8 ядер
- **GPU**: нет NVIDIA (нет CUDA), есть встроенный Radeon 780M iGPU + Ryzen AI NPU (XDNA)
- **ОС**: Windows 11 Enterprise
- **Запись**: совещание 3 участников, 14:41, русский язык, микрофон ноутбука
## Конфигурации
| # | Модель | Бэкенд | compute_type | Устройство |
|---|--------|--------|--------------|------------|
| 1 | medium | OpenVINO | fp16 | CPU |
| 2 | large-v3 | OpenVINO | fp16 | CPU |
| 3 | medium | CTranslate2 (faster-whisper) | float32 | CPU |
| 4 | medium | CTranslate2 (faster-whisper) | int8_float32 | CPU |
| 5 | — | Whisper.ai (облако) | — | — |
## Результаты: скорость
| # | Конфигурация | Время, с | Коэфф. к реалтайму (14:41 = 881с) |
|---|---|---|---|
| 1 | medium, OpenVINO fp16 | **~240** | 0.27x |
| 2 | large-v3, OpenVINO fp16 | ~503 | 0.57x |
| 4 | medium, CT2 int8_float32 | ~599 | 0.68x |
| 3 | medium, CT2 float32 | ~881 | 1.0x |
## Результаты: качество
Для оценки выбраны маркерные фразы — технические термины, сложная разговорная речь,
имена собственные. Каждый маркер проверен вручную по контексту записи.
### Техтермины (английские в русской речи)
| Термин | #1 OV fp16 | #2 large OV | #3 CT2 f32 | #4 CT2 int8f32 | #5 Whisper.ai |
|--------|-----------|-------------|------------|----------------|---------------|
| DWH | ✅ DWH | ❌ ДВХ | ⚠️ ДВХ | ✅ DWH | ⚠️ dvh |
| Teradata | ✅ TeraData | ⚠️ тирадат | ⚠️ Тирадату | ✅ Teradata | ⚠️ тирадата |
| NiFi | ✅ NiFi | ❌ "на файл" | ⚠️ Найфай | ✅ NiFi | ⚠️ фай |
| FineBI | ✅ fineBI | ❌ "фанбой" | ✅ FNBI | ✅ finebi/FNBI | ⚠️ FineBI/NBI |
| Alation | ❌ "лэйшене" | ❌ "валаши" | ✅ Allation | ✅ Allation | ✅ Allation |
| ETL | ❌ ETA | ❌ "и ты или" | ✅ ETL | ✅ ETL | ✅ ETL |
| DBC Tables V | ✅ | ❌ "деби си" | ✅ | ✅ | ✅ |
| OpenLineage | ⚠️ OpenLinage | ⚠️ "open lineage и о" | ✅ OpenLinage.io | ✅ OpenLinage.io | ✅ Open Lineage.io |
### Русская разговорная речь
| Фраза (правильно) | #1 OV fp16 | #2 large OV | #3 CT2 f32 | #4 CT2 int8f32 | #5 Whisper.ai |
|--------------------|-----------|-------------|------------|----------------|---------------|
| "на другую мониторочку" | ❌ "другом не торчка" | ❌ "другому и" | ✅ "мониторчику" | ⚠️ "мою точку" | ✅ "мониторочку" |
| "верхнеуровневое" | ⚠️ "верхверх верхне..." | ✅ | ✅ | ✅ | ✅ |
| "датарентген" | ❌ "госпиталин ген" | ❌ "господа тренды" | ✅ "даторентген" | ✅ "даторентген" | ✅ "датарентген" |
| "девовские схемы" | ✅ | ❌ "девушки схемы" | ✅ | ✅ | ✅ |
| "с накиданными правами" | ✅ | ❌ "накиданных бровами" | ✅ | ✅ | ✅ |
| "Вьюхи" | ❌ "в юхе" | — | ✅ "Вьюхи" | ⚠️ "Yuhi" | ❌ "в юхе" |
### Структура и пунктуация
| Аспект | #1 OV fp16 | #2 large OV | #3 CT2 f32 | #4 CT2 int8f32 | #5 Whisper.ai |
|--------|-----------|-------------|------------|----------------|---------------|
| Пунктуация | слабая | слабая | хорошая | хорошая | средняя |
| Длина сегментов | ~1 мин | ~1 мин | ~1 мин | ~1 мин | 230 сек |
| Диаризация | нет | нет | нет | нет | есть (условная) |
## Ключевые выводы
### 1. OpenVINO fp16 ухудшает качество medium
OpenVINO даёт **3.7x ускорение**, но fp16-квантизация на CPU вносит заметные ошибки
в распознавание нечёткой русской речи ("госпиталин ген", "ETA"). При этом английские
техтермины (DWH, NiFi, FineBI) распознаются хорошо — видимо, они более «чёткие»
акустически.
### 2. large-v3 через OpenVINO — хуже medium
Удивительный результат: large-v3 с OpenVINO fp16 деградировал по всем параметрам.
FineBI → "фанбой", NiFi → "на файл", девовские → "девушки". Гипотеза: fp16 на CPU
бьёт сильнее по большим моделям из-за накопления ошибок округления.
### 3. CTranslate2 float32 — лучшее качество
Сравнимо с облачным Whisper.ai, а на некоторых маркерах лучше (Вьюхи, DWH).
Но **3.7x медленнее** OpenVINO — неприемлемо для длинных записей.
### 4. int8_float32 — оптимальный баланс
Mixed precision (int8 матрицы, float32 аккумулятор) даёт:
- **1.5x ускорение** vs float32 (599с vs 881с)
- Качество практически идентичное float32
- Техтермины DWH/Teradata/NiFi даже лучше, чем у float32
### 5. Whisper.ai — диаризация как преимущество
Единственное значимое преимущество облачного сервиса — диаризация спикеров.
По качеству распознавания наше приложение с CT2 int8_float32 на уровне или лучше.
## Рекомендации
### Краткосрочно
- **Дефолт для CPU без CUDA**: рассмотреть `int8_float32` вместо `float32` — 1.5x быстрее
при сопоставимом качестве.
- **OpenVINO fp16 оставить** как быстрый вариант — для случаев, когда скорость важнее
точности (превью, черновые транскрипты).
### Среднесрочно
- **DirectML бэкенд** для AMD Radeon iGPU — через onnxruntime-directml можно задействовать
Radeon 780M. Float16 на GPU (в отличие от CPU-квантизации) не должен терять качество.
Потенциально 3–5x ускорение при сохранении качества float32.
### Долгосрочно
- **Ryzen AI NPU (XDNA)** — AMD развивает поддержку, но tooling пока сырой.
- **Диаризация** — добавить идентификацию спикеров (pyannote-audio или аналоги).
+104 -1
View File
@@ -37,7 +37,7 @@ OpenVINO ускоряет inference на x86 процессорах (Intel и AM
| tiny | OpenVINO/whisper-tiny-int8-ov | — | | tiny | OpenVINO/whisper-tiny-int8-ov | — |
| base | — | OpenVINO/whisper-base-fp16-ov | | base | — | OpenVINO/whisper-base-fp16-ov |
| small | OpenVINO/whisper-small-int8-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 | | large-v3 | OpenVINO/whisper-large-v3-int8-ov | OpenVINO/whisper-large-v3-fp16-ov |
### Результаты тестирования OpenVINO ### Результаты тестирования OpenVINO
@@ -77,6 +77,83 @@ OpenVINO ускоряет inference на x86 процессорах (Intel и AM
- **medium** — для повседневного использования и обработки ИИ. Ключевые термины верные, единичные ляпы не влияют на смысл конспекта. Оптимальный баланс скорости и качества. - **medium** — для повседневного использования и обработки ИИ. Ключевые термины верные, единичные ляпы не влияют на смысл конспекта. Оптимальный баланс скорости и качества.
- **large-v3** — для важных записей, где нужна дословная точность. Лучшая пунктуация и связность. На OpenVINO (416с) быстрее, чем medium на чистом CPU (734с) — лучшее качество при выше скорости. - **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) ### 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 + small int8** | **93с** | **153с** | **~10-16x реалтайм** |
| **OpenVINO + medium int8** | **171-205с** | **413с** | **~4-6x реалтайм** | | **OpenVINO + medium int8** | **171-205с** | **413с** | **~4-6x реалтайм** |
| **OpenVINO + large-v3 fp16** | **416с** | — | **~2.3x реалтайм** | | **OpenVINO + large-v3 fp16** | **416с** | — | **~2.3x реалтайм** |
| **CPU + medium int8_float32** | **~460с*** | — | **~2x реалтайм** |
| CPU + medium float32 | 658с (11 мин) | ~26 мин | ~1.5x реалтайм | | CPU + medium float32 | 658с (11 мин) | ~26 мин | ~1.5x реалтайм |
| CPU + large-v3 int8 | 839с (14 мин) | ~37 мин | ~1:1 реалтайм | | 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 int8 GPU | Плохо | Галлюцинации (фразы ×25), потеря контента |
| large-v3 float16 GPU | Отлично | — | | large-v3 float16 GPU | Отлично | — |
| medium float16 GPU | Хорошо | Редкие мелкие ляпы в терминах | | medium float16 GPU | Хорошо | Редкие мелкие ляпы в терминах |
| medium int8_float32 CPU | Отлично | Качество ≈ float32, на уровне облачных сервисов |
| medium float32 CPU | Хорошо | Сопоставимо с large-v3 int8, без галлюцинаций | | medium float32 CPU | Хорошо | Сопоставимо с large-v3 int8, без галлюцинаций |
| large-v3 int8 CPU | Хорошо | Без галлюцинаций (на коротких файлах) | | large-v3 int8 CPU | Хорошо | Без галлюцинаций (на коротких файлах) |
@@ -137,6 +218,28 @@ SQL, PostgreSQL, Greenplum, Airflow, ClickHouse, Docker, CDR, GTP, MAP).
2. **float16/float32 стабильнее int8** — особенно на записях >20 минут 2. **float16/float32 стабильнее int8** — особенно на записях >20 минут
3. **medium + float16 на GPU — лучший баланс** скорости и качества для повседневного использования 3. **medium + float16 на GPU — лучший баланс** скорости и качества для повседневного использования
4. **large-v3 + float16 на GPU** — для максимального качества важных записей 4. **large-v3 + float16 на GPU** — для максимального качества важных записей
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 ускорении.
На CUDA аналогичный эффект может решить проблему галлюцинаций large-v3 с int8
при сохранении скорости GPU. Требуется тестирование на реальном NVIDIA GPU.
## Troubleshooting ## Troubleshooting
-351
View File
@@ -1,351 +0,0 @@
# Исследование: ускорение на AMD Radeon / NPU
**Дата**: 2026-03-23
**Железо**: AMD Ryzen 7 8845H, Radeon 780M iGPU (RDNA3, 12 CU), XDNA 1 NPU (16 TOPS)
## Мотивация
Бенчмарк ([benchmark-2026-03-23.md](benchmark-2026-03-23.md)) показал: лучшее качество
даёт CTranslate2 float32/int8_float32, но это 600880с на 15-минутную запись.
OpenVINO fp16 быстрее (240с), но теряет качество на русской речи.
Нужен путь: качество float32 + скорость GPU.
## Вариант 1: DirectML (onnxruntime-directml)
### Вердикт: ❌ НЕ рекомендуется
**Блокирующая проблема**: оператор `DecoderMaskedMultiHeadAttention` не реализован
в DirectML ([Olive#1213](https://github.com/microsoft/Olive/issues/1213), открыт с июня 2024).
Whisper-декодер fallback-ится на CPU — GPU ускоряет только encoder, выигрыш минимален.
**DirectML в maintenance mode** — Microsoft переключился на Windows ML (WinML).
Команда DML расформирована, новых операторов не будет. Фикс маловероятен.
**WinML** (замена DirectML) — GA с сентября 2025, но Python-пакет `onnxruntime-winml`
ещё не доступен. Требует Windows 11 25H2+. Потенциально интересен в будущем.
## Вариант 2: whisper.cpp + Vulkan ✅
### Вердикт: рекомендуется как основной путь
**Почему:**
- Проверен на AMD Radeon 780M — баг softmax ([#2596](https://github.com/ggml-org/whisper.cpp/issues/2596))
исправлен в декабре 2024
- **34x ускорение** vs CPU на Radeon 680M (RDNA2), 780M (RDNA3) должен быть не хуже
- Весь pipeline внутри: аудио → mel → encoder → decoder → beam search
- GGUF-модели компактнее ONNX
- Активная разработка, Vulkan-бэкенд зрелый
**Бенчмарки (чужие, похожее железо):**
| GPU | Модель | Результат |
|-----|--------|-----------|
| Radeon 680M (RDNA2) | medium | ~34x быстрее CPU |
| Ryzen 5 4500U (Vega) | medium | 1ч аудио за ~25 мин |
| Ryzen AI Max+ 395 (Strix Halo) | large-v3-turbo | 1ч20м аудио за ~3 мин |
**Память:** Radeon 780M использует системную RAM. whisper-medium в GGUF ≈ 1.5 ГБ —
помещается с запасом.
### Интеграция в проект
Новый бэкенд `backends/whisper_cpp.py`, реализующий Backend Protocol:
```
uv add pywhispercpp # Python-биндинги к whisper.cpp
```
Либо Vulkan-сборка whisper.cpp как subprocess (более надёжно,
но менее удобно для пользователя).
**Зависимость в pyproject.toml:**
```toml
# Опциональная, т.к. требует Vulkan-совместимый GPU
"pywhispercpp>=0.4; sys_platform == 'win32'"
```
Либо через dependency group:
```toml
[dependency-groups]
vulkan = ["pywhispercpp>=0.4"]
```
Тогда установка: `uv sync --group vulkan`
**Открытые вопросы:**
- pywhispercpp собран с Vulkan или нужна своя сборка?
- Качество GGUF-квантизации vs CTranslate2 float32 — нужен бенчмарк
- Формат моделей другой (GGUF vs CTranslate2/OpenVINO) — ещё одно скачивание
## Вариант 3: AMD NPU (XDNA)
### Вердикт: ⏳ рано для XDNA 1, перспективно для XDNA 2
**Что есть:**
- Ryzen AI Software 1.7.0 (февраль 2026) поддерживает 8845H (Hawk Point)
- [AMD LIRA](https://github.com/amd/LIRA) — CLI для ASR на NPU, поддерживает whisper base/small/medium
- [AMD-форк whisper.cpp](https://github.com/amd/whisper.cpp) с NPU-бэкендом
- Pre-квантизированные модели на HuggingFace (`amd/NPU-Whisper-Base-Small`)
**Ограничения на XDNA 1 (8845H):**
- 16 TOPS — в 3 раза слабее XDNA 2 (50 TOPS)
- **Только encoder** на NPU, decoder на CPU — ускорение частичное
- whisper-large-v3 не помещается
- Установка через отдельный installer AMD, не pip/uv
- Форк whisper.cpp не в mainline — риск отставания
**Когда станет интересно:**
- На железе с XDNA 2 (Ryzen AI 300+, 50 TOPS)
- Когда AMD выпустит pip-пакет или upstreamит в whisper.cpp
- Для сценариев, где CPU/GPU заняты другой работой
## Сводка
| Подход | Применимость | Ускорение | Сложность | Стабильность |
|--------|-------------|-----------|-----------|--------------|
| **whisper.cpp + Vulkan** | ✅ высокая | 3–4x vs CPU | низкая | хорошая |
| DirectML (onnxruntime) | ❌ заблокирован | — | — | — |
| AMD NPU (XDNA 1) | ⚠️ ограничен | частичное | высокая | средняя |
| WinML (будущее) | ⏳ не готов | неизвестно | средняя | — |
## Детали по whisper.cpp + Vulkan
### Модели (GGML .bin формат, НЕ GGUF)
Скачивать с https://huggingface.co/ggerganov/whisper.cpp/tree/main
| Модель | Файл | Размер |
|--------|------|--------|
| medium f16 | `ggml-medium.bin` | 1.53 ГБ |
| medium q8_0 | `ggml-medium-q8_0.bin` | 823 МБ |
| medium q5_0 | `ggml-medium-q5_0.bin` | 539 МБ |
| large-v3 f16 | `ggml-large-v3.bin` | 3.1 ГБ |
| large-v3 q5_0 | `ggml-large-v3-q5_0.bin` | 1.08 ГБ |
| large-v3-turbo f16 | `ggml-large-v3-turbo.bin` | 1.62 ГБ |
| large-v3-turbo q8_0 | `ggml-large-v3-turbo-q8_0.bin` | 874 МБ |
### Python-биндинги
**pywhispercpp** (v1.4.1) — pip wheel CPU-only. Для Vulkan нужна сборка из исходников:
```bash
GGML_VULKAN=1 pip install git+https://github.com/absadiki/pywhispercpp
```
Требует: VulkanSDK, cmake, C++ компилятор.
### Subprocess-подход (альтернатива)
whisper-cli принимает WAV 16kHz mono, выдаёт JSON с таймкодами:
```bash
whisper-cli -m ggml-medium.bin -f audio.wav -l ru -oj -of output
```
Для видео/mp3 нужна предварительная конвертация через ffmpeg (PyAV уже есть в зависимостях).
### Сборка whisper.cpp с Vulkan
```bash
# Linux/WSL
sudo apt install cmake build-essential libvulkan-dev
git clone https://github.com/ggml-org/whisper.cpp
cd whisper.cpp
cmake -B build -DGGML_VULKAN=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j$(nproc)
# -> build/bin/whisper-cli
```
## Прототип: whisper.cpp в WSL2 (2026-03-23)
### Сборка
whisper.cpp собран с `-DGGML_VULKAN=ON`, но **Vulkan GPU не обнаружен**:
```
ggml_vulkan: No devices found.
whisper_backend_init_gpu: no GPU found
```
**Причина**: WSL2 не предоставляет Vulkan-доступ к AMD GPU.
- `/dev/dxg` есть (DirectX 12 paravirtualization), но **dozen** (Vulkan-over-D3D12) драйвер
отсутствует в текущей mesa (25.2.8)
- RADV (нативный Vulkan) не работает — нет `/dev/dri/renderD128`
- Единственный Vulkan-девайс — `llvmpipe` (CPU-эмуляция), whisper.cpp его игнорирует
Whisper.cpp отработал **на CPU** (4 потока, AVX512).
### Скорость (CPU fallback)
| Параметр | Значение |
|----------|----------|
| Модель | ggml-medium.bin (f16, 1533 МБ) |
| Аудио | 14:41 (881с), русский, 3 участника |
| Общее время | **886с** |
| encode | 368с (32 прохода, 11.5с/проход) |
| batchd (decode) | 424с |
| Потоки | 4 / 16 |
| Beam search | 5 beams + best of 5 |
Сравнение с бенчмарком (тот же аудиофайл):
| Конфигурация | Время, с |
|---|---|
| OpenVINO fp16 (medium) | ~240 |
| CT2 int8_float32 (medium) | ~599 |
| CT2 float32 (medium) | ~881 |
| **whisper.cpp CPU (medium f16)** | **~886** |
На CPU whisper.cpp ≈ CTranslate2 float32. Без GPU ускорения нет.
### Качество (сравнение с бенчмарком)
#### Техтермины
| Термин | whisper.cpp (CPU) | CT2 f32 | CT2 int8f32 |
|--------|------------------|---------|-------------|
| DWH | ✅ DWH | ⚠️ ДВХ | ✅ DWH |
| Teradata | ✅ TeraData | ⚠️ Тирадату | ✅ Teradata |
| NiFi | ⚠️ Найфай/Найфаю | ⚠️ Найфай | ✅ NiFi |
| FineBI | ✅ fineBI/FNBI | ✅ FNBI | ✅ finebi/FNBI |
| Alation | ✅ Allation | ✅ Allation | ✅ Allation |
| ETL | ✅ ETL | ✅ ETL | ✅ ETL |
| DBC Tables V | ✅ DBC tables-V | ✅ | ✅ |
| OpenLineage | ✅ OpenLinage.io | ✅ OpenLinage.io | ✅ OpenLinage.io |
#### Русская разговорная речь
| Фраза | whisper.cpp (CPU) | CT2 f32 | CT2 int8f32 |
|-------|------------------|---------|-------------|
| "на другую мониторочку" | ✅ "на другом мониторчике" | ✅ "мониторчику" | ⚠️ "мою точку" |
| "верхнеуровневое" | ✅ | ✅ | ✅ |
| "датарентген" | ✅ "даторентген" | ✅ "даторентген" | ✅ "даторентген" |
| "девовские схемы" | ✅ | ✅ | ✅ |
| "с накиданными правами" | ✅ | ✅ | ✅ |
| "Вьюхи" | ⚠️ "Yuhi" | ✅ "Вьюхи" | ⚠️ "Yuhi" |
#### Структура и пунктуация
| Аспект | whisper.cpp (CPU) | CT2 f32 | CT2 int8f32 |
|--------|------------------|---------|-------------|
| Пунктуация | хорошая | хорошая | хорошая |
| Длина сегментов | 1–10 сек | ~1 мин | ~1 мин |
**Вывод по качеству**: whisper.cpp medium f16 на уровне CTranslate2 float32/int8_float32.
Качество сопоставимо, различия минимальны. Сегменты короче (1–10 сек vs ~1 мин) —
это даже лучше для навигации по транскрипту.
### Блокер: Vulkan в WSL2 для AMD
Для получения GPU-ускорения нужно одно из:
1. **Нативный Linux** (dual boot / bare metal) — RADV драйвер работает с Radeon 780M
2. **Windows-сборка** — нативный Vulkan через AMD Adrenalin драйвер
3. **WSL2 + dozen** — экспериментальный Vulkan-over-D3D12 драйвер mesa.
Статус: [в разработке](https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests?search=dozen),
не включён в стандартную mesa Ubuntu.
Потенциально можно собрать mesa из исходников с `-Dvulkan-drivers=microsoft-experimental`
**Рекомендация**: попробовать Windows-сборку whisper.cpp — это самый простой путь
к Vulkan + Radeon 780M. Либо собрать mesa с dozen для WSL2.
## Прототип: whisper.cpp + Vulkan на Windows (2026-03-23)
### Сборка
whisper.cpp собран на Windows с MinGW (MSYS2) + Vulkan:
```
cmake -B build-vulkan -G "MinGW Makefiles" -DGGML_VULKAN=ON -DCMAKE_BUILD_TYPE=Release
```
Vulkan GPU обнаружен:
```
ggml_vulkan: Found 1 Vulkan devices:
ggml_vulkan: 0 = AMD Radeon(TM) 780M (AMD proprietary driver) | uma: 1 | fp16: 1 |
warp size: 64 | shared memory: 32768 | int dot: 1 | matrix cores: KHR_coopmat
```
### Проблема: зацикливание (repetition loop)
Первый запуск (дефолтные параметры): **520с**, но с ~07:00 модель зациклилась
на фразе "Ну, опять же, они могут завести…" — повторяется ~170 раз до конца записи.
Потеряна половина транскрипта.
**Причина**: whisper.cpp передаёт контекст предыдущего сегмента в декодер (`-mc -1`),
что провоцирует repetition loop на длинных записях с паузами/перебивками.
**Решение**: `-mc 0` (не передавать контекст между сегментами).
### Скорость (Vulkan, -mc 0)
| Параметр | Значение |
|----------|----------|
| Модель | ggml-medium.bin (f16, 1533 МБ) на Vulkan GPU |
| Аудио | 14:41 (881с), русский, 3 участника |
| Общее время | **432с** |
| encode | 123.5с (35 проходов, 3.5с/проход) |
| batchd (decode) | 252.7с |
| Потоки | 4 / 16 |
Сравнение с бенчмарком (тот же аудиофайл):
| Конфигурация | Время, с | Ускорение vs CPU f32 |
|---|---|---|
| OpenVINO fp16 (medium) | ~240 | 3.7x |
| **whisper.cpp Vulkan + Radeon 780M** | **~432** | **2.0x** |
| **CT2 int8_float32, 8 threads** | **~458** | **1.9x** |
| CT2 int8_float32, 16 threads | ~498 | 1.8x |
| CT2 int8_float32, default (4 threads) | ~599 | 1.5x |
| CT2 float32 / whisper.cpp CPU | ~881-886 | 1.0x |
**Оптимизация потоков**: CTranslate2 по умолчанию использует 4 потока (`cpu_threads=0`).
На Ryzen 7 8845H (8 ядер / 16 потоков) оптимум — **8 потоков** (по числу физических ядер).
16 потоков (SMT/hyperthreading) не помогают — контекст-свитчинг нивелирует выигрыш.
Управление: `OMP_NUM_THREADS=8` или параметр `cpu_threads` в WhisperModel.
CT2 int8_float32 с 8 потоками (**458с**) почти догоняет whisper.cpp Vulkan (**432с**)
без дополнительных зависимостей.
### Качество (Vulkan, -mc 0)
#### Техтермины
| Термин | whisper.cpp Vulkan | CT2 int8f32 |
|--------|-------------------|-------------|
| DWH | ✅ DWH | ✅ DWH |
| Teradata | ✅ TeraData | ✅ Teradata |
| NiFi | ⚠️ IFI | ✅ NiFi |
| FineBI | ✅ FindBI/FineBI/FNBI | ✅ finebi/FNBI |
| Alation | ✅ Allation | ✅ Allation |
| ETL | ✅ ETL | ✅ ETL |
| DBC Tables V | ⚠️ dbc tables v (lowercase) | ✅ DBC Tables V |
| OpenLineage | ✅ OpenLinage.io | ✅ OpenLinage.io |
| Вьюхи | ✅ Вьюхи | ⚠️ Yuhi |
#### Русская разговорная речь и пунктуация
Качество сопоставимо с CT2 int8_float32. Пунктуация хорошая в обоих случаях.
Сегменты у whisper.cpp короче (2-10 сек vs ~1 мин) — удобнее для навигации.
### Вывод
whisper.cpp + Vulkan на Radeon 780M даёт **432с** — всего **28% быстрее** CT2 int8_float32
(599с). Разница недостаточна, чтобы оправдать сложность интеграции:
- Отдельная сборка whisper.cpp (cmake + MinGW + VulkanSDK)
- Другой формат моделей (GGML вместо CTranslate2)
- Workaround `-mc 0` от зацикливания
- Конвертация в WAV (whisper.cpp не принимает mp4 напрямую)
- Ещё одна зависимость для пользователя
**CT2 int8_float32 остаётся оптимальным выбором**: уже встроен в проект, zero-config,
хорошее качество, приемлемая скорость.
## Рекомендуемый план (обновлённый)
1. ~~**Прототип в WSL** — собрать whisper.cpp с Vulkan, прогнать тестовый файл~~ ✅ Сделано
2. ~~**Качество подтверждено** — whisper.cpp medium f16 ≈ CT2 float32/int8_float32~~
3. ~~**GPU-ускорение в WSL2** — Vulkan не видит AMD GPU~~ ✅ Подтверждено
4. ~~**Windows-сборка с Vulkan** — 432с, 2x vs CPU, но всего 28% vs CT2 int8_float32~~
5. **Решение**: whisper.cpp + Vulkan не оправдывает себя на Radeon 780M iGPU.
CT2 int8_float32 — оптимальный дефолт для CPU без CUDA.
6. NPU — отложить до XDNA 2 или до появления pip-пакета от AMD
7. Пересмотреть при появлении дискретного AMD GPU или WinML с Python-поддержкой