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.
This commit is contained in:
1 parent
68fda7ee89
commit
38c99855e2
3 files changed
+630
-19
No files matched your search
@@ -0,0 +1,166 @@
|
||||
# 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, конфигурационный контракт и модель по умолчанию
|
||||
остаются без изменений.
|
||||
Reference in new issue
Block a user