NextStat v0.9.6: нулевой JIT-налог, ESS/grad и сходимость
Финальные канонические результаты со строгим разделением бэкендов: Metal, CUDA V100 и EPYC CPU.
2026-02-18 · 18 мин
TL;DR (только финальные числа v0.9.6)
- ›LAPS Metal: финальная матрица — 8/8 ok,
Div%=0по всем кейсам. - ›CUDA V100 паритет (3-seed медиана, canonical): NextStat LAPS сохраняет нулевой JIT-налог (
cold ≈ warm), тогда как cold-start BlackJAX — 11.8–90.6 с в данной конфигурации. - ›Time-to-result в реальных циклах редактирования: при изменении структуры/формы модели (приоры, параметризация, размерности) JAX/XLA-воркфлоу обычно рекомпилируются; эта задержка компиляции повторяется на каждой итерации. AOT-ядра NextStat сохраняют латентность итерации близкой к warm-path.
- ›ESS/grad (V100 сэмплирование, report-chain нормализация): на совпадающих целях NS LAPS в диапазоне от 2.46× до 45.11× vs BlackJAX в этом canonical прогоне.
- ›Исправлена честность CPU funnel:
FunnelNcpModel(NCP) — 6/6 ok по 3 сидам на EPYC для MAMS и NUTS; centered funnel остаётся известным патологическим контролем.
0.MAMS и LAPS за одну страницу (для пользователей NUTS)
Если вы уже знаете NUTS, ключевая ментальная модель:
- ›NUTS — динамический HMC с адаптивным расширением дерева на каждом переходе (адаптивная длина пути на каждом шаге).
- ›MAMS (Metropolis Adjusted Microcanonical Sampler) использует микроканоническую/изокинетическую динамику с фиксированной длиной траектории в прекондиционированном пространстве.
- ›LAPS — массивно параллельный GPU/Metal-путь сэмплирования, который применяет MAMS-динамику на тысячах цепей с аппаратно-ориентированным исполнением.
Что нового относительно стандартных реализаций NUTS
- ›Ядра переходов фиксированной формы проще эффективно исполнять на SIMD/GPU-бэкендах, чем рекурсивное построение деревьев.
- ›Сэмплер построен для очень большого параллелизма цепей (
4096цепей — штатная рабочая точка в этом отчёте). - ›В этом релизе MAMS/LAPS используют микроканонические диагностические гейты и явное раскрытие NCP-vs-centered для funnel-подобных геометрий.
Где этот дизайн сильнее всего
- ›Time-to-result в итеративных воркфлоу (нет повторной JIT-компиляции в нашем AOT-пути).
- ›Иерархические и мультимасштабные цели, где мы наблюдаем высокий ESS/grad в matched-target запусках.
- ›Локальные пути ускорения (Metal) и серверные GPU-пути (CUDA) с единой семантикой сэмплера.
Где NUTS или XLA-тяжёлые стеки могут выиграть
- ›Простые низкоразмерные цели после прогрева компиляции (возможна более высокая raw warm-path пропускная способность).
- ›Некоторые гладкие концентрированные постериоры на CPU (например, large-n логистическая регрессия в этом отчёте).
Поэтому этот отчёт не заявляет универсального победителя среди сэмплеров — он документирует, где каждая модель исполнения сильнее, с явными оговорками о честности.
1.Протокол и правила честности
Разделение бэкендов (без смешивания)
- ›Результаты
LAPS Metalпубликуются отдельно отLAPS CUDA. - ›Результаты
CPU (EPYC)публикуются отдельно от GPU. - ›Ни одна таблица не смешивает значения Metal и CUDA.
Мульти-ран агрегация (против cherry-pick)
- ›Финальные таблицы сравнения CPU/GPU используют три независимых сида:
42, 123, 777. - ›Мы публикуем медиану как основное число (устойчиво к выбросам), с
mean ± stdгде полезно. - ›Значения одиночных сидов хранятся только в сырых артефактах, не как заголовочные утверждения.
Time-to-result в итеративном моделировании
- ›Байесовская работа — это цикл редактирования (изменить приор, добавить ковариату, репараметризовать, перезапустить).
- ›В JIT/XLA-стеках изменения графа/формы часто инвалидируют скомпилированные исполняемые файлы и запускают рекомпиляцию, поэтому cold-start затраты повторяются при исследовании.
- ›NextStat использует AOT-компилированные Rust/CUDA-ядра, поэтому wall-clock латентность итерации остаётся близкой к warm-path даже при эволюции моделей.
Раскрытие параметризации funnel
Для std_normal, eight_schools и glm_logistic оба движка сэмплируют одну и ту же целевую плотность (идентичные log-density функции).
Для neal_funnel_10d параметризации различаются в V100 parity run:
- ›NS LAPS сэмплирует Non-Centered Parameterization (NCP):
log p(v, z) = -v²/18 - 0.5 · Σ(z_i²). - ›BlackJAX сэмплирует centered-параметризацию:
log p(v, x) = -v²/18 - 0.5·exp(-v)·Σ(x_i²) - 0.5·(d-1)·v.
Это не одна и та же задача оптимизации. Centered funnel имеет позиционно-зависимую кривизну, фундаментально более сложную для сэмплеров с фиксированной метрикой. Строки neal_funnel в секции 3 и Приложении отражают различия как алгоритма, так и параметризации, и не должны интерпретироваться как сравнение «при прочих равных». Они сохранены для демонстрации поведения сходимости (NS сходится, BlackJAX нет), но исключены из заголовочных ESS/grad утверждений.
- ›На CPU теперь есть явная
FunnelNcpModelдля честных NCP-сравнений (секция 6). - ›Centered
FunnelModelостаётся отдельным контролем сложной геометрии.
Алгоритмические изменения в v0.9.6
- ›MAMS использует
eps_jitter=0.1по умолчанию (±10% равномерный шум размера шага на переход), ломая периодичность фиксированного L и улучшая tail ESS на периодических целях вродеstd_normal. - ›Длина траектории по умолчанию:
L = √dв прекондиционированном пространстве (Robnik et al. 2023).
Конфигурация BlackJAX (V100 parity run)
Для предупреждения вопросов о мисконфигурации конкурента, полная конфигурация BlackJAX:
- ›Сэмплер:
blackjax.adjusted_mclmcс интеграторомisokinetic_mclachlan. - ›Прогрев: встроенная
blackjax.adjusted_mclmc_find_L_and_step_size(500 итераций, single-chain прогрев,target_accept=0.9,diagonal_preconditioning=True). - ›Длина траектории: настроена встроенным прогревом BlackJAX (
L,step_size), затемn_steps = round(L / step_size). - ›Mass matrix: сэмплирование использует настроенную
inverse_mass_matrixиз прогрева BlackJAX. - ›Multi-chain: 4096 цепей,
jax.vmap(run_chain),block_until_ready()+device_get()для честного host-side тайминга. - ›Cold/warm: cold = первый вызов
vmap(включает XLA-компиляцию); warm = второй вызов с кэшированным JIT. - ›Init: цепи инициализированы вокруг прогретого single-chain состояния (
warmed_state.position + N(0, 0.5)). - ›Seed: 42 (cold), 1042 (warm).
- ›Seeds:
42, 123, 777(для каждого сида, warm run используетseed + 1000key path). - ›Исходник:
benchmarks/gpu_triple_bench.py, функции_blackjax_builtin_warmup()иbench_blackjax().
Конфигурация V100 parity run (NS LAPS, 3 seeds)
- ›
n_chains=4096,n_warmup=500,n_samples=1000,report_chains=256,seeds=42/123/777. - ›Секции 3/4 публикуют медиану по 3 сидам.
- ›R̂ вычислена по 256 report chains (512 полу-цепей), давая существенно более точные диагностики по сравнению с предыдущим 64-chain репортингом.
2.Каноничные результаты LAPS Metal (финальные)
Железо: Apple M5, 10 GPU-ядер, 24 ГБ unified memory.
| Модель | Цепи | w+s | Wall (с) | R̂ | ESS/s | Div% | Статус |
|---|---|---|---|---|---|---|---|
| std_normal_10d | 256 | 100+100 | 0.14 | 1.175 | 3 680 | 0.0 | ok |
| std_normal_10d_4096ch | 4096 | 200+500 | 0.09 | 1.038 | 12 585 | 0.0 | ok |
| eight_schools | 4096 | 500+2000 | 0.25 | 1.007 | 124 705 | 0.0 | ok |
| neal_funnel_10d | 4096 | 500+2000 | 0.31 | 1.006 | 22 791 | 0.0 | ok |
| neal_funnel_riemannian | 4096 | 500+2000 | 0.27 | 1.010 | 14 142 | 0.0 | ok |
| glm_logistic_n200_p6 | 4096 | 500+2000 | 2.15 | 1.005 | 4 647 | 0.0 | ok |
| glm_logistic_n1000_p20 | 4096 | 500+2000 | 34.32 | 1.010 | 248 | 0.0 | ok |
| glm_logistic_n5000_p20 | 4096 | 500+2000 | 59.06 | 1.015 | 110 | 0.0 | ok |
Примечание: строка 256-chain std_normal_10d (R̂ 1.175) демонстрирует минимально жизнеспособное количество цепей; строка 4096-chain — каноничная конфигурация бенчмарка.
На практике это показывает, что локальный Apple Silicon способен запускать массивно параллельные inference-нагрузки дата-центрового масштаба с надёжной диагностикой сходимости — без настройки CUDA и без задержки JIT-компиляции.
Политика quality gates для этой матрицы:
- ›
MAMS/LAPS:QualityGates::microcanonical()(EBFMI — только предупреждение). - ›
NUTS: строгий дефолтный gate сохранён (EBFMI fail < 0.20).
Metal M5 — 8/8 ok, Div% = 0
3.CUDA V100 parity run (LAPS vs BlackJAX, 3-seed медиана)
Железо: Tesla V100-PCIE-16GB.
| Модель | Движок | Cold (с) | Warm (с) | min ESS | ESS/s (warm) | R̂ |
|---|---|---|---|---|---|---|
| std_normal_10d | NS LAPS GPU | 1.554 | 0.240 | 159 753 | 680 785 | 1.0062 |
| std_normal_10d | BlackJAX GPU | 14.064 | 0.225 | 1 771 | 7 847 | 1.1010 |
| eight_schools | NS LAPS GPU | 1.425 | 0.241 | 75 682 | 314 476 | 1.0065 |
| eight_schools | BlackJAX GPU | 11.769 | 0.346 | 28 020 | 75 255 | 1.0080 |
| neal_funnel_10d | NS LAPS GPU | 1.404 | 0.259 | 54 768 | 211 581 | 1.0083 |
| neal_funnel_10d | BlackJAX GPU | 15.517 | 0.412 | 706 | 1 759 | 1.2732 |
| glm_logistic | NS LAPS GPU | 23.791 | 9.254 | 77 852 | 8 415 | 1.0086 |
| glm_logistic | BlackJAX GPU | 90.615 | 77.765 | 19 583 | 226 | 1.0122 |
Cold-start латентность (секунды, лог-шкала) — V100
std_normal
eight_schools
neal_funnel
glm_logistic
Как читать эту таблицу
- ›Нулевой JIT-налог: NS LAPS cold остаётся близким к warm (AOT-компилированный Rust/CUDA). Cold-start BlackJAX существенно выше в этой конфигурации (
11.8–90.6 с). - ›Warm-start пропускная способность (canonical прогон): NS LAPS выше на всех совпадающих целях в этой конфигурации.
- ›
neal_funnel— не сравнение «при прочих равных» (см. секцию 1: NS сэмплирует NCP, BlackJAX — centered). В этих 3 сидах R̂ centered-funnel BlackJAX в диапазоне1.260–1.275— это ожидаемо из-за сложности параметризации, а не дефект сэмплера.
4.ESS/grad на V100 (фаза сэмплирования, только совпадающие цели, 3-seed медиана)
| Модель | NS LAPS ESS/grad | BlackJAX ESS/grad | Отношение (NS/BJ) |
|---|---|---|---|
| std_normal_10d | 0.312017 | 0.006917 | 45.11× |
| eight_schools | 0.098544 | 0.040104 | 2.46× |
| glm_logistic | 0.101370 | 0.002638 | 38.43× |
neal_funnel исключён из таблицы, так как два движка сэмплируют разные параметризации (см. секцию 1).
Основной вклад в изменение по сравнению с ранними драфтами — нормализация знаменателя: оба движка теперь вычисляют ESS/grad на одном бюджете report_chains.
ESS/grad (лог-шкала) — совпадающие цели, V100
std_normal
45.11×eight_schools
2.46×glm_logistic
38.43×Практическая интерпретация для этого canonical прогона:
- ›NS LAPS достигает более высокого ESS/grad на всех совпадающих целях в этом отчёте.
- ›
glm_logisticостаётся самой дорогой целью для обоих движков по абсолютному wall time.
5.Верификация качества LAPS на V100 (report_chains=256)
Отдельный запуск с более строгой диагностикой (report_chains=256 → 512 полу-цепей → SE(R̂) ≈ 0.015).
| Модель | R̂ max | ESS_tail min | E-BFMI | Статус |
|---|---|---|---|---|
| StdNormal 10d | 1.0175 | 18 947 | 1.035 | ok |
| NealFunnel NCP 10d | 1.0126 | 48 202 | 0.970 | ok |
| GLM n=5000 p=20 | 1.0149 | 49 660 | 0.863 | ok |
| GLM n=200 p=6 | 1.0044 | 55 423 | 0.449 | ok |
| NealFunnel centered 10d | 1.2914 | 257 | 0.000 | fail (ожидаемый контроль) |
Это подтверждает, что сходимость LAPS надёжна при достаточном количестве диагностических цепей. Значения R̂ из parity-run (секция 3, report_chains=256) напрямую сопоставимы с quality run.
6.CPU EPYC (MAMS vs NUTS) и исправление паритета funnel
Железо: AMD EPYC 7502P, 32 ядра / 64 потока, 128 ГБ RAM (Hetzner dedicated).
Сводка EPYC multi-seed (42/123/777, 3-run агрегат)
Конфигурация: n_chains=4, n_warmup=1000, n_samples=1000, eps_jitter=0.1.
| Модель | MAMS ESS/s (медиана) | MAMS (mean ± std) | NUTS ESS/s (медиана) | NUTS (mean ± std) | Отношение |
|---|---|---|---|---|---|
| std_normal_d2 | 129 592 | 137 761 ± 75 444 | 200 841 | 200 329 ± 13 460 | 0.645 |
| std_normal_d10 | 100 420 | 103 641 ± 4 692 | 85 159 | 95 604 ± 15 815 | 1.179 |
| std_normal_d50 | 13 007 | 13 150 ± 867 | 28 305 | 26 113 ± 3 638 | 0.460 |
| eight_schools | 98 201 | 93 408 ± 8 227 | 48 577 | 46 018 ± 5 781 | 2.022 |
| logreg_n1000_p10 | 714 | 711 ± 10 | 3 896 | 3 914 ± 28 | 0.183 |
| logreg_n5000_p20 | 37 | 36 ± 4 | 186 | 190 ± 11 | 0.200 |
Наблюдаемый паттерн в этой real-run матрице:
| Кейс | dim | n_data | Отношение MAMS/NUTS | Лидер |
|---|---|---|---|---|
| std_normal_d2 | 2 | — | 0.645 | NUTS |
| eight_schools | 10 | 8 | 2.022 | MAMS |
| std_normal_d10 | 10 | — | 1.179 | MAMS |
| std_normal_d50 | 50 | — | 0.460 | NUTS |
| logreg_n1000_p10 | 10 | 1000 | 0.183 | NUTS |
| logreg_n5000_p20 | 20 | 5000 | 0.200 | NUTS |
Почему large-n логистическая регрессия благоприятствует NUTS
- ›Стоимость градиента масштабируется как
O(n·p)на leapfrog-шаг; приn=5000, p=20каждый дополнительный шаг дорог. - ›NUTS может завершать траектории раньше через U-turn, тогда как MAMS использует фиксированную длину траектории в прекондиционированном пространстве.
- ›По мере роста
nгеометрия постериора приближается к хорошо обусловленному гауссиану; это сильный режим для NUTS с адаптивной длиной пути.
Практическая рекомендация
- ›Предпочитайте MAMS для иерархических / мультимасштабных геометрий.
- ›Предпочитайте NUTS для large-n GLM-подобных постериоров на CPU.
- ›Разумное продуктовое направление — явная эвристика
method="auto"(напр.: GLM с большимn→ NUTS; иерархические/funnel-подобные цели → MAMS), с сохранением ручного оверрайда.
MAMS vs NUTS ESS/s медиана — EPYC CPU
std_normal d2
std_normal d10
std_normal d50
eight_schools
logreg n1000
logreg n5000
Контроль параметризации funnel (EPYC, 3 сида)
Конфигурация: n_chains=4, n_warmup=1000, n_samples=1000.
MAMS:
| Модель | Seed | R̂ | ESS_tail | EBFMI | Статус |
|---|---|---|---|---|---|
| Centered (FunnelModel) | 42 | 1.0785 | 221 | n/a | ok |
| Centered (FunnelModel) | 123 | 1.0353 | 31 | n/a | fail |
| Centered (FunnelModel) | 777 | 1.0781 | 244 | n/a | ok |
| NCP (FunnelNcpModel) | 42 | 1.0067 | 1 914 | n/a | ok |
| NCP (FunnelNcpModel) | 123 | 1.0100 | 1 897 | n/a | ok |
| NCP (FunnelNcpModel) | 777 | 1.0048 | 1 924 | n/a | ok |
NUTS:
| Модель | Seed | R̂ | ESS_tail | EBFMI | Статус |
|---|---|---|---|---|---|
| Centered (FunnelModel) | 42 | 2.3844 | 14 | n/a | fail |
| Centered (FunnelModel) | 123 | 1.3636 | 72 | n/a | fail |
| Centered (FunnelModel) | 777 | 1.9480 | 17 | n/a | fail |
| NCP (FunnelNcpModel) | 42 | 1.0026 | 2 516 | n/a | ok |
| NCP (FunnelNcpModel) | 123 | 1.0027 | 1 604 | n/a | ok |
| NCP (FunnelNcpModel) | 777 | 1.0024 | 2 385 | n/a | ok |
Интерпретация:
- ›NCP — 6/6 ok по всем сидам для MAMS и NUTS. ESS_tail в диапазоне 1 604–2 516 (NUTS) и 1 897–1 924 (MAMS).
- ›Centered — 3/3 fail для NUTS и 1/3 fail для MAMS.
- ›Предыдущее несоответствие CPU funnel было методологическим (centered vs NCP), а не проблемой «CPU слабый».
- ›
FunnelNcpModel— рекомендуемая параметризация бенчмарка для CPU/GPU паритета. - ›Centered
FunnelModelсохранён как известный патологический контроль; это демонстрация ограничений, а не регрессия продукта. - ›В этих артефактах EPYC funnel-control
EBFMIне экспортирован (n/aв таблицах), поэтому pass/fail основан на R̂/ESS quality gates.
7.Воспроизводимость и метаданные окружения
- ›JSON бенчмарка V100 содержит top-level снимок
environment(python,jax,cuda,gpu, версии пакетов). - ›Сьют EPYC хранит метаданные железа/конфига/сида и метрики по кейсам; полный снимок окружения на уровне пакетов сейчас только в V100 parity JSON.
Артефакты (все в docs/blog/artifacts/v096-zero-jit-tax/):
- ›Матрица V100 3-seed (canonical):
v100-multi-seed-matrix-canonical.json - ›Графические данные V100 (canonical):
v100-parity-chart-data-canonical.csv,v100-essgrad-ratio-canonical.csv - ›Сырые V100 3-seed (canonical):
v100_v096_builtinwarmup_3seed_20260218T224654Z/seed_42/gpu_triple_bench.json,seed_123/...,seed_777/... - ›V100 funnel addendum:
v100_ns_funnel_3seed_20260218T231337Z/*,v100_bj_funnel_builtin3seed_20260218T231204Z/* - ›V100 quality run:
v100-quality-report256-5models.json - ›V100 + EPYC refresh note:
2026-02-17-v096-refresh-v100-epyc.md - ›EPYC multi-seed матрица:
epyc-multi-seed-matrix.json - ›Выход EPYC сьюта:
epyc-mams-suite.json - ›EPYC funnel-control:
epyc-funnel-control-3seed.json
A.Приложение: V100 neal_funnel (разные параметризации)
Сохранено для прозрачности. Эти строки сравнивают NS LAPS (NCP) с BlackJAX (centered) — это не сравнение «при прочих равных».
| Метрика | NS LAPS (NCP) | BlackJAX (centered) |
|---|---|---|
| Cold (с) | 1.404 | 15.517 |
| Warm (с) | 0.259 | 0.412 |
| min_ESS | 54 768 | 706 |
| ESS/s (warm) | 211 581 | 1 759 |
| R̂ | 1.0083 | 1.2732 |
| ESS/grad | 0.071312 | 0.000710 |
Несходимость BlackJAX на centered funnel ожидаема (см. секцию 6: даже NUTS проваливается 3/3 на centered funnel с 4 цепями и стандартным бюджетом). Это сравнение прежде всего демонстрирует, что дефолтная NCP-диспатч NS производит сходящиеся результаты там, где centered-параметризация не сходится.
Ссылки
- ›Robnik, Cohn-Gordon, Seljak. Metropolis Adjusted Microcanonical Hamiltonian Monte Carlo (MAMS). arXiv:2503.01707
- ›BlackJAX. Composable Bayesian inference in JAX. arXiv:2402.10797
