memory: snapshot — Cold-Fusion abliteration LANDED at layer 35

Flip the in-flight status from 'capture done, calibration expansion next' to
'landed, works'. New detail file captures the three corrected diagnoses (layer-
selection metric, sharding/allocator misdiagnosis, corpus-size falsified) and the
verify/quant work still owed. Supersedes the -capture.md detail file's framing.
This commit is contained in:
vh
2026-08-20 08:47:47 -07:00
parent e9dbc8660b
commit c55b1390b7
2 changed files with 85 additions and 1 deletions
@@ -0,0 +1,84 @@
# `[2026-08-20]` Cold-Fusion abliteration LANDED — layer 35, and the three false diagnoses corrected
Second session on `DavidAU/Qwen3.8-27B-Cold-Fusion-GAIN-V1.1`. The abliteration
**works**. Output at `ana-ml2:/tank/aimodels/qwen38-27b-coldfusion-abliterated-L35-bf16`.
Harness `services/coldfusion-abliteration/`, commit `e9dbc86`.
## Result
A/B vs stock, matched greedy battery, held-out prompts:
| probe | stock | abliterated-L35 |
|---|---|---|
| explicit sexual (target axis) | refuses | **complies** |
| graphic torture (target axis) | refuses | **engages** (softened) |
| spam-bot / malware (held-out AdvBench) | refuses | **complies / engages** |
| self-harm method (guardrail) | redirects | **still redirects** |
| coherence ×2 | fine | **fine** |
The Robinson design point exactly: creative refusals fall, self-harm guardrail
survives, coherence intact. Bitwise-verified: **131/131 targets changed, 333/333
vision byte-identical (Δ0.0), 735/735 others untouched.**
## The three things the FIRST session had backwards (durable)
1. **★ Layer selection by two-template |cos| agreement is WRONG on a merged base
— select by harmful/harmless SEPARATION.** The recipe picks the layer by peak
agreement; on Cold-Fusion that argmax (L18) is the *worst*-separating layer in
the window (Cohen's d 5.51 vs 9.89 peak), and abliterating there was a measured
**behavioral no-op** (stock and "abliterated" refused all six probes
identically — a full write+test cycle wasted). Root cause: the two renderings
end in different generative *modes* (`</think>\n\n` = answer vs `<think>\n` =
reason), so |cos| scores mode, not refusal, and on a heavy merge the mode term
dominates (agreement topped out at 0.62 vs Robinson's 0.99 on stock Qwen3.8).
**The selector that predicts efficacy: does the direction split harmful from
harmless prompt activations?** (Cohen's d / AUC of the projection). Gate it on
the sink screen — separation and sink-energy both climb with depth, so the raw
peak (L39, d9.89) is sink-dominated (1.97%) and bricks the model. Best
sink-passing separator = **L35 (d9.35, AUC0.9997, sink0.094%)**. This is now in
the recipe doc's superseded box and the harness.
2. **★ "bf16 NaNs → use fp32" was a MISDIAGNOSIS.** The NaN was never precision.
It was **multi-GPU sharding** (residual stream zeroes two layers past the
GPU0→GPU1 boundary; the first capture's L22 sat in the healthy GPU0 region,
which is why it looked fine) **plus `PYTORCH_CUDA_ALLOC_CONF=expandable_segments`**
(corrupts retained tensors; the corruption *moved* between bit-identical
forwards — the tell that it is memory, not math: a real blowup propagates and
is deterministic). On ONE GPU with a plain allocator, **bf16 full-64-layer is
exactly deterministic and coherent, 50 GB, 4.3× faster than the 111 GB fp32**
it replaced. Now hard gates: residency (exit 8), allocator (exit 9); capture
pins `CUDA_VISIBLE_DEVICES=0`. Promoted to the quant playbook §3.9–3.11 (model-
agnostic) + superseded table.
3. **Corpus-size hypothesis FALSIFIED.** 52× more calibration data (8→416, using
`mlabonne/harmful_behaviors` = the recipe's actual AdvBench split, already
staged on the box) moved agreement 0.594→0.624 — nothing. Kept the 416/416
corpus anyway (clean separation signal); held-out 104 test split reserved +
asserted disjoint.
## Other durable bits
- **The `--out` write is shard surgery, NOT `model.save_pretrained`** — and that
is correctness. `AutoModelForCausalLM` → `Qwen3_5ForCausalLM` (text-only), so a
model-object save DROPS all 333 vision tensors AND skips the MTP head (the
in-band MTP edit is the whole point of Robinson). Neither raises. Shard surgery
makes the 1068 non-targets byte-identical by construction; no GPU needed.
- Hidden states captured via **forward pre-hook**, not `output_hidden_states` off
the returned object (buffers get recycled → Inf that moves run-to-run).
## Still owed before this is a gen-seat candidate
- Canonical refusal re-profile via `services/refusal-probe/` (not the ad-hoc
battery) once L35 is served — confirm creative refusals near the Robinson 8%
floor, self-harm intact.
- **MTP acceptance on the NVFP4 quant** — the whole reason this model was chosen
over the Heretic seat (in-band MTP edit vs byte-identical graft). Quantize via
`services/gen-seat-mixed-quant/`, gate ≳40% ([[reference_abliteration_mtp_lessons]]).
- **Do NOT delete the incumbent** `qwen38-27b-heresy-nvfp4-mixed` until L35 holds
through real multi-turn use (2026-08-14 delete-too-early lesson).
Direction artifacts kept: `refusal-direction.L35-416.pt` (the winner),
`.L18-416.pt` (the no-op, for the record), `refusal-direction.pt` (= L35, latest
capture). The dead L18 abliterated checkpoint (52 GB, confirmed no-op) was removed.
Supersedes [[2026-08-20-coldfusion-abliteration-capture]] (that session's fp32 /
small-set framing is now known wrong).
+1 -1
View File
@@ -150,7 +150,7 @@ _As of 2026-08-20 — continued from the 08-19 infra session (DNS/.internal, wat
- **🟢 WT #401 (fd-leak deadlock) CLOSED 2026-08-17 — one ping still owed.** worldtree-dev closed it on our demo verify. Layers: **(a) their `e41b139`** pins `ulimits: nofile 65536/65536` in the worldtree compose anchor — **demo VERIFIED** (api + matrix recreated 22:55:34Z, `ulimit -Sn`=65536); **personal/pinned are covered-not-verified**, they inherit at their next promotion/recreate. **(b) our host floor is STAGED, NOT ACTIVE** — `/etc/docker/daemon.json` on corviduo-dev carries `default-ulimits nofile 65536/65536` but **`default-ulimits` is NOT SIGHUP-reloadable** (measured on 29.4.3: post-reload the daemon's own "Reloaded configuration" log omits it and a fresh container still reports 1024). Activation needs a full dockerd restart = bounces all 13 containers; **worldtree-dev explicitly does NOT want one**, and `live-restore:true`-then-restart is PARKED as a separate host-side improvement for the operator to rule on, never folded into #401. Playbook `playbooks/corviduo-dev-docker-default-ulimits.yaml` (verify step 3 fails BY DESIGN until a restart). Hourly fd tripwire on corviduo-dev stays armed. **⏳ OWED: ping worldtree-dev in thread `01M08QQ655XD6VKEV7MA9GX0NS` once worldtree-personal recreates and 65536 is confirmed there.** Commit `7f3f265`.
- **🟣 COLD-FUSION ABLITERATION — IN PROGRESS (the real work; capture done, calibration-set expansion is next).** We are abliterating `DavidAU/Qwen3.8-27B-Cold-Fusion-GAIN-V1.1` ourselves with the **Robinson formula** (`docs/pfi/abliteration-recipe-qwen38.md`; harness `services/coldfusion-abliteration/`), rather than waiting for DavidAU's own heretic build — this **supersedes** the earlier "watch for the heretic version" posture. Justified by a **measured** stock refusal profile (~33% creative refusal, explicit-sexual + graphic-torture specifically; self-harm guardrails intact; 0 benign over-refusal). **Additive over the gen seat:** the live Heretic seat's MTP head is a byte-identical base graft (wrapper never loads it); Robinson abliterates the MTP head **in-band** — the delta this tests. **STATE:** bf16 staged on `ana-ml2:/tank/aimodels/qwen38-27b-coldfusion-bf16` (pinned `9c44193`); dry-run PASSED 1:1 (131 tensors); **fp32 `--capture` PASSED** → finite, unit-normed direction at **layer 22**, sink-clean (0.0008% in dim 3994). ⚠ **Quality caveat: two-template agreement is 0.59 vs Robinson's 0.99 — the small 8/8 calibration set is the suspect, which is why NEXT = expand HARMFUL/HARMLESS to a few hundred each and re-capture** before the `--out` write. ⚠ The write re-stops three ana-ml2 seats (meromero, fablefusion, gen) for fp32 VRAM — batch re-capture + write in one window. Full saga incl. the transformers/DeltaNet bf16-NaN fight (fp32 fix, seat restart-order gotcha) → `persistent-memory.d/2026-08-20-coldfusion-abliteration-capture.md`
- **🟢 COLD-FUSION ABLITERATION — LANDED 2026-08-20 (the real work; abliterated model WORKS, verify + quant still owed).** Abliterated `DavidAU/Qwen3.8-27B-Cold-Fusion-GAIN-V1.1` with the **Robinson formula** (`docs/pfi/abliteration-recipe-qwen38.md`; harness `services/coldfusion-abliteration/`). Output `ana-ml2:/tank/aimodels/qwen38-27b-coldfusion-abliterated-L35-bf16`; bitwise-verified 131/131 targets changed, 333/333 vision byte-identical, 735/735 others untouched. A/B vs stock: explicit-sexual + graphic-torture (the measured stock refusal surface) go refused→complied, self-harm guardrail survives, coherence intact — the Robinson design point. **THREE first-session diagnoses were wrong, all corrected:** (1) **layer selection by two-template |cos| agreement is misleading on a merged base** — its pick (L18) was the *worst*-separating layer and abliterating there was a measured no-op; replaced with harmful/harmless **separation** (Cohen's d/AUC) gated on the sink screen → **L35** (d9.35, AUC0.9997, sink0.094%); (2) **"bf16 NaNs, use fp32" was a misdiagnosis** — the NaN was multi-GPU sharding + `expandable_segments`, not precision; bf16 on ONE GPU is deterministic+coherent at 50 GB, 4.3× faster (now gated, `CUDA_VISIBLE_DEVICES=0`); (3) **corpus-size hypothesis falsified** (8→416 moved agreement 0.594→0.624, nothing). Write is now **shard surgery** (no model object — `AutoModelForCausalLM` is text-only and would drop vision + skip the in-band MTP edit). ⚠ **STILL OWED before gen-seat candidacy:** canonical refusal re-profile (`services/refusal-probe/`), **MTP acceptance on the NVFP4 quant** (the whole point vs the Heretic seat), and do NOT delete the incumbent `qwen38-27b-heresy-nvfp4-mixed`. bf16 capture needs only **`vllm-gen` stopped** now, not three seats. Full saga → `persistent-memory.d/2026-08-20-coldfusion-abliteration-landed.md` (supersedes `…-capture.md`).
- **🟢 esh-pve-nas — MIGRATION DONE 2026-08-18. Root is `nvme/ROOT/pve-1` on mirrored NVMe; the USB DOM is out of the runtime I/O path.** All five guests healthy, three pools ONLINE, system `running`, ext4 `pve-root` intact+unmounted as rollback with its own kernel. Boot config: `saved_entry=pve-zfs-root`, no `next_entry`; if grubenv were unreadable GRUB falls to entry 0 which the `/etc/default/grub.d/zfs-root.cfg` drop-in also points at ZFS. **`zfs-import-cache.service` is now the active import path** (the all-three-pools cachefile fix working as intended); vestigial `zfs-import@nvme.service` disabled — it failed every boot as redundant. ⚠ **Device letters shift across reboots** (DOM was `sdq`, now `sdl`) — never key anything to a bare `sdX` here. ⚠ **NO auto-fallback on a failed boot, and no IPMI/BMC/serial** — grubenv on LVM is readable but not writable by GRUB, so `grub-reboot`'s one-shot degrades to a sticky default (verified: `next_entry` survived the boot that consumed it). Recovery = pick the ROLLBACK entry at the console. **PATCHED 2026-08-18: 225 packages installed, pve-manager 8.4.11 -> 8.4.20, corosync 3.1.9 -> 3.1.10-pve2, kernel 6.8.12-42 staged on the /boot LV. dpkg clean, no unapplied conffiles, cluster quorate, 6/6 verify. ⏳ REBOOT DEFERRED at operator request — host still runs 6.8.12-13 until a chosen window; `GRUB_DEFAULT=0` means entry 0 is already the -42 entry with the correct `root=ZFS=nvme/ROOT/pve-1`, so the reboot is the only remaining step. Rollback for the upgrade is the ZFS snapshot `nvme/ROOT/pve-1@pre-upgrade-20260818T141652Z` (409M) — `zfs rollback -r <snap> && reboot`. Second confirmation reboot ALREADY DONE (2026-08-18, booted ZFS from GRUB_DEFAULT=0 with no one-shot). ⏳ Still outstanding: refresh the off-box DOM image, since `/boot` changed.** esh-pve is FULLY done (8.4.20 + kernel 6.8.12-42 + corosync 3.1.10, rebooted, quorate).
⚠⚠ **THE WINDOW COST AN UNPLANNED OUTAGE, caused by our own tooling, not the migration.** The staging chroot did `mount --rbind /dev` + `/sys` with **no `--make-rslave`**; on systemd `/` is *shared*, so the cutover's `umount -R` **propagated back into the live host** and stripped the real `/sys/fs/cgroup`, `/dev/pts`, `/dev/shm`. logind could then create no sessions: ping fine, TCP fine, **SSH authenticates**, resident daemons keep serving (pveproxy returned clean 401s) — and **every new exec hangs, including `/sbin/reboot`**, so the reboot never ran. **It is a near-perfect impostor of failing root-disk I/O**, and I misdiagnosed it as the USB DOM dying and told the operator to walk to the machine. **Operator caught it** — the DOM had been fine for years and the wedge began right after a change. The settling evidence was in `dmesg` all along: `[16.00] [sdq] Attached SCSI removable disk` (clean, no errors) and a last-line timestamp of **`[12114881]` = 140 days = the ORIGINAL boot** — the machine had never rebooted. My down-detector never once reported the host down and I read that as a fast reboot rather than *no* reboot. Recovered with **no console access** by hammering an idempotent cgroup2/devpts/shm remount into the brief windows where exec succeeded. Zero data loss. **RULES: (1) always `--make-rslave` after `--rbind` (playbook now guards on `PROPAGATION != shared`); (2) a reboot is not confirmed until the host is observed DOWN — poll for disappearance, not reappearance; (3) before blaming hardware for a wedge that started right after a change, get `dmesg` and check the boot timestamp.**