fix(openvino): клампинг отрицательных таймкодов + результаты тестов Intel/AMD
- Зачем: - OpenVINO GenAI может вернуть отрицательный end_ts, ломая формат транскрипта. - зафиксировать бенчмарки на Intel и AMD CPU для документации. - Что: - backends/openvino.py: start/end клампятся через max(0, ...). - docs/gpu.md: полная таблица скорости Intel i7 vs AMD Ryzen 7 8845H. - сравнение качества medium int8 vs large-v3 fp16 vs CPU float32 на одном файле. - вывод: large-v3 OpenVINO (416с) быстрее medium CPU (734с) при лучшем качестве. - Проверка: - uv run pytest -q — 124 passed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
+27
-19
@@ -16,7 +16,7 @@
|
|||||||
| Любой CPU (fallback) | `cpu` | faster-whisper (CTranslate2) | ~1.5x реалтайм |
|
| Любой CPU (fallback) | `cpu` | faster-whisper (CTranslate2) | ~1.5x реалтайм |
|
||||||
| Apple Silicon (macOS) | `cpu` | faster-whisper (CTranslate2) | ~2x реалтайм |
|
| Apple Silicon (macOS) | `cpu` | faster-whisper (CTranslate2) | ~2x реалтайм |
|
||||||
|
|
||||||
\* Ожидаемая оценка на основе бенчмарков OpenVINO. Реальная скорость зависит от CPU и модели.
|
\* По результатам тестирования на Intel и AMD CPU. Реальная скорость зависит от CPU и модели.
|
||||||
|
|
||||||
## OpenVINO
|
## OpenVINO
|
||||||
|
|
||||||
@@ -39,22 +39,30 @@ OpenVINO ускоряет inference на x86 процессорах (Intel и AM
|
|||||||
|
|
||||||
### Результаты тестирования OpenVINO
|
### Результаты тестирования OpenVINO
|
||||||
|
|
||||||
Тесты на Intel CPU (WSL2), реальные записи рабочих созвонов (русский, техтермины).
|
Реальные записи рабочих созвонов (русский, техтермины: SQL, PostgreSQL, LDAP, DLP и др.).
|
||||||
|
|
||||||
**Скорость (medium int8):**
|
**Скорость:**
|
||||||
|
|
||||||
| Файл | OpenVINO | CPU (CTranslate2) | Ускорение |
|
| Конфигурация | Intel i7 (WSL2) | AMD Ryzen 7 8845H | CPU float32 |
|
||||||
|------|----------|-------------------|-----------|
|
|---|---|---|---|
|
||||||
| 16 мин | 205с (3.4 мин) | 658с (11 мин) | **3.2x** |
|
| OpenVINO medium int8, 16 мин | 171-205с | **185с** | 658-734с |
|
||||||
| 24 мин | 224с (3.7 мин) | — | **~6.5x реалтайм** |
|
| OpenVINO medium int8, 42 мин | 413с (6.9 мин) | — | — |
|
||||||
|
| OpenVINO large-v3 fp16, 16 мин | — | **416с** | — |
|
||||||
|
|
||||||
**Качество (medium int8):**
|
**Ускорение vs CPU:** **3-4x** на обоих процессорах (Intel и AMD).
|
||||||
- Содержание и технические термины распознаются корректно
|
|
||||||
- Галлюцинаций и повторов не обнаружено (ни на 16, ни на 24 мин)
|
|
||||||
- Качество сопоставимо с CPU float32 и CUDA float16
|
|
||||||
- OpenVINO даёт более гранулярные сегменты (174 vs 97 на том же файле)
|
|
||||||
|
|
||||||
> Тестирование на AMD CPU пока не проводилось.
|
**Качество (сравнение на одном файле, 16 мин, AMD Ryzen 7 8845H):**
|
||||||
|
|
||||||
|
| | OpenVINO medium int8 | OpenVINO large-v3 fp16 | CPU medium float32 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Время | 185с | 416с | 734с |
|
||||||
|
| Техтермины | корректно | корректно | корректно |
|
||||||
|
| Галлюцинации | нет | нет | нет |
|
||||||
|
| Характерные ошибки | "Атака новенького" (вместо "а так, новенького") | — | те же ошибки, что medium int8 |
|
||||||
|
| Пунктуация | базовая | заметно лучше | базовая |
|
||||||
|
|
||||||
|
`large-v3` на OpenVINO качественнее `medium`, но в 2.2 раза медленнее. При этом `large-v3` на OpenVINO (416с)
|
||||||
|
быстрее, чем `medium` на чистом CPU (734с) — можно получить и лучшее качество, и выше скорость.
|
||||||
|
|
||||||
## Настройка по платформам
|
## Настройка по платформам
|
||||||
|
|
||||||
@@ -87,13 +95,13 @@ winget install -e --id Nvidia.CUDA --version 12.9 # требует запус
|
|||||||
|
|
||||||
Замеры на RTX 3060 Laptop (6 GB) и Intel CPU (WSL2):
|
Замеры на RTX 3060 Laptop (6 GB) и Intel CPU (WSL2):
|
||||||
|
|
||||||
| Конфигурация | 16 мин файл | 24 мин файл | Отн. скорость |
|
| Конфигурация | 16 мин файл | 42 мин файл | Отн. скорость |
|
||||||
|-------------|-------------|-------------|---------------|
|
|-------------|-------------|-------------|---------------|
|
||||||
| GPU + medium float16 | ~35с | — | ~19x реалтайм |
|
| GPU + medium float16 | ~35с | ~133с | ~19x реалтайм |
|
||||||
| GPU + large-v3 float16 | ~90с | — | ~7x реалтайм |
|
| GPU + large-v3 float16 | ~90с | ~350с | ~7x реалтайм |
|
||||||
| **OpenVINO + medium int8** | **205с (3.4 мин)** | **224с (3.7 мин)** | **~4.7-6.5x реалтайм** |
|
| **OpenVINO + medium int8** | **171-205с** | **413с (6.9 мин)** | **~4-6x реалтайм** |
|
||||||
| CPU + medium float32 | 658с (11 мин) | — | ~1.5x реалтайм |
|
| CPU + medium float32 | 658с (11 мин) | ~26 мин | ~1.5x реалтайм |
|
||||||
| CPU + large-v3 int8 | 839с (14 мин) | — | ~1:1 реалтайм |
|
| CPU + large-v3 int8 | 839с (14 мин) | ~37 мин | ~1:1 реалтайм |
|
||||||
|
|
||||||
## Результаты тестирования качества
|
## Результаты тестирования качества
|
||||||
|
|
||||||
|
|||||||
@@ -108,9 +108,11 @@ class OpenVINOBackend:
|
|||||||
segments: list[Segment] = []
|
segments: list[Segment] = []
|
||||||
if hasattr(result, "chunks") and result.chunks:
|
if hasattr(result, "chunks") and result.chunks:
|
||||||
for chunk in result.chunks:
|
for chunk in result.chunks:
|
||||||
|
start = max(0.0, chunk.start_ts)
|
||||||
|
end = max(start, chunk.end_ts)
|
||||||
seg = Segment(
|
seg = Segment(
|
||||||
start=chunk.start_ts,
|
start=start,
|
||||||
end=chunk.end_ts,
|
end=end,
|
||||||
text=chunk.text,
|
text=chunk.text,
|
||||||
)
|
)
|
||||||
if on_segment is not None:
|
if on_segment is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user