TITAN-MoE research log (WP33 UQO)
Chronological, append-only. Times are local (America/Toronto). Every entry names the artifact it produced.
2026-11-01 — Session 1: mandate received, Gate A started
- 13:xx Mandate pasted by the author (verbatim copy in
docs/MANDATE.md). Project placed in the UQO working-paper series as WP33, directoryRecherche-UQO/ia/titan-moe/(series convention; the mandate'swp33_titan_moe/name is kept as the repository namewp33_uqo.giton spbgit — see DECISIONS D-001). - Scaffold created from
_modele-working-paper(UQO LaTeX template, Makefile, .latexmkrc, title pages). Git repo initialised (main). - Python 3.12 venv (
uv): mlx 0.32.4, mlx-lm 0.32.2, numpy 2.5.4 (laptop). Lock file to be written at Gate B. - Reference repositories shallow-cloned into
third_party/(git-ignored) with commit hashes recorded inresearch/prior_art.csv: colibri0a5504a(2026-10-31), mlx-lm736ab0d(2026-10-30), mlxbd63d38(2026-11-01, version header 0.32.5), llama.cppa91eab6(2026-10-31). - Hardware inventory of the MacLustr LAN launched (29 aliases). Results in
artifacts/environment.json(sanitized) andartifacts/private/inventory-2026-11-01.txt(not committed). 7 aliases unreachable at probe time (SSH timeout): M2M32, M2M32b, M4M36, m4ma, m4mb, m4mc, m2m16; M4BP48 answered with an empty record. Treated as unavailable for WP33 unless they come back; not assumed from historical notes. - Literature search delegated to a web-research sub-agent (output →
research/RELATED_WORK.md,research/prior_art.csv,paper/references.bib), to be verified entry by entry before use. - Small open-licensed MoE chosen for Gate B:
mlx-community/OLMoE-1B-7B-0125-Instruct-4bit(Apache-2.0, 3.9 GB, revisione2384419), download started 2026-11-01 (laptop HF cache). - OLMoE-1B-7B-0125-Instruct-4bit downloaded (33 s). Layout read from
model.safetensors(benchmarks/raw/gateA/smoke/): per-expert tensorsmodel.layers.L.mlp.experts.E.{gate,up,down}_proj.{weight,scales,biases}(affine 4-bit, group 64; gate/up weight U32 [1024,256] = 1.05 MB + scales/biases F16 2×64 KB; down [2048,128] = 1.05 MB + 2×64 KB) → 3.375 MiB per expert, 1 024 experts = 3.625 GB; attention 0.151 GB; embeddings/head 0.116 GB (tied). Per decode token: 16 layers × top-8 = 128 experts = 432 MiB of weights touched. - Smoke baseline mlx-lm
generateon the laptop (M5 Max, 48 GB, mlx 0.32.4, mlx-lm 0.32.2, temp 0, 33-token prompt, 85 generated): prompt 45.0 tok/s (includes first-call compilation), generation 493.9 tok/s, peak memory 4.11 GB. Raw:benchmarks/raw/gateA/smoke/mlx_lm_generate_laptop_*.txt. - SSD probe
benchmarks/scripts/ssd_bandwidth.py(single-threadedpread, F_NOCACHE aftersudo purge): laptop random 3.4 MB reads 8.50 GB/s (p50 0.43 ms / chunk, p99 0.49 ms), page-cached 28.4 GB/s, sequential 8 MB reads 11.5 GB/s. Lesson: F_NOCACHE alone does not evict already-cached pages —purgeis mandatory before a cold measurement (first attempt read 37 GB/s = cache). Raw:benchmarks/raw/gateA/ssd/laptop-M5Max.json. - Design microbenchmark for the slot table (
benchmarks/raw/gateB/design/slot_update_microbench_laptop.txt): in-place slot update 0.305 ms; gather_qmm 0.260 ms/layer; per-expert loop 0.428 ms; restack 0.502 ms; lazy mmap expert load 0.53 ms (cached). - Gate B implemented:
titan/registry.py(safetensors byte ranges, routing semantics),titan/store.py(pread SSD tier with accounting),titan/slots.py(LRU/LFU slot tables, stall accounting),titan/moe.py(TitanSwitchGLU, exact row chunking),titan/runtime.py(mlx-lm host model with experts spliced out). Teststests/(7 passed, rawbenchmarks/raw/tests/pytest_gateB_20261101T011805.txt): registry; pread bytes ==mx.loadbytes; logits vs mlx-lm max |Δ| = 0.0 for capacity 64/32/16/8 on 4 prompts (argmax equal); greedy 32-token decode token-identical with 16 slots. First unfused activation attempt gave Δ = 0.0195 (fixed, D-006). - Literature pass completed: 59 verified works →
research/prior_art.csv,paper/references.bib(59 entries), synthesis and novelty matrix inresearch/RELATED_WORK.md.