Azure Container Apps — хостинг ONNX-ботов
Summary
Вывод на 2026-08-13: Microsoft Azure технически хорошо подходит для двух webhook-ботов в отдельных Azure Container Apps. При текущей наблюдаемой нагрузке это будет стоить ориентировочно $45–55 в месяц, после бесплатной квоты. Для постоянной работы сейчас выгоднее Google Cloud, пока там действуют бонусные кредиты, или
aurora, если приемлема зависимость от домашней лаборатории. Azure имеет смысл как независимая площадка для canary/эксперимента и как запасной вариант после замеров обоих алгоритмов.
Зачем рассматриваем Azure
Мы хотим запустить два новых бота, использующих модель, подготовленную для аналитики:
- Exact KCP one-ply — на каждом легальном ходе оценивает вероятность взятия короля новой dice-free KCP-моделью и выбирает лучший ход.
- Hybrid — использует rich 2-ply expectimax, а новую KCP-модель — для дополнительной оценки корневых ходов.
Это должны быть два разных игровых имени и две независимо развёртываемые программы: так можно сравнивать качество, скорость и стоимость без смешивания результатов.
Модель аналитики отличается от уже работающих oracle-3 и oracle-4. Зафиксированный
артефакт: kcp_nodice_serving_20260809.onnx, размер 1 149 338 байт, SHA-256
3154c6e4d35292063ebf55141a90d2d09cb70418ef9035d4bb6aae7a4679434d.
Что уже есть в Microsoft Azure
Проверено через Azure CLI 2026-08-13:
- одна активная индивидуальная подписка Pay-As-You-Go;
- лимит расходов (
spendingLimit) выключен; - бонусный кредит в данных подписки и биллинга не обнаружен;
- бюджеты и оповещения о расходах не настроены;
- регион текущих ресурсов — Sweden Central;
- работает один Linux Consumption Function App старого агрессивного бота;
- рядом находятся Storage Account, Application Insights и Log Analytics;
- Container Apps, Container Instances и Azure Container Registry пока не созданы;
- provider
Microsoft.App, необходимый для Container Apps, пока не зарегистрирован.
Фактическая стоимость Azure за 1–13 августа 2026 практически нулевая:
| Сервис | Стоимость |
|---|---|
| Azure App Service / Functions | €0.00 |
| Storage | €0.000098 |
| Всего | ≈ €0.0001 |
Это описание текущего состояния, а не прогноз стоимости ONNX-ботов: существующая Function почти ничего не потребляет и не отражает будущую вычислительную нагрузку.
Microsoft объявила завершение поддержки Linux Consumption для Azure Functions 30 сентября 2028 года и рекомендует Flex Consumption. Переносить существующую Function только ради новых ботов не требуется: для JVM + ONNX Runtime практичнее сразу использовать контейнеры.
Рекомендуемая архитектура
Один Azure Container Apps environment в Sweden Central, созданный в современном режиме Workload Profiles v2, и две отдельные Container Apps на профиле Consumption:
flowchart LR P["play.jc.id.lv"] -->|"HTTPS webhook"| E["Container Apps environment\nSweden Central"] E --> B1["Bot 1\nExact KCP one-ply\n1 vCPU / 2 GiB"] E --> B2["Bot 2\nHybrid expectimax + KCP\n1 vCPU / 2 GiB"] B1 --> M["Private ONNX model"] B2 --> M
Предлагаемая конфигурация каждой программы:
| Параметр | Значение | Почему |
|---|---|---|
| CPU / RAM | 1 vCPU / 2 GiB | разумный минимум для JVM и ONNX Runtime |
| Ingress | external HTTPS | сайт вызывает публичный webhook |
| Min replicas | 0 | при отсутствии партий нет платы за CPU/RAM |
| Max replicas | 1 | один игровой аккаунт не должен играть параллельно сам с собой |
| HTTP concurrency | 1 | последовательная обработка ходов и предсказуемая память |
Для scale-to-zero нужен именно входящий webhook. Бот с постоянным исходящим
соединением/stream сам по себе не разбудит нулевую реплику: для него пришлось бы
держать minReplicas = 1 и оплачивать idle-время. Поэтому Azure-вариант следует
строить на webhook-контейнере.
Контейнер не обязан храниться в Azure Container Registry. Чтобы не создавать ещё один платный сервис, можно использовать приватный GHCR. Закрытую модель лучше не включать в публичный image: загружать её при старте из приватного Blob/Azure Files или поставлять внутри приватного image. Секрет webhook хранить как Container App secret, а не в репозитории или обычной переменной конфигурации.
Бесплатная квота Container Apps
Для Consumption-профиля Microsoft предоставляет на одну подписку в месяц:
- 180 000 vCPU-секунд, то есть 50 vCPU-часов;
- 360 000 GiB-секунд, то есть 100 GiB-часов памяти;
- 2 млн HTTP-запросов;
- при нуле реплик вычислительная плата отсутствует.
Квота общая для всех Container Apps этой подписки, а не отдельная на каждого бота. Для короткого canary-теста её должно хватить; для постоянной текущей нагрузки — нет.
Оценка стоимости
Исходные данные
Для оценки использована реальная активность двух близких по назначению Cloud Run сервисов. В журналах за примерно 12,8 дня найдено:
| Сервис | Запросы | Время обработки |
|---|---|---|
| ONNX bot | не менее 100 000 | 96,143 ч |
| ONNX bot 4 | 97 396 | 111,426 ч |
| Вместе | не менее 197 396 | 207,569 ч |
Первый запрос был ограничен лимитом 100 000 строк, поэтому нагрузка и итоговая стоимость могут быть немного выше. Линейная экстраполяция на 31 день даёт примерно 500 активных vCPU-часов в месяц.
Розничные тарифы Azure Container Apps для Sweden Central на дату снимка:
| Ресурс | Цена |
|---|---|
| Active vCPU | $0.000024 / vCPU-с |
| Active memory | $0.000003 / GiB-с |
| Requests | $0.40 / 1 млн |
Расчёт
При конфигурации каждого контейнера 1 vCPU / 2 GiB:
| Составляющая | Расчёт | Оценка |
|---|---|---|
| CPU | (500 − 50 free) × 3600 × $0.000024 | ≈ $38.9 |
| RAM | (500 × 2 − 100 free) × 3600 × $0.000003 | ≈ $9.7 |
| Requests | меньше 2 млн/мес | $0 |
| Вычисления | ≈ $48.6/мес |
Практический бюджет: $45–55 в месяц за двух ботов. В эту вилку не заложены существенный рост числа партий, длительные cold starts, избыточное логирование и хранение больших объёмов данных. Storage и Log Analytics при аккуратных retention и sampling должны быть малы, но не гарантированно нулевыми. Налоги и конвертация в евро также зависят от биллинга.
Особенно важно сначала измерить exact KCP one-ply: если он в среднем думает около 6,6 секунды на ход, он может оказаться заметно дороже использованных для оценки Cloud Run-сервисов. Окончательный прогноз следует пересчитать после benchmark и canary на реальных партиях.
Сравнение площадок
| Площадка | Экономика сейчас | Плюсы | Ограничения |
|---|---|---|---|
| Google Cloud Run | текущий прогноз около €48,54/мес; пока покрывается бонусными кредитами | уже работает webhook-контейнер, известная эксплуатация | после кредитов стоимость станет реальной |
| Azure Container Apps | ориентир $45–55/мес; canary может уложиться в free grant | независимое облако, scale-to-zero, Sweden Central | бонусный кредит не найден; инфраструктуру ещё создать |
| aurora | минимальная дополнительная денежная стоимость | 8 потоков CPU, достаточно RAM, модель уже рядом | делит CPU с analytics/sync и зависит от домашнего интернета |
| dexus | электроэнергия только во время включения | пригоден для batch/arena и ночных вычислений | 4 потока и 3,3 GiB RAM; неудачен как постоянный webhook-host |
| play | уже доступен | близко к сайту | 1 ARM core — слишком слаб для JVM + KCP ONNX |
Google на момент проверки остаётся финансово предпочтительнее из-за активных
бонусных кредитов. aurora дешевле как постоянный узел, если важнее экономия, чем
облачная независимость. Azure — хороший третий вариант и удобная площадка для
ограниченного эксперимента.
Безопасный план проверки Azure
Перед развёртыванием:
- Получить benchmark обоих алгоритмов: p50/p95 времени хода, CPU-time и peak RSS.
- Зарегистрировать provider
Microsoft.App. - Создать бюджет, например €10 на canary, и оповещения на 50/80/100%.
- Создать один Container Apps environment и первую app с
min=0,max=1. - Проверить cold start JVM + загрузку модели и соблюдение лимита времени хода.
- Сыграть ограниченную серию партий, сверить фактические vCPU/GiB-seconds с расчётом.
- Только после этого запускать второго бота и принимать решение о постоянном хостинге.
Никаких ресурсов Azure в ходе этого исследования не создавалось и существующая Function не изменялась.
Источники и дата актуальности
Цены и квоты меняются. Снимок сделан 2026-08-13: