Ядро солвера PLO5 / PLO6: где мы сейчас

данные на {{ dataDate }}
Солвер
сегодня
Префлоп
Флоп
Тёрн
Ривер
{{ cr.row }}
Показать
Вид карты
{{ edgesSvg }}
{{ pulse }}
{{ n.title }} {{ n.kidLabel }}
{{ n.stLabel }}
Готово - подтверждено кодом Текущий фокус Следующее по плану В плане / оценка Исследуем Ждёт данных Связь между ветками
Объяснялка 1 из 6

Дерево „взрывается“

Солвер хранит все возможные продолжения раздачи. Каждая ставка - развилка, а каждая новая карта - десятки развилок сразу. Переключите улицы и посмотрите, как растёт дерево.

{{ trSvg }}
{{ tl.t }}
Варианты ставок Новая карта на столе Схема упрощена: настоящих ветвей в тысячи раз больше
Ветвей на схеме {{ trLeaves }} {{ trT.ahead }}
Память{{ trRamTag.t }}
{{ trT.ram }} {{ trT.hands }}
Время расчёта, PLO6{{ trTimeTag.t }}
{{ trT.time }} Rust, ноутбук Ryzen 7 5800H
Сколько памяти нужно улицеЛогарифмическая шкала: каждое деление - в 10 раз больше
{{ tb.t }}
{{ tb.lab }}{{ tb.tag.t }}
128 ГБ · RISE-L
ВыводРивер - сотни мегабайт, тёрн - тоже немного. Флоп с тремя размерами ставок - около 130 ГБ даже на 500 рук: это уже предел сервера RISE-L. Поэтому перед арендой проверяем, что реально помещается.
RAM ≈ узлы решения × руки на игрока × ≈70 байт на (узел · руку) + overhead. Флоп 33/75/100% на всех улицах ≈ 3,79 млн узлов, с размерами по умолчанию 33/50/75/100% ≈ 7,82 млн. Ривер и тёрн - замеры на ноутбуке при разном числе рук: 10 000 и 1 000. Полный флоп не решался.
Объяснялка 2 из 6

Как солвер учится

Солвер не знает ответа заранее. Он раз за разом играет сам с собой и „жалеет“ о вариантах, которые принесли бы больше. Здесь - настоящий расчёт на самой простой игре, прямо в браузере.

Игрок 1 · ходит первымНатсы или воздух - 50 на 50

Банк 10 bb. С натсами всегда ставит 10 bb. Вопрос солверу: как часто ставить с воздухом, то есть блефовать?

Игрок 2Ловец блефов

Его рука бьёт только блеф. Вопрос солверу: как часто отвечать на ставку коллом?

Итерация {{ cfIt }}
100% 50% 0%
0итерации → {{ cfMax }}
Блеф воздухом - средняя Колл ловца - средняя Тонкие - текущая стратегия, она раскачивается
Воздух блефует {{ cfAB }}
Теория: 50% - тогда треть всех ставок блеф
Ловец коллирует {{ cfAC }}
Теория: 50%
Эксплуатируемость{{ cfExpl }}
EV игрока 1{{ cfEV }}теория 7,50 bb
Сошлось к равновесию - как в теории
ВыводТекущая стратегия всё время „качается“: блефуем много - соперник начинает коллировать, он коллирует - блефуем меньше. А средняя за все итерации приходит к равновесию. Наш солвер на этой игре даёт блеф 49,9% и колл 50,0% - это проверка /proof в Telegram-боте.
Здесь - vanilla regret matching с усреднением стратегии по reach, стартовые regrets 9:1 (блеф 90%, колл 10%). Ядро проекта использует Discounted CFR. Эксплуатируемость = NashConv / банк; у ривера PLO6 на 5000 рук - 0,25% банка.
Объяснялка 3 из 6

Диапазон - мешок рук

Мы не знаем карты соперника, но знаем, какие руки у него могут быть. Каждое его действие делает одни руки вероятнее, другие - почти невозможными. Нажимайте действия по очереди.

Мешок рук соперникаВозможных рук: {{ rgLeft }} из 60 · размер = вес
{{ rc.t }}
Что сделал соперник
Доля каждого типа в мешке
{{ rs.t }}
{{ rs.share }}
{{ rgHist }}
ВыводЧтобы правильно разобрать ривер, солверу нужен мешок, каким он стал к риверу, а не „любые руки“. Поэтому так важен префлоп: это первый и самый большой фильтр, и его даст наша базовая стратегия. Числа в этой анимации условные - для иллюстрации.
P(h | a) ∝ P(h) · P(a | h), затем нормализация и исключение рук, конфликтующих с бордом (блокеры). На троих учитывается совместимость рук всех игроков. Популяционные диапазоны ≠ GTO-диапазоны.
Объяснялка 4 из 6

Память и процессор: склад и грузчики

Память (RAM) - склад: вся задача должна поместиться в него целиком. Процессор - грузчики: чем их больше, тем быстрее идёт работа. Но если груз не влез на склад, грузчики стоят.

Задача
Машина
{{ whS.s }}
Потоков
{{ whThr }}
Склад · RAM{{ whCapGB }}
Не влезло:
складданные ↔ расчётгрузчики
движения нет
Задача{{ whTaskGB }}{{ whTag.t }}
{{ whMsg }}
Грузчики · потоки CPU
Светлые - физические ядра, тёмные - вторые потоки тех же ядер (SMT)
не измерено идеал: ×N 32× 1× 1 поток 32 потока
Скорость от числа потоков {{ whSpeed }} Замер сделан на ноутбуке Ryzen 7 5800H. „16 ядер / 32 потока“ - это не 32 полноценных ядра, и вторые потоки могут почти не помогать, если ядра ждут данных из памяти.
ВыводСначала нужно, чтобы задача влезла в память, и только потом важна скорость. 128 ГБ хватает на ривер, тёрн и урезанный флоп, но полный флоп с тремя размерами ставок - впритык или нет. Именно это и проверяют текущие тесты.
Объяснялка 5 из 6

Где помогает видеокарта

У видеокарты тысячи маленьких ядер, но они сильны, только когда делают одно и то же одновременно. Солверу же приходится идти по дереву, где каждая ветка - своя дорога.

Видеокарта · много маленьких ядер
{{ gpGpuTxt }}
Процессор · 16 больших ядер
{{ gpCpuTxt }}
Поэтому этапы разделены и арендуются отдельно
CPU-сервер
солвер на Rust
Датасет
решения солвера
GPU по часам
обучение сети
Модель
быстрые ответы
Оператор
разбор за секунды
Deep CFR: нейросеть стоит внутри цикла CFR - процессор и видеокарта нужны одновременно и постоянно обмениваются данными. Выигрыш по времени для PLO6 неизвестен.
Обычный путь: месяцами считаем на процессоре, потом на несколько часов арендуем видеокарту для обучения. Постоянно платить за оба сервера не нужно.
ВыводВидеокарта сильна там, где много одинаковых операций сразу: обучение моделей и большие матричные умножения, например выплаты на троих. Обход дерева CFR ей даётся плохо. Deep CFR - отдельная исследовательская ветка, её проверяем своим бенчмарком. Анимация - схема, не замер.
Объяснялка 6 из 6

Префлоп зависит от всего будущего

Чтобы понять, стоит ли рейзить руку до флопа, нужно знать, чем закончится раздача на всех следующих улицах. Посмотрите, где полный перебор упирается в память и как его обходит базовая стратегия.

{{ pb.t }} {{ pb.mT }}
{{ pb.sub }}
{{ ps.n }}{{ ps.t }}
Так будет выглядеть чартМакет, не GTO
PLO66-maxBTNпротив рейза UTG100bb
A♠ A♥ K♠ Q♥ J♦ T♦
Фолд- %
Колл- %
Рейз- %
Частот пока нет: их даст базовая стратегия.
Почему один чарт не подходит всем Частоты зависят от позиции, глубины стеков, рейка, размера рейзов и всей истории до вас. Другая позиция или другой SPR - другой чарт. В PLO6 у одного игрока 20 358 520 стартовых рук - удобной таблицы 13 × 13 как в холдеме не будет. Нужен просмотр по типам: пары, масти, связанность, блокеры. Глубина стеков в клубе разная: 30, 50 и 200-300 bb. Базу считаем отдельно для каждой глубины.
ВыводПолный перебор префлопа не поместится ни в один сервер. Поэтому префлоп считаем своим солвером как базовую стратегию: похожие руки объединены в группы, размеров ставок немного, расчёт идёт на арендованном сервере. Сначала холдем, для него есть открытые чарты для сверки, затем PLO4, PLO5 и PLO6. Чарты клиента не обязательны, но пригодятся для сверки.
Калькулятор

Сколько нужно памяти

Память ≈ число точек решения × число рук × байты на каждую пару. Двигайте ползунки или выберите готовую конфигурацию.

Точки решения в дереве{{ rnL }}
Больше размеров ставок и глубже стек - больше точек
Рук на игрока{{ rhL }}
Байт на точку и руку{{ rbtL }}
≈70 - эмпирическая оценка проекта; float32 мог бы её снизить
Накладные расходы{{ roL }}
Структурная оценка, не замер Нужно памяти {{ rcGB }} {{ rcFormula }}
{{ rs.t }}{{ rs.v }}
Шкала памяти · логарифмическая: 1 ГБ → 3 ТБ
{{ rm.m }}{{ rm.n }}
Это линейная модель для одного дерева. Реальный размер дерева зависит от разрешённых ставок, олл-инов и SPR, поэтому „точная память для 300bb при любом банке“ простой формулой не считается - нужен проверенный подсчёт дерева. Запас 20-30% нужен на служебные данные.
Калькулятор

Сценарий окупаемости

Сколько дополнительного математического ожидания даёт команде небольшое улучшение игры. Это сценарий, а не прогноз прибыли: дисперсия, соперники и усвоение тренировок здесь не учтены.

Раздач в месяц{{ roiHands }}
Устойчивое улучшение игры{{ roiDeltaL }}
Значения по умолчанию - вводные заказчика из обсуждений: 30+ игроков, около 1000 раздач в день, $25/$50. Документами клуба не подтверждены.
Сценарный EV, не прогноз прибыли Дополнительное ожидание команды в месяц {{ roiEV }}
Сервер окупается при{{ roiBE }}
Ожидание / стоимость{{ roiX }}
УлучшениеОжидание команды в месяц {{ rr.d }}{{ rr.v }}
Формула: игроки × раздачи в месяц / 100 × улучшение bb/100 × $BB. Не учитывает дисперсию, игру сотрудников клуба друг против друга, неполное освоение тренировок и реальные лимиты. Эффект обучения измеряется отдельно - на новых раздачах.
Цифры

Замеры и оценки

Что реально запускали и измеряли - отдельно от того, что пока только оценено по размеру дерева.

Измерено в проектеЗамер
Ноутбук Ryzen 7 5800H (8 ядер / 16 потоков), Rust; банк ≈10bb, стек 50bb; ставки 33/75/100%, рейз в банк, олл-ин; остановка ≈0,3% банка. СпотРук на игрокаВремяПамять {{ bm.spot }}{{ bm.hands }}{{ bm.time }}{{ bm.ram }} Rust быстрее Python в 14-17 раз на ривере и в 45-47 раз на тёрне; на 8 физических ядрах - ≈7-8× от одного потока.
Ривер на троих: эталон на PythonЗамер
PLO5, ноутбук; банк 10 bb, стеки по 50 bb. Время одной итерации CFR при разном числе рук у каждого игрока. Расчёт растёт примерно как куб числа рук. СтавкиТочек решения100 рук300 рук1 000 рук {{ b3.cfg }}{{ b3.nodes }}{{ b3.h100 }}{{ b3.h300 }}{{ b3.h1000 }} Память при 1 000 рук - около 240 МБ. Как ускорить расчёт до тысяч рук, решает текущая задача 014.
Флоп: только оценкаОценка, не фактический замер
Один базовый флоп-спот ~100bb, ≈70 байт на (узел · руку). Дерево построено, сам флоп не решался. 5000 рук - механическая экстраполяция. Размеры ставокУзлов решения500 рук1000 рук5000 рук {{ be.cfg }}{{ be.nodes }}{{ be.h500 }}{{ be.h1000 }}{{ be.h5000 }} Сокращение 3/3/3 → 3/1/1 уменьшает память, но разница в EV не измерена - нужен эксперимент на расширенном дереве.
Цифры

Четыре подхода к флопу

Ни один пока не выбран окончательно: выбор сделают замеры.

{{ cr.k }}{{ cv.t }}
Предпочтительный порядок исследований: сначала точные оптимизации и выбор размеров ставок, параллельно - оценка Value Network; Deep CFR - альтернатива со своим бенчмарком „время до одинакового качества“. Метрики GTO Wizard относятся к PLO4 и на PLO6 не переносятся.
{{ dc.date }}{{ dc.st }}

{{ dc.t }}

Ситуация{{ dc.ctx }}
Что решили{{ dc.chosen }}
Почему{{ dc.why }}
Какие ещё были варианты ВариантЗаПротив {{ al.t }}{{ al.pro }}{{ al.con }}
{{ ds.t }}

Словарь

Покерные, математические и инженерные слова, которые встречаются на карте. В режиме „Технически“ - подробности.

Такого термина нет. Попробуйте поиск в шапке - он ищет и по карте.
{{ gg.t }}
{{ gi.t }}

{{ gi.s }}

{{ gi.x }}

Ссылки

Внешние материалы и серверы, которые упоминаются на карте. Цифры из чужих работ, например для PLO4, на PLO6 автоматически не переносятся.

Исследования и солверы МатериалГде на карте {{ lr.t }}{{ lr.used }}
Серверы для аренды Кандидаты для тестов и для префлоп-солвера. Цены и наличие меняются, актуальные - на сайтах поставщиков. СерверГде на карте {{ ls.t }}{{ ls.used }}