ソース情報
- リポジトリ
- 1nslyn/autoMIL
- ソースの最終更新活動
- 2026年8月17日 07:29
- 検出された SKILL.md の言語
- 英語
- スター
- 4
- フォーク
- 1
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
メニュー
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/1nslyn/autoMIL --skill automilコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
SKILL.md を表示中
| name | automil |
| description | Run the autonomous MIL experiment loop. Requires setup first (use /automil-setup). |
Run the autonomous experiment loop. Setup must be completed first via
/automil-setup.
cd to the directory containing automil/config.yamluv run automil check (must pass with no issues)tmux new -s orchestrator
uv run automil orchestrator start
# Ctrl-b d to detach
--dangerously-skip-permissions
so it can run autonomously without prompts:
tmux new -s automil
claude --dangerously-skip-permissions
# Then type: /automil
uv run automil start-loopThe loop is autonomous and long-running (experiments take 60–240 min
each). You must drive it from completion events, not polling.
Immediately after the first automil submit in any session, start a
persistent Monitor on automil/orchestrator/orchestrator.log filtered
to state-transition lines. Without this, GPUs go idle for hours between
submits and the loop stalls.
Use the Monitor tool with:
persistent: true (lives for the whole session, not the 5-min default)timeout_ms: 3600000 (ignored when persistent, but set for safety)tail -n 0 -F so you start at EOF and follow through rotationgrep --line-buffered — without this, pipe buffering delays events by
minutesCompleted node_|Launched node_|crash is enough to
stay oriented without flooding the chatExample command:
tail -n 0 -F /abs/path/to/project/automil/orchestrator/orchestrator.log \
2>/dev/null \
| grep --line-buffered -E "Completed node_|Launched node_|crash"
When a Completed event arrives: reconcile, read the result, update
learnings.md, queue the next experiment. Never let the queue go empty
while .automil_active exists. If the monitor gets auto-stopped for
volume, restart it with a tighter regex.
For one-shot "wait until this one command finishes" (not the loop),
prefer Bash(..., run_in_background=true) — Monitor is for streaming.
All file paths in files.editable, uv run automil submit --files, and run.command
are relative to the git repo root, not to where automil/ lives. The
orchestrator creates worktrees from the git root, so overlay paths must match.
Read registry.mode before proposing. In free mode, the loop explores
architecture and recipe and keeps the structural portfolio gate. In
architecture-preserving mode, the published model is fixed: explore declared
scalars plus executable train-only optimizer/update, scheduler, and stopping
policies, never architecture, data/sampling, or ensemble proposals.
Never propose a scalar named in registry.identity_locked_hparams; those keys
can erase the arm's defining mechanism and are rejected at submit and launch.
automil portfolio enforces the configured mode.
First, every session/restart: read automil/config.yaml, automil/graph.json,
automil/learnings.md, automil/plan.md, and the training + files.editable
source; then uv run automil reconcile.
LOOP FOREVER — one batch =
RESEARCH. Delegate a short research sub-agent (WebSearch + WebFetch) for
current-year and prior-year methods relevant to this model class and the
current bottleneck. Pick 1–2 tractable drop-ins that fit the existing
pipeline (no full rewrites, no data-format changes). Log title + arXiv id in
learnings.md for anything you try, so future sessions don't re-try it blind.
DIAGNOSE. Read graph.json + recent archive/<node>/result.json +
learnings.md and name the one primary failure mode of the current best —
overfit · underfit · attention-collapse · poor calibration · class-imbalance ·
data/feature bottleneck — with evidence. This is what the batch attacks. Never
propose from "which knob is untried"; propose from "what is actually limiting
the model".
PLAN. Rewrite automil/plan.md: the diagnosis, then a table of this
batch's proposals — each with kind, parent, and hypothesis → expected
mechanism. Queue each with
uv run automil propose --parent <id> --kind <k> --desc "..."
(kinds: architecture · regularization · hp · data · ensemble).
Then run uv run automil portfolio. In free mode, aim ≥50% structural
(architecture/ensemble) and rebalance if it reports BELOW TARGET. In
architecture-preserving mode, use only regularization or hp;
architecture, data, and ensemble are forbidden. A batch may be
HP-only if that is what the diagnosis supports, but actively consider the
broader executable train-only recipe surface instead of enumerating knobs.
EXECUTE. uv run automil rank, then implement and submit — prefer the
variant-registry path:
a. In architecture-preserving mode, add a registered PolicyVariant at
automil/variants/_policies/<name>.py, then submit it explicitly with
--files automil/variants/_policies/<name>.py --override "--policy-variant <name>". The protected consumer loop supplies only
optimizer/scheduler/stopping seams; model, defining loss, measurement,
and held-out outputs are unavailable through this interface. What the
seams genuinely support: single-point optimizer wrappers (Lookahead,
gradient clipping, per-group LR, custom LR schedules inside a wrapped
) and stopping policies driven by the supplied validation
metrics. They do NOT support SAM-class two-pass optimizers (no closure
re-evaluates the loss), loss shaping, sampling changes, or ensembling —
don't spend attempts discovering that. The stopping seam receives the
per-epoch validation metrics on every arm, so a stopping policy doubles
as a diagnostic probe: print the epoch-by-epoch validation trajectory it
observes to stdout and read it back from that run's archived —
when the training script itself prints no per-epoch lines, this is the
only way to see the learning curve. Keep module scope declarative:
only import , , ,
or at top level; import numerical libraries inside the
policy methods that use them.
b. In free mode, model/loss/policy variants may use their registered kind
directory and normal selection lifecycle.
c. Free-mode edit: edit project files, then
,
then restore ONLY those files:
. Never bulk-restore
(, , ) — it discards unrelated work.
Every result.json metrics block is validation-only, and primary_value is
computed from it — that is the sole selection signal. Any test metrics the
consumer emits are sealed into a held_out block that the orchestrator
quarantines under archive/<node>/certify/; they are never surfaced to you
during search. Do not try to read, reconstruct, or optimize against test.
When the whole search is finished, reveal the held-out number exactly once:
uv run automil certify # honest held-out test for the val-selected winner
The val→test gap is the honest cost of search; reporting the certified number (not a test-selected one) is what keeps the comparison trustworthy.
.automil_active existsautomil/plan.md BEFORE proposing--kind to automil propose and run automil portfolio
before execution. Free mode requires its structural quota; architecture-
preserving mode forbids architecture/ensemble and has no structural quota.files.editable; never attempt
to bypass admissibility with explicit --files, raw identity overrides, or
a model/loss variant.metrics/primary_value are validation-only and test is sealed (val-firewall). Reveal held-out test once at the very end with uv run automil certify, never inside the loopuv run automil submit for every experiment (not manual runs)uv run automil rank to pick experiments (not random)automil/learnings.md after every result (paper title + arXiv id when from a paper)User runs uv run automil stop-loop to allow the agent to exit.
step()run.logautomil.registry__future__typingcollections.abcuv run automil submit --node <id> --desc "..." --mil-model <model> --files <changed files>git restore --source=HEAD -- <each-file>git checkout .git restore .git stash -kSaturate every GPU — submit until the VRAM bin-packer can't fit another
run, not until each GPU has one. Measure a typical run's peak_vram_mb
(archive/<node>/result.json) and set orchestrator.max_concurrent_per_gpu
orchestrator.default_vram_estimate_gb in config.yaml (hot-reloads live).
Check orchestrator/gpu_state.json → schedulable_free_gb / running; if
workers < cap while the queue is non-empty and free VRAM is large, the loop is
running serially — submit more specs until the cap binds.Attempts are the budget. When the cell declares cap.eval_budget,
every launched attempt is charged — crashes, timeouts, and budget-kills
included; only submit-time refusals are free. Check remaining attempts with
uv run automil cell status before each batch, and never spend one on a
duplicate, an unverified guess, or a submission you have not sanity-checked
locally (imports, config validity). A wasted attempt cannot be recovered.
When an external freeze census governs the cell (the frozen preprint protocol freezes discovery only after the entire eval budget is consumed), the budget is also a floor: spend every attempt — late budget goes to the strongest remaining hypotheses, never banked — and never exit the runtime session while unspent attempts remain. The cell is bound to this session and a replacement session cannot inherit the binding, so stranded budget leaves the cell permanently unable to freeze.
WAIT on Monitor completion events (do not poll). Agent-active time is Claude Code's native cumulative active-time metric (CLI + user active seconds; idle excluded). Monitor is the event-driven wait mechanism, not the budget clock. Research or diagnosis performed while a batch trains remains active work and is therefore billed normally.
RECONCILE + LEARN. uv run automil reconcile; read results; update
learnings.md (what worked / failed / near-miss, with paper ids). Commit
winning changes. Then loop back to RESEARCH for the next batch.