Media Gen Roadmap
Evaluation of image / video / audio generation for this machine. The same constraints
that shaped the LLM picks apply here — but media workloads invert the memory story:
diffusion is bandwidth-bound rather than token-bound, so the 256 GB/s LPDDR5X
(measured ~212 GB/s) is the ceiling, not the 124 GiB GTT pool. Full findings:
research/mediagen-eval.md.
The one hardware fact that decides everything
Diffusion video/image generation is memory-bandwidth-bound. Measured community scaling on Wan 2.2 vs an RTX 3090 (936 GB/s): 320×320 lands at ~36% of the 3090, 512×512 at ~19%, 640×640 at ~11%. That collapse is an unresolved gfx1151 ROCm kernel inefficiency (TheRock #2591) on top of the raw bandwidth gap. Video works on this box; it is not fast, and it degrades hard above 640px.
The genuine hardware win is fit: no consumer NVIDIA card holds unquantized Wan 2.2 14B. This machine does — that's a batch-mode capability, not a speed one.
Selected picks — by modality
| Modality | Pick | Runtime | Footprint | Expected perf | License |
|---|---|---|---|---|---|
| Images (daily) | Z-Image-Turbo 6B, GGUF Q8 + Qwen3-4B encoder | stable-diffusion.cpp v1.0.1 (Vulkan) | ~12 GB total | ~10 s/image (AMD-confirmed on Strix Halo) | Apache 2.0 ✓ |
| Images (text-heavy / edits) | Qwen-Image-2512 20B, GGUF Q8 | ComfyUI + TheRock wheels | ~21 GB (Q8) | ~120–150 s/image | Apache 2.0 ✓ |
| Video (entry) | Wan 2.2 TI2V-5B + Lightning LoRA | ComfyUI | fits unquantized | ~8.5–9 min / 5 s 720p clip | Apache 2.0 ✓ |
| Video (batch) | Wan 2.2 14B + 4-step Lightning | ComfyUI | 54–80 GB unquantized | ~30 min / 832×480 clip | Apache 2.0 ✓ |
| TTS | Kokoro-82M | CPU (no GPU needed) | <1 GB | faster than real-time on CPU | Apache 2.0 ✓ |
| Voice cloning | Chatterbox (v3 Multilingual) | GPU | ~4–6 GB VRAM | real-time-ish | MIT ✓ (PerTh watermark default-on) |
| STT | whisper large-v3-turbo | whisper.cpp Vulkan | ~1.6 GB | ~26× real-time (Windows Vulkan datapoint) | MIT ✓ |
Considered and excluded — with reasons
- Flux.2 [dev] 32B — best quality available, but BFL non-commercial license for the weights (paid license required in a commercial product) and ~32 GB at Q8. ComfyUI-only; stable-diffusion.cpp has no Flux.2 support yet. License-excluded for any monetized path.
- Flux.1 [dev] — same BFL non-commercial weights; superseded by Z-Image/Qwen-2512 on quality-per-watt anyway. Personal/lab use only.
- F5-TTS / CosyVoice (cloning) — look open, but both carry CC-BY-NC-4.0 model weights (Emilia / WenetSpeech4TTS training data). Banned for monetized use. Chatterbox is the only SOTA-quality cloner with permissive code and weights.
- HunyuanVideo — 35–50 min per 5 s clip on this bandwidth class; strictly worse than Wan on this hardware.
- MiniMax H3 (video+audio joint DiT, Apache 2.0, merged into ComfyUI core Aug 2026) — most active Sep-2026 ecosystem, 19.6–31.7 GB INT8 fits easily, but no Strix Halo perf datapoint yet. Watch-list.
- Meta Muse Image — API-only, no local weights. Out of scope for an on-box build.
- SD.Next / FastSDCPU — smaller communities, fewer gfx1151 datapoints than sd.cpp or the kyuz0 ComfyUI toolboxes. Not worth the deviation.
Co-residency rule vs the LLM pool
The 124 GiB GTT pool is already claimed by LLM serving (up to 96–113 GB resident). Only three media workloads are exempt from swap-out:
- Kokoro (~1–3 GB) and whisper turbo (~1.6 GB) — always resident, zero conflict.
- Z-Image-Turbo (~12 GB with encoder) — co-resident whenever ~15 GB of GTT headroom exists (fine alongside Qwen3.8-27B; conflicts only with the 100 GB+ MoE models resident).
Everything else (Qwen-Image full precision, Wan 14B, Flux.2) requires unloading the served LLMs first. Rule: any media job >16 GB swaps the LLMs out and restores after. Treat video as an overnight batch mode, not an interactive one.
Install-order plan executed — phases 0–2 live, see test results below
- Phase 0 — zero risk, co-resident: whisper.cpp Vulkan build + large-v3-turbo; Kokoro CPU service. Verify with a 10-min transcription RTF and a 5-min narration render.
- Phase 1 — low risk: stable-diffusion.cpp v1.0.1 Vulkan build; Z-Image-Turbo GGUF Q8 (7.2 GB) + Qwen3-4B encoder. Bench target ~10 s/image.
- Phase 2 — medium complexity, LLM swap required: ComfyUI via the
kyuz0 Fedora toolbox (closest match to Fedora 44); TheRock multi-arch wheels with
[device-gfx1151]extras; the established env set (HSA_OVERRIDE_GFX_VERSION=11.5.1,HSA_ENABLE_SDMA=0,HSA_USE_SVM=0,--disable-mmap,attention_mode=sdpa,cudnn.enabled=false). Then Qwen-Image-2512 Q8 and Wan 2.2 TI2V-5B. - Phase 3 — on demand: Chatterbox for voice cloning, watermark-on.
Biggest risk per modality
- Images: Qwen-Image-2512 produces black images on k-quant GGUFs (sd.cpp issue #1385, activation dequant overflow) — stay on Q8 and lead with Z-Image.
- Video: the gfx1151 ROCm kernel inefficiency (TheRock #2591) has no fix timeline; budget 10–30 min/clip and cap resolution at 480p for the 14B.
- Audio: the cloning-license trap above; and Chatterbox embeds a PerTh neural watermark in every output by default — a disclosure fact, not a defect.
Upscaling (1080p+ from base models) — installed & verified 2026-09-10
ComfyUI 4x-UltraSharp (64 MB, models/upscale_models/) — verified live:
took the blurry Z-Image 1280×720 output to 5120×2880 in under a minute
through the ComfyUI API (LoadImage → UpscaleModelLoader → ImageUpscaleWithModel → SaveImage).
This is the standard production path: generate at the model's native resolution, then
neural-upscale — native 1080p generation from small models collapses, but upscaled output
is sharp. RealESRGAN x4plus also staged. sd.cpp supports --upscale-model on
the same files for the non-ComfyUI lane.
Live test results — 2026-09-10 (all 6 modalities PASS, co-resident with LLMs)
| Modality | Result | Timing | Verification |
|---|---|---|---|
| Kokoro TTS | PASS | 7.9s for 5.7s audio (RTF 1.40, CPU) | wav + whisper cross-check |
| whisper STT | PASS | 1.9s wall | exact transcript of the TTS clip |
| Z-Image-Turbo (sd.cpp) | PASS | 33.6s incl. model load, 512px | image visually inspected |
| Chatterbox voice clone | PASS | 60.3s for 6.8s audio (GPU-contended run) | clone transcribed back, exact match |
| Qwen-Image-2512 (ComfyUI) | PASS | 163.5s, 6.5 s/it @ 512px | image visually inspected |
| Wan 2.2 TI2V-5B video | PASS | 47s for 20 steps @ 320p/25f (2.3 s/it) | frame visually inspected |
All ran co-resident with the served LLMs — llama-swap never stopped. Wan at small resolution ran 4× better than the eval doc's 720p projections. Wiring added: ComfyUI-GGUF custom node, gguf dep, extra_model_paths.yaml, model symlinks. Known gap: espeak-ng (installed 2026-09-10) was missing during the test — Kokoro skipped out-of-vocabulary words; fixed after. Full repro: research/mediagen-live-tests.md.
Full-resolution video battery · 2026-09-11 · complete
Hi-res battery on sd.cpp vid_gen (Vulkan/RADV), creative prompts, GPU decode, 27B LLM evicted during renders (unified-memory headroom). LTX-2.3 dev Q8_0 (21 GB), distilled Q4, and Wan 2.2 TI2V-5B.
| Lane | Result | Timing | Verification |
|---|---|---|---|
| LTX-2.3 dev Q8_0 · 1280×736/33f | PASS | 921 s wall (sampling 764 s, GPU VAE decode 137 s) | webm + md5, EBML matches reference |
| LTX-2.3 dev Q8_0 · 1920×1088/33f headline | PASS | 1865 s wall (sampling 1806 s, video VAE decode 50.7 s, audio 1.0 s) | webm 9.3 MB + md5; frames 5/16/27 visually inspected — on-prompt, stylized look, one minor temporal artifact |
| Wan 2.2 TI2V-5B · 1280×704/33f | PASS | 21.7 min wall (~21 s/it — fastest video model on the box) | valid EBML, command recorded |
| LTX-2.3 · 121-frame clips (any resolution) | BLOCKED | — | two hard memory walls: 1920×1088 pinned alloc exceeds RADV maxBufferSize at graph build; 720p OOM-killed in decode (~76 GB RSS). Upstream item: tiled/multi-segment video-VAE decode. |
Daily-driver video pipeline (operator pick, 2026-09-11): Wan 2.2 A14B + Lightning LoRA —
4 steps (2 high + 2 low), cfg 1.0, 832×480/33f: sampling 287.6 s (~4.8 min) vs
the 5B's 418.5 s — the bigger model is also the faster one, and visibly more
photoreal (fur micro-texture, true bokeh; the 5B control came out stylized/washed at
20 steps). Wall 8:42 incl. decode. Honest caveats: 14B caps at 832×480 on this box;
cfg 1.0 means the negative prompt is structurally inert (official Lightning recipe);
LoRA's I64 alpha scalars required an F32 rewrite for sd.cpp (fix documented). A/B log:
research/wan-lightning-ab.md.
Reliable ceiling (LTX path): 1920×1088 / 33 f / 24 fps (~1.4 s clips), zero workarounds, GPU decode.
During debugging a regression was root-caused to the amdgpu.lockup_timeout=600
kernel param (it hung every large video-VAE decode on RADV/gfx1151); it was removed —
do not re-add it to this box's cmdline. Full evidence trail (6 rounds):
research/gfx1151-sdcpp-ltx-debug.md.
Photoreal image battery · 2026-09-11 · complete
SDXL-class photoreal models (uncensored-permissive tier) via sd.cpp, shared SDXL components (clip_l + clip_g + VAE), euler, 28–30 steps, cfg 6–6.5, FA. Outputs delivered to the operator's Telegram — not published on this site (governance: uncensored-tier outputs stay off the live docs).
| Model | Result | Timing | Verification |
|---|---|---|---|
| Juggernaut XL v9 Q8_0 | PASS ×2 | 55.4 s @ 1024², 58.2 s @ 1216×832 | both images visually inspected — cinematic/saturated look, zero artifacts |
| RealVisXL v5.0 Q8_0 | PASS ×2 | 54.5 s @ 1024², 58.3 s @ 1216×832 | visually inspected — most photoreal of the two (true skin texture, pore-level detail) |
~55 s per 1080p-class image, both models production-usable, no upscale required.
~1.6 s/it, resolution-insensitive in this range. Known non-fatals: recurring Vulkan
pinned-mem alloc warning during VAE decode (decodes fine, 8–10 s) and an auto-fit
"no GPU devices" warning on some runs (renders still execute on Vulkan).
Battery log: research/uncensored-battery.md.
Uncensored-capability proof · 2026-09-11 · proved
Capability test of the uncensored-permissive tier: renders of prompt classes that filtered services block, judged on coherence (uncensored models don't refuse — the claim is that anatomy/structure hold where filtered-trained models mangle). Outputs delivered to the operator's Telegram only, per governance — verdicts only here.
| Prompt class | Verdict | Evidence |
|---|---|---|
| Fine-art nude figure study (adults) | PROVED both models | correct limb count, plausible hands, natural anatomy — the class where filtered models visibly fail |
| Horror / practical-effects creature | PROVED — strongest class | fully coherent |
| Action violence (injury detail) | coherent, muted | renders fully without degradation, but injury detail subtle at tested settings — "renders coherently", not "graphic" |
Operational finding: both models self-interpret toward modesty
unless the prompt explicitly names the fine-art nude tradition — precise prompting is
required. Test surface, hard lines: adults only, no real-person likeness, no non-consent
framing. Log: research/uncensored-proof.md.