Commit Graph

76 Commits

Author SHA1 Message Date
m3ultra
58a2a8177d operator: qwen_layered_local — image -> N editable RGBA layers (Qwen-Image-Layered 20B, MLX)
Vendored mflux PR#302 fork (monster/Qwen-Image-Layered-MRP-MLX), tuned
defaults 20 steps/640/baked-q8 (243s m3ultra, 366s m1ultra). Baked-model
resolution via QWEN_LAYERED_MODEL env or per-box paths, HF+q8 fallback.
nodes.json (gitignored, machine-local) updated on m3 to route to m1 too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 22:06:05 +10:00
m3ultra
8849438bce benchmarks: Qwen-Layered cross-bench — m3ultra 243.0s (1.50x vs m1), both Ultras serving from baked q8
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 21:41:28 +10:00
m3ultra
0db2c90481 benchmarks: Qwen-Layered ladder — 20 steps holds quality, 3.2x to 365.6s on m1ultra
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 21:09:37 +10:00
m3ultra
64afe54474 benchmarks: Qwen-Image-Layered working on MLX (m1ultra) — 4-layer RGBA decomposition verified, PR302 fork vendored
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 20:40:02 +10:00
m3ultra
79bfd713c1 docs+benchmarks: vertex baker productionized in both pipelines — 130s e2e, 1s bake, zero dark patches
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 19:17:01 +10:00
m3ultra
232cc84420 bake fix PROVEN: KDTree-IDW vertex sampling kills the dark patches in 0.3s; axis + gamma gotchas documented; production path defined
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 18:07:21 +10:00
m3ultra
5d2a3f57e4 benchmarks: KDTree control post-mortem — 5.85h bake + broken export; fast-rasterizer rewrite required
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 15:52:26 +10:00
m3ultra
142a0ac5da docs: packet — trellis-2-mrp-mlx fork pushed to Gitea (pin tag pr175-head-754d403)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 15:30:39 +10:00
m3ultra
603efcf7e2 docs+benchmarks: dark-patch verdict — decoder attrs near-fal clean, Metal texel-sampling convicted; regular-grid gather fix designed; parity fixtures complete
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 14:03:53 +10:00
m3ultra
a0e1ef1f18 benchmarks: Hunyuan mlx-tune final — 243s vs 260s (1.07x), M1 rebench suggested
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 13:54:46 +10:00
m3ultra
d488d87490 benchmarks: Hunyuan mlx-tune e2e 246s vs 260s baseline (~1.06x, texture-led)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:51:24 +10:00
m3ultra
0476d1bc30 docs: packet §9 — Fable session 1 execution log (oracle pass, A0 ADOPT, mlx-tune branch, dark-patch narrowed)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:47:11 +10:00
m3ultra
0ac173d4fb benchmarks: A0 gate — MLX TRELLIS.2 (Jourloy hybrid) BEATS MPS 216.6s vs 248.8s at 14x bake density; dark patches reproduce -> Metal texel sampling prime suspect
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:46:16 +10:00
m3ultra
ace4be37ba benchmarks: Hunyuan T1 mx.compile micro gate — parity PASS, 1.04x (GEMM-bound; T3/T4 are the real levers)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:40:06 +10:00
m3ultra
eed732446c docs: FABLE_STARTUP_PACKET §8 — adopt path needs NO weight conversion (Jourloy loads originals directly; convert_weights.py retired as double-transpose trap)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 11:55:38 +10:00
m3ultra
3b6b9124f9 docs: FABLE_STARTUP_PACKET §7 — round-2 verification (ADOPT confirmed HIGH, transpose policy verified, parity oracle CPU-runnable, BiRefNet fetched; flags ss_dec double-transpose + bf16-crash + downcast in convert_weights)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 11:51:47 +10:00
m3ultra
abfa344565 docs: FABLE_STARTUP_PACKET — prep recon consolidated (adopt PR#175 MLX base, Hunyuan mx.compile targets, prep_local draft, weight-convert+parity plan)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 11:11:23 +10:00
m3ultra
ca4c802e40 docs: master build plan — TRELLIS.2+Hunyuan full MLX + kernel rewrites + preprocessing frontend (multi-day roadmap for Fable)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 10:46:38 +10:00
type-two
cf402e322c fix(stereo_depth): negative disparity window + percentile normalize — movie stereo works
Movie SBS converges on the screen plane, so real content sits at NEGATIVE
disparity; minDisparity=0 clipped everything behind convergence to black.
Window is now ±num_disp/2 with 2-98 percentile normalization and a validity
mask. Verified on Big Buck Bunny (half-OU) + One Night In Hell (half-SBS):
structured depth + colored clouds that render in Blender.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 01:51:55 +10:00
type-two
95708ad220 feat: sd_local (SD1.5 + anatomy LoRAs + pose/IP-Adapter) + stereo_depth (SBS → SGBM depth/cloud)
sd_local: the repose stack as an operator — Hyper_Realism + repose/models/lora
+ optional OpenPose T-pose template + IP-Adapter ref. Absolute venv path =
primary-only by design. Verified: 512x640 portrait in one shot.

stereo_depth: side-by-side stereo video/frame → per-frame SGBM disparity maps
+ colored midframe .ply for Blender displace/point-cloud work. venvs/stereo
(opencv-headless). Verified on a synthetic 24px-disparity plate: subject
bright, zero-disparity bg black, 1.4MB cloud.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 01:22:12 +10:00
m3ultra
fcb5e80702 benchmarks: trellis_mac sparse-conv ablation - Metal flex_gemm = 1.72x end-to-end vs pure-torch fallback
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 00:50:56 +10:00
m3ultra
793f8a88bb benchmarks: m1max studio added to fleet MLX matrix - 7.1 TF, 336 GB/s second-best bandwidth
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 00:35:15 +10:00
m3ultra
5bd7191b32 scripts: mlxprobe.py — fleet MLX capability probe
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 00:31:59 +10:00
m3ultra
ed2ee8dc16 benchmarks: 6-machine fleet MLX matrix — bf16-on-M1 answered, head_dim-64 padding critical on M4/M5
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 00:31:55 +10:00
m3ultra
daa6124dcf benchmarks: first trellis_mac vs fal trellis-2 head-to-head — local faster, quality gap = hole-fill + pre-simplify
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 00:22:41 +10:00
m3ultra
2734ef9107 docs: TRELLIS.2 Apple Silicon recon — trellis-mac is already TRELLIS.2, MLX ladder, PR #175 watch
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 23:44:30 +10:00
m3ultra
4bc2f56d34 README: local-first rewrite + ignore the .env.* family
The README still read as a fal.ai front-end with a local afterthought: the headline
`mb` example ran fal_trellis2, the "recommended chain for best image→3D" was four
fal_* calls, and the operator table listed 5 local ops against 9 cloud ones. That is
backwards now — 22 of the 31 operators run entirely on the fleet.

It also predated most of what we have: the whole audio/video/text suite (tts_local,
stt_local, voice_clone_local, music_local, lipsync_local, wan_video, llm_local,
motion_local), comfyui_sd, flux_local, mflux_image_edit, seedvr2_upscale and
bg_remove_local were all missing from the catalog entirely.

- lead with local; cloud demoted to its own opt-in "costs real money" section
- all 31 operators documented, grouped by what you're trying to make
- recommended chain is now local: bg_remove_local -> [seedvr2_upscale] -> trellis_mac
  (quality) or hunyuan3d_mlx (faster, ~3x lighter, the only one that runs on M1)
- setup section reordered: most local ops need nothing, hunyuan3d_mlx needs no HF
  login at all, only sf3d/trellis_mac/bg_remove_local are gated
- lanes corrected: gpu+cpu are a NODE POOL (gpu 1/node, cpu per-node cpu_slots),
  not the old flat "gpu=1, cpu=3, net=6"
- manifest `python` documented as repo-relative (remote nodes can't resolve absolute)
- link PERFCHECK.md; drop the stale "on the M3 Ultra" framing — it's a fleet
- verified: every operator on disk appears, no phantom ids, no broken doc links

Also: .gitignore had `*.env` and `.env`, neither of which matches a suffixed name
like `.env.remote` — which is sitting un-ignored in the m1's checkout right now, one
`git add -A` away from being committed. Ignore the `.env.*` family (keeping
.env.example committable). Nothing has leaked: no .env file is tracked.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 22:25:08 +10:00
type-two
b9de2a4167 docs: register the M1 Max / M4 mini / M1 mini nodes in CLUSTER + HARDWARE
These three were onboarded on 2026-07-17 and are live in nodes.json, but the docs
still described a three-machine fleet (M3 Ultra / M1 Ultra / M4 Pro). Anyone reading
CLUSTER.md to decide where a job should land was working from a stale map.

Records the M1 Max as a second full gen node (flux_local, hunyuan3d_mlx; NOT trellis
- M1 bf16), and the M4 mini / M1 mini as light bg_remove + cpu helpers. Also notes
the M1 Max login split: admin is `m1max`, but the checkout and farm run as `studio`,
which needs /opt/homebrew/bin on its login PATH.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 22:24:36 +10:00
type-two
712a6ed520 install_acestep: torchcodec for torchaudio>=2.9 save path
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 19:47:03 +10:00
type-two
12a8cf1fd2 music_local (ACE-Step) + motion_local (MoMask) operators with install scripts
install_momask.sh encodes the compat patches: numpy<2 + umath_tests shim,
matplotlib axes-clearing fix, np.float alias wrapper (mb_gen.py)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 19:42:14 +10:00
type-two
b7e113ca5b wan/lipsync: scratch dirs in /tmp so they don't register as assets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 18:57:54 +10:00
type-two
8ea7e8928b stt/wan run.py: prepend homebrew to PATH (job env can't find ffmpeg)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 18:42:43 +10:00
type-two
110b2298b7 audio/video/text operator suite: stt_local, lipsync_local, voice_clone_local, wan_video, llm_local
- stt_local: Whisper large-v3-turbo MLX, transcript + timestamped json
- lipsync_local: Rhubarb visemes (CPU lane), dialog-guided
- voice_clone_local: Chatterbox on MPS (needs setuptools<81 for perth/pkg_resources)
- wan_video: Wan 2.2 TI2V-5B t2v/i2v via resident ComfyUI, frames->mp4
- llm_local: Qwen3-30B-A3B-4bit dialogue writer (primary-only)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 18:26:51 +10:00
m3ultra
27564e80eb perfcheck: nightly fleet GPU canary + the contention lessons that shaped it
BENCHMARKS.md says what a model cost the day it was measured; nothing noticed if a
macOS/torch update or a thermal fault halved a node. perfcheck runs the whole fleet
in ~35s off godcheck's 03:30 cron on the m4mini and reports drift into
GODCHECK_LATEST.md.

Probes matmul (fp16/fp32), memory bandwidth, and SDPA at head_dim 64 vs 56 — the
latter turning CorridorKey's fast-path cliff into a permanent canary: it confirms
the padding win fleet-wide (1.96x-5.26x) and tells us if a future torch closes it.
Runs on venvs/rmbg/bin/python, already identical fleet-wide, so nothing new is
installed (nothing lands on the disk-tight m1max).

First cross-machine capability table for all 6 nodes. The M3 Ultra is ~2.2x the M1
Ultra on fp16 matmul, but they share ~625 GB/s — so bandwidth-bound stages run alike
while compute-bound ones scale. Both Ultras reach only ~78% of spec bandwidth on a
single kernel; the smaller Macs hit ~88%.

Measuring a fleet that is doing real work is the whole problem, and naive
benchmarking here is off by 11x:

- min, not median: a concurrent trellis_mac job dragged a median-of-5 matmul from
  ~24500 to ~2150 GFLOP/s, which reads exactly like a catastrophic regression.
- n=4096 not 2048: 2048 is dispatch-bound and swung 48% run-to-run; 4096 reproduces
  to 0.1% even while contended.
- sdpa 16x2048 not 8x1024: sub-ms probes are dispatch noise — 8x1024 gave ratios of
  0.79/3.95/2.35 on three runs of one machine, the first "proving" 56 is faster.
- busy nodes are excluded, not blamed: GPU contention is invisible to load average
  (M3 Ultra read load 2.45 with its GPU pinned), so bench.py samples ioreg GPU% before
  it touches the GPU — our own matmul pins the device, so ordering is the trick.
- baselines are the median of recent history, not a saved best: the M4 Pro also serves
  Ollama and is bimodal (~3200 vs ~5500 fp32), so a best-observed baseline pins to a
  lucky outlier and alerts forever.
- a regression must repeat before it is believed ([~] watching -> [!] CONFIRMED).

Validated by re-running the fleet against its own baselines: zero false alarms,
including a sweep where the M3 Ultra read 43 GB/s under load and was correctly
marked BUSY rather than reported as a 93% regression.

Also found: the m4mini is the only node with Tailscale SSH (RunSSH: true) and it does
NOT propagate remote exit codes — `ssh m4mini "exit 7"` returns 0, so any
`if ssh m4mini ...` test silently always passes. Test on output instead, which is
what godcheck already does (and why it is unaffected). It also cannot ssh to itself,
so run_fleet detects its own tailnet IP and benches the local node via the shell.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 18:03:03 +10:00
type-two
f6626f0a06 tts_local operator: text→speech via Kokoro-82M on MLX (character voice templates)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 18:01:58 +10:00
m3ultra
26c4cfd099 benchmarks: 8-machine CorridorKey matrix — tiled keys 2048 on the 2020 M1 mini 2026-07-17 15:04:00 +10:00
m3ultra
a6a6d110b2 benchmarks: NEGATIVE result — I2V-synthesized orbits don't reconstruct in 3D
Tested single image -> I2V orbit -> colmap -> brush. COLMAP registered 26/49
frames but triangulated ZERO 3D points (vs 1006 for real iPad footage);
gauge fix failed, 'reconstruction' in 2.4s. Brush still emitted a 190MB .ply
from geometry-free input = garbage.
Cause: the subject isn't rigid (tail dissolves, orb appears, figure morphs).
Video models optimise temporal plausibility, not multi-view consistency.
You cannot synthesize your way out of capture. Documented so it isn't retried.
Also: TI2V-5B 704x704/49f/40steps = 337s.
2026-07-17 02:07:19 +10:00
m3ultra
acec2cc6c5 benchmarks: first M3 Ultra mlx-video/Wan numbers + the auto-tiling SIGKILL gotcha
Wan2.1-T2V-1.3B: 3s @ 832x480/50 steps = 809.6s (denoise 780.7s, 15.6s/step).
Quality genuinely good (coherent 49-frame photoreal fox).
Default --tiling auto SIGKILLs past ~25 frames (bisect: 25f OK, 33f killed) --
NOT memory (4GB RSS, 195GB free, 179GB max_buffer). auto never enables temporal
tiling; fails AFTER denoising. Fix: --tiling aggressive. Plus 3 packaging bugs.
2026-07-17 01:47:48 +10:00
m3ultra
9c7164f77a comfyui_sd: fail fast when a checkpoint/LoRA isn't on the routed node
Checkpoints are no longer uniform across the fleet (M3 keeps only the
LoRA-compatible SD1.5 model; M1 holds the full SDXL archive). The gpu pool
routes by operator, not by checkpoint, so a job asking for bigLust could land
on a node without it. Query the node's own ComfyUI /object_info and exit with
the available list + where the rest lives, instead of a cryptic 400.
2026-07-17 01:44:17 +10:00
m3ultra
75ace36e00 comfyui_sd operator: local SD/SDXL + LoRA via resident ComfyUI
Fills the gap flux_local can't (mflux is FLUX-only). Pure-stdlib run.py talks
to a resident ComfyUI on :8188 (auto-starts, keeps checkpoints cached — 4s
warm per 5122/20-step image on M3). Warns on the SD1.5-LoRA-on-SDXL trap.
No manifest python => uses the node's system python3 via the python-less
remote path, so it distributes across the gpu pool.
2026-07-16 23:37:30 +10:00
m3ultra
a0f4114c28 scripts/install_comfyui.sh: portable ComfyUI install (SD/SDXL runner; mflux is FLUX-only) 2026-07-16 23:28:25 +10:00
m3ultra
fe0da76016 benchmarks: fleet ablation results — sdpa 4.5x M1 cliff (bf16 innocent), tiled768+compile new best, M4 swap wall 2026-07-16 22:48:50 +10:00
type-two
532294b7a5 users.py: 'token <name>' subcommand — mint named API keys from the CLI
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:29:51 +10:00
m3ultra
273922f492 CORRIDORKEY.md: status, Ultra tuning findings, video->3D use-case map 2026-07-16 21:50:56 +10:00
m3ultra
175e1eeac4 benchmarks: CorridorKey MLX Ultra tuning — tiled512+compile patch wins (1.47x M3, best quality, 2.3GB) 2026-07-16 21:38:08 +10:00
m3ultra
876a666e9a HARDWARE.md: per-operator RAM + Apple Silicon tier guide (8GB→256GB) 2026-07-16 14:00:39 +10:00
m3ultra
1537d94cf7 benchmarks: 4096 hunyuan defaults confirmed fleet-safe (M3 + M1) 2026-07-16 11:11:33 +10:00
m3ultra
06f33be865 pool cpu lane across nodes; hunyuan Studio-quality defaults
runner: gpu AND cpu are now a node pool. Per-node cpu_slots (primary 3,
helpers 2, nodes.json-overridable); net stays primary-only. Python-less ops
(ffmpeg/ffprobe) now run remotely on the node's system python3. Verified: 9
concurrent ffmpeg_frames distributed 4 local / 2 m1 / 2 m4.

hunyuan3d_mlx: default to Studio-quality (octree 384, texture 4096, remesh
120k) — 4096 bake verified watchdog-free on M3 Ultra; big quality gain
(defined face, 120k faces). remesh_faces now a param. All param-overridable.
2026-07-16 10:59:44 +10:00
m3ultra
9b525fa420 hunyuan install clones self-owned MLX fork; CLUSTER fleet final state
- install_hunyuan3d_mlx.sh: auto-clone monster/Hunyuan3D-2.2-mrp-MLX (our
  Gitea fork) into vendor/ when missing, so any node bootstraps identically.
- CLUSTER.md: M1 hunyuan verified, M4 = bg_remove + Ollama qwen2.5:7b endpoint,
  cpu-lane-not-pooled caveat, self-owned repo reference.
2026-07-16 10:35:11 +10:00
m3ultra
573afa7b7a hunyuan3d_mlx operator (local MLX image→3D) + cluster docs
- server/operators/hunyuan3d_mlx: native-MLX Hunyuan3D 2.1, both stages, PBR.
  Verified end-to-end on M3 Ultra: 260s total, 40k-face GLB w/ 2048² PBR.
  Weights public (no HF login). Runs on M1 (MLX-native).
- scripts/install_hunyuan3d_mlx.sh: uv py3.11 venv + MLX-path deps.
- CLUSTER.md: local-first policy + M3/M1/M4 fleet roles + central-queue howto.
- BENCHMARKS/README/AGENTS: hunyuan3d_mlx rows + trellis head-to-head.
2026-07-16 10:10:43 +10:00