| myst |
|
|---|
This topic covers Kubernetes sizing, USER_DATA_PATH backup and
retention, LLM gateway credential checks, log/metrics surface, and a
disaster-recovery runbook.
This topic is intended for Site reliability and platform engineers self-hosting
Hyperloom on their own AMD GPU infrastructure (Kubernetes, bare metal, or a managed platform as a service (PaaS)). For the hosted Primus-Claw experience AMD owns operations; this document does not apply.
For application-level configuration see Environment variables; for credential setup see Hyperloom authentication and credentials; for recurring symptoms see Troubleshooting Hyperloom.
Shell paths on this page follow the recommended `pip install --target .` layout.
In a source checkout, replace the `hyperloom/` prefix with `src/hyperloom/`.
The command blocks assume `REPO_ROOT` points at that workspace. No installer
exports it for you, so run `export REPO_ROOT="$(pwd -P)"` from the workspace
first — it does not survive a new shell.
The following resource requirements apply to a single optimization session.
A single Hyperloom optimization session is a long-running Python process that drives benchmarks; the heavy GPU work happens in the inference server it benchmarks (sglang or vllm) and in the Ray-scheduled GEAK workers. The Coordinator pod itself is small.
| Component | CPU | RAM | GPU | Disk |
|---|---|---|---|---|
| Coordinator + Orchestration | 4 cores | 16 GiB | none | minimal |
| Critic (subprocess) | 1 core | 2 GiB | none | <100 MB (knowledge base (KB) drafts) |
| Robustness (subprocess) | 1 core | 2 GiB | none | <100 MB (findings JSONL) |
| GEAK + Ray head (kernel optimization) | 4 cores | 16 GiB | none for head; workers below | varies |
| Ray worker (GEAK attempt) | 8 cores | 32 GiB | 1 × MI300X, MI325X, or MI355X | ~10 GB per attempt for build artifacts |
| Inference server (sglang or vllm) | 16 cores | 128 GiB | 1–8 × MI300X, MI325X, or MI355X (matches TP) | weights + KV cache; depends on model |
| GEAK retrieval-augmented generation (RAG) index (first build) | 4 cores | 16 GiB | 1 × any GPU (CPU is hours-slow) | ~1.3 GB BGE embedding model + index in ~/.cache/amd-ai-devtool/semantic-index/ |
Minimum viable node: one AMD GPU (MI300X, MI325X, or MI355X) with ≥ 256 GiB system RAM, 32 cores, and 500 GB local fast disk for the session dir + GEAK build artifacts.
By default, each optimization session lives under a per-model timestamped directory:
$USER_DATA_PATH/<model_basename>/<YYYYMMDDTHHMMSSZ>/
Commands below use $SESSION_DIR for that concrete session directory.
| Workload | Typical session size | Retention recommendation |
|---|---|---|
2-hour --no-kernel run |
5–10 GB | 30 days (then archive session_breakdown.json only) |
| 24-hour full run with kernel-opt | 50–100 GB | 14 days (then archive selectively) |
| Multi-day run | 200 GB+ | 7 days (move artifacts to cold storage) |
The largest contributors are:
$SESSION_DIR/runs/<action>/<task_id>/Magpie outputs (per-benchmark trace- result.json).
$SESSION_DIR/kernel-agent/runs/<session_id>/kernel optimization and TraceLens artifacts (especially GEAK reports, prompts, traces, and patches).$SESSION_DIR/kernel-agent/runs/<session_id>/tracelens/per-session traces (compressed but still GB-scale).
If you only need long-term observability, the only file you must
preserve is session_breakdown.json (1–10 MB; see
session_breakdown.json integration in Hyperloom).
To run the same workload under a batch scheduler instead of Kubernetes, see
[Install for Slurm](../install/slurm.md).
Hyperloom does not ship its own Helm chart. Recommended layout for self-hosters:
namespace: hyperloom
├── Job: hyperloom-session-<session_id> # short-lived, one per optimization run
│ ├── Pod: coordinator # Python CLI
│ ├── (subprocess) critic-agent
│ ├── (subprocess) robustness-agent
│ └── Ray head (launched by kernel request handlers; GEAK runs as Ray workers)
├── PersistentVolumeClaim: user-data # mounted at /workspace/hyperloom
├── PersistentVolumeClaim: tracelens-extension # optional read-only private extension mount
├── Secret: hyperloom-creds # OPENAI_API_KEY
└── ConfigMap: hyperloom-env # path env, KB env, observability env
Notes:
- Ray is launched directly by the Coordinator's programmatic kernel request
handlers (
orchestrator/kernel/request_handlers.py) when GEAK runs, not by a separate kernel-agent process. Hyperloom does not require Ray's Kubernetes operator. (Hosted Primus-Claw deployments do use RayJob for multi-node scale-out; that is internal to the Primus-Claw control plane.) - Pin the pod to a single node with
nodeSelectormatching your AMD GPU labels; Ray currently expects all GPUs visible to the head. - Mount
USER_DATA_PATHon a fast local SSD or NVMe (RWO). Network storage (NFS, WekaFS) works but adds latency to the per-tick state.json reads. (RWO= ReadWriteOnce, a persistent volume (PV) access mode.) - LLM calls go directly to the configured upstream gateway; no in-pod auth-proxy Service or NetworkPolicy is required.
The following table describes the key lifecycle events for a Hyperloom session.
| Phase | Trigger | Action |
|---|---|---|
| Session start | API call / Job creation | Coordinator creates $SESSION_DIR and writes manifest.json, state.json. |
| Heartbeat | Every Coordinator tick (--tick-interval-sec, default 0 = no sleep) |
Coordinator atomically rewrites state.json (temp .state.json.*.tmp + os.replace) inside $SESSION_DIR. |
| Session end | target_reached / time_exhausted / global_converged |
Coordinator writes session_breakdown.json, exits 0. |
| Crash recovery | Pod OOM / preemption | Re-launch with --resume-from "$SESSION_DIR"; reads manifest.json + state.json. |
The following guidelines cover what to back up and for how long.
Back up the following artifacts from each session.
| Artifact | Source path | Retention |
|---|---|---|
| Session manifest + state | $SESSION_DIR/manifest.json,$SESSION_DIR/state.json |
Until the session ends; not normally needed afterwards. |
session_breakdown.json (downstream contract) |
$SESSION_DIR/session_breakdown.json |
Permanent. This is the canonical record consumed by downstream dashboards and notebooks. |
| Local knowledge root | ${KNOWLEDGE_LOCAL_ROOT:-$USER_DATA_PATH/knowledge} (otherwise ~/.cache/hyperloom/knowledge) |
Permanent. Backup before cleanup of USER_DATA_PATH. |
| Robustness findings | $SESSION_DIR/agents/robustness/findings/<session_id>.jsonl |
30 days minimum; longer if your incident process needs it. |
| Kernel-opt attempts | $SESSION_DIR/kernel-agent/runs/<session_id>/optimization_attempts.jsonl |
14 days unless an attempt was promoted; keep promoted attempts permanently. |
| Per-attempt artifacts (full) | $SESSION_DIR/kernel-agent/runs/<session_id>/{logs,results,verification}/ |
7–14 days. Cold-archive only if you need full reproducibility. |
Use the following cron jobs to automate session backup and cleanup.
# Daily: ship session_breakdown.json + KB to S3
find "$USER_DATA_PATH" -name session_breakdown.json -mtime -1 \
-exec aws s3 cp {} s3://my-bucket/hyperloom/sessions/ \;
KB_ROOT="${KNOWLEDGE_LOCAL_ROOT:-${HYPERLOOM_LOCAL_KB_ROOT:-${USER_DATA_PATH:-$HOME/.cache/hyperloom}/knowledge}}"
aws s3 sync "$KB_ROOT" s3://my-bucket/hyperloom/knowledge/
# Weekly: prune session dirs older than 14 days
find "$USER_DATA_PATH" -mindepth 2 -maxdepth 2 -type d -name '20??????T??????Z' -mtime +14 -exec rm -rf {} \;GEAK and forge workers call the configured upstream gateway directly using the aliases generated by preflight and the kernel-agent installer.
Operational checks:
test -n "${OPENAI_API_KEY:-${ANTHROPIC_API_KEY:-${ANTHROPIC_AUTH_TOKEN:-}}}"
test -n "${OPENAI_BASE_URL:-${ANTHROPIC_BASE_URL:-}}"
bash "$REPO_ROOT/hyperloom/agents/kernel/scripts/install.sh" --check-onlyChild processes inherit the gateway settings prepared by preflight; keep
operator-facing gateway configuration in OPENAI_API_KEY / OPENAI_BASE_URL
or the split Anthropic/OpenAI credentials.
Hyperloom does not ship a metrics endpoint of its own; observability is JSONL-on-disk + (optional) downstream collectors.
| Signal | File / location | Format |
|---|---|---|
| Per-tick Coordinator state | $SESSION_DIR/state.json |
JSON, snapshot |
| Session breakdown (final) | $SESSION_DIR/session_breakdown.json |
JSON, snapshot |
| Robustness findings | $SESSION_DIR/agents/robustness/findings/<session_id>.jsonl |
JSONL, append |
| Critic verdicts | $SESSION_DIR/critic-workdir/<turn>/emit.json (memory in $SESSION_DIR/critic-session-memory/) |
JSON per call |
| Kernel-opt attempts | $SESSION_DIR/kernel-agent/runs/<session_id>/optimization_attempts.jsonl |
JSONL, append |
| Inference server logs | $SESSION_DIR/runs/<action>/<task>/server.log |
text |
Recommended pipeline: vector / fluentbit tailing the JSONL files
and forwarding to your observability stack of choice (Datadog, Loki,
Elastic, …). session_breakdown.json is the highest-signal artefact —
ingest it whole on session end.
- Locate the affected session directory and verify the PV is intact:
ls "$SESSION_DIR/state.json". - Relaunch with
--resume-from:python3 -m hyperloom.inference_optimizer.cli optimize --resume-from "$SESSION_DIR" - Coordinator reads
manifest.json+state.json, re-enters the loop at the last completed action. The current in-flight action (if any) is re-played from scratch. - Robustness writes a fresh
findings/<session>.jsonlsegment; old segments remain.
To rebuild only the session_breakdown (and push it to Langfuse) for a run
that exited abnormally — without re-running the optimization loop — use the
dedicated subcommand instead of --resume-from:
python3 -m hyperloom.inference_optimizer.cli recover-session --session-dir "$SESSION_DIR" [--force] [--backfill-trace]--force re-runs even when the session already looks complete;
--backfill-trace replays reports/trace/llm_calls.jsonl as Langfuse
generations (use only when the live emitter never ran, or it duplicates
generations). --resume-from = keep optimizing; recover-session = rebuild
the breakdown artifact.
- The session is unrecoverable. Restart from scratch with a fresh
--model …invocation. - KB is unaffected if
HYPERLOOM_LOCAL_KB_ROOTlives on a different volume (recommended). The next run gets the same local recipe store.
- Confirm the pod has a current key and base URL (
OPENAI_API_KEY/OPENAI_BASE_URL, or split Anthropic/OpenAI credentials). - Re-run
bash "$REPO_ROOT/hyperloom/agents/kernel/scripts/install.sh" --check-onlyand then without--check-onlyif it reports missing aliases. - Inspect
~/.claude/config.json;customApiUrlmust point at the upstream gateway.
- Move the selected local KB root aside before starting a new run:
KB_ROOT="${KNOWLEDGE_LOCAL_ROOT:-${HYPERLOOM_LOCAL_KB_ROOT:-${USER_DATA_PATH:-$HOME/.cache/hyperloom}/knowledge}}" mv "$KB_ROOT" "$KB_ROOT.corrupt.$(date -u +%Y%m%dT%H%M%SZ)"
- Restart the optimizer with the same
--local-kb-root(or env default). The local store is recreated lazily on first write.
The Ray 2.44 CLI is incompatible with Click ≥ 8.3:
pip install --quiet 'click<8.3.0' 'ray[default]==2.44.1'
ray --versionSee Upgrade Hyperloom version for per-version migration steps.
The summary policy: USER_DATA_PATH is forward-compatible across
patch releases; minor releases might add new fields to
session_breakdown.json (backwards-compatible) without bumping
schema_version.
Before going to production with self-hosted Hyperloom, ensure:
- AMD GPU pool sized to your concurrent-session count (1 session = 1–8 GPUs depending on workload TP).
USER_DATA_PATHPV ≥ 200 GB per active session, ideally local NVMe.KNOWLEDGE_LOCAL_ROOT(or the default$USER_DATA_PATH/knowledge) on persistent storage with daily backup.OPENAI_API_KEYrotation runbook (key is long-lived; rotation requires only re-export +install.shre-run).- LLM gateway credential and endpoint check in the session startup probe.
- Daily ship of
session_breakdown.jsonto long-term storage. - Weekly prune of
USER_DATA_PATHfor completed sessions14 days old.
- Pager rotation for "Coordinator process exit code ≠ 0".