☁️ Oracle Cloud — раннбук (CPU: обогащение, арены, свипы)

О чём это

Как поднять на грант Oracle ($300 / 30 дней) временную CPU-виртуалку, прогнать на ней тяжёлую батч-работу и погасить её, не проев кредит. Почему именно CPU (а не GPU) и зачем — в План усиления value-модели (§5 «Как использовать Oracle»). Здесь только как.

Связанные: План усиления value-модели


1. Что мы там гоняем

Все наши нагрузки — CPU, батч, хорошо параллелятся. Одна мощная виртуалка покрывает все три:

ЗадачаКомандаСтек
Обогащение обучающего CSV фичами движкаmise run ml:enrich-trainingdicechess-analytics)JVM (sbt + движок ≥ 1.8.0)
Большие арены bot-vs-bot (доверие к гейту)sbt "runMain …OnnxExpectimaxArenaRunner …" (движок)JVM
Свипы гиперпараметров LightGBMmise run train / свип-скрипт (в dicechess-ev)Python (uv)

GPU не нужен и, скорее всего, недоступен

LightGBM на табличных фичах учится за ~15 с на CPU; SR на GPU-лимит ранее отклонили. Вся тяжёлая работа тут CPU-bound — это удачно совпадает.


2. Форма инстанса (shape)

  • VM.Standard.A1.Flex (Ampere, Arm) — по умолчанию. Дёшево (~$0.01/OCPU-ч), 4 OCPU / 24 ГБ — always-free. Наш JVM+Python стек на aarch64 чистый. Для батч-всплеска взять 16–32 OCPU / 2 ГБ на OCPU.
  • VM.Standard.E5.Flex (AMD, x86) — фолбэк (~$0.03/OCPU-ч), если:
    • A1 упирается в Out of host capacity (частая беда бесплатного A1 — Oracle раздал всю ёмкость), или
    • всплывает несобираемое aarch64-колесо в Python.

Стоимость для нас копеечная

Один CPU-бокс на несколько часов работы ≈ пара-тройка долларов из $300. Дорого выходит только забытый running-инстанс (см. §6).


3. Провижнинг — три способа

flowchart LR
    A[Первый раз] --> B[Console<br/>веб-UI]
    B --> C[Повторы:<br/>OCI CLI oci]
    C -. IaC, оверкилл .-> D[Terraform]
  1. Console (веб-UI) — для первой виртуалки: там же задаётся SSH-ключ и сразу видно, есть ли ёмкость A1. Compute → Instances → Create → выбрать shape/образ (Oracle Linux 9 или Ubuntu 22.04) → вставить публичный SSH-ключ → Create.
  2. OCI CLI (oci) — скриптуемый spin-up/tear-down; ставится их скриптом:
    bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
    oci setup config     # одноразово: сгенерит API-ключ, его надо загрузить в Console (User → API Keys)
    Запуск инстанса (OCID берутся из Console — compartment, subnet, image):
    oci compute instance launch \
      --compartment-id "$COMPARTMENT_OCID" \
      --availability-domain "$AD" \
      --shape VM.Standard.A1.Flex \
      --shape-config '{"ocpus":16,"memoryInGBs":32}' \
      --image-id "$IMAGE_OCID" \
      --subnet-id "$SUBNET_OCID" \
      --ssh-authorized-keys-file ~/.ssh/id_ed25519.pub \
      --assign-public-ip true
  3. Terraform (OCI provider) — полноценный IaC. Для наших разовых батчей оверкилл, пропускаем.

4. Bootstrap виртуалки

ssh opc@<PUBLIC_IP>          # Oracle Linux → opc; Ubuntu → ubuntu
 
# 1) mise (тянет JDK/sbt/node/uv по .mise.toml репозиториев)
curl https://mise.run | sh && echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc && exec bash
 
# 2) git + доступ к артефактам движка из GitHub Packages
sudo dnf install -y git       # Ubuntu: sudo apt-get install -y git
export GITHUB_TOKEN=<PAT с read:packages>   # build.sbt резолвит движок этим токеном (actor по умолчанию "git" — ок)
 
# 3) публичный репо аналитики
git clone https://github.com/rabestro/dicechess-analytics.git
cd dicechess-analytics && mise install

Приватный dicechess-ev (только для свипов)

Для клона приватного репо нужен PAT с repo-scope (или gh auth login): git clone https://<PAT>@github.com/rabestro/dicechess-ev.git. Токен НЕ коммитить и НЕ оставлять в истории shell.


5. Прогон

5a. Обогащение (первый реальный use)

# залить уже выгруженный CSV с рабочей машины (29 МБ) — экспорт заново НЕ нужен
scp training_data.csv.gz opc@<PUBLIC_IP>:~/dicechess-analytics/
 
# на виртуалке: parallelism по умолчанию = число OCPU
cd ~/dicechess-analytics
mise run ml:enrich-training training_data.csv.gz training_data_rich.csv.gz
 
# забрать результат
scp opc@<PUBLIC_IP>:~/dicechess-analytics/training_data_rich.csv.gz .

5b. Арены и свипы

  • Арены: клонировать dicechess-engine-scala, sbt "runMain …ArenaRunner <opts>", гонять варианты (набор фич × 1-ply/2-ply × K) — параллельно, много партий. Сначала засеять Random бота (см. 3).
  • Свипы: в dicechess-ev перебирать гиперпараметры LightGBM (обучение ~секунды → в цикле).

6. Деньги и гигиена (обязательно)

Гаси инстанс в простое

Биллинг идёт за каждый час running, а не за использование CPU. Закончил прогон — STOP или TERMINATE:

oci compute instance action --instance-id "$INSTANCE_OCID" --action STOP        # переиспользовать позже
oci compute instance terminate --instance-id "$INSTANCE_OCID"                    # больше не нужен

(или в Console). И поставь Budget alert (Billing → Budgets), чтобы не проесть $300 незаметно.

Триал vs Pay-As-You-Go

Для одного CPU-бокса кредитов триала обычно хватает напрямую. Апгрейд на PAYG нужен, только если упрёшься в лимиты (кап block storage 200 ГБ, лимит OCPU) или в нехватку ёмкости A1; апгрейд снимает капы и сохраняет $300 на исходные 30 дней.


7. Чек-лист «под задачу»

  • Создать инстанс (A1 flex; при Out of host capacity → другой AD/регион или E5 x86)
  • ssh → mise → GITHUB_TOKEN → клон + mise install
  • scp вход → прогнать → scp выход
  • STOP/TERMINATE инстанс
  • Результат положить куда надо (dicechess-ev для обучения / homelab)