🏁 Результаты усиления модели и ростер oracle-ботов

О чём это

Итоги арки усиления value-модели (material → rich → KCP) с финальными числами win-rate и ценой каждого варианта, плюс полное описание задеплоенных oracle-ботов. Дом плана — План усиления value-модели; объяснялки — 🎓 2-ply Expectimax поверх value-модели и 🎓 KCP-фича — тактика против глубины поиска.

Результаты: сила эвалуаторов

Все замеры — арена 400 партий (200/цвет) против aggressive, seeded (воспроизводимо). Метка = «взятие короля», модель dice-free (оценивает позицию без знания следующего броска — так её зовёт поиск на листе).

ЭвалуаторФичиПлайWin-rateСкорость (400 партий)
material7 (материал)141.5%быстро
rich9 (+mobility, king-safety)148.0%быстро (~15 с)
material72~55%быстро
rich (🏆 задеплоен = oracle-3)9257.8%~18 мин
KCP13 (+king/queen capture-prob)160.8%~5 ч 29 мин

По силе: KCP выигрывает

1-ply + KCP = 60.8% — обходит 2-ply rich (57.8%) и 1-ply rich (48%). Прямой сигнал «могу взять короля» на одном плае сильнее двухплайной глубины по позиционным фичам. Offline это подтверждает: AUC 0.702→0.711, king_capture_attack = фича №3 по важности (выше total_material).

Но цена оказалась обратной ожиданиям

Предпосылка «KCP дёшев, т.к. считается только на корне (1-ply)» — неверна. Каждый eval = 4× DFS по 216 исходам кубиков (~40–60 мс) × десятки-сотни корневых ходов ⟹ 1-ply KCP тяжелее по времени, чем 360k дешёвых листьев 2-ply rich. Итог: ~6.6 с/ход на M3 Pro (~6 ядер), ≈18× медленнее 2-ply rich.

Следствие для live: 6.6 с/ход — много для партий 1–2 мин, впритык для 3 мин. А на rpi4 (где живут house-боты, 4 слабых ARM-ядра) будет ещё в разы медленнее. Значит KCP для живого бота нужен либо на более мощном хосте, либо после удешевления (см. KingCaptureProbability оптимизация, epic #385 / top-K / deadline-1-ply).

Ростер oracle-ботов

Живут в приватном репо dicechess-house-bots, крутятся на rpi4 (auto-accept челленджей на play-сайте). Различаются моделью, набором фич и глубиной поиска. Общий образ ghcr.io/rabestro/dicechess-house-bots, поведение задаётся env (MODEL_PATH, ORACLE_FEATURES, алгоритм).

БотМодельФичиПоискWin-rateСтатус
oracle-1oracle-1.onnxmaterial1-ply41.5%задеплоен
oracle-2oracle-1.onnx (та же)material2-ply expectimax~55%задеплоен
oracle-3oracle-3.onnxrich2-ply expectimax57.8%задеплоен (текущий чемпион)
oracle-4oracle-4.onnx (=kcp_nodice)kcp1-ply60.8%🚧 планируется, скорость-гейт

oracle-1 и oracle-2 делят одну модель и отличаются только глубиной (1 vs 2 плая). oracle-3 — первая с богатыми фичами. oracle-4 (KCP) — сильнейший по игре, но требует решения по хосту из-за цены хода.

Где лежат модели

ГдеЧтоВ git?
dicechess-ev/models/тренировочные/эксперимент (LightGBM .txt + ONNX)❌ gitignored — только локально
dicechess-house-bots/models/задеплоенные (oracle-*.onnx)✅ закоммичены + впекаются в GHCR-образ

⚠️ Экспериментальные модели эфемерны (только на рабочем маке); воспроизводимы из training_data_*.csv.gz + dicechess-ev/train.py, но CSV тоже локальные. Долговременный дом модели = попадание в house-bots/models/ при деплое бота.

Как обучается/экспортируется (кратко)

dicechess-ev (Python, uv+mise): mise run train <csv> --no-dice [--kcp] → LightGBM (objective=regression для ONNX) → export_onnx.py (авто-детект числа фич + round-trip проверка). Порядок фич движок↔ONNX↔python общий: заголовок обогащённого CSV = KcpFeatures.columnNames (материал → mobility/king-safety → 4 KCP), движок извлекает тем же порядком (train==serve). Обогащение фич считается в движке (EnrichTrainingDataApp в analytics, featureSet=rich|kcp), т.к. в Python нет генератора ходов.

Связанные заметки