diff --git a/docs/benchmarks/2026-09-01-streaming-sortformer-intel-scout.md b/docs/benchmarks/2026-09-01-streaming-sortformer-intel-scout.md new file mode 100644 index 0000000..6a98a1c --- /dev/null +++ b/docs/benchmarks/2026-09-01-streaming-sortformer-intel-scout.md @@ -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-разведка не +позволяет предсказать его результат; сейчас владелец решил не тратить на него +время.