Azure Container Apps — хостинг ONNX-ботов

Summary

Вывод на 2026-08-13: Microsoft Azure технически хорошо подходит для двух webhook-ботов в отдельных Azure Container Apps. При текущей наблюдаемой нагрузке это будет стоить ориентировочно $45–55 в месяц, после бесплатной квоты. Для постоянной работы сейчас выгоднее Google Cloud, пока там действуют бонусные кредиты, или aurora, если приемлема зависимость от домашней лаборатории. Azure имеет смысл как независимая площадка для canary/эксперимента и как запасной вариант после замеров обоих алгоритмов.

Зачем рассматриваем Azure

Мы хотим запустить два новых бота, использующих модель, подготовленную для аналитики:

  1. Exact KCP one-ply — на каждом легальном ходе оценивает вероятность взятия короля новой dice-free KCP-моделью и выбирает лучший ход.
  2. 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 / RAM1 vCPU / 2 GiBразумный минимум для JVM и ONNX Runtime
Ingressexternal HTTPSсайт вызывает публичный webhook
Min replicas0при отсутствии партий нет платы за CPU/RAM
Max replicas1один игровой аккаунт не должен играть параллельно сам с собой
HTTP concurrency1последовательная обработка ходов и предсказуемая память

Для 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 00096,143 ч
ONNX bot 497 396111,426 ч
Вместене менее 197 396207,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

Перед развёртыванием:

  1. Получить benchmark обоих алгоритмов: p50/p95 времени хода, CPU-time и peak RSS.
  2. Зарегистрировать provider Microsoft.App.
  3. Создать бюджет, например €10 на canary, и оповещения на 50/80/100%.
  4. Создать один Container Apps environment и первую app с min=0, max=1.
  5. Проверить cold start JVM + загрузку модели и соблюдение лимита времени хода.
  6. Сыграть ограниченную серию партий, сверить фактические vCPU/GiB-seconds с расчётом.
  7. Только после этого запускать второго бота и принимать решение о постоянном хостинге.

Никаких ресурсов Azure в ходе этого исследования не создавалось и существующая Function не изменялась.

Источники и дата актуальности

Цены и квоты меняются. Снимок сделан 2026-08-13: