AbstractPhil commited on
Commit
70c3e58
·
verified ·
1 Parent(s): 1fc6721

The arms fitted on the final mini-beatrix-3 core, the lookup arm's versions, and the four control twins of 2s. On mini-beatrix-3's final checkpoint (step 245,674, still opening bare) the arm list now holds the arm sets (stages 1-4, stages 1-8, the caption set, the research sets; two seeds each), served one row per set with a box per arm so any subset runs; the sixteen solo arms; and every version of the lookup arm (softmax attention after blocks 2, 6, 12 and 20, born at zero), mounted through amoe 0.2.12 from the arm's own tensors, which are read from the checkpoint by range request when no arm-only file exists. The lookup rows get recall prompts in the Completion tab and an activity line per site; the set rows get each member stage's prompts. The run's own stage programs (the checkpoints to step 148,000) use the same member switch. New crafts: mini-beatrix-2s-control (the original softmax twin) and its re-runs -attn-fp16-r10k (still training), -attn-fp16 and -bf16 (stopped), decoded in fp32. Pin: amoe-lora 5c934cf -> 9b1942d (v0.2.12); geolip-alephllm unchanged.

Browse files
Files changed (5) hide show
  1. README.md +27 -4
  2. app.py +780 -111
  3. arm_mount.py +88 -5
  4. arms_catalog.json +1818 -2
  5. requirements.txt +1 -1
README.md CHANGED
@@ -9,7 +9,7 @@ python_version: '3.12'
9
  app_file: app.py
10
  pinned: false
11
  license: mit
12
- short_description: Three byte-level AlephLLM crafts and their arms
13
  models:
14
  - AbstractPhil/mini-beatrix-2.5s
15
  - AbstractPhil/mini-beatrix-3
@@ -19,8 +19,9 @@ models:
19
  # Beatrix — AlephLLM chat
20
 
21
  Three generations of the same byte-level architecture, served side by
22
- side, newest first. Pick the **Craft** first; everything below it
23
- follows.
 
24
 
25
  **mini-beatrix-3** — 376M parameters over 32 blocks: the same governed
26
  full-splat hub, deeper, and the Space's default. Its mission is
@@ -34,7 +35,22 @@ own stage; the run detached them at step 148,000, partway through the
34
  fourth stage, and finished on the core alone. Pick a checkpoint that
35
  carries them (a stage close before that point, or 148,000 itself, the
36
  last with all four) and they open all on, each switchable exactly; every
37
- later checkpoint, the final one included, is the core alone.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
  **Take it home — mini-beatrix-3.** The final weights, as
40
  [mini-beatrix-3](https://huggingface.co/AbstractPhil/mini-beatrix-3):
@@ -73,6 +89,13 @@ m.mount_arm("pair"); m.say("...") # an arm — detach_arm() puts it back
73
  The library served here is the wider surface, refuted and control rows
74
  included; the package is the settled subset.
75
 
 
 
 
 
 
 
 
76
  **mini-beatrix-1** — 112.5M parameters, pretrained on 15.3 billion raw
77
  bytes, serving with a **library of detachable arms**: small aleph
78
  adapters (3.2M–5.3M parameters), each trained on one exact frozen core.
 
9
  app_file: app.py
10
  pinned: false
11
  license: mit
12
+ short_description: Byte-level AlephLLM crafts, their arms, and 2s's twins
13
  models:
14
  - AbstractPhil/mini-beatrix-2.5s
15
  - AbstractPhil/mini-beatrix-3
 
19
  # Beatrix — AlephLLM chat
20
 
21
  Three generations of the same byte-level architecture, served side by
22
+ side, newest first, and four control twins of 2s that run ordinary
23
+ softmax attention where 2s runs the splat. Pick the **Craft** first;
24
+ everything below it follows.
25
 
26
  **mini-beatrix-3** — 376M parameters over 32 blocks: the same governed
27
  full-splat hub, deeper, and the Space's default. Its mission is
 
35
  fourth stage, and finished on the core alone. Pick a checkpoint that
36
  carries them (a stage close before that point, or 148,000 itself, the
37
  last with all four) and they open all on, each switchable exactly; every
38
+ later checkpoint is the core alone.
39
+
40
+ **Arms fitted on the final core.** The final checkpoint opens bare and
41
+ lists the arms fitted on it afterwards, with the core frozen:
42
+
43
+ - **Arm sets** — one 13.7M arm per curriculum stage, on together (stages
44
+ 1–4, stages 1–8, and an experimental set adding an arm for image
45
+ captions; two seeds each, plus research sets). A box per arm switches
46
+ any subset off; a switched-off arm removes exactly its own write.
47
+ - **Solo arms** — each stage's arm trained alone, two seeds.
48
+ - **The lookup arm** — ordinary softmax attention after blocks 2, 6, 12
49
+ and 20, born at zero, so off is the core bit for bit. It fetches a
50
+ value planted far back in a long text, where the core alone forgets it
51
+ within a few hundred bytes. Every version is listed, with recall
52
+ prompts in the Completion tab to run with the arm on and with *Core
53
+ only*.
54
 
55
  **Take it home — mini-beatrix-3.** The final weights, as
56
  [mini-beatrix-3](https://huggingface.co/AbstractPhil/mini-beatrix-3):
 
89
  The library served here is the wider surface, refuted and control rows
90
  included; the package is the settled subset.
91
 
92
+ **The 2s control twins** — 2s's recipe and data with softmax attention
93
+ in all 20 blocks: the original twin (it destabilized under the recipe
94
+ tuned for the splat and closed at 2.88 bits per byte against 2s's 1.11),
95
+ two precision re-runs from its step 16,000 (stopped), and a re-run from
96
+ its step 10,000 with fp32 attention around fp16 flash, stable and still
97
+ training. No arms; decoded in fp32.
98
+
99
  **mini-beatrix-1** — 112.5M parameters, pretrained on 15.3 billion raw
100
  bytes, serving with a **library of detachable arms**: small aleph
101
  adapters (3.2M–5.3M parameters), each trained on one exact frozen core.
app.py CHANGED
@@ -29,9 +29,20 @@ own config, its own byte format, and its own arm library:
29
  148,000 and finished on the core alone, so the
30
  checkpoints from 92,000 to 148,000 ship their arms and
31
  the Space serves them together as a program
32
- (arm_mount "program": all live as trained, or any one
33
- switched off exactly), while every later checkpoint,
34
- the final one included, is the core alone.
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  Crafts are discovered from the repo at boot: a craft with no manifest or
37
  no checkpoint is skipped, and one that starts shipping appears on its
@@ -128,10 +139,50 @@ GEN_BUDGET_S = 95.0
128
  # chat plus a 3.2M arm that makes it chat, removable bit-for-bit.
129
  # Listed newest first; if the default ever fails to load, the next one
130
  # down serves instead.
 
 
 
 
 
 
131
  CRAFTS = [
132
  {"name": "mini-beatrix-3", "fmt": "specials", "wants_arms": True,
133
  "stage_arms": True, "fp32": True},
134
  {"name": "mini-beatrix-2s", "fmt": "specials", "wants_arms": True},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  {"name": "mini-beatrix-1", "fmt": "v1tags", "wants_arms": True},
136
  ]
137
  DEFAULT_CRAFT = "mini-beatrix-3" # the newest completed mission leads
@@ -255,7 +306,9 @@ EXHIBIT_STEP = {"mini-beatrix-1": 88508}
255
  # as a BEFORE/AFTER pair across the chat anneal — 57,607 continues
256
  # documents, 61,422 answers — and that contrast is the clearest thing
257
  # the run produced, so the earlier half stays one click away.
258
- ALWAYS_OFFER = {"mini-beatrix-2s": [57607]}
 
 
259
  # default arm for the craft's DEFAULT step only — scoped so it can never
260
  # displace another checkpoint's own chat arm. day1/poly is a BEHAVIOR arm
261
  # on a single-turn Q&A frame: Chat therefore sends one question at a time
@@ -352,8 +405,11 @@ def load_arm_index(files, craft):
352
 
353
  def _arm_files(arm):
354
  """The hub files one arm row mounts: its own checkpoint, or a stack's
355
- or a stage program's members (neither has a file of its own)."""
 
356
  m = arm.get("mount") or {}
 
 
357
  return (list(m["members"]) if m.get("type") in ("stack", "program")
358
  else [arm["path"]])
359
 
@@ -384,7 +440,15 @@ STAGE_TEACHES = {
384
  "tryfail": "trying, checking, finding the error, fixing it",
385
  "mixed": "a review spiral over every earlier stage",
386
  "register": "definitions, and one fact said several ways",
 
 
387
  }
 
 
 
 
 
 
388
  # completion prompts in each stage's own training format, cut just before
389
  # the part the stage teaches
390
  STAGE_PROBES = {
@@ -415,6 +479,9 @@ STAGE_PROBES = {
415
  "register": [
416
  "Plainly: the rain filled the barrel by morning. Formally:",
417
  "The word 'fragile' means"],
 
 
 
418
  }
419
  # general text none of the stages is about: where every arm should be
420
  # quiet (the activity line after a reply shows whether it is)
@@ -444,11 +511,10 @@ def load_stage_programs(files, craft):
444
  """{step: [row, ...]} for a craft whose arms are co-trained stage arms.
445
 
446
  Every step with at least one arm file gets the PROGRAM row — all of
447
- that step's arms live, the model as the run trained it. With two or
448
- more arms it also gets, per arm, "only this one live" and "this one
449
- switched off": the exact contrasts the per-arm switch exists for (a
450
- switched-off arm passes its input through unchanged; nothing
451
- renormalizes)."""
452
  members = {}
453
  for f in files:
454
  if not f.startswith(f"{craft}/arms/"):
@@ -463,25 +529,133 @@ def load_stage_programs(files, craft):
463
  names = [n for _, n, _ in ms]
464
  paths = [p for _, _, p in ms]
465
  words = ", ".join(_stage_word(n) for n in names)
466
- rows = [_program_row(
467
  craft, step, names, paths, names, "",
468
- f"Stage arms, all live as trained ({words})"
469
  if len(names) > 1 else
470
- f"Stage arm {names[0]}, live as trained")]
471
- if len(names) > 1:
472
- for n in names:
473
- rows.append(_program_row(
474
- craft, step, names, paths, [n], f"#only={n}",
475
- f"Only {n} live (the other {len(names) - 1} off)"))
476
- for n in names:
477
- rows.append(_program_row(
478
- craft, step, names, paths,
479
- [x for x in names if x != n], f"#without={n}",
480
- f"All live except {n}"))
481
- by_step[step] = rows
482
  return by_step
483
 
484
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
  def load_reports(files, craft):
486
  """{step: report} for every stage-close report the run has shipped
487
  (<craft>/reports/v3/<phase>_step<N>.json). A stage close is where the
@@ -579,6 +753,30 @@ def _mount(c, arm, step):
579
  the handle, or None when any file fails provenance. Adapter geometry
580
  is read from each file's own tensors (the library holds more than one
581
  shape), so nothing is assumed from a default spec."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
582
  local = []
583
  for p in _arm_files(arm):
584
  t0 = time.time()
@@ -695,12 +893,29 @@ class Craft:
695
  if ph.get("status") == "active"), None)
696
  self.stage_arms = bool(spec.get("stage_arms"))
697
  self.fp32 = bool(spec.get("fp32"))
 
698
  self.reports = (load_reports(files, self.name) if self.stage_arms
699
  else {})
700
  self.arms = (load_stage_programs(files, self.name)
701
  if self.stage_arms else
702
  load_arm_index(files, self.name) if spec["wants_arms"]
703
  else {})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
704
  self._chat_ok = { # per CHECKPOINT, not craft
705
  s: bool(self.frame_trained and self._chat_from is not None
706
  and int(m.get("tokens") or 0) > self._chat_from)
@@ -714,8 +929,8 @@ class Craft:
714
  # (the run detached them there and finished on the core alone):
715
  # the last step that ships arms, so later cores are labelled as
716
  # the core alone rather than as "before the stage arms"
717
- self.arm_last = (max(self.arms) if self.stage_arms and self.arms
718
- else None)
719
  self.arm_by_path = {a["path"]: a
720
  for arms in self.arms.values() for a in arms}
721
 
@@ -807,10 +1022,12 @@ class Craft:
807
  step = int(step)
808
  arms = self.arms.get(step, [])
809
  if self.stage_arms:
810
- # the run's own model at this checkpoint is the core WITH its
811
- # stage arms (they trained together), so every one opens live
 
 
812
  for a in arms:
813
- if a.get("live") == a.get("members"):
814
  return a["path"]
815
  return CORE_ONLY
816
  if step == getattr(self, "step", None):
@@ -869,11 +1086,16 @@ class Craft:
869
  else "pre-chat (documents only)")
870
  n_chat = sum(a["kind"] == "chat" for a in arms)
871
  if self.stage_arms:
872
- names = arms[0]["members"] if arms else []
 
 
873
  if step in self.reports:
874
  bits.append(f"close of {self.reports[step].get('tag')}")
875
  bits.append(("stage arms: " + ", ".join(
876
  _stage_word(n) for n in names)) if names
 
 
 
877
  else "core alone (arms detached)"
878
  if self.arm_last and step > self.arm_last
879
  else "before the stage arms")
@@ -893,13 +1115,18 @@ class Craft:
893
  arms = (f"{len(self.arm_by_path)} arms" if self.arm_by_path
894
  else "no arms yet")
895
  if self.stage_arms:
896
- newest = self.arms.get(max(self.arms), []) if self.arms else []
897
- k = len(newest[0]["members"]) if newest else 0
898
  arms = ("no stage arms yet" if not k else
899
  f"{k} stage arm{'s' if k != 1 else ''} trained with it"
900
  if self.arm_last >= max(self.cores) else
901
  f"{k} stage arm{'s' if k != 1 else ''} to step "
902
  f"{self.arm_last:,}")
 
 
 
 
 
903
  if self.fmt == "specials":
904
  state = ("in training" if self.active_phase
905
  else "training complete")
@@ -957,9 +1184,27 @@ def _resolve_arm(c, arm_path, step):
957
  return arm if (arm and arm["step"] == int(step)) else None
958
 
959
 
960
- def _select(craft, step, arm_path):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
961
  """Make the live model BE (craft, step, arm). arm_path is "" for
962
- core-only. Runs inside the ZeroGPU worker, where each call starts
 
963
  from the parent's packed state, so a non-default selection re-applies
964
  per request (weights come from the local hub cache — no
965
  re-download). Returns a provenance dict."""
@@ -1001,36 +1246,115 @@ def _select(craft, step, arm_path):
1001
  c.handle = _mount(c, arm, step) # provenance, every switch
1002
  if c.handle is not None:
1003
  c.loaded["mount"] = want_mount
 
1004
  if arm is not None and c.handle is not None:
1005
- if arm.get("live") is not None: # a stage program row
1006
- c.handle.set_live(arm["live"])
1007
- if arm.get("live") is not None and c.loaded["arm_path"] != want:
1008
- print(f"[arms] {c.name} @{step:,}: on "
1009
- + (", ".join(arm["live"]) or "none")
1010
- + (f" · off {', '.join(n for n in arm['members'] if n not in arm['live'])}"
1011
- if len(arm["live"]) < len(arm["members"]) else ""),
1012
- flush=True)
 
 
1013
  c.loaded["arm_path"] = want # commit only now
 
1014
  arm_on = arm is not None and c.handle is not None
1015
  fp32 = c.fp32 or (arm_on and (arm.get("decode") or {}).get("precision")
1016
  == "fp32")
1017
  prov = {"craft": c.name, "checkpoint_step": step,
1018
- "arm": (want.split("/")[-1] if arm_on else None),
 
1019
  "arm_kind": (arm["kind"] if arm_on else "core-only"),
1020
  "precision": "fp32" if fp32 else "bf16",
1021
  "switch_s": round(time.time() - t0, 2)}
1022
- if arm_on and arm.get("live") is not None:
1023
- prov["live_arms"] = list(arm["live"])
1024
  prov["stage_arms"] = list(arm["members"])
 
 
 
1025
  return prov
1026
 
1027
 
1028
- def _program_line(c, step, arm):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1029
  """A stage program as it runs on this checkpoint: every member on or
1030
  off (what each stage teaches, while there are few enough to fit), and,
1031
  when this checkpoint is a stage close, the cost the trainer measured
1032
  for each arm on general text."""
1033
- live = set(arm["live"])
 
 
1034
  few = len(arm["members"]) <= 2
1035
  mem = " · ".join(
1036
  f"`{n}` {'✓ on' if n in live else '✗ off'}"
@@ -1048,17 +1372,20 @@ def _program_line(c, step, arm):
1048
  lines.append("Measured by the trainer at this stage close, each "
1049
  "arm's cost on held-out web text (bits per byte, on "
1050
  "minus off; its bar is +0.012): " + " · ".join(cost))
1051
- lines.append("Switching an arm off removes exactly its write; the core "
1052
- "and the other arms are untouched. Decoded in fp32. After "
1053
- "each run the stats line shows how far each live arm moved "
1054
- "the predictions on that text.")
 
1055
  return " \n".join(lines)
1056
 
1057
 
1058
- def status_md(craft, step, arm_path=CORE_ONLY):
1059
  c = S(craft)
1060
  step = _step(c, step)
1061
  arms = c.arms.get(step, [])
 
 
1062
  meta = c.ckpt_meta.get(step, {})
1063
  newest = max(c.cores)
1064
  arm = _resolve_arm(c, arm_path, step)
@@ -1071,12 +1398,23 @@ def status_md(craft, step, arm_path=CORE_ONLY):
1071
  "They live on bytes UTF-8 can never produce, so "
1072
  "nothing you type can forge them."
1073
  + (f" \n**Arms** all switched off — the raw core "
1074
- f"({len(arms[0]['members'])} stage arm"
1075
- f"{'s' if len(arms[0]['members']) != 1 else ''} "
1076
  "trained with it here)"
1077
- if c.stage_arms and arms else ""))
1078
- elif arm and arm.get("live") is not None:
1079
- arm_line = _program_line(c, step, arm)
 
 
 
 
 
 
 
 
 
 
 
1080
  elif arm:
1081
  sp = arm.get("spec") or {}
1082
  t = _tmpl(arm)
@@ -1116,6 +1454,8 @@ def status_md(craft, step, arm_path=CORE_ONLY):
1116
  + f" · {c.core_params/1e6:.1f}M core · ctx {c.cfg.context}"
1117
  + (f" · newest is {newest:,}" if step != newest else ""),
1118
  arm_line,
 
 
1119
  # which side of the chat anneal THIS core sits on — the mission
1120
  # ends in a before/after pair and they are not interchangeable
1121
  (f"**Phase:** `{c.phase_of(step)}` · "
@@ -1126,15 +1466,20 @@ def status_md(craft, step, arm_path=CORE_ONLY):
1126
  if c.fmt == "specials" and c.phase_of(step) else ""),
1127
  # a craft still in pretraining has never seen its chat frame:
1128
  # say so rather than letting the Chat tab imply otherwise
1129
- ("⚠️ this craft is **still pretraining** (phase "
1130
- f"`{c.active_phase}`, {c.tokens_seen/1e9:.2f}B bytes) and has not "
1131
- "reached the anneal that teaches its conversation frame — Chat "
1132
- "will read as off-distribution. **Completion** is the honest "
1133
- "view of what she can do today."
1134
- + (f" Checkpoints and progress were read when this Space started"
1135
- f", from a manifest written {c.updated_utc}; the run has moved "
1136
- "on since, and a restart picks up what it shipped."
1137
- if c.updated_utc else "")
 
 
 
 
 
1138
  if c.fmt == "specials" and not c.frame_trained else ""),
1139
  # the craft finished its chat anneal but THIS checkpoint predates
1140
  # it: the pre-chat baseline continues documents rather than
@@ -1151,7 +1496,12 @@ def status_md(craft, step, arm_path=CORE_ONLY):
1151
  # mini-beatrix-3 after its arms were detached (step 148,000): say
1152
  # why the arm picker holds only the core here (one short line: the
1153
  # panel sits above the tabs)
1154
- (f"ℹ️ the core alone: its stage arms were detached at step "
 
 
 
 
 
1155
  f"{c.arm_last:,}. Pick {c.arm_last:,} or an earlier stage close "
1156
  "to run them."
1157
  if c.stage_arms and c.arm_last and step > c.arm_last else ""),
@@ -1192,10 +1542,10 @@ def status_md(craft, step, arm_path=CORE_ONLY):
1192
  ("ℹ️ no arm has been trained on this lineage yet — and none is "
1193
  "needed to talk to it: the conversation frame was taught to the "
1194
  "core itself, in the anneal that closed its mission."
1195
- if not c.arm_by_path and c.chats(step) else ""),
1196
  ("ℹ️ no arm has been trained on this lineage yet — every reply "
1197
  "here is the raw pretrained core."
1198
- if not c.arm_by_path and not c.chats(step) else ""),
1199
  ]))
1200
 
1201
 
@@ -1232,13 +1582,17 @@ def _examples_of(arm):
1232
 
1233
 
1234
  def _probe_prompts(arm):
1235
- """Completion prompts for a stage program: each member stage's own
1236
- training format, then general text where every arm should stay quiet.
1237
- None for any other row (the prompt list is then hidden)."""
1238
- if not arm or arm.get("live") is None:
 
 
 
 
 
1239
  return None
1240
- out = [p for n in arm["members"]
1241
- for p in STAGE_PROBES.get(_stage_word(n), [])]
1242
  return [[p] for p in out + OFF_STAGE_PROBES]
1243
 
1244
 
@@ -1248,6 +1602,161 @@ def _probe_update(arm, fam_examples):
1248
  if probes and fam_examples else gr.update(visible=False))
1249
 
1250
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1251
  def on_arm(craft, step, arm_path, auto_decode, fam_examples):
1252
  """Selecting an arm re-tunes what the arm needs and shows what it
1253
  knows: a task arm collapses to turn-end off-distribution and turns
@@ -1263,7 +1772,9 @@ def on_arm(craft, step, arm_path, auto_decode, fam_examples):
1263
  gr.update(value=r) if auto_decode else gr.update(),
1264
  gr.update(samples=_examples_of(arm)) if fam_examples
1265
  else gr.update(),
1266
- _probe_update(arm, fam_examples))
 
 
1267
 
1268
 
1269
  def on_checkpoint(craft, step, auto_decode, fam_examples):
@@ -1394,6 +1905,11 @@ def _rep_penalty(logits, produced, penalty, n=8, window=256):
1394
 
1395
  ACTIVITY_BYTES = 1024 # the text window the per-arm activity reads
1396
  CALL_BUDGET_S = 112.0 # ZeroGPU ends the call at 120 s
 
 
 
 
 
1397
 
1398
 
1399
  @torch.no_grad()
@@ -1406,8 +1922,11 @@ def _activity(c, deadline):
1406
  reply, inside the same GPU call, while the program is still attached.
1407
  Near zero means the arm is quiet on this text."""
1408
  h, ids = c.handle, getattr(c, "last_ids", None)
1409
- if not isinstance(h, arm_mount.ProgramHandle) or ids is None \
1410
- or ids.shape[1] < 2:
 
 
 
1411
  return ""
1412
  live = [n for n in h.names if h.live.get(n)]
1413
  if not live:
@@ -1421,37 +1940,87 @@ def _activity(c, deadline):
1421
  continue
1422
  with h.masked(n):
1423
  lb = c.model(x)[0].float().log_softmax(-1)
1424
- kl = float((lb.exp() * (lb - la)).sum(-1).mean())
1425
- moved = float((lb.argmax(-1) != la.argmax(-1)).float().mean())
1426
- # below ~1e-9 an fp32 KL between two near-identical distributions
1427
- # is rounding, not a measurement: say "none measurable", not 0
1428
- parts.append(f"`{n}` " + (f"{kl:.1e} nats/byte" if kl >= 1e-9 else
1429
- "< 1e-9 nats/byte (none measurable)")
1430
- + f", top byte changed at {moved:.1%} of positions")
1431
  return (f" · **arm activity** on this text (last {x.shape[1]:,} bytes, "
1432
  "each arm switched off alone): " + " · ".join(parts))
1433
 
1434
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1435
  @spaces.GPU(duration=120)
1436
  def _stream(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
1437
- ckpt_step, stop=(), stop_ids=(), guard=False, rep=1.0):
 
1438
  """The GPU call: the reply as it streams (_generate), then, when a
1439
- stage program ran, one more yield that adds each live arm's measured
1440
- activity on the finished text to the stats line."""
1441
  t_call = time.time()
1442
  last = None
1443
  for last in _generate(craft, ids, max_new, temperature, top_p,
1444
  use_cache, arm_path, ckpt_step, stop, stop_ids,
1445
- guard, rep):
1446
  yield last
1447
- if last is not None and last[2].get("live_arms"):
 
1448
  line = _activity(S(craft), t_call + CALL_BUDGET_S)
1449
  if line:
1450
  yield last[0], last[1] + line, last[2]
1451
 
1452
 
1453
  def _generate(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
1454
- ckpt_step, stop=(), stop_ids=(), guard=False, rep=1.0):
 
1455
  """Yields (text, stats, prov) — prov is what actually RAN, resolved
1456
  by _select, not what the dropdowns asked for. It travels back
1457
  through the yield because it has to cross a process boundary: the
@@ -1467,7 +2036,7 @@ def _generate(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
1467
  tasks) and a threading.Lock would be actively unsafe under fork: one
1468
  held by any parent thread at fork time is inherited locked with no
1469
  owner, and the child would block forever."""
1470
- prov = _select(craft, ckpt_step, arm_path)
1471
  c = S(craft)
1472
  model = c.model
1473
  dev = next(model.parameters()).device
@@ -1493,10 +2062,16 @@ def _generate(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
1493
  stop_ids = set(int(s) for s in stop_ids)
1494
  out, t0 = [], time.time()
1495
  deadline, budget_hit = t0 + GEN_BUDGET_S, False
 
 
1496
  label = (f"{prov['craft']} · step {prov['checkpoint_step']:,} · "
1497
- + (("stage arms on: " + ", ".join(
1498
- f"`{n}`" for n in prov["live_arms"]))
 
 
1499
  if prov.get("live_arms") is not None else
 
 
1500
  f"arm `{prov['arm'].split('@')[0]}`" if prov["arm"]
1501
  else "core only")
1502
  + (" · fp32" if prov.get("precision") == "fp32" else "")
@@ -1570,14 +2145,15 @@ def _generate(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
1570
  # the requested byte count was honoured as far as the GPU
1571
  # allowance allowed; the shortfall is stated, never hidden
1572
  note = (f" …[stopped at {len(out)} of {max_new} bytes — "
1573
- f"{GEN_BUDGET_S:.0f}s GPU budget"
1574
  + ("" if use_cache else "; the KV cache is off, so "
1575
  "every byte recomputes the whole context") + "]")
1576
  yield _render(out, c.fmt) + note, stats + " · **budget**", prov
1577
 
1578
 
1579
  def complete(craft, prompt, max_new, temperature, top_p, use_cache, arm_path,
1580
- ckpt_step, guard, rep=1.0, request: gr.Request = None):
 
1581
  if not prompt or not prompt.strip():
1582
  yield "(enter a prompt)", ""
1583
  return
@@ -1601,7 +2177,8 @@ def complete(craft, prompt, max_new, temperature, top_p, use_cache, arm_path,
1601
  arm_path, step_i, stop=stops,
1602
  stop_ids=stop_ids,
1603
  guard=bool(guard),
1604
- rep=float(rep)):
 
1605
  yield prompt + text, stats
1606
  done = True
1607
  finally:
@@ -1672,8 +2249,17 @@ def _specials_chat_ids(history, message, context, budget=None):
1672
  errors="replace")
1673
 
1674
 
 
 
 
 
 
 
 
 
 
1675
  def chat(craft, message, history, max_new, temperature, top_p, use_cache,
1676
- arm_path, ckpt_step, guard, rep=1.0, convo_id="",
1677
  request: gr.Request = None):
1678
  if not message or not message.strip():
1679
  yield list(history or []), "", ""
@@ -1759,7 +2345,8 @@ def chat(craft, message, history, max_new, temperature, top_p, use_cache,
1759
  top_p, use_cache, arm_path, step_i,
1760
  stop=stops, stop_ids=stop_ids,
1761
  guard=bool(guard),
1762
- rep=float(rep)):
 
1763
  body = _finish_reply(text, stops)
1764
  history[-1]["content"] = (preface + body) if body else empty
1765
  yield history, "", stats
@@ -1782,7 +2369,9 @@ TITLE = "# Beatrix — byte-level AlephLLMs you can talk to"
1782
  # Everything explanatory lives in a closed accordion for that reason.
1783
  DESCRIPTION = """
1784
  Three generations of the same architecture, served side by side, newest
1785
- first. Pick the **Craft** first — everything below it follows.
 
 
1786
 
1787
  **mini-beatrix-3** — 376M parameters over 32 blocks: the same governed
1788
  full-splat hub as 2s, deeper. Its mission is **complete** — 64.4 billion
@@ -1814,11 +2403,46 @@ pick a checkpoint that carries them: the stage closes before that point,
1814
  or 148,000 itself, the last with all four. They open all on; each can
1815
  run alone or be switched off, a switched-off arm removes exactly its own
1816
  write, and after every run the stats line shows how far each live arm
1817
- moved the predictions on that text. Every later checkpoint, the final
1818
- one included, is the core alone. The stages with arms: perspective (one
1819
- event seen from different people), concept (kinds and opposites), rules
1820
- (if-then chains over made-up words) and arithmetic (with the working
1821
- shown).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1822
 
1823
  **mini-beatrix-2s** — 237.1M parameters, **full splat**: the signed
1824
  address read runs in *every* block (v1 used it in three), with a
@@ -1862,6 +2486,19 @@ The library here is the wider surface — 73 rows including the refuted
1862
  and control ones that exist to be disprovable. The package is the
1863
  settled subset, carrying each arm's measured numbers with it.
1864
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1865
  **mini-beatrix-1** — 112.5M parameters, pretrained on 15.3 billion raw
1866
  bytes, carrying a **library of detachable arms**: small adapters
1867
  (3.2M–5.3M parameters) each trained on one exact frozen core. Pick a
@@ -1940,7 +2577,7 @@ _C0 = STATE[CRAFT]
1940
 
1941
  with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
1942
  gr.Markdown(TITLE)
1943
- with gr.Accordion("About Beatrix — the three crafts, how she reads text, "
1944
  "what the arms are, what to expect", open=False):
1945
  gr.Markdown(DESCRIPTION)
1946
  gr.Markdown(LOG_NOTE)
@@ -1964,6 +2601,23 @@ with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
1964
  label="Arm (adapter)", scale=4,
1965
  allow_custom_value=True,
1966
  interactive=bool(_C0.arm_by_path))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1967
  with gr.Row():
1968
  max_new = gr.Slider(16, MAX_NEW_CAP, value=192, step=16,
1969
  label="Max new bytes")
@@ -2023,7 +2677,8 @@ with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
2023
  # after a Clear ran together as one conversation
2024
  convo = gr.State("")
2025
  _chat_in = [craft_pick, msg, chatbot, max_new, temperature, top_p,
2026
- use_cache, arm_pick, ckpt, guard, rep, convo]
 
2027
  _chat_out = [chatbot, msg, stats_md]
2028
  _ev1 = msg.submit(chat, _chat_in, _chat_out)
2029
  _ev2 = send.click(chat, _chat_in, _chat_out)
@@ -2039,6 +2694,14 @@ with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
2039
  # max_lines pinned: unpinned textboxes auto-grow to 20 rows in
2040
  # 6.23.1, and a streaming continuation would push the tabs out
2041
  # of reach inside the non-scrolling iframe
 
 
 
 
 
 
 
 
2042
  prompt = gr.Textbox(label="Prompt", lines=4, max_lines=4,
2043
  value="The history of mathematics begins")
2044
  comp_out = gr.Textbox(label="Continuation (streams)", lines=12,
@@ -2059,8 +2722,9 @@ with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
2059
  _ev3 = comp_go.click(
2060
  complete,
2061
  [craft_pick, prompt, max_new, temperature, top_p, use_cache,
2062
- arm_pick, ckpt, guard, rep],
2063
  [comp_out, stats_md])
 
2064
  # ONE halt for every generator, wired after both tabs so a Stop on
2065
  # either side reaches the run in flight. Cancelling closes the
2066
  # generator at its yield: the bytes already streamed stay on screen,
@@ -2076,14 +2740,19 @@ with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
2076
  # toggles say otherwise
2077
  craft_pick.change(on_craft, [craft_pick, auto_decode, fam_examples],
2078
  [ckpt, arm_pick, status_box, temperature, top_p, rep,
2079
- ex.dataset, comp_ex.dataset])
 
2080
  ckpt.change(on_checkpoint, [craft_pick, ckpt, auto_decode, fam_examples],
2081
  [ckpt, arm_pick, status_box, temperature, top_p, rep,
2082
- ex.dataset, comp_ex.dataset])
2083
  arm_pick.change(on_arm,
2084
  [craft_pick, ckpt, arm_pick, auto_decode, fam_examples],
2085
  [status_box, temperature, top_p, rep, ex.dataset,
2086
- comp_ex.dataset])
 
 
 
 
2087
  demo.load(js=RESIZE_JS)
2088
 
2089
  demo.launch()
 
29
  148,000 and finished on the core alone, so the
30
  checkpoints from 92,000 to 148,000 ship their arms and
31
  the Space serves them together as a program
32
+ (arm_mount "program": all live as trained, or any
33
+ subset switched off exactly), while every later
34
+ checkpoint, the final one included, is the core alone.
35
+ On the FINAL core (245,674) the arms fitted afterwards
36
+ are listed too: the arm SETS (several arms trained
37
+ switched on together; any subset can be switched on),
38
+ the solo arms, and every version of the LOOKUP ARM (a
39
+ zero-born softmax attention arm after blocks 2, 6, 12
40
+ and 20; amoe.arms.lookup), its tensors read from each
41
+ version's checkpoint by range request.
42
+ the 2s twins 257.6M · mini-beatrix-2s's recipe and data with softmax
43
+ attention in every block where 2s has the splat hub:
44
+ the original control twin and its re-runs from earlier
45
+ weights. No arms; decoded in fp32.
46
 
47
  Crafts are discovered from the repo at boot: a craft with no manifest or
48
  no checkpoint is skipped, and one that starts shipping appears on its
 
139
  # chat plus a 3.2M arm that makes it chat, removable bit-for-bit.
140
  # Listed newest first; if the default ever fails to load, the next one
141
  # down serves instead.
142
+ # The 2s TWINS (`twin`): the pre-registered control of 2s — its recipe and
143
+ # data with softmax attention in all 20 blocks where 2s has the splat hub —
144
+ # and its re-runs from earlier weights. No arms. Decoded in fp32 (`fp32`):
145
+ # the re-runs trained their attention block in fp32 around fp16 flash, and
146
+ # bf16 decoding would serve a coarser model than the one that trained.
147
+ # `twin` carries (the short label for the craft title, the panel line).
148
  CRAFTS = [
149
  {"name": "mini-beatrix-3", "fmt": "specials", "wants_arms": True,
150
  "stage_arms": True, "fp32": True},
151
  {"name": "mini-beatrix-2s", "fmt": "specials", "wants_arms": True},
152
+ {"name": "mini-beatrix-2s-control-attn-fp16-r10k", "fmt": "specials",
153
+ "wants_arms": False, "fp32": True, "twin": (
154
+ "re-run from step 10,000, fp16 attention · still training",
155
+ "ℹ️ **the 2s twin, re-run and stable** — the twin re-run from its "
156
+ "step-10,000 weights with its attention block computed in fp32 "
157
+ "around fp16 flash attention, retracing 2s's curriculum. It has "
158
+ "stayed stable, and on each of the six stage-boundary texts reached "
159
+ "so far it reads fewer bits per byte than 2s (one run, one seed). "
160
+ "It is still training; the Space lists what had shipped when it "
161
+ "last started.")},
162
+ {"name": "mini-beatrix-2s-control", "fmt": "specials",
163
+ "wants_arms": False, "fp32": True, "twin": (
164
+ "the original control twin · training complete",
165
+ "ℹ️ **a control** — mini-beatrix-2s's recipe and data with softmax "
166
+ "attention in all 20 blocks where 2s has the splat hub. It ran the "
167
+ "whole mission in bf16, and under the recipe tuned for the splat "
168
+ "its training destabilized from step 17,600 (the gradient norm past "
169
+ "its clip on 813 of the last 824 logged steps); it closed at 2.88 "
170
+ "bits per byte on held-out text against 2s's 1.11. Steps 10,000 and "
171
+ "16,000 are the weights its re-runs started from.")},
172
+ {"name": "mini-beatrix-2s-control-attn-fp16", "fmt": "specials",
173
+ "wants_arms": False, "fp32": True, "twin": (
174
+ "re-run from step 16,000, fp16 attention · stopped",
175
+ "ℹ️ **a precision test** — the twin re-run from its step-16,000 "
176
+ "weights (before it destabilized) with its attention block computed "
177
+ "in fp32 around fp16 flash attention. Stopped at step 18,251, in "
178
+ "web-text pretraining.")},
179
+ {"name": "mini-beatrix-2s-control-bf16", "fmt": "specials",
180
+ "wants_arms": False, "fp32": True, "twin": (
181
+ "re-run from step 16,000, bf16 · stopped",
182
+ "ℹ️ **the precision test's control** — the twin re-run from its "
183
+ "step-16,000 weights with fresh optimizer states and the bf16 "
184
+ "attention it first ran with. Stopped at step 18,323, in web-text "
185
+ "pretraining.")},
186
  {"name": "mini-beatrix-1", "fmt": "v1tags", "wants_arms": True},
187
  ]
188
  DEFAULT_CRAFT = "mini-beatrix-3" # the newest completed mission leads
 
306
  # as a BEFORE/AFTER pair across the chat anneal — 57,607 continues
307
  # documents, 61,422 answers — and that contrast is the clearest thing
308
  # the run produced, so the earlier half stays one click away.
309
+ ALWAYS_OFFER = {"mini-beatrix-2s": [57607],
310
+ # the weights the twin's re-runs started from
311
+ "mini-beatrix-2s-control": [10000, 16000]}
312
  # default arm for the craft's DEFAULT step only — scoped so it can never
313
  # displace another checkpoint's own chat arm. day1/poly is a BEHAVIOR arm
314
  # on a single-turn Q&A frame: Chat therefore sends one question at a time
 
405
 
406
  def _arm_files(arm):
407
  """The hub files one arm row mounts: its own checkpoint, or a stack's
408
+ or a stage program's members (neither has a file of its own), or the
409
+ checkpoint a lookup arm's tensors are read from."""
410
  m = arm.get("mount") or {}
411
+ if m.get("type") == "lookup":
412
+ return [m.get("arm_file") or m["source"]]
413
  return (list(m["members"]) if m.get("type") in ("stack", "program")
414
  else [arm["path"]])
415
 
 
440
  "tryfail": "trying, checking, finding the error, fixing it",
441
  "mixed": "a review spiral over every earlier stage",
442
  "register": "definitions, and one fact said several ways",
443
+ "caption": "image captions in a labelled frame (tags, caption, short, "
444
+ "attributes, scene, photo, structure, medium, long, rating)",
445
  }
446
+ # the member switch's labels (stage number, then what the stage is about)
447
+ MEMBER_LABEL = {"perspective": "1 perspective", "concept": "2 concepts",
448
+ "rules": "3 rule chains", "arith": "4 arithmetic",
449
+ "causal": "5 cause and effect", "tryfail": "6 try-fail-revise",
450
+ "mixed": "7 mixed", "register": "8 register",
451
+ "caption": "9 captions"}
452
  # completion prompts in each stage's own training format, cut just before
453
  # the part the stage teaches
454
  STAGE_PROBES = {
 
479
  "register": [
480
  "Plainly: the rain filled the barrel by morning. Formally:",
481
  "The word 'fragile' means"],
482
+ "caption": [
483
+ "caption: a red bicycle leaning against a brick wall on a rainy "
484
+ "street\nshort:"],
485
  }
486
  # general text none of the stages is about: where every arm should be
487
  # quiet (the activity line after a reply shows whether it is)
 
511
  """{step: [row, ...]} for a craft whose arms are co-trained stage arms.
512
 
513
  Every step with at least one arm file gets the PROGRAM row — all of
514
+ that step's arms live, the model as the run trained it. Which members
515
+ run is the member switch's choice (any subset; a switched-off arm
516
+ passes its input through unchanged and nothing renormalizes), so one
517
+ row per program replaces the old only-this / all-but-this rows."""
 
518
  members = {}
519
  for f in files:
520
  if not f.startswith(f"{craft}/arms/"):
 
529
  names = [n for _, n, _ in ms]
530
  paths = [p for _, _, p in ms]
531
  words = ", ".join(_stage_word(n) for n in names)
532
+ by_step[step] = [_program_row(
533
  craft, step, names, paths, names, "",
534
+ f"Stage arms trained with this core ({words})"
535
  if len(names) > 1 else
536
+ f"Stage arm {names[0]}, trained with this core")]
 
 
 
 
 
 
 
 
 
 
 
537
  return by_step
538
 
539
 
540
+ # ------------------------------------------- arms fitted on the final core
541
+ # After the mission, arms were fitted on mini-beatrix-3's FINAL core with
542
+ # the core frozen: arm SETS (several arms trained switched on together;
543
+ # mounted as a program, any subset switchable), SOLO arms (one at a time)
544
+ # and the LOOKUP ARM (zero-born softmax attention after chosen blocks). The
545
+ # sets and solos come from arms_catalog.json (built from the training
546
+ # results by mb25/build_v3_space_catalog.py); the lookup arm's versions are
547
+ # found in the repo listing at boot, so a version that ships later appears
548
+ # after a restart with nothing rebuilt.
549
+ LOOKUP_RE = re.compile(r"^(mini-beatrix-3-la[\w.-]*)/checkpoints/"
550
+ r"step_(\d+)\.safetensors$")
551
+ LOOKUP_CACHE = os.environ.get("BEATRIX_LOOKUP_CACHE", "/tmp/beatrix-lookup")
552
+
553
+
554
+ def load_lookup_rows(files, craft, core_step, core_cfg):
555
+ """One row per checkpoint of every lookup-arm craft whose manifest
556
+ chain (init_from, step by step) starts from THIS craft's core at
557
+ core_step and whose trunk config equals the core's (the arm trained
558
+ with the trunk frozen, so every version mounts on that one core). The
559
+ row mounts only the arm: its tensors are read from the checkpoint by
560
+ range request (or from an arm-only file when one shipped)."""
561
+ spec = (CATALOG.get(craft) or {}).get("lookup") or {}
562
+ found = {}
563
+ for f in files:
564
+ m = LOOKUP_RE.match(f)
565
+ if m:
566
+ found.setdefault(m.group(1), []).append(int(m.group(2)))
567
+ mans = {}
568
+ for lc in found:
569
+ try:
570
+ mans[lc] = json.load(open(hf_hub_download(
571
+ REPO, f"{lc}/manifest.json"), encoding="utf-8"))
572
+ except Exception as e:
573
+ print(f"[boot] lookup arm {lc}: manifest unreadable "
574
+ f"({type(e).__name__}) — not offered", flush=True)
575
+
576
+ def root(lc, seen=()):
577
+ src = ((mans.get(lc) or {}).get("init_from") or {}).get("source", "")
578
+ m = re.search(r"([^/]+)/checkpoints/step_(\d+)\.safetensors$", src)
579
+ if not m:
580
+ return None
581
+ parent, st = m.group(1), int(m.group(2))
582
+ if parent == craft:
583
+ return st
584
+ if parent in seen or parent not in mans:
585
+ return None
586
+ return root(parent, seen + (lc,))
587
+
588
+ rows = []
589
+ for lc, steps in sorted(found.items()):
590
+ man = mans.get(lc)
591
+ if not man:
592
+ continue
593
+ mc = man.get("model_config") or {}
594
+ trunk_ok = all(mc.get(k) == v for k, v in core_cfg.items()
595
+ if k != "name")
596
+ if root(lc) != core_step or not trunk_ok or not mc.get(
597
+ "lookup_arm_sites"):
598
+ print(f"[boot] lookup arm {lc}: not chained to {craft} @"
599
+ f"{core_step:,} with the same trunk — not offered",
600
+ flush=True)
601
+ continue
602
+ sites = [int(s) for s in mc["lookup_arm_sites"]]
603
+ depth = int(mc.get("lookup_arm_depth") or 1)
604
+ d = int(mc["d_model"])
605
+ per_layer = 4 * d * d + 4 * d # qkv + o (4d²), the q/k gains (2d), the norm (2d)
606
+ info = (spec.get("crafts") or {}).get(lc) or {}
607
+ reads = (spec.get("reads") or {}).get(lc) or {}
608
+ tail = lc[len(craft) + 1:]
609
+ arm_only = {}
610
+ for f in files:
611
+ m = re.match(rf"^{re.escape(lc)}/lookup_arm/lookup_arm_step_"
612
+ rf"(\d+)\.safetensors$", f)
613
+ if m:
614
+ arm_only[int(m.group(1))] = f
615
+ for st in sorted(steps, reverse=True):
616
+ rd = reads.get(str(st)) or {}
617
+ fetch = rd.get("fetch_2048")
618
+ path = f"{lc}/checkpoints/step_{st:08d}.safetensors"
619
+ rows.append({
620
+ "path": path, "step": core_step, "name": f"{tail}@{st}",
621
+ "group": "lookup arm", "kind": "lookup", "family": "lookup",
622
+ "title": (f"Lookup arm · {info.get('short', tail)} · step "
623
+ f"{st:,} · "
624
+ + (f"fetch from 2,048 bytes back {fetch:.2f}"
625
+ if fetch is not None else "not read yet")
626
+ + (f" · {depth} layers a site" if depth > 1 else "")),
627
+ "what": info.get("what") or tail,
628
+ "lookup_craft": lc, "lookup_step": st, "reads": rd,
629
+ "sites": sites, "depth": depth,
630
+ "params": depth * len(sites) * per_layer,
631
+ "mount": {"type": "lookup", "source": path,
632
+ "arm_file": arm_only.get(st),
633
+ "name": f"{tail}@{st}"},
634
+ "template": None,
635
+ "decode": {"temperature": 0.0, "top_p": 1.0, "rep": 1.0,
636
+ "precision": "fp32",
637
+ "why": "the arm's reads are greedy"},
638
+ # after the packaged sets; newest craft first, newest step
639
+ "rank": 3.5 + 0.01 * info.get("order", 9) + 1e-9 * (
640
+ 10 ** 7 - st)})
641
+ return rows
642
+
643
+
644
+ def load_final_core_rows(files, craft, core_step, core_cfg):
645
+ """The catalog's rows for the final core (sets and solos, each listed
646
+ only when every file it mounts is on the hub) and the lookup rows."""
647
+ present = set(files)
648
+ rows = [dict(r) for r in ((CATALOG.get(craft) or {}).get("rows") or [])
649
+ if int(r.get("step", -1)) == core_step]
650
+ kept = [r for r in rows if all(p in present for p in _arm_files(r))]
651
+ if len(kept) < len(rows):
652
+ print(f"[boot] {craft}: {len(rows) - len(kept)} catalog arm(s) have no "
653
+ "file on the hub — not offered", flush=True)
654
+ kept += load_lookup_rows(files, craft, core_step, core_cfg)
655
+ kept.sort(key=lambda r: (r.get("rank", 99), r.get("title", "")))
656
+ return kept
657
+
658
+
659
  def load_reports(files, craft):
660
  """{step: report} for every stage-close report the run has shipped
661
  (<craft>/reports/v3/<phase>_step<N>.json). A stage close is where the
 
753
  the handle, or None when any file fails provenance. Adapter geometry
754
  is read from each file's own tensors (the library holds more than one
755
  shape), so nothing is assumed from a default spec."""
756
+ m = arm.get("mount") or {}
757
+ if m.get("type") == "lookup":
758
+ # provenance was settled at boot (the version's manifest chain from
759
+ # this exact core, the same trunk config) and _resolve_arm pins the
760
+ # row to the core's step; only the arm's own tensors are fetched
761
+ t0 = time.time()
762
+ try:
763
+ f = (hf_hub_download(REPO, m["arm_file"]) if m.get("arm_file")
764
+ else arm_mount.fetch_lookup_tensors(REPO, m["source"],
765
+ LOOKUP_CACHE))
766
+ except Exception as e:
767
+ print(f"[arms] refusing lookup arm {arm['name']}: its tensors "
768
+ f"could not be read ({type(e).__name__}: {str(e)[:200]})",
769
+ flush=True)
770
+ return None
771
+ print(f"[arms] {c.name} @{int(step):,}: lookup arm {arm['name']} ready "
772
+ f"({os.path.getsize(f) / 1e6:.1f} MB, {time.time() - t0:.1f}s)",
773
+ flush=True)
774
+ h = arm_mount.mount(c.model, {"type": "lookup", "name": arm["name"]}, f)
775
+ print(f"[arms] {c.name} @{int(step):,}: lookup arm {arm['name']} "
776
+ f"mounted (blocks {', '.join(map(str, h.sites))}, "
777
+ f"{h.spec.depth} layer{'s' if h.spec.depth > 1 else ''} a site, "
778
+ f"{h.n_params() / 1e6:.1f}M)", flush=True)
779
+ return h
780
  local = []
781
  for p in _arm_files(arm):
782
  t0 = time.time()
 
893
  if ph.get("status") == "active"), None)
894
  self.stage_arms = bool(spec.get("stage_arms"))
895
  self.fp32 = bool(spec.get("fp32"))
896
+ self.twin = spec.get("twin") # (title label, panel line) or None
897
  self.reports = (load_reports(files, self.name) if self.stage_arms
898
  else {})
899
  self.arms = (load_stage_programs(files, self.name)
900
  if self.stage_arms else
901
  load_arm_index(files, self.name) if spec["wants_arms"]
902
  else {})
903
+ # the run's own stage programs end at step 148,000; the arms fitted
904
+ # afterwards on the FINAL core join that step's list (and only it)
905
+ self.mission_steps = set(self.arms) if self.stage_arms else set()
906
+ self.final_rows = 0
907
+ if self.stage_arms:
908
+ final = max(self.cores)
909
+ extra = load_final_core_rows(files, self.name, final,
910
+ dict(manifest["model_config"]))
911
+ self.arms.setdefault(final, []).extend(extra)
912
+ self.final_rows = len(extra)
913
+ if extra:
914
+ print(f"[boot] {self.name} @{final:,}: "
915
+ f"{sum(r['kind'] == 'arm-set' for r in extra)} arm sets, "
916
+ f"{sum(r['kind'] == 'solo' for r in extra)} solo arms, "
917
+ f"{sum(r['kind'] == 'lookup' for r in extra)} lookup arm "
918
+ "versions fitted on the final core", flush=True)
919
  self._chat_ok = { # per CHECKPOINT, not craft
920
  s: bool(self.frame_trained and self._chat_from is not None
921
  and int(m.get("tokens") or 0) > self._chat_from)
 
929
  # (the run detached them there and finished on the core alone):
930
  # the last step that ships arms, so later cores are labelled as
931
  # the core alone rather than as "before the stage arms"
932
+ self.arm_last = (max(self.mission_steps)
933
+ if self.stage_arms and self.mission_steps else None)
934
  self.arm_by_path = {a["path"]: a
935
  for arms in self.arms.values() for a in arms}
936
 
 
1022
  step = int(step)
1023
  arms = self.arms.get(step, [])
1024
  if self.stage_arms:
1025
+ # the run's own model at an armed checkpoint is the core WITH its
1026
+ # stage arms (they trained together), so they open live; the
1027
+ # final core was released bare, and the arms fitted on it
1028
+ # afterwards are listed, not opened
1029
  for a in arms:
1030
+ if a.get("kind") == "stage-program":
1031
  return a["path"]
1032
  return CORE_ONLY
1033
  if step == getattr(self, "step", None):
 
1086
  else "pre-chat (documents only)")
1087
  n_chat = sum(a["kind"] == "chat" for a in arms)
1088
  if self.stage_arms:
1089
+ prog = [a for a in arms if a.get("kind") == "stage-program"]
1090
+ names = prog[0]["members"] if prog else []
1091
+ extra = len(arms) - len(prog)
1092
  if step in self.reports:
1093
  bits.append(f"close of {self.reports[step].get('tag')}")
1094
  bits.append(("stage arms: " + ", ".join(
1095
  _stage_word(n) for n in names)) if names
1096
+ else "arm sets, solo arms and the lookup arm "
1097
+ "fitted on it afterwards"
1098
+ if extra
1099
  else "core alone (arms detached)"
1100
  if self.arm_last and step > self.arm_last
1101
  else "before the stage arms")
 
1115
  arms = (f"{len(self.arm_by_path)} arms" if self.arm_by_path
1116
  else "no arms yet")
1117
  if self.stage_arms:
1118
+ last = self.arms.get(self.arm_last, []) if self.arm_last else []
1119
+ k = len(last[0]["members"]) if last else 0
1120
  arms = ("no stage arms yet" if not k else
1121
  f"{k} stage arm{'s' if k != 1 else ''} trained with it"
1122
  if self.arm_last >= max(self.cores) else
1123
  f"{k} stage arm{'s' if k != 1 else ''} to step "
1124
  f"{self.arm_last:,}")
1125
+ if self.final_rows:
1126
+ arms += " · arm sets and the lookup arm on the final core"
1127
+ if self.twin:
1128
+ return (f"{self.name} · {n} · softmax twin of 2s · "
1129
+ f"{self.twin[0]}")
1130
  if self.fmt == "specials":
1131
  state = ("in training" if self.active_phase
1132
  else "training complete")
 
1184
  return arm if (arm and arm["step"] == int(step)) else None
1185
 
1186
 
1187
+ def _live_set(arm, live):
1188
+ """Which members of a program row run: the member switch's choice
1189
+ (a list; an empty list switches every member off) or, when the caller
1190
+ sent none, the row's own default (every member on)."""
1191
+ members = list(arm.get("members") or [])
1192
+ if live is None:
1193
+ return list(arm.get("live") or members)
1194
+ want = set(live)
1195
+ # a non-empty choice naming none of this row's members is left over
1196
+ # from another row (a send that raced the switch's refresh): it gets
1197
+ # the row's default, never "all off" by accident. An EMPTY choice is
1198
+ # the visitor unticking every box and means exactly that.
1199
+ if want and not want & set(members):
1200
+ return list(arm.get("live") or members)
1201
+ return [n for n in members if n in want]
1202
+
1203
+
1204
+ def _select(craft, step, arm_path, live=None):
1205
  """Make the live model BE (craft, step, arm). arm_path is "" for
1206
+ core-only; `live` is the member switch's choice for a program row.
1207
+ Runs inside the ZeroGPU worker, where each call starts
1208
  from the parent's packed state, so a non-default selection re-applies
1209
  per request (weights come from the local hub cache — no
1210
  re-download). Returns a provenance dict."""
 
1246
  c.handle = _mount(c, arm, step) # provenance, every switch
1247
  if c.handle is not None:
1248
  c.loaded["mount"] = want_mount
1249
+ on = None
1250
  if arm is not None and c.handle is not None:
1251
+ if arm.get("members"): # a program row: the switch
1252
+ on = _live_set(arm, live)
1253
+ c.handle.set_live(on)
1254
+ if (c.loaded["arm_path"] != want
1255
+ or c.loaded.get("live") != on):
1256
+ print(f"[arms] {c.name} @{step:,}: on "
1257
+ + (", ".join(on) or "none")
1258
+ + (f" · off {', '.join(n for n in arm['members'] if n not in on)}"
1259
+ if len(on) < len(arm["members"]) else ""),
1260
+ flush=True)
1261
  c.loaded["arm_path"] = want # commit only now
1262
+ c.loaded["live"] = on
1263
  arm_on = arm is not None and c.handle is not None
1264
  fp32 = c.fp32 or (arm_on and (arm.get("decode") or {}).get("precision")
1265
  == "fp32")
1266
  prov = {"craft": c.name, "checkpoint_step": step,
1267
+ "arm": ((arm.get("name") if arm.get("kind") in ("lookup", "arm-set")
1268
+ else want.split("/")[-1]) if arm_on else None),
1269
  "arm_kind": (arm["kind"] if arm_on else "core-only"),
1270
  "precision": "fp32" if fp32 else "bf16",
1271
  "switch_s": round(time.time() - t0, 2)}
1272
+ if arm_on and on is not None:
1273
+ prov["live_arms"] = list(on)
1274
  prov["stage_arms"] = list(arm["members"])
1275
+ if arm_on and arm.get("kind") == "lookup":
1276
+ prov["lookup_sites"] = list(arm["sites"])
1277
+ prov["lookup_version"] = f"{arm['lookup_craft']}@{arm['lookup_step']}"
1278
  return prov
1279
 
1280
 
1281
+ def _f3(x):
1282
+ s = f"{x:.3f}"
1283
+ return s[1:] if s.startswith("0.") else s
1284
+
1285
+
1286
+ def _set_line(arm, live):
1287
+ """An arm set fitted on the final core: which members run, what the set
1288
+ is, and what was measured for it (each member's own stage text with
1289
+ every arm off, with the whole set on, and with that member alone; the
1290
+ set's cost on held-out web text)."""
1291
+ on = set(live)
1292
+ reads = arm.get("reads") or {}
1293
+ mem = " · ".join(f"`{_stage_word(n)}` {'✓' if n in on else '✗'}"
1294
+ for n in arm["members"])
1295
+ meas = " · ".join(
1296
+ f"{_stage_word(n)} {_f3(r['off'])}→{_f3(r['on'])}"
1297
+ + (f" (alone {_f3(r['alone'])})" if r.get("alone") is not None else "")
1298
+ for n, r in reads.items() if r.get("off") is not None
1299
+ and r.get("on") is not None)
1300
+ return " \n".join(filter(None, [
1301
+ f"**Arm set** · {arm['name']} · {len(arm['members'])} arms, "
1302
+ f"{arm['params'] / 1e6:.1f}M · {arm.get('status', '')} · fitted on "
1303
+ f"THIS core with the core frozen — " + mem,
1304
+ arm.get("what", ""),
1305
+ ("Measured, each arm's own stage text in bits per byte, every arm "
1306
+ "off → the set on (that arm alone): " + meas
1307
+ + (f" · held-out web text with the set on {arm['web']:+.4f}"
1308
+ if arm.get("web") is not None else "")) if meas else "",
1309
+ "Tick and untick arms below to run any subset: a switched-off arm "
1310
+ "removes exactly its own write, nothing renormalizes. Decoded greedy "
1311
+ "in fp32 as measured; the Completion tab has prompts in each stage's "
1312
+ "own format."]))
1313
+
1314
+
1315
+ def _solo_line(arm):
1316
+ return " \n".join(filter(None, [
1317
+ f"**Solo arm** · {arm['title'].split(' · ', 1)[1]} · "
1318
+ f"{arm['params'] / 1e6:.1f}M · {arm.get('status', '')}",
1319
+ arm.get("what", ""),
1320
+ f"Measured: {arm['score']} (bits per byte)" if arm.get("score") else "",
1321
+ "Decoded greedy in fp32 as measured; the Completion tab has prompts "
1322
+ "in its stage's own format."]))
1323
+
1324
+
1325
+ def _lookup_line(c, arm):
1326
+ rd = arm.get("reads") or {}
1327
+ bare = ((CATALOG.get(c.name) or {}).get("lookup") or {}).get("bare") or {}
1328
+ fet = " · ".join(f"{k.split('_')[1]} bytes back {rd[k]:.2f}"
1329
+ for k in ("fetch_1024", "fetch_2048", "fetch_3072",
1330
+ "fetch_3400") if rd.get(k) is not None)
1331
+ return " \n".join(filter(None, [
1332
+ f"**Lookup arm** · version `{arm['lookup_craft']}` step "
1333
+ f"{arm['lookup_step']:,} · softmax attention after blocks "
1334
+ + ", ".join(map(str, arm["sites"]))
1335
+ + (f", {arm['depth']} layers a site" if arm.get("depth", 1) > 1 else "")
1336
+ + f" · {arm['params'] / 1e6:.1f}M · born at zero and trained with THIS "
1337
+ "core frozen, so switching it off gives the core back bit for bit",
1338
+ "This version: " + arm.get("what", ""),
1339
+ ("Measured, the planted value's first byte fetched from: " + fet
1340
+ + (f" (the core alone: {bare.get('fetch_1024', 0):.2f} / "
1341
+ f"{bare.get('fetch_2048', 0):.2f} at 1,024 / 2,048)" if bare else ""))
1342
+ if fet else "Not read yet.",
1343
+ "Its write is concentrated where a question asks for a value planted "
1344
+ "earlier. Try the recall prompts in the Completion tab with the arm "
1345
+ "on and with Core only. Decoded greedy in fp32; after a run the "
1346
+ "activity line shows how far the whole arm, and each site alone, "
1347
+ "moved the predictions on that text."]))
1348
+
1349
+
1350
+ def _program_line(c, step, arm, live=None):
1351
  """A stage program as it runs on this checkpoint: every member on or
1352
  off (what each stage teaches, while there are few enough to fit), and,
1353
  when this checkpoint is a stage close, the cost the trainer measured
1354
  for each arm on general text."""
1355
+ if arm.get("kind") == "arm-set":
1356
+ return _set_line(arm, _live_set(arm, live))
1357
+ live = set(_live_set(arm, live))
1358
  few = len(arm["members"]) <= 2
1359
  mem = " · ".join(
1360
  f"`{n}` {'✓ on' if n in live else '✗ off'}"
 
1372
  lines.append("Measured by the trainer at this stage close, each "
1373
  "arm's cost on held-out web text (bits per byte, on "
1374
  "minus off; its bar is +0.012): " + " · ".join(cost))
1375
+ lines.append("Tick and untick arms below to run any subset: switching an "
1376
+ "arm off removes exactly its write; the core and the other "
1377
+ "arms are untouched. Decoded in fp32. After each run the "
1378
+ "stats line shows how far each live arm moved the "
1379
+ "predictions on that text.")
1380
  return " \n".join(lines)
1381
 
1382
 
1383
+ def status_md(craft, step, arm_path=CORE_ONLY, live=None):
1384
  c = S(craft)
1385
  step = _step(c, step)
1386
  arms = c.arms.get(step, [])
1387
+ prog = [a for a in arms if a.get("kind") == "stage-program"]
1388
+ extra = [a for a in arms if a.get("kind") in ("arm-set", "solo", "lookup")]
1389
  meta = c.ckpt_meta.get(step, {})
1390
  newest = max(c.cores)
1391
  arm = _resolve_arm(c, arm_path, step)
 
1398
  "They live on bytes UTF-8 can never produce, so "
1399
  "nothing you type can forge them."
1400
  + (f" \n**Arms** all switched off — the raw core "
1401
+ f"({len(prog[0]['members'])} stage arm"
1402
+ f"{'s' if len(prog[0]['members']) != 1 else ''} "
1403
  "trained with it here)"
1404
+ if c.stage_arms and prog else "")
1405
+ + (f" \n**Arms** none attached — the final core alone. "
1406
+ f"Fitted on it afterwards and listed under *Arm*: "
1407
+ f"{sum(a['kind'] == 'arm-set' for a in extra)} arm "
1408
+ f"sets, {sum(a['kind'] == 'solo' for a in extra)} solo "
1409
+ f"arms, {sum(a['kind'] == 'lookup' for a in extra)} "
1410
+ "versions of the lookup arm"
1411
+ if c.stage_arms and extra else ""))
1412
+ elif arm and arm.get("members"):
1413
+ arm_line = _program_line(c, step, arm, live)
1414
+ elif arm and arm.get("kind") == "solo":
1415
+ arm_line = _solo_line(arm)
1416
+ elif arm and arm.get("kind") == "lookup":
1417
+ arm_line = _lookup_line(c, arm)
1418
  elif arm:
1419
  sp = arm.get("spec") or {}
1420
  t = _tmpl(arm)
 
1454
  + f" · {c.core_params/1e6:.1f}M core · ctx {c.cfg.context}"
1455
  + (f" · newest is {newest:,}" if step != newest else ""),
1456
  arm_line,
1457
+ # a 2s twin says what it is (a control, which re-run, its state)
1458
+ (c.twin[1] if c.twin else ""),
1459
  # which side of the chat anneal THIS core sits on — the mission
1460
  # ends in a before/after pair and they are not interchangeable
1461
  (f"**Phase:** `{c.phase_of(step)}` · "
 
1466
  if c.fmt == "specials" and c.phase_of(step) else ""),
1467
  # a craft still in pretraining has never seen its chat frame:
1468
  # say so rather than letting the Chat tab imply otherwise
1469
+ (("⚠️ this run **stopped before** the anneal that teaches the "
1470
+ f"conversation frame (it ended in phase `{c.active_phase}`, "
1471
+ f"{c.tokens_seen/1e9:.2f}B bytes) — Chat will read as "
1472
+ "off-distribution. **Completion** is the honest view."
1473
+ if c.twin and "stopped" in c.twin[0] else
1474
+ "⚠️ this craft is **still training** (phase "
1475
+ f"`{c.active_phase}`, {c.tokens_seen/1e9:.2f}B bytes) and has not "
1476
+ "reached the anneal that teaches its conversation frame — Chat "
1477
+ "will read as off-distribution. **Completion** is the honest "
1478
+ "view of what she can do today."
1479
+ + (f" Checkpoints and progress were read when this Space started"
1480
+ f", from a manifest written {c.updated_utc}; the run has moved "
1481
+ "on since, and a restart picks up what it shipped."
1482
+ if c.updated_utc else ""))
1483
  if c.fmt == "specials" and not c.frame_trained else ""),
1484
  # the craft finished its chat anneal but THIS checkpoint predates
1485
  # it: the pre-chat baseline continues documents rather than
 
1496
  # mini-beatrix-3 after its arms were detached (step 148,000): say
1497
  # why the arm picker holds only the core here (one short line: the
1498
  # panel sits above the tabs)
1499
+ (f"ℹ️ the run's own stage arms were detached at step "
1500
+ f"{c.arm_last:,} (pick {c.arm_last:,} or an earlier stage close to "
1501
+ "run them); the arms in the list here were fitted on this final "
1502
+ "core afterwards, with the core frozen."
1503
+ if c.stage_arms and c.arm_last and step > c.arm_last and extra else
1504
+ f"ℹ️ the core alone: its stage arms were detached at step "
1505
  f"{c.arm_last:,}. Pick {c.arm_last:,} or an earlier stage close "
1506
  "to run them."
1507
  if c.stage_arms and c.arm_last and step > c.arm_last else ""),
 
1542
  ("ℹ️ no arm has been trained on this lineage yet — and none is "
1543
  "needed to talk to it: the conversation frame was taught to the "
1544
  "core itself, in the anneal that closed its mission."
1545
+ if not c.arm_by_path and c.chats(step) and not c.twin else ""),
1546
  ("ℹ️ no arm has been trained on this lineage yet — every reply "
1547
  "here is the raw pretrained core."
1548
+ if not c.arm_by_path and not c.chats(step) and not c.twin else ""),
1549
  ]))
1550
 
1551
 
 
1582
 
1583
 
1584
  def _probe_prompts(arm):
1585
+ """Completion prompts for a stage program or arm set (each member
1586
+ stage's own training format) or a solo arm (its stage's), then general
1587
+ text where every arm should stay quiet. None for any other row (the
1588
+ prompt list is then hidden)."""
1589
+ if not arm:
1590
+ return None
1591
+ words = ([_stage_word(n) for n in arm["members"]] if arm.get("members")
1592
+ else [arm["probe_stage"]] if arm.get("probe_stage") else None)
1593
+ if not words:
1594
  return None
1595
+ out = [p for w in words for p in STAGE_PROBES.get(w, [])]
 
1596
  return [[p] for p in out + OFF_STAGE_PROBES]
1597
 
1598
 
 
1602
  if probes and fam_examples else gr.update(visible=False))
1603
 
1604
 
1605
+ # Recall prompts for the lookup arm, in its training phrasing (the deep
1606
+ # renderer's single record, updated record and lockers): a value planted
1607
+ # after the first sentences, ordinary text, then the record's sentence
1608
+ # again, cut just before the value. The filler is plain prose written for
1609
+ # this page. Greedy decoding: the next bytes should be the planted value.
1610
+ _FILL = (
1611
+ "The ferry left the north landing a little after seven, as it did on "
1612
+ "most mornings in the dry season. The river was low and brown, and the "
1613
+ "pilot kept to the deep channel near the eastern bank, where the water "
1614
+ "moved faster and the sandbars could not reach. On the deck a few "
1615
+ "traders sat beside their baskets of onions and dried fish, and a boy "
1616
+ "sold tea from a dented kettle balanced on a charcoal stove. Nobody "
1617
+ "spoke much in the first hour. The light came up slowly behind the "
1618
+ "hills, turning the haze from grey to a pale gold, and the birds that "
1619
+ "lived in the reeds rose in loose flocks as the boat passed. At the "
1620
+ "bend below the old mill the pilot sounded the horn twice, the signal "
1621
+ "for the farms on the far side that the ferry would stop on its way "
1622
+ "back. The mill itself had not turned in years. Its wheel was rusted "
1623
+ "in place and a fig tree grew from the roof of the grinding room, its "
1624
+ "roots working down through the cracked plaster toward the water. "
1625
+ "Some of the older passengers remembered when the mill had ground "
1626
+ "wheat for three villages, and they talked about the long lines of "
1627
+ "carts that used to wait on the road in the harvest weeks. The traders "
1628
+ "were more interested in the price of diesel, which had risen again, "
1629
+ "and in whether the new bridge upstream would ever be finished. "
1630
+ "Everyone had an opinion about the bridge. It had been promised for "
1631
+ "twelve years, and twice the pylons had been started and then left to "
1632
+ "stand in the current like the legs of some patient wading bird. By "
1633
+ "the middle of the morning the wind had changed. It came from the "
1634
+ "south now, warm and smelling of cut grass, and it raised small waves "
1635
+ "that slapped against the hull. The pilot slowed the engine and let "
1636
+ "the boat drift for a while past the island where the fishermen kept "
1637
+ "their huts. Smoke rose from one of the chimneys, and a dog ran along "
1638
+ "the shore barking until the ferry was out of sight. The boy with the "
1639
+ "kettle had sold all his tea and sat on an upturned crate counting his "
1640
+ "coins into neat stacks. The market town came into view a little "
1641
+ "before noon. Its waterfront was crowded with boats of every size, "
1642
+ "from narrow canoes to the steel barges that carried gravel down from "
1643
+ "the quarries, and the ferry had to wait its turn to reach the stone "
1644
+ "steps of the landing. While it waited, the passengers gathered their "
1645
+ "things and argued gently about who would get off first. The steps "
1646
+ "were wet and slippery, worn smooth by a century of feet, and a man in "
1647
+ "a blue cap stood at the top to help people up with their loads. "
1648
+ "Beyond the landing the market spread across a wide square shaded by "
1649
+ "plane trees. There were stalls for cloth and stalls for tools, a row "
1650
+ "of women selling herbs and seeds from small paper packets, and at the "
1651
+ "far end a covered hall where the butchers worked. The noise was "
1652
+ "constant and cheerful. Prices were called out, refused, called again, "
1653
+ "and finally agreed with a handshake or a shrug. A radio somewhere "
1654
+ "played the same song three times in an hour. In the afternoon the "
1655
+ "heat settled over the square and the trading slowed. Stallholders "
1656
+ "dozed under their awnings, and the cats that lived around the "
1657
+ "butchers' hall stretched out on the cool stones by the fountain. Only "
1658
+ "the children kept moving, chasing each other between the tables and "
1659
+ "through the narrow lanes that led away from the square toward the "
1660
+ "older houses on the hill. The ferry would not leave again until four. "
1661
+ "Its crew ate lunch on the deck, bread and cheese and a few late "
1662
+ "plums, and talked about the season, the river and the bridge.")
1663
+
1664
+
1665
+ def _sentences(text, n):
1666
+ """The leading whole sentences of `text` that fit in n bytes."""
1667
+ body = text[:max(0, n)]
1668
+ return body[:body.rindex(". ") + 2] if ". " in body else body
1669
+
1670
+
1671
+ def _recall(plant, ask, gap, later=None):
1672
+ """~220 bytes of prose, the plant, about `gap` bytes of prose, the
1673
+ question. `later` (a second sentence of the record) goes in a third
1674
+ of the way through the gap: the updated-record form."""
1675
+ head = _sentences(_FILL, _FILL.index(". ", 200) + 2)
1676
+ rest = _FILL[len(head):]
1677
+ body = _sentences(rest, gap - len(plant))
1678
+ if later:
1679
+ first = _sentences(body, len(body) // 3)
1680
+ body = first + later + body[len(first):]
1681
+ return head + plant + body + ask
1682
+
1683
+
1684
+ def _back(text, value):
1685
+ """How far back the answer sits: bytes from the value's (last) plant
1686
+ to the end of the prompt, where the reply begins."""
1687
+ b = text.encode()
1688
+ return len(b) - b.rindex(value.encode())
1689
+
1690
+
1691
+ def _recall_rows():
1692
+ rows = []
1693
+ for cue, value, gap in (("code", "48213", 450), ("word", "quilmet", 1050),
1694
+ ("number", "7395021", 2100),
1695
+ ("token", "vandrel", 3100)):
1696
+ t = _recall(f"The secret {cue} is {value}. ",
1697
+ f"The secret {cue} is ", gap)
1698
+ rows.append((f"the secret {cue}, planted {_back(t, value):,} bytes "
1699
+ f"back (the answer: {value})", t))
1700
+ t = _recall("The secret key is 3fa91c. ", "The secret key is ", 1600,
1701
+ later="The secret key is now 82d04e. ")
1702
+ rows.append(("an updated key: the first value, then a later one "
1703
+ f"{_back(t, '82d04e'):,} bytes back (the answer: the later "
1704
+ "value, 82d04e)", t))
1705
+ t = _recall("Locker 4821 holds code 55370. Locker 3109 holds code 90412. "
1706
+ "Locker 7744 holds code 21865. Locker 1296 holds code 67093. ",
1707
+ "Locker 3109 holds code ", 900)
1708
+ rows.append(("four lockers, the asked one planted "
1709
+ f"{_back(t, '90412'):,} bytes back (the answer: 90412; "
1710
+ "telling keys apart is still open: the one-layer arm reads "
1711
+ "near chance here)", t))
1712
+ return rows
1713
+
1714
+
1715
+ RECALL_PROBES = _recall_rows()
1716
+
1717
+
1718
+ def _recall_update(arm):
1719
+ if arm and arm.get("kind") == "lookup":
1720
+ return gr.update(choices=[lab for lab, _ in RECALL_PROBES], value=None,
1721
+ visible=True)
1722
+ return gr.update(visible=False, value=None)
1723
+
1724
+
1725
+ def on_recall(label):
1726
+ """Writes the chosen recall prompt into the Completion prompt box."""
1727
+ for lab, text in RECALL_PROBES:
1728
+ if lab == label:
1729
+ return text
1730
+ return gr.update()
1731
+
1732
+
1733
+ def _members_update(arm, live=None):
1734
+ """The member switch: shown for a program row (a stage program or an
1735
+ arm set), one box per member, every box ticked when the row is picked."""
1736
+ if not arm or not arm.get("members"):
1737
+ return gr.update(choices=[], value=[], visible=False)
1738
+ return gr.update(
1739
+ choices=_member_choices(arm), value=_live_set(arm, live),
1740
+ label=_member_label(arm), visible=True)
1741
+
1742
+
1743
+ def _member_choices(arm):
1744
+ return [(MEMBER_LABEL.get(_stage_word(n), _stage_word(n)), n)
1745
+ for n in (arm or {}).get("members") or []]
1746
+
1747
+
1748
+ def _member_label(arm):
1749
+ return ("Arms in this set · untick any arm to switch it off"
1750
+ if (arm or {}).get("kind") == "arm-set" else
1751
+ "Stage arms trained with this core · untick any arm to switch "
1752
+ "it off")
1753
+
1754
+
1755
+ def on_members(craft, step, arm_path, live):
1756
+ """Ticking or unticking a member re-renders the panel's member line."""
1757
+ return status_md(craft, step, arm_path, live)
1758
+
1759
+
1760
  def on_arm(craft, step, arm_path, auto_decode, fam_examples):
1761
  """Selecting an arm re-tunes what the arm needs and shows what it
1762
  knows: a task arm collapses to turn-end off-distribution and turns
 
1772
  gr.update(value=r) if auto_decode else gr.update(),
1773
  gr.update(samples=_examples_of(arm)) if fam_examples
1774
  else gr.update(),
1775
+ _probe_update(arm, fam_examples),
1776
+ _members_update(arm),
1777
+ _recall_update(arm))
1778
 
1779
 
1780
  def on_checkpoint(craft, step, auto_decode, fam_examples):
 
1905
 
1906
  ACTIVITY_BYTES = 1024 # the text window the per-arm activity reads
1907
  CALL_BUDGET_S = 112.0 # ZeroGPU ends the call at 120 s
1908
+ # the reply must end this long after the GPU call began, whatever the arm
1909
+ # switch before it cost: a first mount of a nine-arm set downloads ~0.5 GB,
1910
+ # and a reply cut by the call's own end is lost mid-stream instead of
1911
+ # stopping with a note
1912
+ CALL_GEN_END_S = 105.0
1913
 
1914
 
1915
  @torch.no_grad()
 
1922
  reply, inside the same GPU call, while the program is still attached.
1923
  Near zero means the arm is quiet on this text."""
1924
  h, ids = c.handle, getattr(c, "last_ids", None)
1925
+ if ids is None or ids.shape[1] < 2:
1926
+ return ""
1927
+ if _is_lookup(h):
1928
+ return _lookup_activity(c, h, ids, deadline)
1929
+ if not isinstance(h, arm_mount.ProgramHandle):
1930
  return ""
1931
  live = [n for n in h.names if h.live.get(n)]
1932
  if not live:
 
1940
  continue
1941
  with h.masked(n):
1942
  lb = c.model(x)[0].float().log_softmax(-1)
1943
+ parts.append(f"`{n}` " + _kl_text(la, lb))
 
 
 
 
 
 
1944
  return (f" · **arm activity** on this text (last {x.shape[1]:,} bytes, "
1945
  "each arm switched off alone): " + " · ".join(parts))
1946
 
1947
 
1948
+ def _kl_text(la, lb):
1949
+ """KL(off || as it ran) in nats per byte and the top-byte change rate.
1950
+ Below ~1e-9 an fp32 KL between two near-identical distributions is
1951
+ rounding, not a measurement: say "none measurable", not 0."""
1952
+ kl = float((lb.exp() * (lb - la)).sum(-1).mean())
1953
+ moved = float((lb.argmax(-1) != la.argmax(-1)).float().mean())
1954
+ return ((f"{kl:.1e} nats/byte" if kl >= 1e-9 else
1955
+ "< 1e-9 nats/byte (none measurable)")
1956
+ + f", top byte changed at {moved:.1%} of positions")
1957
+
1958
+
1959
+ def _is_lookup(h):
1960
+ try:
1961
+ from amoe.arms.lookup import LookupHandle
1962
+ except ImportError:
1963
+ return False
1964
+ return isinstance(h, LookupHandle)
1965
+
1966
+
1967
+ @torch.no_grad()
1968
+ def _lookup_activity(c, h, ids, deadline):
1969
+ """The lookup arm's write on the text just produced: the whole arm
1970
+ switched off, then each site switched off alone, as KL(off || armed)
1971
+ per byte over the last ACTIVITY_BYTES. The arm writes where a cue
1972
+ asks for a value planted earlier and barely anywhere else, so on
1973
+ ordinary text these read near zero; on a recall prompt the write sits
1974
+ at the question. The arm's flags are restored even if a read fails."""
1975
+ x = ids[:, -ACTIVITY_BYTES:]
1976
+ wraps = h.wraps()
1977
+ la = c.model(x)[0].float().log_softmax(-1)
1978
+ parts = []
1979
+ try:
1980
+ for w in wraps:
1981
+ w.enabled = False
1982
+ lb = c.model(x)[0].float().log_softmax(-1)
1983
+ parts.append("whole arm off " + _kl_text(la, lb))
1984
+ finally:
1985
+ for w in wraps:
1986
+ w.enabled = True
1987
+ for s, w in zip(h.sites, wraps):
1988
+ if time.time() > deadline:
1989
+ parts.append(f"block {s} not read (GPU time)")
1990
+ continue
1991
+ try:
1992
+ w.enabled = False
1993
+ lb = c.model(x)[0].float().log_softmax(-1)
1994
+ finally:
1995
+ w.enabled = True
1996
+ parts.append(f"after block {s} off alone " + _kl_text(la, lb))
1997
+ return (f" · **lookup arm activity** on this text (last {x.shape[1]:,} "
1998
+ "bytes): " + " · ".join(parts))
1999
+
2000
+
2001
  @spaces.GPU(duration=120)
2002
  def _stream(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
2003
+ ckpt_step, stop=(), stop_ids=(), guard=False, rep=1.0,
2004
+ live=None):
2005
  """The GPU call: the reply as it streams (_generate), then, when a
2006
+ program of arms or the lookup arm ran, one more yield that adds the
2007
+ measured activity on the finished text to the stats line."""
2008
  t_call = time.time()
2009
  last = None
2010
  for last in _generate(craft, ids, max_new, temperature, top_p,
2011
  use_cache, arm_path, ckpt_step, stop, stop_ids,
2012
+ guard, rep, live, call_t0=t_call):
2013
  yield last
2014
+ if last is not None and (last[2].get("live_arms")
2015
+ or last[2].get("lookup_sites")):
2016
  line = _activity(S(craft), t_call + CALL_BUDGET_S)
2017
  if line:
2018
  yield last[0], last[1] + line, last[2]
2019
 
2020
 
2021
  def _generate(craft, ids, max_new, temperature, top_p, use_cache, arm_path,
2022
+ ckpt_step, stop=(), stop_ids=(), guard=False, rep=1.0,
2023
+ live=None, call_t0=None):
2024
  """Yields (text, stats, prov) — prov is what actually RAN, resolved
2025
  by _select, not what the dropdowns asked for. It travels back
2026
  through the yield because it has to cross a process boundary: the
 
2036
  tasks) and a threading.Lock would be actively unsafe under fork: one
2037
  held by any parent thread at fork time is inherited locked with no
2038
  owner, and the child would block forever."""
2039
+ prov = _select(craft, ckpt_step, arm_path, live)
2040
  c = S(craft)
2041
  model = c.model
2042
  dev = next(model.parameters()).device
 
2062
  stop_ids = set(int(s) for s in stop_ids)
2063
  out, t0 = [], time.time()
2064
  deadline, budget_hit = t0 + GEN_BUDGET_S, False
2065
+ if call_t0 is not None: # the switch above spent the same call
2066
+ deadline = min(deadline, call_t0 + CALL_GEN_END_S)
2067
  label = (f"{prov['craft']} · step {prov['checkpoint_step']:,} · "
2068
+ + ((("stage arms on: " if prov["arm_kind"] == "stage-program"
2069
+ else f"arm set `{prov['arm']}`, on: ")
2070
+ + (", ".join(f"`{n}`" for n in prov["live_arms"])
2071
+ or "none (every member switched off)"))
2072
  if prov.get("live_arms") is not None else
2073
+ f"lookup arm `{prov['lookup_version']}`"
2074
+ if prov.get("lookup_version") else
2075
  f"arm `{prov['arm'].split('@')[0]}`" if prov["arm"]
2076
  else "core only")
2077
  + (" · fp32" if prov.get("precision") == "fp32" else "")
 
2145
  # the requested byte count was honoured as far as the GPU
2146
  # allowance allowed; the shortfall is stated, never hidden
2147
  note = (f" …[stopped at {len(out)} of {max_new} bytes — "
2148
+ f"{deadline - t0:.0f}s GPU budget"
2149
  + ("" if use_cache else "; the KV cache is off, so "
2150
  "every byte recomputes the whole context") + "]")
2151
  yield _render(out, c.fmt) + note, stats + " · **budget**", prov
2152
 
2153
 
2154
  def complete(craft, prompt, max_new, temperature, top_p, use_cache, arm_path,
2155
+ ckpt_step, guard, rep=1.0, members=None,
2156
+ request: gr.Request = None):
2157
  if not prompt or not prompt.strip():
2158
  yield "(enter a prompt)", ""
2159
  return
 
2177
  arm_path, step_i, stop=stops,
2178
  stop_ids=stop_ids,
2179
  guard=bool(guard),
2180
+ rep=float(rep),
2181
+ live=_members_in(members)):
2182
  yield prompt + text, stats
2183
  done = True
2184
  finally:
 
2249
  errors="replace")
2250
 
2251
 
2252
+ def _members_in(members):
2253
+ """The member switch's value as _select takes it: a list (possibly
2254
+ empty: every member off), or None when no switch value came with the
2255
+ call (an API caller), which means the row's own default."""
2256
+ if members is None:
2257
+ return None
2258
+ return [str(m) for m in members]
2259
+
2260
+
2261
  def chat(craft, message, history, max_new, temperature, top_p, use_cache,
2262
+ arm_path, ckpt_step, guard, rep=1.0, convo_id="", members=None,
2263
  request: gr.Request = None):
2264
  if not message or not message.strip():
2265
  yield list(history or []), "", ""
 
2345
  top_p, use_cache, arm_path, step_i,
2346
  stop=stops, stop_ids=stop_ids,
2347
  guard=bool(guard),
2348
+ rep=float(rep),
2349
+ live=_members_in(members)):
2350
  body = _finish_reply(text, stops)
2351
  history[-1]["content"] = (preface + body) if body else empty
2352
  yield history, "", stats
 
2369
  # Everything explanatory lives in a closed accordion for that reason.
2370
  DESCRIPTION = """
2371
  Three generations of the same architecture, served side by side, newest
2372
+ first, and four control twins of 2s that run ordinary softmax attention
2373
+ where 2s runs the splat. Pick the **Craft** first — everything below it
2374
+ follows.
2375
 
2376
  **mini-beatrix-3** — 376M parameters over 32 blocks: the same governed
2377
  full-splat hub as 2s, deeper. Its mission is **complete** — 64.4 billion
 
2403
  or 148,000 itself, the last with all four. They open all on; each can
2404
  run alone or be switched off, a switched-off arm removes exactly its own
2405
  write, and after every run the stats line shows how far each live arm
2406
+ moved the predictions on that text. Every later checkpoint is the core
2407
+ alone. The stages with arms: perspective (one event seen from different
2408
+ people), concept (kinds and opposites), rules (if-then chains over
2409
+ made-up words) and arithmetic (with the working shown).
2410
+
2411
+ **Arms fitted on the final core.** After the mission, new arms were
2412
+ fitted on the final core (step 245,674) with the core frozen, and that
2413
+ checkpoint lists them under *Arm*. It still opens bare; pick a row to
2414
+ attach one.
2415
+
2416
+ - **Arm sets**: one arm per curriculum stage (13.7M parameters each),
2417
+ on together. Picking a set shows a box for each of its arms. Untick
2418
+ any of them, alone or several at once, to run every subset of the set:
2419
+ a switched-off arm removes exactly its own write, and nothing
2420
+ renormalizes. The panel gives each arm's measured bits per byte on its
2421
+ own stage's text and the set's cost on held-out web text. Listed first
2422
+ are the two packaged sets (stages 1–4 and stages 1–8) and the
2423
+ experimental caption set (the eight plus an arm for image captions in
2424
+ a labelled frame), each in two seeds; the research sets after them
2425
+ differ in how the arms were trained together.
2426
+ - **Solo arms**: each stage's arm trained alone, two seeds each.
2427
+ - **The lookup arm**: ordinary softmax attention added after four of the
2428
+ core's blocks (2, 6, 12 and 20), born at zero and trained with the
2429
+ core frozen, so switching it off gives the core back bit for bit. The
2430
+ core remembers by address, and a value planted early in a long text
2431
+ fades from it within a few hundred bytes. The arm was trained on web
2432
+ text mixed with recall rows (a value planted behind text, asked for
2433
+ later), and every version of it is listed. Picking one shows recall
2434
+ prompts in the Completion tab: run one with the arm on, then with
2435
+ *Core only*. On the measured recall rows the core alone fetches none
2436
+ of the values from 1,024 bytes back; the deep-mix versions fetch the
2437
+ value's first byte about nine times in ten from 2,048 bytes back.
2438
+ Telling apart several values planted under different keys (the
2439
+ lockers prompt) is still open: the one-layer arm reads near chance
2440
+ there.
2441
+
2442
+ The packaged sets and solo arms ship with the
2443
+ [mini-beatrix-3](https://huggingface.co/AbstractPhil/mini-beatrix-3)
2444
+ package: `m.mount_arm("stages-1-8")` for a set, `m.mount_arm("solo/s3_rules")`
2445
+ for one solo arm, `m.detach_arm()` for the bare core again.
2446
 
2447
  **mini-beatrix-2s** — 237.1M parameters, **full splat**: the signed
2448
  address read runs in *every* block (v1 used it in three), with a
 
2486
  and control ones that exist to be disprovable. The package is the
2487
  settled subset, carrying each arm's measured numbers with it.
2488
 
2489
+ **The 2s control twins.** The four crafts named mini-beatrix-2s-control
2490
+ are 2s's own recipe and data with ordinary softmax attention in all 20
2491
+ blocks where 2s has the splat hub: the experiment's control. The
2492
+ original twin ran the whole mission in bf16. Under the recipe tuned for
2493
+ the splat its training destabilized from step 17,600, and it closed at
2494
+ 2.88 bits per byte on held-out text against 2s's 1.11. Three re-runs
2495
+ start from its own earlier weights. Two precision tests restarted at
2496
+ step 16,000 and stopped near 18,300. The third restarted at step 10,000
2497
+ with the attention computed in fp32 around fp16 flash attention; it has
2498
+ stayed stable and is still training, and the Space lists what it had
2499
+ shipped when the Space last started. The twins carry no arms and decode
2500
+ in fp32.
2501
+
2502
  **mini-beatrix-1** — 112.5M parameters, pretrained on 15.3 billion raw
2503
  bytes, carrying a **library of detachable arms**: small adapters
2504
  (3.2M–5.3M parameters) each trained on one exact frozen core. Pick a
 
2577
 
2578
  with gr.Blocks(title="Beatrix — AlephLLM chat") as demo:
2579
  gr.Markdown(TITLE)
2580
+ with gr.Accordion("About Beatrix — the crafts, how she reads text, "
2581
  "what the arms are, what to expect", open=False):
2582
  gr.Markdown(DESCRIPTION)
2583
  gr.Markdown(LOG_NOTE)
 
2601
  label="Arm (adapter)", scale=4,
2602
  allow_custom_value=True,
2603
  interactive=bool(_C0.arm_by_path))
2604
+ # the member switch: one box per arm of the picked program (a stage
2605
+ # program or an arm set), every box ticked when the row is picked;
2606
+ # hidden for every other row, so no other craft's page grows
2607
+ # gradio checks a submitted value against the component's choices: the
2608
+ # session's copy once an event has updated them, the page's own at the
2609
+ # start of a session (and for API callers). Hidden, the switch starts
2610
+ # with every member name any program row carries, so no session's
2611
+ # first call is refused; picking a row narrows it to that row's members.
2612
+ _a0 = _C0.arm_by_path.get(_C0.default_arm(STEP))
2613
+ _all_members = list(dict.fromkeys(
2614
+ n for _c in STATE.values() for _r in _c.arm_by_path.values()
2615
+ for n in (_r.get("members") or [])))
2616
+ members_pick = gr.CheckboxGroup(
2617
+ choices=(_member_choices(_a0) if (_a0 or {}).get("members") else
2618
+ _member_choices({"members": _all_members})),
2619
+ value=_live_set(_a0, None) if (_a0 or {}).get("members") else [],
2620
+ label=_member_label(_a0), visible=bool((_a0 or {}).get("members")))
2621
  with gr.Row():
2622
  max_new = gr.Slider(16, MAX_NEW_CAP, value=192, step=16,
2623
  label="Max new bytes")
 
2677
  # after a Clear ran together as one conversation
2678
  convo = gr.State("")
2679
  _chat_in = [craft_pick, msg, chatbot, max_new, temperature, top_p,
2680
+ use_cache, arm_pick, ckpt, guard, rep, convo,
2681
+ members_pick]
2682
  _chat_out = [chatbot, msg, stats_md]
2683
  _ev1 = msg.submit(chat, _chat_in, _chat_out)
2684
  _ev2 = send.click(chat, _chat_in, _chat_out)
 
2694
  # max_lines pinned: unpinned textboxes auto-grow to 20 rows in
2695
  # 6.23.1, and a streaming continuation would push the tabs out
2696
  # of reach inside the non-scrolling iframe
2697
+ # shown only for the lookup arm: a value planted early in a long
2698
+ # text, asked for at the end, in the phrasing the arm trained on
2699
+ recall_pick = gr.Dropdown(
2700
+ [lab for lab, _ in RECALL_PROBES], value=None,
2701
+ label="Recall prompts for the lookup arm · picking one writes "
2702
+ "it into the prompt box; run it with the arm on, then "
2703
+ "with Core only",
2704
+ visible=bool(_a0 and _a0.get("kind") == "lookup"))
2705
  prompt = gr.Textbox(label="Prompt", lines=4, max_lines=4,
2706
  value="The history of mathematics begins")
2707
  comp_out = gr.Textbox(label="Continuation (streams)", lines=12,
 
2722
  _ev3 = comp_go.click(
2723
  complete,
2724
  [craft_pick, prompt, max_new, temperature, top_p, use_cache,
2725
+ arm_pick, ckpt, guard, rep, members_pick],
2726
  [comp_out, stats_md])
2727
+ recall_pick.input(on_recall, recall_pick, prompt)
2728
  # ONE halt for every generator, wired after both tabs so a Stop on
2729
  # either side reaches the run in flight. Cancelling closes the
2730
  # generator at its yield: the bytes already streamed stay on screen,
 
2740
  # toggles say otherwise
2741
  craft_pick.change(on_craft, [craft_pick, auto_decode, fam_examples],
2742
  [ckpt, arm_pick, status_box, temperature, top_p, rep,
2743
+ ex.dataset, comp_ex.dataset, members_pick,
2744
+ recall_pick])
2745
  ckpt.change(on_checkpoint, [craft_pick, ckpt, auto_decode, fam_examples],
2746
  [ckpt, arm_pick, status_box, temperature, top_p, rep,
2747
+ ex.dataset, comp_ex.dataset, members_pick, recall_pick])
2748
  arm_pick.change(on_arm,
2749
  [craft_pick, ckpt, arm_pick, auto_decode, fam_examples],
2750
  [status_box, temperature, top_p, rep, ex.dataset,
2751
+ comp_ex.dataset, members_pick, recall_pick])
2752
+ # ticking a member re-renders the panel's member line; .input fires on
2753
+ # the visitor's own clicks only, not when on_arm refreshes the boxes
2754
+ members_pick.input(on_members, [craft_pick, ckpt, arm_pick, members_pick],
2755
+ status_box)
2756
  demo.load(js=RESIZE_JS)
2757
 
2758
  demo.launch()
arm_mount.py CHANGED
@@ -20,11 +20,15 @@ Recipe types (the `mount.type` field of an arm-index row):
20
  recurrent a small recurrent cell per site fed by the attention read
21
  program a co-trained stage-arm program (mini-beatrix-3): one anchor
22
  arm per curriculum stage, trained together with the core,
23
- nested in stage order, each member switchable on its own
 
 
 
 
24
 
25
- The relay_ema, recurrent and gain recipes carry state across cached
26
- decode steps; a fresh prefill starts that state over, and the uncached
27
- path treats every forward as a fresh context.
28
 
29
  Trained arms and their measurements:
30
  huggingface.co/AbstractPhil/alephllm-mini-beatrix-training
@@ -49,7 +53,7 @@ from amoe.io.checkpoint import load_anchor, load_dispatch
49
  from amoe.runtime.attach import AttachHandle, _probe
50
 
51
  MOUNT_TYPES = ("anchor", "stack", "routed", "relay_ema", "recurrent",
52
- "program")
53
 
54
 
55
  # ------------------------------------------------------------- geometry
@@ -370,11 +374,90 @@ def _mount_recurrent(model, path):
370
  return attach_recurrent(model, name, RecurrentSpec(**blob["spec"]), state=blob["state"])
371
 
372
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
  def mount(model, recipe: dict, path: str, member_paths=None):
374
  """Attach one arm recipe to the bare model. `path` is the local file of
375
  the row's own checkpoint; `member_paths` are the local files of a
376
  stack's members, inner first, or of a stage program's members."""
377
  kind = (recipe or {}).get("type", "anchor")
 
 
378
  if kind == "anchor":
379
  return _mount_anchor(model, path)
380
  if kind == "stack":
 
20
  recurrent a small recurrent cell per site fed by the attention read
21
  program a co-trained stage-arm program (mini-beatrix-3): one anchor
22
  arm per curriculum stage, trained together with the core,
23
+ nested in stage order, each member switchable on its own;
24
+ the arm sets fitted on the finished core mount the same way
25
+ lookup a zero-born causal softmax-attention arm after chosen
26
+ blocks (amoe.arms.lookup), read from the lookup_* tensors
27
+ of a trainer checkpoint or of an arm-only file
28
 
29
+ The relay_ema, recurrent, gain and lookup recipes carry state across
30
+ cached decode steps; a fresh prefill starts that state over, and the
31
+ uncached path treats every forward as a fresh context.
32
 
33
  Trained arms and their measurements:
34
  huggingface.co/AbstractPhil/alephllm-mini-beatrix-training
 
53
  from amoe.runtime.attach import AttachHandle, _probe
54
 
55
  MOUNT_TYPES = ("anchor", "stack", "routed", "relay_ema", "recurrent",
56
+ "program", "lookup")
57
 
58
 
59
  # ------------------------------------------------------------- geometry
 
374
  return attach_recurrent(model, name, RecurrentSpec(**blob["spec"]), state=blob["state"])
375
 
376
 
377
+ # ------------------------------------------------------------- lookup arm
378
+ LOOKUP_PREFIXES = ("lookup_arms.", "lookup_norms.")
379
+ _ST_DTYPES = {"BF16": torch.bfloat16, "F16": torch.float16,
380
+ "F32": torch.float32, "F64": torch.float64}
381
+
382
+
383
+ def _st_tensor(meta, raw):
384
+ t = torch.frombuffer(bytearray(raw), dtype=_ST_DTYPES[meta["dtype"]])
385
+ return t.reshape(meta["shape"]).clone()
386
+
387
+
388
+ def fetch_lookup_tensors(repo: str, path: str, cache_dir: str) -> str:
389
+ """The lookup arm's tensors out of a trainer checkpoint on the hub, by
390
+ HTTP range reads: the safetensors header, then only the lookup_*
391
+ tensors' bytes (about 34 MB of a 790 MB file per attention layer set).
392
+ Written once to a local safetensors file under cache_dir (atomically,
393
+ so two workers never read a half-written file) and reused after."""
394
+ import json
395
+ import os
396
+ import struct
397
+ import tempfile
398
+
399
+ from huggingface_hub import HfFileSystem
400
+ from safetensors.torch import save_file
401
+
402
+ out = os.path.join(cache_dir, path.replace("/", "__") + ".lookup.safetensors")
403
+ if os.path.exists(out):
404
+ return out
405
+ os.makedirs(cache_dir, exist_ok=True)
406
+ with HfFileSystem().open(f"{repo}/{path}", "rb") as fh:
407
+ n = struct.unpack("<Q", fh.read(8))[0]
408
+ header = json.loads(fh.read(n))
409
+ base = 8 + n
410
+ spans = sorted((header[k]["data_offsets"][0], header[k]["data_offsets"][1], k)
411
+ for k in header if k.startswith(LOOKUP_PREFIXES))
412
+ if not spans:
413
+ raise KeyError(f"{path}: the checkpoint carries no lookup arm")
414
+ lo, hi = spans[0][0], spans[-1][1]
415
+ tensors = {}
416
+ if hi - lo <= 2 * sum(e - b for b, e, _ in spans): # one read
417
+ fh.seek(base + lo)
418
+ blob = fh.read(hi - lo)
419
+ for b, e, k in spans:
420
+ tensors[k] = _st_tensor(header[k], blob[b - lo:e - lo])
421
+ else:
422
+ for b, e, k in spans:
423
+ fh.seek(base + b)
424
+ tensors[k] = _st_tensor(header[k], fh.read(e - b))
425
+ fd, tmp = tempfile.mkstemp(dir=cache_dir, suffix=".part")
426
+ os.close(fd)
427
+ save_file(tensors, tmp, metadata={"source": f"{repo}/{path}",
428
+ "keys": str(len(tensors))})
429
+ os.replace(tmp, out)
430
+ return out
431
+
432
+
433
+ def _mount_lookup(model, path, name="lookup"):
434
+ """A lookup arm: zero-born causal softmax attention after chosen blocks,
435
+ each layer behind its own LayerNorm (amoe.arms.lookup). The geometry is
436
+ read from the keys (sites, depth, heads from the q/k gains) and checked
437
+ against the bound trunk; the attention runs in fp32 under autocast, as
438
+ it was trained. Cached decode keeps the arm's own key/value cache."""
439
+ from safetensors.torch import load_file
440
+ from amoe.arms.lookup import attach_from_alephllm, from_alephllm_state
441
+ sd = {k: v for k, v in load_file(path).items()
442
+ if k.startswith(LOOKUP_PREFIXES)}
443
+ _, sites, depth = from_alephllm_state(sd)
444
+ b = resolve(model, None)
445
+ n_blocks, d = len(list(b.layers(model))), b.hidden_size(model)
446
+ if max(sites) >= n_blocks:
447
+ raise ValueError(f"lookup arm sites {sites} outside a {n_blocks}-block trunk")
448
+ w = sd[f"lookup_arms.{sites[0]}.qkv.weight"]
449
+ if tuple(w.shape) != (3 * d, d):
450
+ raise ValueError(f"lookup arm width {tuple(w.shape)} does not fit d={d}")
451
+ return attach_from_alephllm(model, sd, name=name, attn_fp32=True)
452
+
453
+
454
  def mount(model, recipe: dict, path: str, member_paths=None):
455
  """Attach one arm recipe to the bare model. `path` is the local file of
456
  the row's own checkpoint; `member_paths` are the local files of a
457
  stack's members, inner first, or of a stage program's members."""
458
  kind = (recipe or {}).get("type", "anchor")
459
+ if kind == "lookup":
460
+ return _mount_lookup(model, path, (recipe or {}).get("name", "lookup"))
461
  if kind == "anchor":
462
  return _mount_anchor(model, path)
463
  if kind == "stack":
arms_catalog.json CHANGED
@@ -3790,6 +3790,1821 @@
3790
  "default": false
3791
  }
3792
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3793
  }
3794
  },
3795
  "skipped": [
@@ -3801,5 +5616,6 @@
3801
  "btx-e003-2s-EG-rnn-s1.b2a4@step61422.recurrent.pt",
3802
  "local file not on hub"
3803
  ]
3804
- ]
3805
- }
 
 
3790
  "default": false
3791
  }
3792
  ]
3793
+ },
3794
+ "mini-beatrix-3": {
3795
+ "rows": [
3796
+ {
3797
+ "path": "mini-beatrix-3/arm_refit/group/gXA_close8",
3798
+ "step": 245674,
3799
+ "name": "stages-1-8",
3800
+ "group": "arm sets",
3801
+ "kind": "arm-set",
3802
+ "family": "set",
3803
+ "run": "gXA",
3804
+ "close": 8,
3805
+ "title": "Arm set · stages 1–8, on together · seed A",
3806
+ "status": "two seeds · the packaged set",
3807
+ "rank": 1,
3808
+ "what": "The four arms of stages 1–4 held fixed and on, then a new arm for each of stages 5–8 fitted over them one after another, 4,000 steps each, each kept quiet on web text and on the other arms' stage text. Packaged as stages-1-8 in mini-beatrix-3.",
3809
+ "score": "stage text, arms off → set on: perspective .554→.049 · concepts .721→.110 · rules .930→.224 · arithmetic 1.234→.328 · causal .660→.043 · try-fail .673→.055 · mixed .783→.720 · register .491→.021 · web text +0.0019",
3810
+ "mount": {
3811
+ "type": "program",
3812
+ "members": [
3813
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s1_perspective.safetensors",
3814
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s2_concept.safetensors",
3815
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s3_rules.safetensors",
3816
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s4_arith.safetensors",
3817
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s5_causal.safetensors",
3818
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s6_tryfail.safetensors",
3819
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s7_mixed.safetensors",
3820
+ "mini-beatrix-3/arm_refit/group/anchors/gXA_close8_s8_register.safetensors"
3821
+ ]
3822
+ },
3823
+ "mount_key": "mini-beatrix-3/arm_refit/group/gXA_close8",
3824
+ "members": [
3825
+ "s1_perspective",
3826
+ "s2_concept",
3827
+ "s3_rules",
3828
+ "s4_arith",
3829
+ "s5_causal",
3830
+ "s6_tryfail",
3831
+ "s7_mixed",
3832
+ "s8_register"
3833
+ ],
3834
+ "live": [
3835
+ "s1_perspective",
3836
+ "s2_concept",
3837
+ "s3_rules",
3838
+ "s4_arith",
3839
+ "s5_causal",
3840
+ "s6_tryfail",
3841
+ "s7_mixed",
3842
+ "s8_register"
3843
+ ],
3844
+ "reads": {
3845
+ "s1_perspective": {
3846
+ "off": 0.5538333013185592,
3847
+ "on": 0.049211667943427066,
3848
+ "alone": 0.05251879489204885
3849
+ },
3850
+ "s2_concept": {
3851
+ "off": 0.7211839326967642,
3852
+ "on": 0.11045867104531781,
3853
+ "alone": 0.35026574371684355
3854
+ },
3855
+ "s3_rules": {
3856
+ "off": 0.9296131361815035,
3857
+ "on": 0.2237152122866791,
3858
+ "alone": 0.8236434891082838
3859
+ },
3860
+ "s4_arith": {
3861
+ "off": 1.2338748670942346,
3862
+ "on": 0.32794756855052143,
3863
+ "alone": 1.126693075548818
3864
+ },
3865
+ "s5_causal": {
3866
+ "off": 0.6604376826115352,
3867
+ "on": 0.04305856436254439,
3868
+ "alone": 0.09109720145841224
3869
+ },
3870
+ "s6_tryfail": {
3871
+ "off": 0.6728212611401647,
3872
+ "on": 0.05483553152977349,
3873
+ "alone": 0.16377145340459293
3874
+ },
3875
+ "s7_mixed": {
3876
+ "off": 0.7829759286650222,
3877
+ "on": 0.719981644980245,
3878
+ "alone": 0.7241658592632068
3879
+ },
3880
+ "s8_register": {
3881
+ "off": 0.4906504977761471,
3882
+ "on": 0.02118320337400121,
3883
+ "alone": 0.06783037737981043
3884
+ }
3885
+ },
3886
+ "web": 0.0018905407874407892,
3887
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
3888
+ "template": null,
3889
+ "decode": {
3890
+ "temperature": 0.0,
3891
+ "top_p": 1.0,
3892
+ "rep": 1.0,
3893
+ "precision": "fp32",
3894
+ "why": "the sets were measured greedy in fp32"
3895
+ },
3896
+ "params": 109543680,
3897
+ "sites": 32
3898
+ },
3899
+ {
3900
+ "path": "mini-beatrix-3/arm_refit/group/gCA_close9",
3901
+ "step": 245674,
3902
+ "name": "stages-1-8-caption",
3903
+ "group": "arm sets",
3904
+ "kind": "arm-set",
3905
+ "family": "set",
3906
+ "run": "gCA",
3907
+ "close": 9,
3908
+ "title": "Arm set · stages 1–8 + the caption arm (experimental) · seed A",
3909
+ "status": "two seeds · experimental",
3910
+ "rank": 2,
3911
+ "what": "The eight held fixed and on, then a ninth arm fitted over them for 4,000 steps on image captions in a labelled frame (tags, caption, short, attributes, scene, photo, structure, medium, long, rating: one label per line). A prototype for the diffusion line, not a curriculum stage.",
3912
+ "score": "stage text, arms off → set on: perspective .554→.050 · concepts .721→.111 · rules .930→.224 · arithmetic 1.234→.329 · causal .660→.043 · try-fail .673→.055 · mixed .783→.722 · register .491→.022 · captions 1.265→.783 · web text +0.0027",
3913
+ "mount": {
3914
+ "type": "program",
3915
+ "members": [
3916
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s1_perspective.safetensors",
3917
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s2_concept.safetensors",
3918
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s3_rules.safetensors",
3919
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s4_arith.safetensors",
3920
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s5_causal.safetensors",
3921
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s6_tryfail.safetensors",
3922
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s7_mixed.safetensors",
3923
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s8_register.safetensors",
3924
+ "mini-beatrix-3/arm_refit/group/anchors/gCA_close9_s9_caption.safetensors"
3925
+ ]
3926
+ },
3927
+ "mount_key": "mini-beatrix-3/arm_refit/group/gCA_close9",
3928
+ "members": [
3929
+ "s1_perspective",
3930
+ "s2_concept",
3931
+ "s3_rules",
3932
+ "s4_arith",
3933
+ "s5_causal",
3934
+ "s6_tryfail",
3935
+ "s7_mixed",
3936
+ "s8_register",
3937
+ "s9_caption"
3938
+ ],
3939
+ "live": [
3940
+ "s1_perspective",
3941
+ "s2_concept",
3942
+ "s3_rules",
3943
+ "s4_arith",
3944
+ "s5_causal",
3945
+ "s6_tryfail",
3946
+ "s7_mixed",
3947
+ "s8_register",
3948
+ "s9_caption"
3949
+ ],
3950
+ "reads": {
3951
+ "s1_perspective": {
3952
+ "off": 0.5538333013185592,
3953
+ "on": 0.04959379525484903,
3954
+ "alone": 0.05251879489204885
3955
+ },
3956
+ "s2_concept": {
3957
+ "off": 0.7211839326967642,
3958
+ "on": 0.111269350234979,
3959
+ "alone": 0.35026574371684355
3960
+ },
3961
+ "s3_rules": {
3962
+ "off": 0.9296131361815035,
3963
+ "on": 0.22448037384928343,
3964
+ "alone": 0.8236434891082838
3965
+ },
3966
+ "s4_arith": {
3967
+ "off": 1.2338748670942346,
3968
+ "on": 0.328711851389269,
3969
+ "alone": 1.126693075548818
3970
+ },
3971
+ "s5_causal": {
3972
+ "off": 0.6604376826115352,
3973
+ "on": 0.043431814413230005,
3974
+ "alone": 0.09109720145841224
3975
+ },
3976
+ "s6_tryfail": {
3977
+ "off": 0.6728212611401647,
3978
+ "on": 0.0550433322549074,
3979
+ "alone": 0.16377145340459293
3980
+ },
3981
+ "s7_mixed": {
3982
+ "off": 0.7829759286650222,
3983
+ "on": 0.7218170545791686,
3984
+ "alone": 0.7241658592632068
3985
+ },
3986
+ "s8_register": {
3987
+ "off": 0.4906504977761471,
3988
+ "on": 0.02167318429763465,
3989
+ "alone": 0.06783037737981043
3990
+ },
3991
+ "s9_caption": {
3992
+ "off": 1.2648128906514393,
3993
+ "on": 0.7829180887497539,
3994
+ "alone": 0.7850811467964025
3995
+ }
3996
+ },
3997
+ "web": 0.002653240848354624,
3998
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
3999
+ "template": null,
4000
+ "decode": {
4001
+ "temperature": 0.0,
4002
+ "top_p": 1.0,
4003
+ "rep": 1.0,
4004
+ "precision": "fp32",
4005
+ "why": "the sets were measured greedy in fp32"
4006
+ },
4007
+ "params": 123236640,
4008
+ "sites": 32
4009
+ },
4010
+ {
4011
+ "path": "mini-beatrix-3/arm_refit/group/gRA_close4",
4012
+ "step": 245674,
4013
+ "name": "stages-1-4",
4014
+ "group": "arm sets",
4015
+ "kind": "arm-set",
4016
+ "family": "set",
4017
+ "run": "gRA",
4018
+ "close": 4,
4019
+ "title": "Arm set · stages 1–4, on together · seed A",
4020
+ "status": "two seeds · the packaged set",
4021
+ "rank": 3,
4022
+ "what": "The arms of stages 1 and 2 from a co-trained run held fixed, then new arms for stages 3 and 4 fitted over them one after the other, 800 steps each, each kept quiet on web text and on the other arms' stage text. Packaged as stages-1-4 in mini-beatrix-3.",
4023
+ "score": "stage text, arms off → set on: perspective .554→.048 · concepts .721→.112 · rules .930→.224 · arithmetic 1.234→.338 · web text +0.0017",
4024
+ "mount": {
4025
+ "type": "program",
4026
+ "members": [
4027
+ "mini-beatrix-3/arm_refit/group/anchors/gRA_close4_s1_perspective.safetensors",
4028
+ "mini-beatrix-3/arm_refit/group/anchors/gRA_close4_s2_concept.safetensors",
4029
+ "mini-beatrix-3/arm_refit/group/anchors/gRA_close4_s3_rules.safetensors",
4030
+ "mini-beatrix-3/arm_refit/group/anchors/gRA_close4_s4_arith.safetensors"
4031
+ ]
4032
+ },
4033
+ "mount_key": "mini-beatrix-3/arm_refit/group/gRA_close4",
4034
+ "members": [
4035
+ "s1_perspective",
4036
+ "s2_concept",
4037
+ "s3_rules",
4038
+ "s4_arith"
4039
+ ],
4040
+ "live": [
4041
+ "s1_perspective",
4042
+ "s2_concept",
4043
+ "s3_rules",
4044
+ "s4_arith"
4045
+ ],
4046
+ "reads": {
4047
+ "s1_perspective": {
4048
+ "off": 0.5538333013185592,
4049
+ "on": 0.04815859600255551,
4050
+ "alone": 0.05251879489204885
4051
+ },
4052
+ "s2_concept": {
4053
+ "off": 0.7211839326967642,
4054
+ "on": 0.1122730718885469,
4055
+ "alone": 0.35026574371684355
4056
+ },
4057
+ "s3_rules": {
4058
+ "off": 0.9296131361815035,
4059
+ "on": 0.22363961516270922,
4060
+ "alone": 0.8236434891082838
4061
+ },
4062
+ "s4_arith": {
4063
+ "off": 1.2338748670942346,
4064
+ "on": 0.33837794280053096,
4065
+ "alone": 1.126693075548818
4066
+ }
4067
+ },
4068
+ "web": 0.001714742271511971,
4069
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4070
+ "template": null,
4071
+ "decode": {
4072
+ "temperature": 0.0,
4073
+ "top_p": 1.0,
4074
+ "rep": 1.0,
4075
+ "precision": "fp32",
4076
+ "why": "the sets were measured greedy in fp32"
4077
+ },
4078
+ "params": 54771840,
4079
+ "sites": 32
4080
+ },
4081
+ {
4082
+ "path": "mini-beatrix-3/arm_refit/group/gXB_close8",
4083
+ "step": 245674,
4084
+ "name": "stages-1-8 (seed B)",
4085
+ "group": "arm sets",
4086
+ "kind": "arm-set",
4087
+ "family": "set",
4088
+ "run": "gXB",
4089
+ "close": 8,
4090
+ "title": "Arm set · stages 1–8, on together · seed B",
4091
+ "status": "two seeds",
4092
+ "rank": 4,
4093
+ "what": "The second seed of the stages 1–8 set (the arms of stages 5–8 with their own seeds and data order).",
4094
+ "score": "stage text, arms off → set on: perspective .554→.048 · concepts .721→.121 · rules .930→.222 · arithmetic 1.234→.327 · causal .660→.043 · try-fail .673→.054 · mixed .783→.720 · register .491→.021 · web text +0.0010",
4095
+ "mount": {
4096
+ "type": "program",
4097
+ "members": [
4098
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s1_perspective.safetensors",
4099
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s2_concept.safetensors",
4100
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s3_rules.safetensors",
4101
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s4_arith.safetensors",
4102
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s5_causal.safetensors",
4103
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s6_tryfail.safetensors",
4104
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s7_mixed.safetensors",
4105
+ "mini-beatrix-3/arm_refit/group/anchors/gXB_close8_s8_register.safetensors"
4106
+ ]
4107
+ },
4108
+ "mount_key": "mini-beatrix-3/arm_refit/group/gXB_close8",
4109
+ "members": [
4110
+ "s1_perspective",
4111
+ "s2_concept",
4112
+ "s3_rules",
4113
+ "s4_arith",
4114
+ "s5_causal",
4115
+ "s6_tryfail",
4116
+ "s7_mixed",
4117
+ "s8_register"
4118
+ ],
4119
+ "live": [
4120
+ "s1_perspective",
4121
+ "s2_concept",
4122
+ "s3_rules",
4123
+ "s4_arith",
4124
+ "s5_causal",
4125
+ "s6_tryfail",
4126
+ "s7_mixed",
4127
+ "s8_register"
4128
+ ],
4129
+ "reads": {
4130
+ "s1_perspective": {
4131
+ "off": 0.5538333013185592,
4132
+ "on": 0.048373615296375044,
4133
+ "alone": 0.05217516482213097
4134
+ },
4135
+ "s2_concept": {
4136
+ "off": 0.7211839326967642,
4137
+ "on": 0.12122929684668586,
4138
+ "alone": 0.36033454325401637
4139
+ },
4140
+ "s3_rules": {
4141
+ "off": 0.9296131361815035,
4142
+ "on": 0.22223428311624405,
4143
+ "alone": 0.8701872076558641
4144
+ },
4145
+ "s4_arith": {
4146
+ "off": 1.2338748670942346,
4147
+ "on": 0.3266083503971684,
4148
+ "alone": 1.1550061816504822
4149
+ },
4150
+ "s5_causal": {
4151
+ "off": 0.6604376826115352,
4152
+ "on": 0.042796246816605044,
4153
+ "alone": 0.1417724646021276
4154
+ },
4155
+ "s6_tryfail": {
4156
+ "off": 0.6728212611401647,
4157
+ "on": 0.05430685618921398,
4158
+ "alone": 0.14373820614727262
4159
+ },
4160
+ "s7_mixed": {
4161
+ "off": 0.7829759286650222,
4162
+ "on": 0.7197570947572544,
4163
+ "alone": 0.7253837275330026
4164
+ },
4165
+ "s8_register": {
4166
+ "off": 0.4906504977761471,
4167
+ "on": 0.020783710349540914,
4168
+ "alone": 0.05160327413789158
4169
+ }
4170
+ },
4171
+ "web": 0.0010273276160133182,
4172
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4173
+ "template": null,
4174
+ "decode": {
4175
+ "temperature": 0.0,
4176
+ "top_p": 1.0,
4177
+ "rep": 1.0,
4178
+ "precision": "fp32",
4179
+ "why": "the sets were measured greedy in fp32"
4180
+ },
4181
+ "params": 109543680,
4182
+ "sites": 32
4183
+ },
4184
+ {
4185
+ "path": "mini-beatrix-3/arm_refit/group/gCB_close9",
4186
+ "step": 245674,
4187
+ "name": "stages-1-8-caption (seed B)",
4188
+ "group": "arm sets",
4189
+ "kind": "arm-set",
4190
+ "family": "set",
4191
+ "run": "gCB",
4192
+ "close": 9,
4193
+ "title": "Arm set · stages 1–8 + the caption arm · seed B",
4194
+ "status": "two seeds · experimental",
4195
+ "rank": 5,
4196
+ "what": "The second seed of the caption set.",
4197
+ "score": "stage text, arms off → set on: perspective .554→.049 · concepts .721→.122 · rules .930→.223 · arithmetic 1.234→.327 · causal .660→.043 · try-fail .673→.055 · mixed .783→.722 · register .491→.021 · captions 1.265→.779 · web text +0.0017",
4198
+ "mount": {
4199
+ "type": "program",
4200
+ "members": [
4201
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s1_perspective.safetensors",
4202
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s2_concept.safetensors",
4203
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s3_rules.safetensors",
4204
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s4_arith.safetensors",
4205
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s5_causal.safetensors",
4206
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s6_tryfail.safetensors",
4207
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s7_mixed.safetensors",
4208
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s8_register.safetensors",
4209
+ "mini-beatrix-3/arm_refit/group/anchors/gCB_close9_s9_caption.safetensors"
4210
+ ]
4211
+ },
4212
+ "mount_key": "mini-beatrix-3/arm_refit/group/gCB_close9",
4213
+ "members": [
4214
+ "s1_perspective",
4215
+ "s2_concept",
4216
+ "s3_rules",
4217
+ "s4_arith",
4218
+ "s5_causal",
4219
+ "s6_tryfail",
4220
+ "s7_mixed",
4221
+ "s8_register",
4222
+ "s9_caption"
4223
+ ],
4224
+ "live": [
4225
+ "s1_perspective",
4226
+ "s2_concept",
4227
+ "s3_rules",
4228
+ "s4_arith",
4229
+ "s5_causal",
4230
+ "s6_tryfail",
4231
+ "s7_mixed",
4232
+ "s8_register",
4233
+ "s9_caption"
4234
+ ],
4235
+ "reads": {
4236
+ "s1_perspective": {
4237
+ "off": 0.5538333013185592,
4238
+ "on": 0.04877186900444792,
4239
+ "alone": 0.05217516482213097
4240
+ },
4241
+ "s2_concept": {
4242
+ "off": 0.7211839326967642,
4243
+ "on": 0.12184493024328064,
4244
+ "alone": 0.36033454325401637
4245
+ },
4246
+ "s3_rules": {
4247
+ "off": 0.9296131361815035,
4248
+ "on": 0.2225047903282199,
4249
+ "alone": 0.8701872076558641
4250
+ },
4251
+ "s4_arith": {
4252
+ "off": 1.2338748670942346,
4253
+ "on": 0.32716468740042043,
4254
+ "alone": 1.1550061816504822
4255
+ },
4256
+ "s5_causal": {
4257
+ "off": 0.6604376826115352,
4258
+ "on": 0.04308597712065818,
4259
+ "alone": 0.1417724646021276
4260
+ },
4261
+ "s6_tryfail": {
4262
+ "off": 0.6728212611401647,
4263
+ "on": 0.054676336729532454,
4264
+ "alone": 0.14373820614727262
4265
+ },
4266
+ "s7_mixed": {
4267
+ "off": 0.7829759286650222,
4268
+ "on": 0.7215182454722101,
4269
+ "alone": 0.7253837275330026
4270
+ },
4271
+ "s8_register": {
4272
+ "off": 0.4906504977761471,
4273
+ "on": 0.02129359624959004,
4274
+ "alone": 0.05160327413789158
4275
+ },
4276
+ "s9_caption": {
4277
+ "off": 1.2648128906514393,
4278
+ "on": 0.7794967841315616,
4279
+ "alone": 0.7818745625178125
4280
+ }
4281
+ },
4282
+ "web": 0.0016882354454477305,
4283
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4284
+ "template": null,
4285
+ "decode": {
4286
+ "temperature": 0.0,
4287
+ "top_p": 1.0,
4288
+ "rep": 1.0,
4289
+ "precision": "fp32",
4290
+ "why": "the sets were measured greedy in fp32"
4291
+ },
4292
+ "params": 123236640,
4293
+ "sites": 32
4294
+ },
4295
+ {
4296
+ "path": "mini-beatrix-3/arm_refit/group/gRB_close4",
4297
+ "step": 245674,
4298
+ "name": "stages-1-4 (seed B)",
4299
+ "group": "arm sets",
4300
+ "kind": "arm-set",
4301
+ "family": "set",
4302
+ "run": "gRB",
4303
+ "close": 4,
4304
+ "title": "Arm set · stages 1–4, on together · seed B",
4305
+ "status": "two seeds",
4306
+ "rank": 6,
4307
+ "what": "The second seed of the stages 1–4 set.",
4308
+ "score": "stage text, arms off → set on: perspective .554→.048 · concepts .721→.121 · rules .930→.222 · arithmetic 1.234→.338 · web text +0.0011",
4309
+ "mount": {
4310
+ "type": "program",
4311
+ "members": [
4312
+ "mini-beatrix-3/arm_refit/group/anchors/gRB_close4_s1_perspective.safetensors",
4313
+ "mini-beatrix-3/arm_refit/group/anchors/gRB_close4_s2_concept.safetensors",
4314
+ "mini-beatrix-3/arm_refit/group/anchors/gRB_close4_s3_rules.safetensors",
4315
+ "mini-beatrix-3/arm_refit/group/anchors/gRB_close4_s4_arith.safetensors"
4316
+ ]
4317
+ },
4318
+ "mount_key": "mini-beatrix-3/arm_refit/group/gRB_close4",
4319
+ "members": [
4320
+ "s1_perspective",
4321
+ "s2_concept",
4322
+ "s3_rules",
4323
+ "s4_arith"
4324
+ ],
4325
+ "live": [
4326
+ "s1_perspective",
4327
+ "s2_concept",
4328
+ "s3_rules",
4329
+ "s4_arith"
4330
+ ],
4331
+ "reads": {
4332
+ "s1_perspective": {
4333
+ "off": 0.5538333013185592,
4334
+ "on": 0.047862855039216154,
4335
+ "alone": 0.05217516482213097
4336
+ },
4337
+ "s2_concept": {
4338
+ "off": 0.7211839326967642,
4339
+ "on": 0.12117190301141822,
4340
+ "alone": 0.36033454325401637
4341
+ },
4342
+ "s3_rules": {
4343
+ "off": 0.9296131361815035,
4344
+ "on": 0.22223902876251628,
4345
+ "alone": 0.8701872076558641
4346
+ },
4347
+ "s4_arith": {
4348
+ "off": 1.2338748670942346,
4349
+ "on": 0.33787596037663836,
4350
+ "alone": 1.1550061816504822
4351
+ }
4352
+ },
4353
+ "web": 0.0011034729346828115,
4354
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4355
+ "template": null,
4356
+ "decode": {
4357
+ "temperature": 0.0,
4358
+ "top_p": 1.0,
4359
+ "rep": 1.0,
4360
+ "precision": "fp32",
4361
+ "why": "the sets were measured greedy in fp32"
4362
+ },
4363
+ "params": 54771840,
4364
+ "sites": 32
4365
+ },
4366
+ {
4367
+ "path": "mini-beatrix-3/arm_refit/group/gEA_close8",
4368
+ "step": 245674,
4369
+ "name": "eight from scratch",
4370
+ "group": "arm sets",
4371
+ "kind": "arm-set",
4372
+ "family": "set",
4373
+ "run": "gEA",
4374
+ "close": 8,
4375
+ "title": "Arm set · all eight fitted from scratch · seed A",
4376
+ "status": "two seeds · research row",
4377
+ "rank": 7,
4378
+ "what": "All eight arms fitted from scratch, frozen in turn, every arm kept quiet on every other arm's stage text from its first step, 4,000 steps per stage.",
4379
+ "score": "stage text, arms off → set on: perspective .554→.048 · concepts .721→.077 · rules .930→.181 · arithmetic 1.234→.267 · causal .660→.043 · try-fail .673→.055 · mixed .783→.727 · register .491→.021 · web text +0.0012",
4380
+ "mount": {
4381
+ "type": "program",
4382
+ "members": [
4383
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s1_perspective.safetensors",
4384
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s2_concept.safetensors",
4385
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s3_rules.safetensors",
4386
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s4_arith.safetensors",
4387
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s5_causal.safetensors",
4388
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s6_tryfail.safetensors",
4389
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s7_mixed.safetensors",
4390
+ "mini-beatrix-3/arm_refit/group/anchors/gEA_close8_s8_register.safetensors"
4391
+ ]
4392
+ },
4393
+ "mount_key": "mini-beatrix-3/arm_refit/group/gEA_close8",
4394
+ "members": [
4395
+ "s1_perspective",
4396
+ "s2_concept",
4397
+ "s3_rules",
4398
+ "s4_arith",
4399
+ "s5_causal",
4400
+ "s6_tryfail",
4401
+ "s7_mixed",
4402
+ "s8_register"
4403
+ ],
4404
+ "live": [
4405
+ "s1_perspective",
4406
+ "s2_concept",
4407
+ "s3_rules",
4408
+ "s4_arith",
4409
+ "s5_causal",
4410
+ "s6_tryfail",
4411
+ "s7_mixed",
4412
+ "s8_register"
4413
+ ],
4414
+ "reads": {
4415
+ "s1_perspective": {
4416
+ "off": 0.5538333013185592,
4417
+ "on": 0.04782171591578037,
4418
+ "alone": 0.04691673413754267
4419
+ },
4420
+ "s2_concept": {
4421
+ "off": 0.7211839326967642,
4422
+ "on": 0.07664305728712961,
4423
+ "alone": 0.07567364818783051
4424
+ },
4425
+ "s3_rules": {
4426
+ "off": 0.9296131361815035,
4427
+ "on": 0.1810846217122526,
4428
+ "alone": 0.18058990286813004
4429
+ },
4430
+ "s4_arith": {
4431
+ "off": 1.2338748670942346,
4432
+ "on": 0.26691530056799195,
4433
+ "alone": 0.2691548452113829
4434
+ },
4435
+ "s5_causal": {
4436
+ "off": 0.6604376826115352,
4437
+ "on": 0.04337998952399491,
4438
+ "alone": 0.04574753796565191
4439
+ },
4440
+ "s6_tryfail": {
4441
+ "off": 0.6728212611401647,
4442
+ "on": 0.05485438983052493,
4443
+ "alone": 0.07609357876388802
4444
+ },
4445
+ "s7_mixed": {
4446
+ "off": 0.7829759286650222,
4447
+ "on": 0.727499721452351,
4448
+ "alone": 0.7315994411963898
4449
+ },
4450
+ "s8_register": {
4451
+ "off": 0.4906504977761471,
4452
+ "on": 0.02117565444411026,
4453
+ "alone": 0.024590816056992
4454
+ }
4455
+ },
4456
+ "web": 0.0012417254881451761,
4457
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4458
+ "template": null,
4459
+ "decode": {
4460
+ "temperature": 0.0,
4461
+ "top_p": 1.0,
4462
+ "rep": 1.0,
4463
+ "precision": "fp32",
4464
+ "why": "the sets were measured greedy in fp32"
4465
+ },
4466
+ "params": 109543680,
4467
+ "sites": 32
4468
+ },
4469
+ {
4470
+ "path": "mini-beatrix-3/arm_refit/group/gEB_close8",
4471
+ "step": 245674,
4472
+ "name": "eight from scratch (seed B)",
4473
+ "group": "arm sets",
4474
+ "kind": "arm-set",
4475
+ "family": "set",
4476
+ "run": "gEB",
4477
+ "close": 8,
4478
+ "title": "Arm set · all eight fitted from scratch · seed B",
4479
+ "status": "two seeds · research row",
4480
+ "rank": 8,
4481
+ "what": "The second seed of the from-scratch eight.",
4482
+ "score": "stage text, arms off → set on: perspective .554→.051 · concepts .721→.076 · rules .930→.181 · arithmetic 1.234→.267 · causal .660→.044 · try-fail .673→.055 · mixed .783→.728 · register .491→.021 · web text +0.0018",
4483
+ "mount": {
4484
+ "type": "program",
4485
+ "members": [
4486
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s1_perspective.safetensors",
4487
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s2_concept.safetensors",
4488
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s3_rules.safetensors",
4489
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s4_arith.safetensors",
4490
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s5_causal.safetensors",
4491
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s6_tryfail.safetensors",
4492
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s7_mixed.safetensors",
4493
+ "mini-beatrix-3/arm_refit/group/anchors/gEB_close8_s8_register.safetensors"
4494
+ ]
4495
+ },
4496
+ "mount_key": "mini-beatrix-3/arm_refit/group/gEB_close8",
4497
+ "members": [
4498
+ "s1_perspective",
4499
+ "s2_concept",
4500
+ "s3_rules",
4501
+ "s4_arith",
4502
+ "s5_causal",
4503
+ "s6_tryfail",
4504
+ "s7_mixed",
4505
+ "s8_register"
4506
+ ],
4507
+ "live": [
4508
+ "s1_perspective",
4509
+ "s2_concept",
4510
+ "s3_rules",
4511
+ "s4_arith",
4512
+ "s5_causal",
4513
+ "s6_tryfail",
4514
+ "s7_mixed",
4515
+ "s8_register"
4516
+ ],
4517
+ "reads": {
4518
+ "s1_perspective": {
4519
+ "off": 0.5538333013185592,
4520
+ "on": 0.05064719369403434,
4521
+ "alone": 0.05044332505661722
4522
+ },
4523
+ "s2_concept": {
4524
+ "off": 0.7211839326967642,
4525
+ "on": 0.07633792378690858,
4526
+ "alone": 0.07537300235990543
4527
+ },
4528
+ "s3_rules": {
4529
+ "off": 0.9296131361815035,
4530
+ "on": 0.18140732028430745,
4531
+ "alone": 0.18155743560983595
4532
+ },
4533
+ "s4_arith": {
4534
+ "off": 1.2338748670942346,
4535
+ "on": 0.26739326722702894,
4536
+ "alone": 0.26888096552711277
4537
+ },
4538
+ "s5_causal": {
4539
+ "off": 0.6604376826115352,
4540
+ "on": 0.043634570873777964,
4541
+ "alone": 0.04677976809492565
4542
+ },
4543
+ "s6_tryfail": {
4544
+ "off": 0.6728212611401647,
4545
+ "on": 0.055141103048308444,
4546
+ "alone": 0.07294846954948744
4547
+ },
4548
+ "s7_mixed": {
4549
+ "off": 0.7829759286650222,
4550
+ "on": 0.7276259943392891,
4551
+ "alone": 0.7293689578889162
4552
+ },
4553
+ "s8_register": {
4554
+ "off": 0.4906504977761471,
4555
+ "on": 0.021085106922045453,
4556
+ "alone": 0.02668958853390469
4557
+ }
4558
+ },
4559
+ "web": 0.0018326793743410896,
4560
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4561
+ "template": null,
4562
+ "decode": {
4563
+ "temperature": 0.0,
4564
+ "top_p": 1.0,
4565
+ "rep": 1.0,
4566
+ "precision": "fp32",
4567
+ "why": "the sets were measured greedy in fp32"
4568
+ },
4569
+ "params": 109543680,
4570
+ "sites": 32
4571
+ },
4572
+ {
4573
+ "path": "mini-beatrix-3/arm_refit/group/gSA_close4",
4574
+ "step": 245674,
4575
+ "name": "four, quiet on each other",
4576
+ "group": "arm sets",
4577
+ "kind": "arm-set",
4578
+ "family": "set",
4579
+ "run": "gSA",
4580
+ "close": 4,
4581
+ "title": "Arm set · four, frozen in turn, each quiet on the others' text · seed A",
4582
+ "status": "two seeds · research row",
4583
+ "rank": 9,
4584
+ "what": "Four arms frozen in turn, each kept quiet on every other arm's stage text from its first step, 800 steps per stage. Each arm also works alone.",
4585
+ "score": "stage text, arms off → set on: perspective .554→.081 · concepts .721→.120 · rules .930→.376 · arithmetic 1.234→.392 · web text +0.0020",
4586
+ "mount": {
4587
+ "type": "program",
4588
+ "members": [
4589
+ "mini-beatrix-3/arm_refit/group/anchors/gSA_close4_s1_perspective.safetensors",
4590
+ "mini-beatrix-3/arm_refit/group/anchors/gSA_close4_s2_concept.safetensors",
4591
+ "mini-beatrix-3/arm_refit/group/anchors/gSA_close4_s3_rules.safetensors",
4592
+ "mini-beatrix-3/arm_refit/group/anchors/gSA_close4_s4_arith.safetensors"
4593
+ ]
4594
+ },
4595
+ "mount_key": "mini-beatrix-3/arm_refit/group/gSA_close4",
4596
+ "members": [
4597
+ "s1_perspective",
4598
+ "s2_concept",
4599
+ "s3_rules",
4600
+ "s4_arith"
4601
+ ],
4602
+ "live": [
4603
+ "s1_perspective",
4604
+ "s2_concept",
4605
+ "s3_rules",
4606
+ "s4_arith"
4607
+ ],
4608
+ "reads": {
4609
+ "s1_perspective": {
4610
+ "off": 0.5538333013185592,
4611
+ "on": 0.08131032448166621,
4612
+ "alone": 0.08115575641781772
4613
+ },
4614
+ "s2_concept": {
4615
+ "off": 0.7211839326967642,
4616
+ "on": 0.12035538312970001,
4617
+ "alone": 0.12445310894988028
4618
+ },
4619
+ "s3_rules": {
4620
+ "off": 0.9296131361815035,
4621
+ "on": 0.3755476824693398,
4622
+ "alone": 0.38051485045758343
4623
+ },
4624
+ "s4_arith": {
4625
+ "off": 1.2338748670942346,
4626
+ "on": 0.39175397043604643,
4627
+ "alone": 0.3967888377824649
4628
+ }
4629
+ },
4630
+ "web": 0.0019989758488097864,
4631
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4632
+ "template": null,
4633
+ "decode": {
4634
+ "temperature": 0.0,
4635
+ "top_p": 1.0,
4636
+ "rep": 1.0,
4637
+ "precision": "fp32",
4638
+ "why": "the sets were measured greedy in fp32"
4639
+ },
4640
+ "params": 54771840,
4641
+ "sites": 32
4642
+ },
4643
+ {
4644
+ "path": "mini-beatrix-3/arm_refit/group/gSB_close4",
4645
+ "step": 245674,
4646
+ "name": "four, quiet on each other (seed B)",
4647
+ "group": "arm sets",
4648
+ "kind": "arm-set",
4649
+ "family": "set",
4650
+ "run": "gSB",
4651
+ "close": 4,
4652
+ "title": "Arm set · four, frozen in turn, each quiet on the others' text · seed B",
4653
+ "status": "two seeds · research row",
4654
+ "rank": 10,
4655
+ "what": "The second seed.",
4656
+ "score": "stage text, arms off → set on: perspective .554→.080 · concepts .721→.120 · rules .930→.376 · arithmetic 1.234→.392 · web text +0.0022",
4657
+ "mount": {
4658
+ "type": "program",
4659
+ "members": [
4660
+ "mini-beatrix-3/arm_refit/group/anchors/gSB_close4_s1_perspective.safetensors",
4661
+ "mini-beatrix-3/arm_refit/group/anchors/gSB_close4_s2_concept.safetensors",
4662
+ "mini-beatrix-3/arm_refit/group/anchors/gSB_close4_s3_rules.safetensors",
4663
+ "mini-beatrix-3/arm_refit/group/anchors/gSB_close4_s4_arith.safetensors"
4664
+ ]
4665
+ },
4666
+ "mount_key": "mini-beatrix-3/arm_refit/group/gSB_close4",
4667
+ "members": [
4668
+ "s1_perspective",
4669
+ "s2_concept",
4670
+ "s3_rules",
4671
+ "s4_arith"
4672
+ ],
4673
+ "live": [
4674
+ "s1_perspective",
4675
+ "s2_concept",
4676
+ "s3_rules",
4677
+ "s4_arith"
4678
+ ],
4679
+ "reads": {
4680
+ "s1_perspective": {
4681
+ "off": 0.5538333013185592,
4682
+ "on": 0.08042484560321708,
4683
+ "alone": 0.08008908508319063
4684
+ },
4685
+ "s2_concept": {
4686
+ "off": 0.7211839326967642,
4687
+ "on": 0.12043002091294555,
4688
+ "alone": 0.1230374566007489
4689
+ },
4690
+ "s3_rules": {
4691
+ "off": 0.9296131361815035,
4692
+ "on": 0.37645924695072,
4693
+ "alone": 0.3801666447086225
4694
+ },
4695
+ "s4_arith": {
4696
+ "off": 1.2338748670942346,
4697
+ "on": 0.3915001025455416,
4698
+ "alone": 0.3959761283913549
4699
+ }
4700
+ },
4701
+ "web": 0.002171506694372244,
4702
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4703
+ "template": null,
4704
+ "decode": {
4705
+ "temperature": 0.0,
4706
+ "top_p": 1.0,
4707
+ "rep": 1.0,
4708
+ "precision": "fp32",
4709
+ "why": "the sets were measured greedy in fp32"
4710
+ },
4711
+ "params": 54771840,
4712
+ "sites": 32
4713
+ },
4714
+ {
4715
+ "path": "mini-beatrix-3/arm_refit/group/gFA_close4",
4716
+ "step": 245674,
4717
+ "name": "four, frozen in turn",
4718
+ "group": "arm sets",
4719
+ "kind": "arm-set",
4720
+ "family": "set",
4721
+ "run": "gFA",
4722
+ "close": 4,
4723
+ "title": "Arm set · four, the earlier arms frozen while the newest trains · seed A",
4724
+ "status": "two seeds · research row",
4725
+ "rank": 11,
4726
+ "what": "Four arms, the earlier ones held fixed while the newest trains, 800 steps per stage. Each arm works alone in part.",
4727
+ "score": "stage text, arms off → set on: perspective .554→.081 · concepts .721→.109 · rules .930→.358 · arithmetic 1.234→.367 · web text +0.0016",
4728
+ "mount": {
4729
+ "type": "program",
4730
+ "members": [
4731
+ "mini-beatrix-3/arm_refit/group/anchors/gFA_close4_s1_perspective.safetensors",
4732
+ "mini-beatrix-3/arm_refit/group/anchors/gFA_close4_s2_concept.safetensors",
4733
+ "mini-beatrix-3/arm_refit/group/anchors/gFA_close4_s3_rules.safetensors",
4734
+ "mini-beatrix-3/arm_refit/group/anchors/gFA_close4_s4_arith.safetensors"
4735
+ ]
4736
+ },
4737
+ "mount_key": "mini-beatrix-3/arm_refit/group/gFA_close4",
4738
+ "members": [
4739
+ "s1_perspective",
4740
+ "s2_concept",
4741
+ "s3_rules",
4742
+ "s4_arith"
4743
+ ],
4744
+ "live": [
4745
+ "s1_perspective",
4746
+ "s2_concept",
4747
+ "s3_rules",
4748
+ "s4_arith"
4749
+ ],
4750
+ "reads": {
4751
+ "s1_perspective": {
4752
+ "off": 0.5538333013185592,
4753
+ "on": 0.08097044108066967,
4754
+ "alone": 0.08089993424008099
4755
+ },
4756
+ "s2_concept": {
4757
+ "off": 0.7211839326967642,
4758
+ "on": 0.10885521632867315,
4759
+ "alone": 0.23095238734534776
4760
+ },
4761
+ "s3_rules": {
4762
+ "off": 0.9296131361815035,
4763
+ "on": 0.357637406521258,
4764
+ "alone": 0.4788150924493114
4765
+ },
4766
+ "s4_arith": {
4767
+ "off": 1.2338748670942346,
4768
+ "on": 0.36695632407946416,
4769
+ "alone": 0.44643810080125335
4770
+ }
4771
+ },
4772
+ "web": 0.0016101123262932948,
4773
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4774
+ "template": null,
4775
+ "decode": {
4776
+ "temperature": 0.0,
4777
+ "top_p": 1.0,
4778
+ "rep": 1.0,
4779
+ "precision": "fp32",
4780
+ "why": "the sets were measured greedy in fp32"
4781
+ },
4782
+ "params": 54771840,
4783
+ "sites": 32
4784
+ },
4785
+ {
4786
+ "path": "mini-beatrix-3/arm_refit/group/gFB_close4",
4787
+ "step": 245674,
4788
+ "name": "four, frozen in turn (seed B)",
4789
+ "group": "arm sets",
4790
+ "kind": "arm-set",
4791
+ "family": "set",
4792
+ "run": "gFB",
4793
+ "close": 4,
4794
+ "title": "Arm set · four, the earlier arms frozen while the newest trains · seed B",
4795
+ "status": "two seeds · research row",
4796
+ "rank": 12,
4797
+ "what": "The second seed.",
4798
+ "score": "stage text, arms off → set on: perspective .554→.080 · concepts .721→.109 · rules .930→.356 · arithmetic 1.234→.367 · web text +0.0018",
4799
+ "mount": {
4800
+ "type": "program",
4801
+ "members": [
4802
+ "mini-beatrix-3/arm_refit/group/anchors/gFB_close4_s1_perspective.safetensors",
4803
+ "mini-beatrix-3/arm_refit/group/anchors/gFB_close4_s2_concept.safetensors",
4804
+ "mini-beatrix-3/arm_refit/group/anchors/gFB_close4_s3_rules.safetensors",
4805
+ "mini-beatrix-3/arm_refit/group/anchors/gFB_close4_s4_arith.safetensors"
4806
+ ]
4807
+ },
4808
+ "mount_key": "mini-beatrix-3/arm_refit/group/gFB_close4",
4809
+ "members": [
4810
+ "s1_perspective",
4811
+ "s2_concept",
4812
+ "s3_rules",
4813
+ "s4_arith"
4814
+ ],
4815
+ "live": [
4816
+ "s1_perspective",
4817
+ "s2_concept",
4818
+ "s3_rules",
4819
+ "s4_arith"
4820
+ ],
4821
+ "reads": {
4822
+ "s1_perspective": {
4823
+ "off": 0.5538333013185592,
4824
+ "on": 0.08034933715780154,
4825
+ "alone": 0.07990232670411268
4826
+ },
4827
+ "s2_concept": {
4828
+ "off": 0.7211839326967642,
4829
+ "on": 0.10922296226272392,
4830
+ "alone": 0.2265888059064517
4831
+ },
4832
+ "s3_rules": {
4833
+ "off": 0.9296131361815035,
4834
+ "on": 0.35550140886983106,
4835
+ "alone": 0.47156215410579966
4836
+ },
4837
+ "s4_arith": {
4838
+ "off": 1.2338748670942346,
4839
+ "on": 0.36746155805034963,
4840
+ "alone": 0.44645017720801855
4841
+ }
4842
+ },
4843
+ "web": 0.0017539543159086901,
4844
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4845
+ "template": null,
4846
+ "decode": {
4847
+ "temperature": 0.0,
4848
+ "top_p": 1.0,
4849
+ "rep": 1.0,
4850
+ "precision": "fp32",
4851
+ "why": "the sets were measured greedy in fp32"
4852
+ },
4853
+ "params": 54771840,
4854
+ "sites": 32
4855
+ },
4856
+ {
4857
+ "path": "mini-beatrix-3/arm_refit/group/gA_close4",
4858
+ "step": 245674,
4859
+ "name": "four, co-trained",
4860
+ "group": "arm sets",
4861
+ "kind": "arm-set",
4862
+ "family": "set",
4863
+ "run": "gA",
4864
+ "close": 4,
4865
+ "title": "Arm set · four, co-trained (every attached arm training) · seed A",
4866
+ "status": "two seeds · research row",
4867
+ "rank": 13,
4868
+ "what": "Four arms attached one stage at a time, each new arm over the earlier ones, every attached arm still training, 800 steps per stage. The set works with every arm on, but it does not divide its work one stage to an arm: the first arm keeps training under every later stage and takes up most of their text.",
4869
+ "score": "stage text, arms off → set on: perspective .554→.048 · concepts .721→.111 · rules .930→.310 · arithmetic 1.234→.464 · web text +0.0009",
4870
+ "mount": {
4871
+ "type": "program",
4872
+ "members": [
4873
+ "mini-beatrix-3/arm_refit/group/anchors/gA_close4_s1_perspective.safetensors",
4874
+ "mini-beatrix-3/arm_refit/group/anchors/gA_close4_s2_concept.safetensors",
4875
+ "mini-beatrix-3/arm_refit/group/anchors/gA_close4_s3_rules.safetensors",
4876
+ "mini-beatrix-3/arm_refit/group/anchors/gA_close4_s4_arith.safetensors"
4877
+ ]
4878
+ },
4879
+ "mount_key": "mini-beatrix-3/arm_refit/group/gA_close4",
4880
+ "members": [
4881
+ "s1_perspective",
4882
+ "s2_concept",
4883
+ "s3_rules",
4884
+ "s4_arith"
4885
+ ],
4886
+ "live": [
4887
+ "s1_perspective",
4888
+ "s2_concept",
4889
+ "s3_rules",
4890
+ "s4_arith"
4891
+ ],
4892
+ "reads": {
4893
+ "s1_perspective": {
4894
+ "off": 0.5538333013185592,
4895
+ "on": 0.04810219039572311,
4896
+ "alone": 0.05251879489204885
4897
+ },
4898
+ "s2_concept": {
4899
+ "off": 0.7211839326967642,
4900
+ "on": 0.11126926827449693,
4901
+ "alone": 0.35026574371684355
4902
+ },
4903
+ "s3_rules": {
4904
+ "off": 0.9296131361815035,
4905
+ "on": 0.3101908704224312,
4906
+ "alone": 0.9002206024695304
4907
+ },
4908
+ "s4_arith": {
4909
+ "off": 1.2338748670942346,
4910
+ "on": 0.46378667334993046,
4911
+ "alone": 1.2284806419988383
4912
+ }
4913
+ },
4914
+ "web": 0.0009262770597157494,
4915
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4916
+ "template": null,
4917
+ "decode": {
4918
+ "temperature": 0.0,
4919
+ "top_p": 1.0,
4920
+ "rep": 1.0,
4921
+ "precision": "fp32",
4922
+ "why": "the sets were measured greedy in fp32"
4923
+ },
4924
+ "params": 54771840,
4925
+ "sites": 32
4926
+ },
4927
+ {
4928
+ "path": "mini-beatrix-3/arm_refit/group/gB_close4",
4929
+ "step": 245674,
4930
+ "name": "four, co-trained (seed B)",
4931
+ "group": "arm sets",
4932
+ "kind": "arm-set",
4933
+ "family": "set",
4934
+ "run": "gB",
4935
+ "close": 4,
4936
+ "title": "Arm set · four, co-trained (every attached arm training) · seed B",
4937
+ "status": "two seeds · research row",
4938
+ "rank": 14,
4939
+ "what": "The second seed.",
4940
+ "score": "stage text, arms off → set on: perspective .554→.048 · concepts .721→.121 · rules .930→.309 · arithmetic 1.234→.490 · web text +0.0008",
4941
+ "mount": {
4942
+ "type": "program",
4943
+ "members": [
4944
+ "mini-beatrix-3/arm_refit/group/anchors/gB_close4_s1_perspective.safetensors",
4945
+ "mini-beatrix-3/arm_refit/group/anchors/gB_close4_s2_concept.safetensors",
4946
+ "mini-beatrix-3/arm_refit/group/anchors/gB_close4_s3_rules.safetensors",
4947
+ "mini-beatrix-3/arm_refit/group/anchors/gB_close4_s4_arith.safetensors"
4948
+ ]
4949
+ },
4950
+ "mount_key": "mini-beatrix-3/arm_refit/group/gB_close4",
4951
+ "members": [
4952
+ "s1_perspective",
4953
+ "s2_concept",
4954
+ "s3_rules",
4955
+ "s4_arith"
4956
+ ],
4957
+ "live": [
4958
+ "s1_perspective",
4959
+ "s2_concept",
4960
+ "s3_rules",
4961
+ "s4_arith"
4962
+ ],
4963
+ "reads": {
4964
+ "s1_perspective": {
4965
+ "off": 0.5538333013185592,
4966
+ "on": 0.04774676607807653,
4967
+ "alone": 0.05217516482213097
4968
+ },
4969
+ "s2_concept": {
4970
+ "off": 0.7211839326967642,
4971
+ "on": 0.12105901118088586,
4972
+ "alone": 0.36033454325401637
4973
+ },
4974
+ "s3_rules": {
4975
+ "off": 0.9296131361815035,
4976
+ "on": 0.30863669814056,
4977
+ "alone": 0.9003206963723325
4978
+ },
4979
+ "s4_arith": {
4980
+ "off": 1.2338748670942346,
4981
+ "on": 0.4896058052868545,
4982
+ "alone": 1.2247594533821196
4983
+ }
4984
+ },
4985
+ "web": 0.0008299990219795828,
4986
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
4987
+ "template": null,
4988
+ "decode": {
4989
+ "temperature": 0.0,
4990
+ "top_p": 1.0,
4991
+ "rep": 1.0,
4992
+ "precision": "fp32",
4993
+ "why": "the sets were measured greedy in fp32"
4994
+ },
4995
+ "params": 54771840,
4996
+ "sites": 32
4997
+ },
4998
+ {
4999
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s1_perspective_fresh_seed1_d20261005_step4000.safetensors",
5000
+ "step": 245674,
5001
+ "name": "solo s1_perspective seed A",
5002
+ "group": "solo arms",
5003
+ "kind": "solo",
5004
+ "family": "solo",
5005
+ "title": "Solo arm · stage 1: perspective · seed A",
5006
+ "status": "two seeds · one at a time · packaged",
5007
+ "rank": 102,
5008
+ "what": "one small event retold from each side: seen from a person, said to them, told about them. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5009
+ "score": "own stage text .554 → .047 · web text +0.0003",
5010
+ "probe_stage": "perspective",
5011
+ "mount": {
5012
+ "type": "anchor"
5013
+ },
5014
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5015
+ "template": null,
5016
+ "decode": {
5017
+ "temperature": 0.0,
5018
+ "top_p": 1.0,
5019
+ "rep": 1.0,
5020
+ "precision": "fp32",
5021
+ "why": "the solo arms were measured greedy in fp32"
5022
+ },
5023
+ "params": 13692960,
5024
+ "sites": 32
5025
+ },
5026
+ {
5027
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s1_perspective_fresh_seed101_d20261006_step4000.safetensors",
5028
+ "step": 245674,
5029
+ "name": "solo s1_perspective seed B",
5030
+ "group": "solo arms",
5031
+ "kind": "solo",
5032
+ "family": "solo",
5033
+ "title": "Solo arm · stage 1: perspective · seed B",
5034
+ "status": "two seeds · one at a time",
5035
+ "rank": 103,
5036
+ "what": "one small event retold from each side: seen from a person, said to them, told about them. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5037
+ "score": "own stage text .554 → .047 · web text +0.0003",
5038
+ "probe_stage": "perspective",
5039
+ "mount": {
5040
+ "type": "anchor"
5041
+ },
5042
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5043
+ "template": null,
5044
+ "decode": {
5045
+ "temperature": 0.0,
5046
+ "top_p": 1.0,
5047
+ "rep": 1.0,
5048
+ "precision": "fp32",
5049
+ "why": "the solo arms were measured greedy in fp32"
5050
+ },
5051
+ "params": 13692960,
5052
+ "sites": 32
5053
+ },
5054
+ {
5055
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s2_concept_fresh_seed2_d20261005_step4000.safetensors",
5056
+ "step": 245674,
5057
+ "name": "solo s2_concept seed A",
5058
+ "group": "solo arms",
5059
+ "kind": "solo",
5060
+ "family": "solo",
5061
+ "title": "Solo arm · stage 2: concepts · seed A",
5062
+ "status": "two seeds · one at a time · packaged",
5063
+ "rank": 104,
5064
+ "what": "kinds, properties and differences: what a thing is a kind of, what its kind can do, how two things differ. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5065
+ "score": "own stage text .721 → .075 · web text +0.0001",
5066
+ "probe_stage": "concept",
5067
+ "mount": {
5068
+ "type": "anchor"
5069
+ },
5070
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5071
+ "template": null,
5072
+ "decode": {
5073
+ "temperature": 0.0,
5074
+ "top_p": 1.0,
5075
+ "rep": 1.0,
5076
+ "precision": "fp32",
5077
+ "why": "the solo arms were measured greedy in fp32"
5078
+ },
5079
+ "params": 13692960,
5080
+ "sites": 32
5081
+ },
5082
+ {
5083
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s2_concept_fresh_seed102_d20261006_step4000.safetensors",
5084
+ "step": 245674,
5085
+ "name": "solo s2_concept seed B",
5086
+ "group": "solo arms",
5087
+ "kind": "solo",
5088
+ "family": "solo",
5089
+ "title": "Solo arm · stage 2: concepts · seed B",
5090
+ "status": "two seeds · one at a time",
5091
+ "rank": 105,
5092
+ "what": "kinds, properties and differences: what a thing is a kind of, what its kind can do, how two things differ. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5093
+ "score": "own stage text .721 → .075 · web text +0.0000",
5094
+ "probe_stage": "concept",
5095
+ "mount": {
5096
+ "type": "anchor"
5097
+ },
5098
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5099
+ "template": null,
5100
+ "decode": {
5101
+ "temperature": 0.0,
5102
+ "top_p": 1.0,
5103
+ "rep": 1.0,
5104
+ "precision": "fp32",
5105
+ "why": "the solo arms were measured greedy in fp32"
5106
+ },
5107
+ "params": 13692960,
5108
+ "sites": 32
5109
+ },
5110
+ {
5111
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s3_rules_fresh_seed3_d20261005_step4000.safetensors",
5112
+ "step": 245674,
5113
+ "name": "solo s3_rules seed A",
5114
+ "group": "solo arms",
5115
+ "kind": "solo",
5116
+ "family": "solo",
5117
+ "title": "Solo arm · stage 3: rule chains · seed A",
5118
+ "status": "two seeds · one at a time · packaged",
5119
+ "rank": 106,
5120
+ "what": "if-then rules over made-up words, followed step by step to what follows. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5121
+ "score": "own stage text .930 → .180 · web text +0.0003",
5122
+ "probe_stage": "rules",
5123
+ "mount": {
5124
+ "type": "anchor"
5125
+ },
5126
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5127
+ "template": null,
5128
+ "decode": {
5129
+ "temperature": 0.0,
5130
+ "top_p": 1.0,
5131
+ "rep": 1.0,
5132
+ "precision": "fp32",
5133
+ "why": "the solo arms were measured greedy in fp32"
5134
+ },
5135
+ "params": 13692960,
5136
+ "sites": 32
5137
+ },
5138
+ {
5139
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s3_rules_fresh_seed103_d20261006_step4000.safetensors",
5140
+ "step": 245674,
5141
+ "name": "solo s3_rules seed B",
5142
+ "group": "solo arms",
5143
+ "kind": "solo",
5144
+ "family": "solo",
5145
+ "title": "Solo arm · stage 3: rule chains · seed B",
5146
+ "status": "two seeds · one at a time",
5147
+ "rank": 107,
5148
+ "what": "if-then rules over made-up words, followed step by step to what follows. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5149
+ "score": "own stage text .930 → .179 · web text +0.0005",
5150
+ "probe_stage": "rules",
5151
+ "mount": {
5152
+ "type": "anchor"
5153
+ },
5154
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5155
+ "template": null,
5156
+ "decode": {
5157
+ "temperature": 0.0,
5158
+ "top_p": 1.0,
5159
+ "rep": 1.0,
5160
+ "precision": "fp32",
5161
+ "why": "the solo arms were measured greedy in fp32"
5162
+ },
5163
+ "params": 13692960,
5164
+ "sites": 32
5165
+ },
5166
+ {
5167
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s4_arith_fresh_seed4_d20261005_step4000.safetensors",
5168
+ "step": 245674,
5169
+ "name": "solo s4_arith seed A",
5170
+ "group": "solo arms",
5171
+ "kind": "solo",
5172
+ "family": "solo",
5173
+ "title": "Solo arm · stage 4: arithmetic · seed A",
5174
+ "status": "two seeds · one at a time · packaged",
5175
+ "rank": 108,
5176
+ "what": "small arithmetic worked out in text. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5177
+ "score": "own stage text 1.234 → .267 · web text +0.0002",
5178
+ "probe_stage": "arith",
5179
+ "mount": {
5180
+ "type": "anchor"
5181
+ },
5182
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5183
+ "template": null,
5184
+ "decode": {
5185
+ "temperature": 0.0,
5186
+ "top_p": 1.0,
5187
+ "rep": 1.0,
5188
+ "precision": "fp32",
5189
+ "why": "the solo arms were measured greedy in fp32"
5190
+ },
5191
+ "params": 13692960,
5192
+ "sites": 32
5193
+ },
5194
+ {
5195
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s4_arith_fresh_seed104_d20261006_step4000.safetensors",
5196
+ "step": 245674,
5197
+ "name": "solo s4_arith seed B",
5198
+ "group": "solo arms",
5199
+ "kind": "solo",
5200
+ "family": "solo",
5201
+ "title": "Solo arm · stage 4: arithmetic · seed B",
5202
+ "status": "two seeds · one at a time",
5203
+ "rank": 109,
5204
+ "what": "small arithmetic worked out in text. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5205
+ "score": "own stage text 1.234 → .267 · web text +0.0003",
5206
+ "probe_stage": "arith",
5207
+ "mount": {
5208
+ "type": "anchor"
5209
+ },
5210
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5211
+ "template": null,
5212
+ "decode": {
5213
+ "temperature": 0.0,
5214
+ "top_p": 1.0,
5215
+ "rep": 1.0,
5216
+ "precision": "fp32",
5217
+ "why": "the solo arms were measured greedy in fp32"
5218
+ },
5219
+ "params": 13692960,
5220
+ "sites": 32
5221
+ },
5222
+ {
5223
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s5_causal_fresh_seed5_d20261005_step4000.safetensors",
5224
+ "step": 245674,
5225
+ "name": "solo s5_causal seed A",
5226
+ "group": "solo arms",
5227
+ "kind": "solo",
5228
+ "family": "solo",
5229
+ "title": "Solo arm · stage 5: cause and effect · seed A",
5230
+ "status": "two seeds · one at a time · packaged",
5231
+ "rank": 110,
5232
+ "what": "short cause-and-effect text: what happened and why. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5233
+ "score": "own stage text .660 → .043 · web text +0.0006",
5234
+ "probe_stage": "causal",
5235
+ "mount": {
5236
+ "type": "anchor"
5237
+ },
5238
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5239
+ "template": null,
5240
+ "decode": {
5241
+ "temperature": 0.0,
5242
+ "top_p": 1.0,
5243
+ "rep": 1.0,
5244
+ "precision": "fp32",
5245
+ "why": "the solo arms were measured greedy in fp32"
5246
+ },
5247
+ "params": 13692960,
5248
+ "sites": 32
5249
+ },
5250
+ {
5251
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s5_causal_fresh_seed105_d20261006_step4000.safetensors",
5252
+ "step": 245674,
5253
+ "name": "solo s5_causal seed B",
5254
+ "group": "solo arms",
5255
+ "kind": "solo",
5256
+ "family": "solo",
5257
+ "title": "Solo arm · stage 5: cause and effect · seed B",
5258
+ "status": "two seeds · one at a time",
5259
+ "rank": 111,
5260
+ "what": "short cause-and-effect text: what happened and why. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5261
+ "score": "own stage text .660 → .043 · web text +0.0004",
5262
+ "probe_stage": "causal",
5263
+ "mount": {
5264
+ "type": "anchor"
5265
+ },
5266
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5267
+ "template": null,
5268
+ "decode": {
5269
+ "temperature": 0.0,
5270
+ "top_p": 1.0,
5271
+ "rep": 1.0,
5272
+ "precision": "fp32",
5273
+ "why": "the solo arms were measured greedy in fp32"
5274
+ },
5275
+ "params": 13692960,
5276
+ "sites": 32
5277
+ },
5278
+ {
5279
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s6_tryfail_fresh_seed6_d20261005_step4000.safetensors",
5280
+ "step": 245674,
5281
+ "name": "solo s6_tryfail seed A",
5282
+ "group": "solo arms",
5283
+ "kind": "solo",
5284
+ "family": "solo",
5285
+ "title": "Solo arm · stage 6: try, fail, revise · seed A",
5286
+ "status": "two seeds · one at a time · packaged",
5287
+ "rank": 112,
5288
+ "what": "an attempt, its failure and the revised attempt. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5289
+ "score": "own stage text .673 → .057 · web text +0.0003",
5290
+ "probe_stage": "tryfail",
5291
+ "mount": {
5292
+ "type": "anchor"
5293
+ },
5294
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5295
+ "template": null,
5296
+ "decode": {
5297
+ "temperature": 0.0,
5298
+ "top_p": 1.0,
5299
+ "rep": 1.0,
5300
+ "precision": "fp32",
5301
+ "why": "the solo arms were measured greedy in fp32"
5302
+ },
5303
+ "params": 13692960,
5304
+ "sites": 32
5305
+ },
5306
+ {
5307
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s6_tryfail_fresh_seed106_d20261006_step4000.safetensors",
5308
+ "step": 245674,
5309
+ "name": "solo s6_tryfail seed B",
5310
+ "group": "solo arms",
5311
+ "kind": "solo",
5312
+ "family": "solo",
5313
+ "title": "Solo arm · stage 6: try, fail, revise · seed B",
5314
+ "status": "two seeds · one at a time",
5315
+ "rank": 113,
5316
+ "what": "an attempt, its failure and the revised attempt. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5317
+ "score": "own stage text .673 → .057 · web text +0.0006",
5318
+ "probe_stage": "tryfail",
5319
+ "mount": {
5320
+ "type": "anchor"
5321
+ },
5322
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5323
+ "template": null,
5324
+ "decode": {
5325
+ "temperature": 0.0,
5326
+ "top_p": 1.0,
5327
+ "rep": 1.0,
5328
+ "precision": "fp32",
5329
+ "why": "the solo arms were measured greedy in fp32"
5330
+ },
5331
+ "params": 13692960,
5332
+ "sites": 32
5333
+ },
5334
+ {
5335
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s7_mixed_fresh_seed7_d20261005_step4000.safetensors",
5336
+ "step": 245674,
5337
+ "name": "solo s7_mixed seed A",
5338
+ "group": "solo arms",
5339
+ "kind": "solo",
5340
+ "family": "solo",
5341
+ "title": "Solo arm · stage 7: the mixed stage · seed A",
5342
+ "status": "two seeds · one at a time · packaged",
5343
+ "rank": 114,
5344
+ "what": "the mixed stage's diet: the earlier stages' text beside ordinary prose. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5345
+ "score": "own stage text .783 → .715 · web text +0.0000",
5346
+ "probe_stage": "mixed",
5347
+ "mount": {
5348
+ "type": "anchor"
5349
+ },
5350
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5351
+ "template": null,
5352
+ "decode": {
5353
+ "temperature": 0.0,
5354
+ "top_p": 1.0,
5355
+ "rep": 1.0,
5356
+ "precision": "fp32",
5357
+ "why": "the solo arms were measured greedy in fp32"
5358
+ },
5359
+ "params": 13692960,
5360
+ "sites": 32
5361
+ },
5362
+ {
5363
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s7_mixed_fresh_seed107_d20261006_step4000.safetensors",
5364
+ "step": 245674,
5365
+ "name": "solo s7_mixed seed B",
5366
+ "group": "solo arms",
5367
+ "kind": "solo",
5368
+ "family": "solo",
5369
+ "title": "Solo arm · stage 7: the mixed stage · seed B",
5370
+ "status": "two seeds · one at a time",
5371
+ "rank": 115,
5372
+ "what": "the mixed stage's diet: the earlier stages' text beside ordinary prose. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5373
+ "score": "own stage text .783 → .717 · web text +0.0002",
5374
+ "probe_stage": "mixed",
5375
+ "mount": {
5376
+ "type": "anchor"
5377
+ },
5378
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5379
+ "template": null,
5380
+ "decode": {
5381
+ "temperature": 0.0,
5382
+ "top_p": 1.0,
5383
+ "rep": 1.0,
5384
+ "precision": "fp32",
5385
+ "why": "the solo arms were measured greedy in fp32"
5386
+ },
5387
+ "params": 13692960,
5388
+ "sites": 32
5389
+ },
5390
+ {
5391
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s8_register_fresh_seed8_d20261005_step4000.safetensors",
5392
+ "step": 245674,
5393
+ "name": "solo s8_register seed A",
5394
+ "group": "solo arms",
5395
+ "kind": "solo",
5396
+ "family": "solo",
5397
+ "title": "Solo arm · stage 8: register · seed A",
5398
+ "status": "two seeds · one at a time · packaged",
5399
+ "rank": 116,
5400
+ "what": "the same content in different registers of speech. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5401
+ "score": "own stage text .491 → .021 · web text +0.0003",
5402
+ "probe_stage": "register",
5403
+ "mount": {
5404
+ "type": "anchor"
5405
+ },
5406
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5407
+ "template": null,
5408
+ "decode": {
5409
+ "temperature": 0.0,
5410
+ "top_p": 1.0,
5411
+ "rep": 1.0,
5412
+ "precision": "fp32",
5413
+ "why": "the solo arms were measured greedy in fp32"
5414
+ },
5415
+ "params": 13692960,
5416
+ "sites": 32
5417
+ },
5418
+ {
5419
+ "path": "mini-beatrix-3/arm_refit/solo_4000/anchors/s8_register_fresh_seed108_d20261006_step4000.safetensors",
5420
+ "step": 245674,
5421
+ "name": "solo s8_register seed B",
5422
+ "group": "solo arms",
5423
+ "kind": "solo",
5424
+ "family": "solo",
5425
+ "title": "Solo arm · stage 8: register · seed B",
5426
+ "status": "two seeds · one at a time",
5427
+ "rank": 117,
5428
+ "what": "the same content in different registers of speech. Trained alone on the frozen final core for 4,000 steps, kept quiet on web text; mount one solo arm at a time.",
5429
+ "score": "own stage text .491 → .021 · web text +0.0002",
5430
+ "probe_stage": "register",
5431
+ "mount": {
5432
+ "type": "anchor"
5433
+ },
5434
+ "base_model_id": "alephllm/mini-beatrix-3@step245674",
5435
+ "template": null,
5436
+ "decode": {
5437
+ "temperature": 0.0,
5438
+ "top_p": 1.0,
5439
+ "rep": 1.0,
5440
+ "precision": "fp32",
5441
+ "why": "the solo arms were measured greedy in fp32"
5442
+ },
5443
+ "params": 13692960,
5444
+ "sites": 32
5445
+ }
5446
+ ],
5447
+ "lookup": {
5448
+ "core": {
5449
+ "craft": "mini-beatrix-3",
5450
+ "step": 245674
5451
+ },
5452
+ "crafts": {
5453
+ "mini-beatrix-3-la2-6-12-20": {
5454
+ "order": 5,
5455
+ "short": "first training",
5456
+ "what": "the first training: 4,000 steps from the finished core on web text mixed with far-recall rows (a value planted behind text, asked for later)"
5457
+ },
5458
+ "mini-beatrix-3-la2-6-12-20-c249k": {
5459
+ "order": 4,
5460
+ "short": "continued",
5461
+ "what": "the first training continued 4,000 more steps on the same mix"
5462
+ },
5463
+ "mini-beatrix-3-la2-6-12-20-deep1k": {
5464
+ "order": 3,
5465
+ "short": "deep-mix pilot",
5466
+ "what": "the deep-mix pilot: 1,000 steps at Adam 1e-3 on recall rows laid out to fill the window exactly (one draw in four), distances to 3,600 bytes; the reads peaked at 254,000 and slid after it"
5467
+ },
5468
+ "mini-beatrix-3-la2-6-12-20-deep-ctrl": {
5469
+ "order": 2,
5470
+ "short": "deep mix, one layer (pair control)",
5471
+ "what": "the deep mix at Adam 3e-4 from the pilot's 254,000, one attention layer per site: the depth pair's control"
5472
+ },
5473
+ "mini-beatrix-3-la2-6-12-20-deep-d2": {
5474
+ "order": 1,
5475
+ "short": "deep mix, two layers (pair structure arm)",
5476
+ "what": "the deep mix at Adam 3e-4 from the pilot's 254,000, two attention layers per site (the second born at zero): the depth pair's structure arm"
5477
+ }
5478
+ },
5479
+ "bare": {
5480
+ "fetch_1024": 0.0,
5481
+ "fetch_2048": 0.0,
5482
+ "fetch_3400": 0.0,
5483
+ "trials": 128
5484
+ },
5485
+ "reads": {
5486
+ "mini-beatrix-3-la2-6-12-20": {
5487
+ "246000": {
5488
+ "fetch_1024": 0.0078125,
5489
+ "fetch_2048": 0.0,
5490
+ "fetch_3400": 0.0,
5491
+ "trials": 128,
5492
+ "instrument": "battery"
5493
+ },
5494
+ "247000": {
5495
+ "fetch_1024": 0.015625,
5496
+ "fetch_2048": 0.0078125,
5497
+ "fetch_3400": 0.0,
5498
+ "trials": 128,
5499
+ "instrument": "battery"
5500
+ },
5501
+ "248000": {
5502
+ "fetch_1024": 0.5,
5503
+ "fetch_2048": 0.1875,
5504
+ "fetch_3400": 0.015625,
5505
+ "trials": 128,
5506
+ "instrument": "battery"
5507
+ },
5508
+ "249000": {
5509
+ "fetch_1024": 0.6015625,
5510
+ "fetch_2048": 0.359375,
5511
+ "fetch_3400": 0.109375,
5512
+ "trials": 128,
5513
+ "instrument": "battery"
5514
+ },
5515
+ "249674": {
5516
+ "fetch_1024": 0.6171875,
5517
+ "fetch_2048": 0.3359375,
5518
+ "fetch_3400": 0.1171875,
5519
+ "trials": 128,
5520
+ "instrument": "battery"
5521
+ }
5522
+ },
5523
+ "mini-beatrix-3-la2-6-12-20-c249k": {
5524
+ "250000": {
5525
+ "fetch_1024": 0.625,
5526
+ "fetch_2048": 0.4140625,
5527
+ "fetch_3400": 0.125,
5528
+ "trials": 128,
5529
+ "instrument": "battery"
5530
+ },
5531
+ "251000": {
5532
+ "fetch_1024": 0.7265625,
5533
+ "fetch_2048": 0.5,
5534
+ "fetch_3400": 0.1640625,
5535
+ "trials": 128,
5536
+ "instrument": "battery"
5537
+ },
5538
+ "252000": {
5539
+ "fetch_1024": 0.8203125,
5540
+ "fetch_2048": 0.5390625,
5541
+ "fetch_3400": 0.203125,
5542
+ "trials": 128,
5543
+ "instrument": "battery"
5544
+ },
5545
+ "253000": {
5546
+ "fetch_1024": 0.734375,
5547
+ "fetch_2048": 0.4609375,
5548
+ "fetch_3400": 0.171875,
5549
+ "trials": 128,
5550
+ "instrument": "battery"
5551
+ },
5552
+ "253674": {
5553
+ "fetch_1024": 0.875,
5554
+ "fetch_2048": 0.59375,
5555
+ "fetch_3072": 0.3671875,
5556
+ "fetch_3400": 0.265625,
5557
+ "trials": 128,
5558
+ "instrument": "curve"
5559
+ }
5560
+ },
5561
+ "mini-beatrix-3-la2-6-12-20-deep1k": {
5562
+ "253750": {
5563
+ "fetch_1024": 0.9296875,
5564
+ "fetch_2048": 0.8671875,
5565
+ "fetch_3072": 0.6484375,
5566
+ "fetch_3400": 0.5703125,
5567
+ "trials": 128,
5568
+ "instrument": "curve"
5569
+ },
5570
+ "254000": {
5571
+ "fetch_1024": 0.9765625,
5572
+ "fetch_2048": 0.9375,
5573
+ "fetch_3072": 0.8515625,
5574
+ "fetch_3400": 0.8359375,
5575
+ "trials": 128,
5576
+ "instrument": "curve"
5577
+ },
5578
+ "254500": {
5579
+ "fetch_1024": 0.890625,
5580
+ "fetch_2048": 0.890625,
5581
+ "fetch_3072": 0.765625,
5582
+ "fetch_3400": 0.75,
5583
+ "trials": 128,
5584
+ "instrument": "curve"
5585
+ },
5586
+ "254674": {
5587
+ "fetch_1024": 0.8984375,
5588
+ "fetch_2048": 0.875,
5589
+ "fetch_3072": 0.703125,
5590
+ "fetch_3400": 0.6796875,
5591
+ "trials": 128,
5592
+ "instrument": "curve"
5593
+ }
5594
+ },
5595
+ "mini-beatrix-3-la2-6-12-20-deep-ctrl": {
5596
+ "255000": {
5597
+ "fetch_1024": 0.9609375,
5598
+ "fetch_2048": 0.9453125,
5599
+ "fetch_3072": 0.90625,
5600
+ "fetch_3400": 0.7734375,
5601
+ "trials": 128,
5602
+ "instrument": "curve"
5603
+ }
5604
+ }
5605
+ },
5606
+ "instrument": "the planted value's first byte, fetched from the given distance back (128 planted trials per gap; the dense curve where read, the byte battery otherwise)"
5607
+ }
5608
  }
5609
  },
5610
  "skipped": [
 
5616
  "btx-e003-2s-EG-rnn-s1.b2a4@step61422.recurrent.pt",
5617
  "local file not on hub"
5618
  ]
5619
+ ],
5620
+ "generated_v3": "2026-10-11 22:51 UTC"
5621
+ }
requirements.txt CHANGED
@@ -4,4 +4,4 @@ safetensors>=0.4
4
  huggingface_hub>=0.24
5
  numpy
6
  geolip-alephllm @ git+https://github.com/AbstractEyes/alephllm@c6fff9fa3a9423a18d522635d8f2c666093d64c6
7
- amoe-lora @ git+https://github.com/AbstractEyes/amoe-lora@5c934cfcf3da90f073472d8c63ac6a30127854fd
 
4
  huggingface_hub>=0.24
5
  numpy
6
  geolip-alephllm @ git+https://github.com/AbstractEyes/alephllm@c6fff9fa3a9423a18d522635d8f2c666093d64c6
7
+ amoe-lora @ git+https://github.com/AbstractEyes/amoe-lora@9b1942d0ea865c0119655eb8315e73a2027a7682