Apple Silicon ComfyUI workflows for Qwen Image 2.1
Tested custom nodes, GUI/API workflows and seeded comparisons. Integration package; no model weights. Runs PyTorch MPS, not MLX.
Install
Tested: Apple M4 Max / 64 GiB, macOS 27.0.1, ComfyUI 0.39.2, Python 3.12.12, PyTorch 2.14.1. Later releases are not qualified here.
- Download this repository. Copy
custom_nodes/qwen_mps_loader.pyandcustom_nodes/viggle_turbo.pyinto your ComfyUIcustom_nodesdirectory. Back up conflicting custom modules first. Restart an idle server. - Download the model components listed below from their publishers.
- Import a JSON from
workflows/. For edits, upload your reference image; the API examples useqwen-validation-reference.pngfromexamples/.
| Folder under ComfyUI/models | File |
|---|---|
| diffusion_models | qwen_image_2.1_turbo_int8_convrot.safetensors or qwen_image_2.1_turbo_bf16.safetensors |
| diffusion_models | qwen_image_2.1_int8_convrot.safetensors or qwen_image_2.1_bf16.safetensors for base/Viggle |
| text_encoders | qwen3vl_8b_int8_convrot.safetensors or qwen3vl_8b_bf16.safetensors |
| vae | qwen_image_2.1_vae_bf16.safetensors |
| loras | Qwen-Image-2.1-viggle-turbo-v0.3-6step-lora-r256.safetensors, for Viggle only |
Weights: Comfy-Org. Adapter: Viggle.
Shared profile flags: --use-pytorch-cross-attention --reserve-vram 24 --cache-none. This reserves headroom; it does not guarantee swap-free operation. Queue one job at a time. BF16 and 2K need more headroom. The BF16-transformer Turbo preset retains the INT8-storage encoder.
What is custom
QwenImage21CLIPLoaderMPS: BF16 text-encoder computation on Metal, CPU offload through ComfyUI. INT8 storage is emulated BF16 computation on this host.ViggleTurboLora: runtime low-rank branches rather than weight merging/requantization; handles fused MLP projections.ViggleTurboSigmas: publisher's six-step nodes with its resolution-dependent shift. This belongs to Viggle, not official Turbo.- Official Turbo workflows use native
ManualSigmas:1, .978453, .95418, .926626, .89508, .845148, .704534, .414568, 0; Euler, CFG 1, no extra dynamic shift, no Viggle adapter. - Reference edits use 1056 pixels, avoiding the separate 1024-grid issue observed with this stack.
Measured results
October 9, 2026; individual runs in the shared profile, existing LLM retained. Same prompt, seed, 1024 square, Euler and CFG 1 within each comparison. Total wall includes validation/loading, encoding, denoising, VAE decode, save, 0.25-second polling and local PNG retrieval. Server execution is also recorded in benchmark-results.json. These are historical local measurements, not new public-revision benchmarks or universal quality rankings.
| Model | Cup total wall | Poster total wall |
|---|---|---|
| Base / 25 steps | 168.7 s | 167.1 s |
| Viggle v0.3 r256 / 6 | 59.1 s | 61.9 s |
| Official Turbo / 8 | 68.5 s | 70.0 s |
Additional official Turbo: BF16 transformer 1024 square 82.1 s; INT8 native 2048 square 266.5 s; INT8 reference edit 1056 square 91.9 s. All nine final jobs completed. Both poster strings and the three-bean count were correct across the compared models; the edit changed cup color while closely preserving the scene. No broad prompt suite was run.
License and credits
Integration code is GPL-3.0; see LICENSE. Model weights and adapters retain their publishers' licenses. Qwen diffusion weights use the Qwen Research License; commercial model use requires separate authorization. This repository grants no model license.
Credits: Qwen, Comfy-Org/ComfyUI, Viggle, PyTorch. Community packaging and local validation: Shiftedx. Example images are AI-generated. Independent release; no publisher endorsement.
Model tree for Shiftedx/apple-silicon-comfyui-qwen-workflows
Base model
Qwen/Qwen-Image-2.1