diff --git a/docs/benchmarks/2026-03-23-transcription-quality-ryzen.md b/docs/benchmarks/2026-03-23-transcription-quality-ryzen.md new file mode 100644 index 0000000..4d97c00 --- /dev/null +++ b/docs/benchmarks/2026-03-23-transcription-quality-ryzen.md @@ -0,0 +1,125 @@ +# Бенчмарк: качество и скорость транскрипции + +**Дата**: 2026-03-23 + +**Статус:** архив. Перенесено из ветки `feature/amd-acceleration`; конфигурации бэкендов и умолчания с тех пор изменились (ONNX CPU по умолчанию, см. ADR-003). + +## Цель + +Сравнить качество распознавания нашего приложения (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 мин | 2–30 сек | +| Диаризация | нет | нет | нет | нет | есть (условная) | + +## Ключевые выводы + +### 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 или аналоги). diff --git a/docs/research/2026-03-23-amd-acceleration.md b/docs/research/2026-03-23-amd-acceleration.md new file mode 100644 index 0000000..b420c47 --- /dev/null +++ b/docs/research/2026-03-23-amd-acceleration.md @@ -0,0 +1,353 @@ +# Исследование: ускорение на AMD Radeon / NPU + +**Дата**: 2026-03-23 +**Железо**: AMD Ryzen 7 8845H, Radeon 780M iGPU (RDNA3, 12 CU), XDNA 1 NPU (16 TOPS) + +**Статус:** архив. Перенесено из ветки `feature/amd-acceleration` (март 2026) ради истории решений. Выводы не реализованы: ADR-003 выбрал OpenVINO GenAI вместо whisper.cpp, а автоматический выбор устройства закреплён за ONNX CPU (#2). + +## Мотивация + +Бенчмарк ([2026-03-23-transcription-quality-ryzen.md](../benchmarks/2026-03-23-transcription-quality-ryzen.md)) показал: лучшее качество +даёт CTranslate2 float32/int8_float32, но это 600–880с на 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 +- **3–4x ускорение** vs CPU на Radeon 680M (RDNA2), 780M (RDNA3) должен быть не хуже +- Весь pipeline внутри: аудио → mel → encoder → decoder → beam search +- GGUF-модели компактнее ONNX +- Активная разработка, Vulkan-бэкенд зрелый + +**Бенчмарки (чужие, похожее железо):** + +| GPU | Модель | Результат | +|-----|--------|-----------| +| Radeon 680M (RDNA2) | medium | ~3–4x быстрее 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-поддержкой