22 KiB
CPU-диаризация: Intel-этап эксперимента
Дата: 2026-08-31
Статус: handoff; в Ryzen-этап передается один кандидат. Production-профиль не менялся.
Итог
На Intel Core i7-6820HQ пройдены этапы 0-4 эксперимента из спецификации. Для Ryzen передается комбинация C2:
window_shift_ratio=0.1;- Pyannote Segmentation 3.0 FP32;
- WeSpeaker ResNet34 LM FP32;
- текущий
FastClusteringс порогом0.89; - два outer worker, одна общая ONNX Runtime session, общий пул из четырех
intra-op потоков,
inter_op_threads=1.
C2 сохранила результат baseline по всем обязательным и диагностическим
показателям: 3 / 2 / 2 кластера, та же последовательность слов, те же числа
слов без говорящего 51 / 13 / 9 и та же mapped speaker purity. Один прогон
трех фрагментов занял 140,632 с против 146,978 с у соседнего baseline:
ускорение 4,32%. Пиковый RSS вырос с 376,4 до 406,0 МиБ. Порог продолжения на
Intel не достигнут. Разница неотличима от наблюдаемого разброса
одиночных запусков: контрольные baseline в разных сериях лежали в диапазоне
146,978-157,892 с, то есть шире, чем разница между W0 и C2.
Спецификация при этом разрешает передать работоспособный механизм shared-session
как аппаратного кандидата для отдельного A/B на Ryzen. Результат 4,32% остается
диагностическим наблюдением; оценивать по нему ожидаемое ускорение нельзя.
CAMPPlus + NME оказался самым быстрым вариантом: C1 заняла 98,347 с и
сохранила 3 / 2 / 2. Но на одной записи число слов без говорящего
выросло с 51 до 53. Для такого изменения спецификация требует слуховой проверки
отмеченных мест до сборки комбинации. Материал для нее подготовлен, но в этом
окружении прослушивание недоступно. Поэтому C1 измерена и описана, но в handoff
не включена.
Зачем понадобился sherpa-onnx 1.13.6
Версия стенда поднята с 1.13.5 до 1.13.6. В ней публичная Python-конфигурация
сегментации получила window_shift_ratio, необходимый для этапа W0-W4. Свежий
контрольный прогон обеих версий дал одинаковые 3 / 2 / 2 кластера, числа слов
без говорящего 51 / 13 / 9 и purity 0,76655 / 0,78742. Каноническая сверка
интервалов и назначения говорящих словам вынесена в отдельную проверку по сырым
результатам капсулы; расхождений, требующих прослушивания, не обнаружено. Время
одного прогона составило 190,104 с для 1.13.5 и 157,892 с для 1.13.6; это
диагностическое сравнение без повторов, а не самостоятельное доказательство
ускорения версии.
Экспериментальные Prepare/Finalize и общий worker API в 1.13.6 отсутствуют.
Их нет и в проверенном актуальном upstream master sherpa-onnx от 2026-08-31.
Для эксперимента собран локальный патч и wheel:
| Артефакт | SHA-256 |
|---|---|
| Патч sherpa-onnx 1.13.6 | 5f12df858cd525c8a0cfe8ff95b647c3b0e915a13d45621acc4ac42660014c49 |
| Wheel CPython 3.13, Linux x86_64 | 306499d8668ee138357f1de43a5c1c88f4dc46c845e8a92e6ad945327bcaa050 |
Проверка патча на реальной модели подтвердила, что worker владеет подготовленным
состоянием. Копирование матрицы и одноразовая финализация работают корректно;
штатный process() точно совпадает с цепочкой
Prepare -> cluster(copy) -> Finalize. Один и два worker дали одинаковые
строки, метки и итоговые интервалы без пропусков и дублей.
Условия
- Intel Core i7-6820HQ, 4 физических ядра / 8 логических процессоров;
- 32 181 526 528 байт RAM, x86_64, AVX2; VNNI и AVX-512 отсутствуют;
- Linux 7.0.0-30-generic, Python 3.13.13;
sherpa-onnx1.13.6, ONNX Runtime 1.28.0, NumPy 2.4.3;- питание от сети, системный профиль
balanced, governorpowersave, turbo включен; - первая попытка финального W0 отбракована из-за swap-in; повторная попытка W0 и первая попытка C2 прошли runtime guard. В принятых попытках W0 нагрел CPU с 80 до 85 C, C2 - с 80 до 82 C; power limits, throttle count и swap I/O не изменились;
- три контрольных фрагмента по 300 с, ожидаемые кластеры
3 / 2 / 2; - один запуск каждой исследовательской ячейки и одна соседняя пара W0/C2 под runtime guard; ASR-sidecar подготовлены заранее и во время ячейки не учитывались.
Измеряемый интервал включает полную диаризацию фрагмента. Для E3 отдельно помечена составная оценка, потому что независимые session измерялись на заранее подготовленных заданиях.
Идентификаторы прогона
- source commit:
6345cb6449d906767b6ed33e695f2ca4eeaf3008; - experiment ID:
457dffbb690516a2b38ee1331a3939664ada3a0c4ade638eab6b7c5270b17f4e; - capsule ID:
intel-41-5de5f454; - SHA-256 scheduler output:
14c5aa1d3131f9bd324c77d4c3bf315772e6374835f28863c5db45fc27ab5ce5.
Manifest оставляет исследовательские ячейки в матрице как уже измеренные и выключенные, а через scheduler повторяет только финальную соседнюю пару:
| Ячейка | Позиция | Cell ID | Статус в финальном плане |
|---|---|---|---|
| W0 | 1 | 68360310692540e5df2640e3d653c12b91c6acaedfae56170e6ce74ecea12af2 |
сырой результат сохранен |
| W1 | 2 | e170c9a1808c8e1c6c824381dca39495740ba2526725c280e7a9aed115bc7a36 |
сырой результат сохранен |
| W2 | 3 | 8e4283a6ae8bae62e7397e83870afd1d0706816e1e123c012d2b3ae795f4c7d4 |
сырой результат сохранен |
| W3 | 4 | 46d81148e1c3eca15e6f8c1eacce41556db90a5e07429acf1ba4292103996845 |
сырой результат сохранен |
| W4 | 5 | eab104a305dc192847c16786de6cfa81f9a90bb9a80dc91627d439af4eb5d39d |
сырой результат сохранен |
| M0 | 10 | 206a1a7821cb29dfe86d19e45ff665ac6f143aad3a1b79419987162097973208 |
сырой результат сохранен |
| M2 | 11 | 17559e0b25df2ca77a25d93b2238e9a726ac2ab123d11ec6ddcb9de51b298e9c |
сырой результат сохранен |
| M3 | 12 | c5a5d9eb45172caeb5a4d476463f0a783d6337312aab6ef7177f2a6dfcca53d2 |
сырой результат сохранен |
| Q0 | 20 | 386b2b9ba686466bf4603dda51222e7cdd6324061a68babed339db3e8e6a09dc |
сырой результат сохранен |
| Q1 | 21 | e1cee039ce5c65ea91004df99eaefff50b02ce1c40a8f53eba34a234522a0e3f |
сырой результат сохранен |
| E1 | 30 | 4175101fcb0abbc6f4f46caa87273c431ce5fab61620493b13df4ed18f05f29d |
сырой результат сохранен |
| E0 для E1 | 31 | 9f59ab52ffd188da28f94233f13a19a297568e7c1e754c2a9e09157bca10ad85 |
сырой результат сохранен |
| E0 для E2 | 32 | c349a249896faeddc06356fd671ff2505bc2a89075ea7b2407964d6afae90232 |
сырой результат сохранен |
| E2 | 33 | 1aba4e138f3cdfd675cf411b485cfd5a01c3166d4ae893a779d88c75fa1f53c2 |
сырой результат сохранен |
| E3 | 34 | 6d2af928e2270eea37735ab39314b050fd520911cc07ba2303016ab657dd610a |
сырой результат сохранен |
| E0 для E3 | 35 | c55eac6d19ea7741debb02a1b602782dc0332bafe72323ea54651845416d4b6f |
сырой результат сохранен |
| C1 | 40 | 3898cd41f6dc7d50bed245bfa6ec945c700a7fad67ac3f2e7f950d864a9ac9de |
исключена |
| W0 для C2 | 50 | 44a6ce169f9566088376b0f6139f6823783baff481edd8741e39690534c6c47d |
выполнена, baseline |
| C2 | 51 | 90ad304d332efa4742490f3a4a40cfb7e3422dfa85a22fbf254c7f4900b4a51f |
выполнена, handoff |
TitaNet batch 1/4 остался отдельным mechanism smoke и в финальную A/B-матрицу не входит.
Этап 0: механизмы
Prepare/Finalize, общий worker и строгая схема manifest v3 прошли smoke-тесты.
Для CAMPPlus и TitaNet на одних и тех же подготовленных матрицах сравнивались
eigengap и NME:
| Модель | Строки матриц | Eigengap, N | NME, N | Выбор |
|---|---|---|---|---|
| CAMPPlus | 531 / 414 / 440 |
6 / 1 / 7 |
3 / 2 / 2 |
NME |
| TitaNet small | 531 / 414 / 440 |
7 / 2 / 4 |
3 / 2 / 2 |
NME |
Ни одна матрица не потеряла строки. Повторный запуск счетчика и штатная финализация дали одинаковые параметры и метки.
WeSpeaker S8S8 QDQ построен на 48 интервалах отдельной записи. Manifest хранит
исходный SHA-256 и точный интервал каждого элемента. Граф сохранил интерфейс,
opset и метаданные, прошел ONNX checker, динамические входные длины в ONNX
Runtime и загрузку через sherpa-onnx. SHA-256 графа:
9a3f8ae64d1083b64a6276f1e1138b17b7511a9a8d731b632945efc84098588b.
Этап 1: шаг окна
| Ячейка | Шаг | Время, с | Кластеры | Качество | Решение |
|---|---|---|---|---|---|
| W0 | 0,10 | 148,220 | 3 / 2 / 2 |
да | baseline |
| W1 | 0,15 | 100,799 | 2 / 2 / 2 |
нет | исключен |
| W2 | 0,20 | 76,127 | 2 / 2 / 2 |
нет | исключен |
| W3 | 0,25 | 61,369 | 2 / 2 / 2 |
нет | исключен |
| W4 | 0,50 | 31,291 | 1 / 2 / 2 |
нет | исключен |
Сокращение числа окон объясняет ускорение, но все увеличенные шаги потеряли
кластер на первой записи. Рабочим остался 0.1; C0 совпал бы с baseline и
поэтому не запускался.
Этапы 2-3: модели и исполнение
| Ветвь | Время, с | Изменение к W0 | Пиковый RSS, МиБ | Кластеры | Решение |
|---|---|---|---|---|---|
| M2, CAMPPlus + NME | 94,550 | -36,21% | 358,6 | 3 / 2 / 2 |
самая быстрая; нужна слуховая проверка |
| M3, TitaNet + NME | 107,205 | -27,67% | 511,9 | 3 / 2 / 2 |
прошел, но слабее M2 |
| QDQ WeSpeaker | 177,537 | +19,78% | 367,7 | 2 / 2 / 2 |
исключен по качеству |
| E1, shared 2 x pool 4 | 139,219 | -6,07% | 398,6 | 3 / 2 / 2 |
допущен как аппаратный кандидат |
| E2, shared 4 x 1 | 152,167 | +2,66% | 551,2 | 3 / 2 / 2 |
исключен по времени и памяти |
| E3, 4 отдельные session | 159,038 | +7,30% | 732,3 | 3 / 2 / 2 |
отрицательный контроль |
Время E3 - составная оценка, а не прямое время штатного process(). RSS E3 -
максимум всего проверочного процесса: он включает штатную подготовку,
экспериментальные эмбеддинги и контрольную финализацию. Отдельный RSS только
embedding-этапа не измерялся. Даже эта завышенная оценка, включающая соседние
этапы, подтверждает ожидаемый рост памяти с числом session, поэтому E3 не стал
кандидатом.
У E1 и E2 метки, итоговые интервалы и диагностические показатели побайтово совпали с последовательным вариантом. E1 выбран для C2 как более быстрый и экономный режим.
TitaNet batch 1 воспроизвел штатные эмбеддинги с максимальным абсолютным
расхождением не больше 3,4e-6. Batch 4 сохранил 3 / 2 / 2, но поменял метки
строк на всех трех матрицах, дал дрейф эмбеддингов 0,277-0,317 и оказался
медленнее batch 1. Ветвь остановлена до CPU-ячейки.
Этап 4: комбинации
| Комбинация | Рецепт | Время, с | Ускорение | RSS, МиБ | Диагностика | Handoff |
|---|---|---|---|---|---|---|
| C1 | 0.1 + CAMPPlus + NME + sequential |
98,347 | 33,65% | 399,5 | purity выросла; +2 слова без говорящего |
нет |
| C2 | 0.1 + WeSpeaker FP32 + shared 2 x pool 4 |
140,632 | 4,32% | 406,0 | точное совпадение с W0 | да |
Процент C1 посчитан относительно одиночного W0 из этапа окна, 148,220 с; это не соседняя A/B-пара. Процент C2 посчитан относительно соседнего W0 под runtime guard, 146,978 с.
У C1 mapped speaker purity выросла с 0,76655 / 0,78742 до
0,80137 / 0,91079. Слова без говорящего изменились с 51 / 13 / 9 на
53 / 13 / 9. Без слухового решения это не считается пройденной диагностикой.
Закрепленные модели
| Идентификатор | SHA-256 |
|---|---|
| Pyannote FP32 | 220ad67ca923bef2fa91f2390c786097bf305bceb5e261d4af67b38e938e1079 |
| WeSpeaker FP32 | e9848563da86f263117134dfd7ad63c92355b37de492b55e325400c9d9c39012 |
| WeSpeaker S8S8 QDQ | 9a3f8ae64d1083b64a6276f1e1138b17b7511a9a8d731b632945efc84098588b |
| CAMPPlus | aa3cfc16963a10586a9393f5035d6d6b57e98d358b347f80c2a30bf4f00ceba2 |
| TitaNet small | ad4a1802485d8b34c722d2a9d04249662f2ece5d28a7a039063ca22f515a789e |
Индекс публичных доказательств
Хеши ниже связывают обезличенные агрегаты с сырыми файлами приватной капсулы, не публикуя пути, текст или интервалы.
| Результат | SHA-256 | Окна по записям | Embedding-задания по записям |
|---|---|---|---|
| fresh 1.13.5 | c53c1f970ee4db094779bc32b42f978c37c2cb74d814504ccfac87f09e802ddd |
291 / 291 / 291 |
531 / 414 / 440 |
| fresh 1.13.6 | eb7e3d508836e1eefd679a851271eaa6823d688fef39d2ae03978e7fa7006bba |
291 / 291 / 291 |
531 / 414 / 440 |
| W0 | 32d513cd0e81fdca0e37484f86b5c4312d3573608493972a282302dd891cdf0e |
291 / 291 / 291 |
531 / 414 / 440 |
| W1 | be8935b5a81e2aadaeb38540e615c0cd3ae5ac31d6e0949856fd7d16d31a78ea |
195 / 195 / 195 |
357 / 274 / 302 |
| W2 | f95433d516772d40c4071da0d0745b981314ee7a7063fb4a43518e94bc17848e |
146 / 146 / 146 |
264 / 206 / 222 |
| W3 | 14cac4f1d8cd38ed5b4a20189438d2b1e109ba267c5feaa36f0928fbec848580 |
117 / 117 / 117 |
211 / 165 / 175 |
| W4 | 6fafefce00e90590ab2d834fb560413cd7780e20cbd1f631d9954ec8b97a540e |
59 / 59 / 59 |
105 / 82 / 89 |
| M2, исправленный интервал | 3debc8ae5cf1bd13d806dbfe8e4cfa137d6705622a721f4a42f1a22c030ec277 |
291 / 291 / 291 |
531 / 414 / 440 |
| M3, исправленный интервал | 531a842234e35e29f582ff8a51406fb9dd6211e017b3162d80cca21d4732d316 |
291 / 291 / 291 |
531 / 414 / 440 |
| E1, исправленный интервал | f5ac41d29eeff1f7cfbb93497a0025aef40de0838e933e0f9baed30a236d6b85 |
291 / 291 / 291 |
531 / 414 / 440 |
| E2, исправленный интервал | f2664d354ede1e4bf2c42b974513cdc845ff601c73f30ebae51456764fd8dcdc |
291 / 291 / 291 |
531 / 414 / 440 |
| C1, исправленный интервал | 4f96e6f7363e0edb79d4034a07f4d3b6b0003a820fcf6bceff5426bb3c2caff4 |
291 / 291 / 291 |
531 / 414 / 440 |
| W0 для C2, canonical result | e572dd057ec87514aca4617465c48ce361677ae19279efcadbbde404afc85b5d |
291 / 291 / 291 |
531 / 414 / 440 |
| C2, canonical result | d687074cc582e2ac379ed3375362f9480778feca02c7492a4c4be4fcc1a4f15a |
291 / 291 / 291 |
531 / 414 / 440 |
Для W0 под runtime guard суммарное user/system CPU time равно
584,590 / 0,590 с,
средний RTF по трем записям - 0,16331. Для C1 эти значения равны
406,230 / 1,050 с и 0,10927; для C2 под runtime guard -
667,580 / 0,960 с и
0,15626. У C2 повышенное CPU time отражает конкурентную работу двух stream,
а решение принимается по wall time.
Контрольные входы закреплены отдельно от результатов:
| Запись | SHA-256 media | SHA-256 ASR-sidecar | SHA-256 reference |
|---|---|---|---|
| control 1 | 1057616b42e8add00e0eb975b02bdef0ec9f6cdfec6dbf488e0c60423c9b7b87 |
3e190c060b2a9b0f4145249702d66b28c26e9b8518462000d368b431e22902bb |
- |
| control 2 | 51866d247fe3eda134cdd884f707b1f1db8855b492e8bd14d2b56b62476255ed |
f8ce6e25d0ce7999b2d3c31c7ca9fc5f721b8925334362729eed06552296bdb5 |
9098548743a86f868dfcdd906bcde34ed1ce5a935602cbe399f4bceda8685b3c |
| control 3 | 4422f04e2771091a0648e5422d14a31dd7ca2c8eef7ed9f4a5c63f43d8ca6400 |
eca10e7b232a211ce53decfc1a449c8ce2ae482dd7bc67c7aa9a267b12a2582d |
dc2db5925c98ea7029bf52ad9cd7cc332d0084b91118a3d58336058f619d3d9a |
Для CAMPPlus NME выбрал p=111 / 54 / 104; время счетчика составило
3,536 / 1,488 / 1,148 с. Для TitaNet - p=90 / 65 / 110 и
1,084 / 0,780 / 1,112 с. Все шесть результатов дали ожидаемое N,
повторяемые метки и ноль потерянных строк.
Воспроизведение на Ryzen
После проверки commit и внешнего SHA-256 приватной капсулы:
uv sync --frozen
uv pip install --python .venv/bin/python --reinstall \
/path/to/capsule/build/sherpa_onnx-1.13.6-cp313-cp313-linux_x86_64.whl
export LOCAL_TRANSCRIBER_EXPERIMENT_BUILD_SHA256=\
306499d8668ee138357f1de43a5c1c88f4dc46c845e8a92e6ad945327bcaa050
uv run python scripts/benchmarks/diarization_calibration.py \
--capsule /path/to/original-capsule.zip \
--capsule-sha256 CAPSULE_SHA256_FROM_HANDOFF \
--manifest /path/to/capsule/manifest.json \
--validate-only
--validate-only должен вернуть schema v3, этап intel, пустой список
предупреждений и qdq_available=true. Затем Ryzen-агент создает свой manifest
этапа ryzen, указывает Intel commit как handoff_commit и выполняет
изолированный E1 A/B перед первичным A/B C2. Экспериментальный wheel совместим
только с CPython 3.13 на Linux x86_64; на другой платформе его нужно пересобрать
из патча с тем же SHA-256.
Приватная капсула содержит manifest, исходные записи, ASR-sidecar, опорную разметку, калибровочные данные, созданные модельные артефакты, сырые результаты, worker requests и журналы. Эти файлы не входят в Git и не передаются внешним ревьюерам.
Ограничения
- У каждой ячейки один прогон. Проценты не оценивают дисперсию, прогрев и температурный дрейф.
- Ранние ячейки запускались не чередующимися парами, поэтому полного A/B не образуют. Финальные механизмы на Ryzen следует проверять только чередующимися парами из спецификации.
- Сравнение sherpa-onnx 1.13.5 и 1.13.6 показывает равенство качества, но разницу времени нельзя приписывать одной версии без повторов.
- C1 нельзя возвращать в матрицу без слуховой проверки подготовленных мест.
- Полные записи и приемка пяти слуховых категорий относятся к Ryzen-этапу после выбора финалиста.
- Вывод относится к одному Intel Core i7-6820HQ без VNNI/AVX-512. Результаты QDQ и shared-session нельзя переносить на Ryzen без собственного A/B.