ransom-ml-models / ARTIFACT_BACKUP_INDEX.md
cycloevan's picture
index: add Phase D Block 1 (winner gat×bbfe)
d0e7b6d verified
|
Raw History Blame Contribute Delete
7.72 kB
# Artifact Backup Index — where every experiment's outputs live
**One-glance index of what is backed up, from which experiment, and where.**
Chronological transfer log: [`artifact_backup_log.md`](artifact_backup_log.md).
HF private repos: **dataset** `cycloevan/ransom-ml`, **model** `cycloevan/ransom-ml-models`.
Rule of thumb: model weights (`*.pt`, `*.safetensors`) + tokenizers → **model** repo;
metrics / predictions / reports / manifests → **dataset** repo. Raw PE is NEVER backed up (§0).
To fetch a tagged snapshot:
`huggingface_hub.HfApi().list_repo_files("<repo>", repo_type="<model|dataset>", revision="<tag>")`.
---
## Backup units (each = one experiment stage → its artifacts)
### 1. Phase B — feature-representation selection · tag `phase-b-feature-select` · 2026-07-23
**Experiment.** Validation-only selection of the ASM feature representation for the whole
ladder: **normalized opcode+operand vs raw opcode-only**, function filter FIXED at `[5,250]`
(not a variable). Two sub-stages: (a) *feature-pretrain* — one DistilBERT MLM per variant
(6L/768/12H, max_len 256, 3-epoch MLM on the **official-TRAIN 2,123** corpus, official TEST
excluded; vocab normalized=2,007 / opcode=978); (b) *feature-select* — M1 (`--mode asm_only`)
supervised, **2 variants × 3 model seeds {42,1337,2024} = 6 runs**, split seed 42, uncapped
functions, 5 epochs, `--no-test` (Test-509 never opened; metrics are Validation).
**Result / gate.** Winner = **normalized_5_250** (Valid F1 0.9569±0.0028 vs opcode 0.9530±0.0016;
higher AP, tighter variance) → Phase C input locked (filter_5_250 / token-field=tokens /
normalized_5_250 tokenizer). Full write-up: `reports/validation_feature_selection/PHASE_B_MANIFEST.md`.
| artifact | what it is | repo | path (revision = tag `phase-b-feature-select`) |
|---|---|---|---|
| development MLM ×2 | DistilBERT MLM weights per variant (`final/model.safetensors` + `checkpoint-45120`) + embedded tokenizer | **model** | `checkpoints/pretrain_development_variants/{normalized_5_250,opcode_5_250}/distilbert_len256/` |
| feature-select M1 ×6 | `best.pt` per (variant × seed) — asm_only Validation-selected weights | **model** | `reports/validation_feature_selection/{variant}/poolattention_fusegated_seed{S}_asm_only/best.pt` |
| custom WordPiece ×3 | tokenizers used by MLM/feature-select (+ `.meta.json`) | **model** | `tokenizer/development_variants/{normalized_5_250,opcode_5_250,normalized_1_inf}.json` |
| Validation metrics/config | `valid_metrics.json` (×6), `config.json`, `leaderboard.json` (×2), preprocessing audits, `PHASE_B_MANIFEST.md` | **dataset** | `reports/validation_feature_selection/` |
Verified present (HfApi list): model — best.pt 6/6, MLM final 2/2, tokenizers 6/6;
dataset — 28 files incl. 6 valid_metrics + manifest.
---
### 2. Phase C-1 — backbone × length (FULL 6/6) · tag `phase-c1` · 2026-07-31
**Experiment.** Validation-only M1 (`--mode asm_only`) full cross of **{distilbert, bert, roberta} ×
{max_len 128, 256}**, 3 model seeds {42,1337,2024}, split seed 42, uncapped, `--no-test` (Test-509
never opened — runner log "screening complete; Test remained unopened"). All backbones share the
SAME winner feature from Phase B (`normalized_5_250`, token-field=tokens, filter [5,250], WordPiece
vocab 2,007). Each config = 1 development MLM (per-backbone encoder over the WordPiece vocab,
max_len 128/256, 3-epoch MLM on official-TRAIN 2,123) + 3 supervised M1 runs.
**Result / gate. Winner = bert_len256** (Valid F1 **0.9649 ± 0.0019**, recall 0.9713, tightest
variance). Full standings (Valid F1): bert_len256 0.9649 > roberta_len256 0.9571 >
distilbert_len256 0.9544 > bert_len128 0.9503 > roberta_len128 0.9502 > distilbert_len128 0.9492.
Clear pattern: **len256 ≫ len128** (all three len256 beat all three len128). → Phase C-2/D/E/F use
backbone=bert, max_len=256; **Phase F reuses the bert_len256 development MLM** (no MLM retrain).
(Supersedes `phase-c1-partial` = the earlier 4/6 GPU-drop recovery snapshot.)
| artifact | what it is | repo | path (revision = tag `phase-c1`) |
|---|---|---|---|
| development MLM ×6 | per-config encoder MLM (`final/model.safetensors` + `checkpoint-45120`) over WordPiece normalized_5_250 | **model** | `checkpoints/pretrain_development_backbone_grid/{distilbert,bert,roberta}_len{128,256}/` |
| M1 best.pt ×18 | `best.pt` per (config × seed) — asm_only Validation-selected weights (swept, `reports/…` path preserved) | **model** | `reports/validation_backbone_length/{config}/poolattention_fusegated_seed{S}_asm_only/best.pt` |
| Validation metrics/config | `valid_metrics.json` (×18), `selection.json`, `leaderboard.json` (×6), `config.json`, `environment.json` | **dataset** | `reports/validation_backbone_length/` |
Verified present (HfApi list): model — swept best.pt 18/18, MLM safetensors 12 (6 final + 6 ckpt);
dataset — 6/6 leaderboards.
---
### 3. Phase D Block 1 — GNN × node selection screen · tag `phase-d-block1` · 2026-08-09
**Experiment.** Validation-only (`--no-test`) single-seed(42) DUAL screen: `{gcn,sage,gat} ×
{bbfe,ldp,opcode_hist} × edge=real × mode=dual` = 9 cells. Each cell trains the FULL dual model
(per-function BERT ASM branch + GNN graph branch, gated fusion), reusing the Phase C winner
bert_len256 dev MLM; only the graph-branch (GNN type × node feature) varies. Uncapped functions.
**Result / gate. Winner = gat × bbfe** (Valid F1 **0.9834**, AUC 0.9987). Ranking: bbfe 3-way
(gat 0.9834 / gcn 0.9804 / sage 0.9804) ≫ opcode_hist (0.9577–0.9603) ≥ ldp (0.9505–0.9577).
Mechanistic signal: within bbfe the GNN choice barely moves F1 (~0.3pp) → supports "graph
re-aggregates the ASM representation (redundant)". Deployed dual = gat+bbfe+real+bert_len256 →
Phase E freeze → F (3-seed Test). Note: one GPU-drop (NVML) mid cell-4; recovered by pod
Stop→Start (port 8961→8977) + resume-safe skip; single-seed is a deliberate screen (final numbers
come from Phase F 3-seed).
| artifact | what it is | repo | path (revision = tag `phase-d-block1`) |
|---|---|---|---|
| dual best.pt ×9 | `best.pt` per (GNN × node) cell — full dual (ASM+GNN) Validation-selected weights (swept) | **model** | `reports/validation_block1/{gnn}_{node}/pool…/best.pt` |
| Validation metrics/config | `valid_metrics.json` (×9), `selection.json`, `config.json`, **`block1_comparison.json`** (9-cell ranking) | **dataset** | `reports/validation_block1/` |
Verified present (HfApi list): model — swept best.pt 9/9; dataset — 29 files incl. block1_comparison.
Local backup 2.9G verified (9/9). No new dev MLM (reused bert_len256).
---
## Earlier snapshots (superseded / historical — see log for detail)
| tag | repos | what |
|---|---|---|
| `protocol-lock-20260714` | model + dataset | Full processed-data archive, splits, manifest, exclusions, reports, checkpoints, models, tokenizer at the protocol lock. |
| `base-test509-3seed` | model | Capped (128-func) base run 3-seed Test-509 weights (§4b) — historical, capped-artifact. |
| `r0shuffle-gate-seed42` | dataset | Uncapped LDP ladder + R0-shuffle gate + uncapped Pulse (seed42, exploratory/selected-on-test — prior only, NOT paper-valid). |
| `ldp-ladder-seed42` | dataset | Uncapped content-vs-topology ladder (seed42 exploratory). |
---
## Maintenance
`scripts/backup_to_hf.sh` routes by leading path / extension and, since 2026-07-23, **sweeps
any `*.pt`/`*.safetensors` found under a dataset-routed dir to the model repo** (fixes the
Phase-B `best.pt` silent-drop). Re-run per stage: `bash scripts/backup_to_hf.sh <targets…>`,
then tag both repos with the stage id and append a row here + in `artifact_backup_log.md`.