docs(diarization): опубликован Intel-scout Streaming Sortformer #49

Merged
ddmitry merged 1 commits from research/46-sortformer-intel-scout into master 2026-09-01 22:07:45 +03:00
@@ -0,0 +1,178 @@
# Streaming Sortformer: разведочный прогон на Intel
**Дата:** 2026-09-01
**Статус:** разведка завершена; владелец решил не запускать Ryzen-прогон,
production-профиль не меняется. Задача #46 формально остается открытой без
исхода `go` или `stop`.
## Решение
Streaming Sortformer v2 Q8_0 обработал три 300-секундных фрагмента за
137,498 с против 157,487 с у свежего W0. Ускорение одной парной проверки на
четырех физических ядрах составило 12,69%. Это заметный выигрыш, но он далеко
не дотягивает до целевых 30%.
По исходной спецификации ускорение выше 10% открывает пять финальных циклов.
Разведка этот порог прошла. Владелец, однако, изменил вопрос: нужно было решить,
оправдано ли неудобное развертывание отдельной машины ради шанса достичь 30%.
Предсказать Ryzen по этой паре нельзя. Восемь физических ядер могут сильнее
ускорить W0, чья приемочная конфигурация получает восемь потоков. Более новая
микроархитектура Ryzen, напротив, может оказаться выгоднее Sortformer. Модели
переноса для этих эффектов нет. Решение владельца учитывает слабый запас по
скорости, смешанную диагностику качества и рост памяти. Формальное правило
остановки эксперимента здесь не применялось.
Кандидат не включается в production. Пять финальных циклов, полные записи и
слуховая приемка не запускались.
## Статус относительно задачи #46
Это не канонический исход `go` или `stop` из
[спецификации](../specs/2026-09-01-streaming-sortformer-cpu-experiment.md).
Владелец изменил маршрут исследования после слияния стенда: вместо неудобного
развертывания отдельной Ryzen-машины сначала потребовалась локальная проверка,
достаточная для решения, нужен ли Ryzen вообще.
Разведка отличается от исходного контракта:
- Intel Core i7-6820HQ вместо целевого Ryzen;
- привязка к четырем физическим ядрам `0-3` вместо восьми;
- четыре intra-op потока W0 вместо восьми; Sortformer сохранил закрепленные
четыре внутренних потока;
- одна свежая пара на трех фрагментах вместо primary и пяти финальных пар;
- использована утвержденная владельцем готовая разметка. Нового полного
прослушивания для повторного определения числа голосов не было;
- swap был занят до начала измерений. Во время принятой пары его объем не
изменился, но каноническую проверку памяти нельзя считать пройденной.
Поэтому числа ниже отвечают только на практический вопрос о целесообразности
дальнейшего Ryzen-прогона. Формальная задача #46 остается незавершенной.
Новая закрытая основа была собрана отдельно из сохраненных исходных записей.
Подготовленные sidecar и опорная разметка перенесены по решению владельца.
Ее `basis.json` не заменяет канонический manifest приемочного стенда. Старые
manifest, расписания, измерения и результаты стенд не читал. Байты моделей W0
проверены заново по закрепленным SHA-256.
## Рецепты
W0 использовал `sherpa-onnx/core 1.13.6`, Pyannote Segmentation 3.0 FP32,
WeSpeaker ResNet34 LM FP32, `window_shift_ratio=0.1`,
`FastClustering(auto, 0.89)`, CPU provider, `debug=True`, один процесс и четыре
intra-op потока, `inter_op_threads=1`, `min_duration_on=0.3` и
`min_duration_off=0.5`.
Кандидат использовал NeMo-Speech.cpp на закрепленном commit, модель Streaming
Sortformer v2 Q8_0, CPU backend, один процесс и один stream. Geometry и
post-processing полностью совпадали со спецификацией. Реальная загрузка модели
через C ABI подтвердила четыре выходных канала и шаг 0,08 с на кадр.
Обе ветви получили одни и те же заранее декодированные mono/16 kHz float32
буферы. Загрузка моделей, декодирование, чтение sidecar, вычисление метрик и
запись результатов находились вне таймера. W0 измерял штатный
`diarizer.process(samples)`. У кандидата таймер охватывал
`stream_open -> stream_push -> stream_finish` и построение итоговых сегментов;
копирование диагностической матрицы вероятностей в wall не входило.
## Условия прогона
- Intel Core i7-6820HQ, четыре физических ядра и восемь логических;
- обе ветви привязаны к физическим ядрам `0-3`;
- фиксированный порядок пары: W0, затем Sortformer;
- каждая ветвь запущена новым процессом; модель загружена один раз, три
фрагмента обработаны последовательно;
- swap до и после каждой полной ячейки занимал 185 774 080 байт и не менялся;
короткий `vmstat` перед парой не показал swap I/O.
Режим питания, governor, turbo, температуру и признаки throttling во время
принятой пары защитная проверка не записала. Обратный порядок пары тоже не
проверялся. Поэтому 12,69% служит только ориентиром для решения о продолжении.
Устойчивая оценка производительности Intel не получена.
## Скорость и память
| Фрагмент | W0, с | Sortformer, с | Ускорение | Кластеры W0 | Кластеры Sortformer |
|---:|---:|---:|---:|---:|---:|
| 1 | 54,560 | 46,163 | 15,39% | 3 | 3 |
| 2 | 53,524 | 46,254 | 13,58% | 2 | 2 |
| 3 | 49,402 | 45,081 | 8,75% | 2 | 2 |
| **Сумма** | **157,487** | **137,498** | **12,69%** | - | - |
Суммы рассчитаны из сырых значений до округления строк таблицы.
У кандидата `inference` занял 137,497047 с, построение сегментов - 0,000566 с.
Их сумма 137,497614 с совпадает с полным `wall` до точности округления.
Пиковый RSS процесса составил 321,8 МиБ у W0 и 586,2 МиБ у кандидата.
Sortformer потребовал на 264,3 МиБ, или на 82,1%, больше. После третьего
фрагмента рост вышел на плато. Разница и процент рассчитаны из числа байтов до
округления значений в МиБ.
## Автоматическое качество
Обе ветви на всех трех фрагментах:
- нашли ранее утвержденное число голосовых кластеров `3; 2; 2`;
- сохранили текст, число и порядок слов из общего ASR-sidecar;
- выдали конечные, положительные и упорядоченные интервалы;
- прошли правила канонической нумерации говорящих.
Кандидат дополнительно прошел специальную проверку Sortformer: форма
вероятностей `T x 4`, диапазон `[0, 1]`, метки `1..4`, метаданные кадров и
эффективная конфигурация совпали с закрепленными значениями.
Диагностика не показывает однозначного улучшения качества. Показатель
`mapped speaker purity` изменился с `0,8404; 0,7665; 0,7874` у W0 на
`0,6477; 0,8372; 0,9201` у Sortformer: на первом фрагменте есть заметное
ухудшение, на двух других - улучшение. Слов без назначенного говорящего стало
92 вместо 75. Эти показатели не имеют автоматического порога, но при
продолжении потребовали бы слуховой проверки затронутых мест.
## Закрепленные доказательства
- source commit local-transcriber:
`f59efa51b769a4301a231fa977b8e04844331bc1`;
- SHA-256 закрытого `basis.json`:
`ab5ee0b191770abf69d5d17fb5cc2be169c0890e3b5b683f05d5c8b7c9ffa0d3`;
- commit NeMo-Speech.cpp:
`4f9676226f667d14608487df744f375db87127f8`;
- commit submodule ggml:
`c03b4e2bcece5134827881af90242086daf75be5`;
- SHA-256 модели Sortformer Q8_0:
`0679cfeb1ce356d0dea9470b31274f4bfc7eb927497d82005483770666da998a`;
- SHA-256 модели Pyannote Segmentation 3.0 FP32:
`220ad67ca923bef2fa91f2390c786097bf305bceb5e261d4af67b38e938e1079`;
- SHA-256 модели WeSpeaker ResNet34 LM FP32:
`e9848563da86f263117134dfd7ad63c92355b37de492b55e325400c9d9c39012`;
- SHA-256 исполняемого файла:
`571ca0be2342a0ee7a807e2bdb55fda0f5e6cfa510db28ae4f5b127613889053`;
- SHA-256 библиотеки C ABI:
`620ad4d76906c7af744b1eabba6f961ae82e8113e404099a91cf1d8536f08122`;
- SHA-256 приватного runner-скрипта:
`a015a78cbed767e861eda1b52496d9da9a54cf2ba3cba0b3bc11ee89022017d9`;
- SHA-256 закрытого результата W0:
`d921c0160d3b79b073f1c631f87aa2f8798e619d936f13369d85656ebf3c75be`;
- SHA-256 закрытого результата кандидата:
`ff5a0c7f49faf64e2736ebc8075bb80dbfb85fadd4d29caeffbb3b2beadddbd3`;
- SHA-256 сводного закрытого результата:
`826cda109d05b72cf37af0d92101d67ffa24edd96ab78ce67abba737f73ba5ca`.
Закрытое хранилище содержит подготовленные записи, sidecar, опорную разметку,
сырые результаты и воспроизводимые пины. Пути, идентификаторы записей, текст,
интервалы, логи и аудио в отчет не включены.
## Ограничения
Разведка не доказывает скорость на Ryzen и не заменяет расписание приемочного
эксперимента. Один порядок одной пары и неполная защитная проверка не дают
устойчивой оценки разброса, питания и нагрева. Память не получила канонического
вердикта.
Сохраняются ограничения самой модели: не больше четырех выходных голосовых
кластеров, риск для встреч с пятью и более голосами, русской речи вне домена и
длинных записей. Если когда-нибудь понадобится именно формальный исход #46,
потребуется отдельный Ryzen-прогон по исходной спецификации. Intel-разведка не
позволяет предсказать его результат; сейчас владелец решил не тратить на него
время.