docs(diarization): опубликован Intel-scout Streaming Sortformer #49
@@ -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-разведка не
|
||||
позволяет предсказать его результат; сейчас владелец решил не тратить на него
|
||||
время.
|
||||
Reference in new issue
Block a user