Научная воспроизводимость — как будильник в понедельник: вроде должен сработать, а просыпаешься в полдень. В LLM это особенно заметно: задаёшь один и тот же вопрос при температуре 0 — а ответы живут своей жизнью. Виноваты ли «злые» GPU и неассоциативность сложения с плавающей точкой? Отчасти. Но этого объяснения мало.

Фокус в том, что сами ядра прямого прохода обычно детерминированы «запуск‑к‑запуску». Однако система в целом зависит от нагрузки сервера: меняется размер батча — меняется порядок редукций и, из‑за крошечных численных эффектов, расходится выход. Это и есть скрытый источник недетерминизма: отсутствие батч‑инвариантности.

Что такое батч‑инвариантность? Это когда результат для конкретного элемента не зависит от того, сколько соседей ехало в том же «батч‑вагоне» и как именно движок нарезал работу. Три узких места — RMSNorm, матмулы и внимание — потому что они содержат редукции.

Для RMSNorm решение простое: «data‑parallel» стратегия, где каждая строка нормируется в пределах одного ядра, не меняя порядок операций. Для крошечных батчей можно принять небольшой просадочный режим, лишь бы не ломать инвариантность.

С матмулом хитрее: хочется расколоть по K (split‑K) ради загрузки GPU, но это рушит инвариантность. Компромисс — одна устойчивая конфигурация без split‑K и без прыганья по тайлам. Потеря около 20% к cuBLAS в типичных формах LLM терпима, зате зато численно стабильно.

Внимание — босс уровня. Нужно, чтобы порядок редукций по K/V был одинаковым независимо от префилла, декодинга и нарезки на чанки. Значит, мы обновляем KV‑кэш заранее и используем фиксированный размер сплитов по KV, а не «фиксированное число сплитов». Тогда при длинных кэшах и коротких запросах мы всё равно складываем в одном и том же порядке.

Практика показывает: без батч‑инвариантных ядер при температуре 0 получаем десятки уникальных продолжений и расхождение уже на сотом токене. С ними — 1000 из 1000 идентичны. Цена вопроса — умеренная: да, немного медленнее, но далеко не катастрофа.

Бонус‑треугольник для исследователей RL: когда сэмплер и трейнер численно согласованы бит‑в‑бит, «он‑полиси» становится не лозунгом, а реальностью. И никаких тайных атол/ртол‑договорённостей. Только порядок, математика и воспроизводимость.