Files
local-transcriber/docs/benchmarks/2026-08-31-cpu-diarization-ryzen.md
T
Dmitry Dementiev 38c99855e2 feat(diarization): завершен Ryzen-этап CPU-эксперимента
Зачем:
- Проверить переносимость Intel-handoff на Ryzen и закрыть выбор CPU-профиля.

Что:
- Усилена проверка связи Ryzen-manifest с капсулой и переносимости рецептов.
- Добавлены регрессионные тесты и публичный отчет с исходом new map.

Проверка:
- uv run --no-sync pytest -q (389 passed, 2 skipped).
- uv run --no-sync ruff check src/local_transcriber/benchmark_experiment.py tests/test_benchmark_experiment.py.
2026-09-01 00:58:46 +03:00

167 lines
13 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.
# CPU-диаризация: Ryzen-этап эксперимента
**Дата:** 2026-08-31
**Статус:** `new map`; C2 прошла проверки качества и памяти, но не достигла
итогового порога ускорения 30%, а более быстрые ветви Intel уперлись в качество.
Production-профиль не менялся.
## Итог
На AMD Ryzen 7 8845H выполнен этап 5 эксперимента из
[спецификации](../specs/2026-08-30-cpu-diarization-experiment.md) по единственному
кандидату C2 из [Intel-этапа](2026-08-31-cpu-diarization-intel.md). Этап 6
остановлен до полных прогонов: победителя нет. C2 сохраняет baseline-рецепт
диаризации, но выполняет embedding-вызовы через два outer
worker и одну общую ONNX Runtime session с общим intra-op пулом из восьми
потоков; `inter_op_threads=1`.
Изолированный A/B механизма shared-session дал ускорение 24,05%. Первичный A/B
C2 показал 22,90%, поэтому кандидат прошел порог продолжения 10%, и для него
запустили пять чередующихся циклов. Они дали медиану 23,57% при MAD 0,62
процентного пункта, то есть ниже итогового порога 30%; по одному Ryzen-кандидату
C2 итог был бы `stop`.
Полная воронка, однако, соответствует отдельному исходу `new map`: все шаги
окна W1-W4 потеряли кластер, а C1 с CAMPPlus + NME ускорилась на Intel на 33,65%,
но добавила 2 слова без говорящего и осталась без требуемой слуховой проверки.
C1 на Ryzen не передавали, победителем она не считается; возвращать ее в матрицу
без подготовленной приватной слуховой проверки нельзя, и автоматической оценкой
эта проверка не подменялась.
Все принятые ячейки прошли обязательное качество: `3 / 2 / 2` кластера,
неизменный текст, `51 / 13 / 9` слов без говорящего, те же значения
`mapped speaker purity` `0,76655 / 0,78742`, `291 / 291 / 291` segmentation-окон
и `531 / 414 / 440` embedding-заданий. Потерь или дублей prepared-строк не было.
Пиковый RSS C2 оставался в диапазоне 410,3-418,1 МиБ; OOM, активности swap и
линейного роста памяти не наблюдалось.
Полные записи и пятикатегорийная слуховая приемка по правилам этапа 6 не
запускались.
## Handoff и воспроизводимость
| Объект | Значение |
|---|---|
| Merge commit в начале Ryzen-этапа | `68fda7ee893265acfa00ac78b8d4c9697f9916d9` |
| Handoff commit | `42f094ccb9464742683eec9d695e5aa9a69dd4ec` |
| Source commit эксперимента | `6345cb6449d906767b6ed33e695f2ca4eeaf3008` |
| SHA-256 Intel-отчета | `8d4183be4c3ab35f2ea043f8d87ca20e16f523cb60f9c5414d974c1bc4d6b7de` |
| SHA-256 входной Intel-капсулы | `a3a50d34783d24fe6cd13b154ca9813f9842fdcb08d99eab33a6a54efea1e3ae` |
| ID закрытого Ryzen-хранилища | `ryzen-42-20260831` |
| Upstream commit sherpa-onnx 1.13.6 | `1cb484af9b1ab05cc36f89e03dd7d76322f2e911` |
| SHA-256 патча sherpa-onnx 1.13.6 | `5f12df858cd525c8a0cfe8ff95b647c3b0e915a13d45621acc4ac42660014c49` |
| SHA-256 Intel-wheel | `306499d8668ee138357f1de43a5c1c88f4dc46c845e8a92e6ad945327bcaa050` |
| SHA-256 Ryzen-wheel | `baaaa2532606f1e1411e5c84655afa70107ad4b1676420953f5e67233c46a484` |
Входная Intel-капсула прошла полную проверку: schema v3, 199 файлов,
QDQ-артефакт доступен, предупреждений нет. Ryzen-manifest без изменений закрепил
из Intel-капсулы handoff, артефакты, контрольные записи, calibration, QDQ, патч,
версии runtime и интервал RSS. Baseline и candidate каждой запускаемой
combination-пары совпали с переносимыми Intel-рецептами.
Ryzen-manifest, сырые результаты, рабочие артефакты стенда, guard-свидетельства
и журналы сохранены в закрытой папке Яндекс Диска. Чтобы восстановить
Ryzen-этап, нужны это хранилище и входная Intel-капсула; публичный отчет связывает
приведенные ниже восемь результатов с закрытым хранилищем только по SHA-256.
Переданный wheel не загрузился в Ryzen WSL: он требовал GLIBC 2.43, а стенд
работает с GLIBC 2.39. Для измерений wheel пересобран из того же upstream commit
и патча под текущую систему; его отдельный SHA-256 приведен в
таблице. Production-зависимости и lock-файл не менялись.
Стенд потребовал два исправления, не меняющих пользовательский контракт. Ранее
Ryzen-запуск сравнивал свой manifest побайтово с Intel `manifest.json` внутри
капсулы, хотя обязательные `stage=ryzen`, Ryzen-машина и расписание такое
совпадение исключают. Теперь Intel-manifest проверяется по индексу капсулы, а
Ryzen-manifest отдельно связывается с handoff и входами капсулы. Второе:
`temperature_celsius` допускает `null`, когда WSL и Windows не показывают
датчик температуры; отсутствие измерения больше не подменяется числом.
## Стенд Ryzen
- AMD Ryzen 7 8845H with Radeon 780M, 8 физических ядер / 16 логических
процессоров;
- 15 584 276 480 байт RAM доступны WSL, 31 944 794 112 байт установлены в
Windows; swap WSL - 4 294 967 296 байт, активность во время принятых ячеек -
нулевая;
- x86_64; AVX, AVX2, AVX-512, AVX512 VNNI, FMA, SSE4.1, SSE4.2 и AES;
- WSL2 Linux 5.15.167.4 с GLIBC 2.39, Windows 11 Enterprise 10.0.26200,
Python 3.13.13;
- `sherpa-onnx` / `sherpa-onnx-core` 1.13.6, ONNX Runtime 1.28.0,
NumPy 2.4.3, ONNX 1.22.0, kaldi-native-fbank 1.22.3, psutil 7.2.2;
- питание от сети, стабильный Windows-профиль `balanced`, EPP AC 25%,
максимальное состояние процессора 100%, boost mode `aggressive`;
- WSL не предоставляет governor, а доступные интерфейсы не показывают
температурный датчик или аппаратные лимиты мощности. Температура
записана как недоступная; это ограничивает тепловой guard;
- нативные WSL-интерфейсы не отдали supply, platform profile и throttle count,
поэтому для принятых ячеек стенд взял override
`LOCAL_TRANSCRIBER_RUNTIME_GUARD_JSON`, заполненный проверенными Windows-фактами:
AC, `balanced`, turbo, power policy, нулевая подкачка, отсутствие throttling.
До и после принятых пар Windows-проверка подтверждала AC, неизменный `balanced`
и отсутствие событий throttling от `Microsoft-Windows-Kernel-Processor-Power`.
Статический override сам по себе не обнаруживает изменение внутри ячейки,
поэтому внешняя проверка остается ограничением воспроизводимости;
- baseline: одна session, один outer worker, `intra_op_threads=8`,
`inter_op_threads=1`, batch 1; C2: одна shared session, два outer worker,
общий `intra_op_threads=8`, `inter_op_threads=1`, batch 1.
## Ячейки этапа 5
Время ячейки - сумма трех вызовов `diarizer.process()`, по одному на каждый
пятиминутный фрагмент. ASR и загрузка моделей в измерение не входят.
| Проверка | Порядок | Baseline, с | Кандидат, с | Ускорение | RSS baseline / кандидат, МиБ | Качество |
|---|---|---:|---:|---:|---:|:---:|
| Совпадающий baseline | W0 | 110,998 | - | - | 370,4 / - | да |
| Изолированный E1 | W0 -> E1 | 111,557 | 84,723 | 24,05% | 367,3 / 412,2 | да |
| Первичный C2 | C2 -> W0 | 111,423 | 85,909 | 22,90% | 369,6 / 410,3 | да |
E1 и C2 сохранили все обязательные и диагностические показатели baseline.
Первичный C2 прошел порог продолжения и уложился в правило памяти.
## Пять финальных A/B-циклов
| Цикл | Порядок | Baseline, с | C2, с | Парное ускорение | RSS baseline / C2, МиБ | Качество |
|---:|---|---:|---:|---:|---:|:---:|
| 1 | W0 -> C2 | 111,354 | 83,529 | 24,99% | 369,2 / 413,4 | да |
| 2 | C2 -> W0 | 108,899 | 83,907 | 22,95% | 373,0 / 418,1 | да |
| 3 | W0 -> C2 | 110,928 | 84,968 | 23,40% | 373,8 / 410,9 | да |
| 4 | C2 -> W0 | 114,985 | 83,342 | 27,52% | 376,6 / 411,1 | да |
| 5 | W0 -> C2 | 113,233 | 86,548 | 23,57% | 358,6 / 413,4 | да |
| **Итог** | - | - | - | **медиана 23,57%; MAD 0,62 п. п.** | - | **да** |
Чередование не изменило вывод: даже лучший отдельный цикл остался ниже 30%, а
медиана недобрала 6,43 процентного пункта. На Intel тот же механизм давал только
4,32%; Ryzen ускоряет shared-session заметнее, но недостаточно для `go`.
## Индекс публичных доказательств
Хеши связывают обезличенные агрегаты с приватными JSON-результатами и не
раскрывают пути, текст, интервалы и идентификаторы записей.
| Результат | SHA-256 |
|---|---|
| Совпадающий baseline | `f50684784392cacc2d99c8aee51d01f0a67dfee3da6ea3ba5f3db749a3d5287a` |
| Изолированный E1 A/B | `24d5edae117e0619e432ef3f3019e8c66cf3516b87b80b64b8591390db25bf48` |
| Первичный C2 A/B | `142db6d06efc8d558b38e18f47f47e3e35e7df00751da2583339f99add8d75c4` |
| Финальный цикл 1 | `4b5095c9e64ff0ef75bbc58516c662bedbbdb0bedf131f66cc1031c9a0ad8c7f` |
| Финальный цикл 2 | `256a17b2d08510aad03d43f5c626c1a4269c9a25271ce492dc3305c4afca1888` |
| Финальный цикл 3 | `b5d37c7a8b05b065c61bc9d5f1c0ab639a80a821730e505179388d90c4239caa` |
| Финальный цикл 4 | `639cc9f13511a59c7240c6fb6ec6bf1c31ec26350330e3ca0c64fb721b768736` |
| Финальный цикл 5 | `4ff2863a93fc22a037de5c292391b6b46de1b539cf397026b349ea5134cf1051` |
## Решение
Итог - `new map`:
1. C2 прошла обязательное качество и память.
2. Медианное ускорение 23,57% не достигло порога 30%.
3. W1-W4 потеряли кластер, а C1 преодолела 30% на Intel только с незакрытым
диагностическим слуховым gate: сокращение окон и цены эмбеддинга уперлось в
качество раньше итогового порога.
4. По правилу спецификации следующий шаг - отдельная карта end-to-end
диаризации; этот отчет ее не открывает и новых замеров не назначает.
5. Полные записи и Ryzen-слуховая приемка не требуются без победителя.
6. Production-профиль, CLI, конфигурационный контракт и модель по умолчанию
остаются без изменений.