OCI Free Tier como laboratorio MLOps

Fecha: 2026-09-20 Estado: plan aprobado para ejecutar por fases

Objetivo

Practicar MLOps de punta a punta sobre OCI Always Free, usando proyectos reales de ~/nef como casos de uso — no tutoriales. Una sola VM, todo lo demás se queda local o en Cloudflare.

Recurso base

  • 1× VM Ampere A1.Flex (2 OCPU / 12 GB RAM, Ubuntu ARM, boot 100 GB)
  • Home region fija desde el registro (Always Free solo vive ahí)
  • Si aparece “out of host capacity”: reintentar en otro AD o scriptarlo

Stack elegido (ligero, nada de Kubernetes)

CapaHerramientaPor qué
Orquestacióncron/systemd timersAirflow no cabe ni se necesita en 2 OCPU. Cron primero, Dagster solo si cron duele
Versionado de datosDVCGit-based, remote = OCI Object Storage (20 GB)
Tracking + registroMLflow self-hostedSQLite como backend, artifacts en Object Storage vía API S3-compatible de OCI
ServingFastAPI + DockerSimple, ARM nativo
CI/CDGitHub Actions → GHCR → docker compose pull en la VMGHCR gratis evita gastar el Object Storage de 20 GB en imágenes de OCIR
Observabilidadlogs + healthcheck primero; Prometheus/Grafana solo en fase tardíaScope down

Caso de uso piloto: news-silo

Pipeline: ingesta de noticias → embeddings → HDBSCAN → modelo/artefacto servido. Es el proyecto con pipeline real y es el candidato natural.

Otros candidatos posteriores: fraud-analysis (batch scoring), retrato-hablado.

Fases (cada una termina en artefacto verificable)

  1. Fase 0 — infra: VM creada, Docker + compose, GHCR, docker login. Verificación: docker run hello-world + healthcheck del host.
  2. Fase 1 — MLflow up: compose con MLflow, artifacts en Object Storage. Verificación: primer run logueado desde local apuntando a la VM.
  3. Fase 2 — DVC: datos de news-silo versionados, remote en OCI. Verificación: dvc push + dvc pull desde la VM.
  4. Fase 3 — pipeline nocturno: cron que corre el pipeline, loguea a MLflow, registra el modelo. Bonus: mantiene CPU > 20% p95 (evita la reclamación por idle de Oracle).
  5. Fase 4 — serving: FastAPI expone el clusterer; endpoint de salud. Verificación: request real con una noticia → cluster asignado.
  6. Fase 5 — (solo si hace falta): Dagster, Grafana, drift checks.

Lo que NO entra (requisitos duros)

  • NO Kubernetes, NO Airflow inicial
  • NO WordPress en OCI (micros de 1 GB no dan para Elementor)
  • NO migrar Workers de Cloudflare (chat-hf, motor_estado_turismo) — se quedan
  • NO gastar los $300 del trial: todo cabe en Always Free
  • NO modelos pesados en la nube: embeddings/inferencia seria sigue en System76 + Ollama (la A1 orquesta, no infiere)

Advertencias registradas

  • Reclamación por idle: CPU p95 < 20% en 7 días → Oracle borra la instancia. El cron de la Fase 3 lo resuelve.
  • Object Storage: 20 GB compartidos entre DVC, artifacts MLflow y datasets. Vigilar con alerta de cuota.
  • Puerto 25 bloqueado (email saliente) — no afecta este plan.