[ArtStudio M2] Mac-native pipeline profile — full Tier-A stage chain on MPS (concept → model → texture → rig → animate → export) #357

Closed
opened 2026-07-04 05:27:47 +00:00 by spikerj · 3 comments
Owner

Sub-ticket of epic #346, Mac workstream. Depends on #356 (device seam). Target hardware: M5 Pro Max, 128 GB unified memory.

What: an end-to-end pipeline profile that runs every stage on Apple Silicon using only Tier-A backends (audit: portable with a device patch, no CUDA extensions). 128 GB unified memory removes the 24 GB VRAM ceiling that constrains the Linux host — models that queue behind GpuCoordinator leases on SERVER can run generously on the Mac.

Profile (default model per stage on macOS):

Stage Backend Audit status
concept SDXL-Lightning (fallback SDXL-Turbo) portable-as-is
modeling TripoSR (fallback Shap-E) needs-work: torchmcubes CPU build, rembg/onnxruntime
texturing SD-Turbo-Tex portable-as-is
rigging smart_rig (Blender addon, CPU) → RigNet CPU fallback (pyg CPU wheels, slow) CPU-fine
animation MDM device int 0 → mps mapping (#356)
export/enrichment headless Blender w/ Metal (#356) + OpenPose/MediaPipe (already CPU) fine

Scope:

  • Introduce a pipeline profile concept (linux-cuda vs macos-mps) selecting default + allowed models per stage — data-driven alongside the stage plans from #347; per-OS manifest overrides from #356
  • Validate each profile stage on the M5: run, record wall-time + peak memory + output quality on 3 student-realistic prompts (matrix mirrors spike #354 — post results there for comparison against the CUDA host)
  • FLUX.schnell as optional concept upgrade: bf16→fp16/fp32 on MPS, 22 GB weights — trivial fit in 128 GB unified memory; measure speed before enabling
  • MPS-specific fixes discovered during validation (op fallbacks via PYTORCH_ENABLE_MPS_FALLBACK, dtype issues) folded back into #356's device helper
  • hymotion reality-check: manifest says 4 GB, CLAUDE.md says 24 GB+ — measure on the Mac (unified memory can hold it either way); enable in the profile if throughput is acceptable
  • Document the profile + measured timings in art_pipe docs (upstream candidate)

Note: quality parity with the CUDA profile is NOT the goal here — a working, honest Mac chain is. TRELLIS-class modeling quality arrives via #355/M3.

Acceptance: on the M5 Mac, one command runs a character prompt through concept → modeling → texturing → rigging → animation → export producing a rigged, animated GLB with previews, all stages on MPS/CPU per the profile, with recorded timings per stage.

Sub-ticket of epic #346, Mac workstream. Depends on #356 (device seam). Target hardware: M5 Pro Max, 128 GB unified memory. **What:** an end-to-end pipeline profile that runs every stage on Apple Silicon using only Tier-A backends (audit: portable with a device patch, no CUDA extensions). 128 GB unified memory removes the 24 GB VRAM ceiling that constrains the Linux host — models that queue behind GpuCoordinator leases on SERVER can run generously on the Mac. **Profile (default model per stage on macOS):** | Stage | Backend | Audit status | |---|---|---| | concept | SDXL-Lightning (fallback SDXL-Turbo) | portable-as-is | | modeling | TripoSR (fallback Shap-E) | needs-work: torchmcubes CPU build, rembg/onnxruntime | | texturing | SD-Turbo-Tex | portable-as-is | | rigging | smart_rig (Blender addon, CPU) → RigNet CPU fallback (pyg CPU wheels, slow) | CPU-fine | | animation | MDM | device int `0` → mps mapping (#356) | | export/enrichment | headless Blender w/ Metal (#356) + OpenPose/MediaPipe (already CPU) | fine | **Scope:** - [ ] Introduce a **pipeline profile** concept (linux-cuda vs macos-mps) selecting default + allowed models per stage — data-driven alongside the stage plans from #347; per-OS manifest overrides from #356 - [ ] Validate each profile stage on the M5: run, record wall-time + peak memory + output quality on 3 student-realistic prompts (matrix mirrors spike #354 — post results there for comparison against the CUDA host) - [ ] FLUX.schnell as optional concept upgrade: bf16→fp16/fp32 on MPS, 22 GB weights — trivial fit in 128 GB unified memory; measure speed before enabling - [ ] MPS-specific fixes discovered during validation (op fallbacks via `PYTORCH_ENABLE_MPS_FALLBACK`, dtype issues) folded back into #356's device helper - [ ] hymotion reality-check: manifest says 4 GB, CLAUDE.md says 24 GB+ — measure on the Mac (unified memory can hold it either way); enable in the profile if throughput is acceptable - [ ] Document the profile + measured timings in art_pipe docs (upstream candidate) **Note:** quality parity with the CUDA profile is NOT the goal here — a working, honest Mac chain is. TRELLIS-class modeling quality arrives via #355/M3. **Acceptance:** on the M5 Mac, one command runs a character prompt through concept → modeling → texturing → rigging → animation → export producing a rigged, animated GLB with previews, all stages on MPS/CPU per the profile, with recorded timings per stage.
spikerj added the enhancement label 2026-07-04 05:27:47 +00:00
Author
Owner

First real generations on the M5 Max — both Tier-A launch backends work on MPS through the canonical worker seam (artpipe servePOST /jobs), zero PYTORCH_ENABLE_MPS_FALLBACK needed. Report committed at art_pipe/docs/mps-validation-m5.md (branch feature/device-abstraction-mps, commits ef32053/6463acb/5f0e04d).

Run Wall time Output
sdxl_lightning "robot mascot" (cold) 19.9 s clean 1024px concept PNG
sdxl_lightning "red dragon" 12.4 s prompt-faithful cartoon game art (eyeballed: excellent)
sdxl_lightning "treasure chest" 10.3 s clean
triposr dragon PNG → 3D 11.3 s 81k-vert OBJ + 3.2 MB GLB, clearly the dragon w/ vertex colors

~5–7 s of each SDXL run is per-job model reload (fresh subprocess per job) — warm-worker mode is the biggest Mac latency lever. Disk: 8.8 GB weights of the 25 GB budget.

Fixes committed (two are upstream candidates): torchmcubes has no MPS kernel → CPU marching-cubes wrap in triposr; transformers<5 pin (breaks TripoSR ckpt on CUDA too); TripoSR weights/torchmcubes provisioning via manifest setup_commands; psutil made optional in hardware.detect() (stdlib server venv crashed).

Remaining for this ticket: profile config concept, sdxl_turbo/shap_e/mdm validation, unified-memory admission budgeting (VRAM gate is nvidia-smi-only → everything admitted optimistically), Blender export stage (no Blender installed here yet). Cross-reference for the #354 matrix: Mac numbers above vs CUDA host TBD.

**First real generations on the M5 Max — both Tier-A launch backends work on MPS through the canonical worker seam** (`artpipe serve` → `POST /jobs`), zero `PYTORCH_ENABLE_MPS_FALLBACK` needed. Report committed at `art_pipe/docs/mps-validation-m5.md` (branch `feature/device-abstraction-mps`, commits `ef32053`/`6463acb`/`5f0e04d`). | Run | Wall time | Output | |---|---|---| | sdxl_lightning "robot mascot" (cold) | 19.9 s | clean 1024px concept PNG | | sdxl_lightning "red dragon" | 12.4 s | prompt-faithful cartoon game art (eyeballed: excellent) | | sdxl_lightning "treasure chest" | 10.3 s | clean | | triposr dragon PNG → 3D | 11.3 s | 81k-vert OBJ + 3.2 MB GLB, clearly the dragon w/ vertex colors | ~5–7 s of each SDXL run is per-job model reload (fresh subprocess per job) — **warm-worker mode is the biggest Mac latency lever**. Disk: 8.8 GB weights of the 25 GB budget. Fixes committed (two are upstream candidates): torchmcubes has no MPS kernel → CPU marching-cubes wrap in triposr; `transformers<5` pin (breaks TripoSR ckpt on CUDA too); TripoSR weights/torchmcubes provisioning via manifest `setup_commands`; psutil made optional in `hardware.detect()` (stdlib server venv crashed). Remaining for this ticket: profile config concept, sdxl_turbo/shap_e/mdm validation, unified-memory admission budgeting (VRAM gate is nvidia-smi-only → everything admitted optimistically), Blender export stage (no Blender installed here yet). Cross-reference for the #354 matrix: Mac numbers above vs CUDA host TBD.
Author
Owner

Slice 2 done on feature/device-abstraction-mps (commits 82b422f1d56900; pytest 596 passed — 22 new profile tests; independently re-verified).

  • Pipeline profiles implemented in config.py (PIPELINE_PROFILES: linux-cuda/windows-cuda/macos-mps), auto-detected (detect_profile_name(), ARTPIPE_PROFILE override). The existing PIPELINE_* constants now derive from the active profile, so preset resolution, submission normalization, node registry, and stage fallbacks were wired for free. Verified live: default submission on this Mac resolves triposr/image_to_3d; env override flips to linux-cuda.
  • Unified-memory VRAM admission implemented (not deferred): dispatcher free/total VRAM falls back to unified memory on Apple Silicon, vram_mb enforced with 1.4× overhead & 0.85 cap.
  • sdxl_turbo on MPS: zero fixes (6.2–9.3 s). shap_e on MPS: 2 fixes (undeclared ipywidgets dep — hits CUDA too; float64→float32 schedule extraction, upstream candidate) — 35 s/64-step and 116 s/128-step text→3D GLBs, prompt-faithful.
  • Disk now ~18 GB weights total. Deferred: flux (gated), mdm (SMPL licensing — flagged: it's the macos-mps motion default, needs the license step or a profile change), sf3d/instantmesh/riggers/Blender stages; shap_e fixed-output-path clobber noted.

Next: first end-to-end platform run on the Mac (#359 slice 1) using the validated concept+modeling chain.

Slice 2 done on `feature/device-abstraction-mps` (commits `82b422f`…`1d56900`; pytest **596 passed** — 22 new profile tests; independently re-verified). - **Pipeline profiles implemented** in `config.py` (`PIPELINE_PROFILES`: linux-cuda/windows-cuda/macos-mps), auto-detected (`detect_profile_name()`, `ARTPIPE_PROFILE` override). The existing `PIPELINE_*` constants now derive from the active profile, so preset resolution, submission normalization, node registry, and stage fallbacks were wired for free. Verified live: default submission on this Mac resolves triposr/image_to_3d; env override flips to linux-cuda. - **Unified-memory VRAM admission implemented** (not deferred): dispatcher free/total VRAM falls back to unified memory on Apple Silicon, `vram_mb` enforced with 1.4× overhead & 0.85 cap. - **sdxl_turbo on MPS: zero fixes** (6.2–9.3 s). **shap_e on MPS: 2 fixes** (undeclared ipywidgets dep — hits CUDA too; float64→float32 schedule extraction, upstream candidate) — 35 s/64-step and 116 s/128-step text→3D GLBs, prompt-faithful. - Disk now ~18 GB weights total. Deferred: flux (gated), mdm (SMPL licensing — flagged: it's the macos-mps motion default, needs the license step or a profile change), sf3d/instantmesh/riggers/Blender stages; shap_e fixed-output-path clobber noted. Next: first end-to-end platform run on the Mac (#359 slice 1) using the validated concept+modeling chain.
Author
Owner

Resolved in spikersoft-artpipe PR #1 (merged to main). The macos-mps profile is shipped config (auto-detected, ARTPIPE_PROFILE override), unified-memory VRAM admission enforced, and the full Tier-A chain validated repeatedly on the M5 — culminating in complete 7-stage Character and Prop plans through the platform stack (45–72 s Prop smoke). Validated backends at close: sdxl_lightning, sdxl_turbo, triposr, shap_e, sd_turbo_tex, Blender stages, SafetyCheck, plus trellis_mac in allowed_models (#358). Remaining per-backend stragglers (flux gated, mdm SMPL licensing, sf3d/instantmesh) are documented in docs/mps-validation-m5.md and tracked via #358/#354 where relevant. Closing.

Resolved in spikersoft-artpipe PR #1 (merged to `main`). The `macos-mps` profile is shipped config (auto-detected, `ARTPIPE_PROFILE` override), unified-memory VRAM admission enforced, and the full Tier-A chain validated repeatedly on the M5 — culminating in complete 7-stage Character and Prop plans through the platform stack (45–72 s Prop smoke). Validated backends at close: sdxl_lightning, sdxl_turbo, triposr, shap_e, sd_turbo_tex, Blender stages, SafetyCheck, plus trellis_mac in allowed_models (#358). Remaining per-backend stragglers (flux gated, mdm SMPL licensing, sf3d/instantmesh) are documented in `docs/mps-validation-m5.md` and tracked via #358/#354 where relevant. Closing.
Sign in to join this conversation.