Qwen-Image-2512 Realism (bf16, LoRA-merged UNet)
A single-file bf16 diffusion model (UNet only) for ComfyUI: Qwen/Qwen-Image-2512 with two photorealism LoRAs baked into the weights. No LoRA loaders needed at inference — load it like any other diffusion model and you get the realism the two LoRAs provide.
The main reason this exists: it is one file to pull onto a fresh training/inference box instead of "base model + LoRA A + LoRA B + remembering the strengths".
Merge recipe
Merged in ComfyUI (UNETLoader → LoraLoaderModelOnly → LoraLoaderModelOnly → ModelSave):
| # | Component | Strength |
|---|---|---|
| 0 | qwen_image_2512_bf16.safetensors (base, Qwen/Qwen-Image-2512) | — |
| 1 | SamsungCam UltraReal | 0.75 |
| 2 | NiceGirls UltraReal | 0.50 |
The full merge graph is embedded in the .safetensors header (__metadata__.prompt / __metadata__.workflow),
so the recipe is verifiable from the file itself:
python -c "import json,struct;f=open('qwen-image-2512-realism-bf16.safetensors','rb');n=struct.unpack('<Q',f.read(8))[0];print(json.loads(f.read(n))['__metadata__']['prompt'])"
Files
| File | Params | Tensors | dtype | Size |
|---|---|---|---|---|
qwen-image-2512-realism-bf16.safetensors | 20.43 B | 1933 | BF16 | ~38 GiB |
qwen-image-2512-realism-int8_convrot.safetensors | 20.43 B | 3613 | INT8 ConvRot + BF16 | ~19.1 GiB |
| File | Size (bytes) | sha256 |
|---|---|---|
qwen-image-2512-realism-bf16.safetensors | 40,861,077,616 | 0536439ab5b416136e5ca290b7e037c65c1e9556926985513acbc4a3a38a06f7 |
qwen-image-2512-realism-int8_convrot.safetensors | 20,499,093,816 | 775cbeb1d06d077a166a230d8e77b8aa27598bd426c244629c8ea5aa3d8d788e |
Tensor keys are unprefixed (img_in.weight, transformer_blocks.0.…) — the model.diffusion_model.
prefix that ComfyUI's ModelSave writes has been stripped. ComfyUI loads either form; some trainers
(e.g. ostris/ai-toolkit) expect the bare keys, so this is the more portable of the two.
INT8 ConvRot
qwen-image-2512-realism-int8_convrot.safetensors is an INT8 ConvRot conversion of qwen-image-2512-realism-bf16.safetensors for ComfyUI. It loads with the same Load Diffusion Model (UNETLoader) node (weight_dtype default) and needs a ComfyUI with comfy-kitchen INT8 ConvRot support.
Conversion recipe
The reference is supermind/int8_convrot_models diffusion_models/qwen/qwen_image_2512_int8_convrot.safetensors (sha256 cd6f8c0388cdf88dd10f5b5516028cd39ee59bddc8fed402d391d7cb29169ee2). Its header defines the per-key rule (which tensors are quantized, the .comfy_quant JSON, dtypes), mirrored key-for-key.
INT8 ConvRot (840 tensors): int8_tensorwise with a per-row F32 weight_scale of shape [N, 1] and ConvRot enabled.
| Tensors | Count | ConvRot group size |
|---|---|---|
All linears in transformer_blocks.0–59: attn.to_q/k/v, attn.add_q/k/v_proj, attn.to_out.0, attn.to_add_out, img_mod.1, txt_mod.1, img_mlp.net.0.proj / net.2, txt_mlp.net.0.proj / net.2 | 840 | 256 |
Not quantized (1093 tensors): img_in, txt_in, proj_out, norm_out.linear, time_text_embed.timestep_embedder.linear_1/2, all biases and all norms — BF16, bit-identical to the bf16 file. These are exactly the tensors the reference keeps unquantized.
Each quantized layer carries a .comfy_quant U8 tensor with the same JSON as the reference: {"format": "int8_tensorwise", "convrot": true, "convrot_groupsize": 256}.
Comfy-Org's own INT8 ConvRot build of the same architecture (qwen_image_edit_2511_int8_convrot.safetensors in Comfy-Org/Qwen-Image-Edit_ComfyUI) uses the identical layout: same 840 quantized tensors, same group size, same dtypes. The only difference is an empty __index_timestep_zero__ marker tensor specific to the edit model, which is not added here.
Scale rule. The reference scales are not plain absmax: a per-row absmax quantizer (comfy-kitchen's TensorWiseINT8Layout.quantize) changes 37–73 % of the reference's int8 values on the layers checked. The rule was recovered from the reference itself and reproduces it (see Verification):
- Upcast the BF16 weight to FP32 and apply the ConvRot rotation
W · Hᵀ(block Hadamard, group size 256) with comfy-kitchen's portable implementation. - For every output row
r, try the 80 clip ratiosc = torch.linspace(0.55, 1.0, 80), withs = absmax(r) · c / 127andq = clamp(round(r / s), −127, 127). - Keep the
cwith the smallestΣ (q·s − r)²; on an exact tie the smallercwins. Storeqas I8 andsas the F32weight_scale.
comfy-kitchen 0.2.35, CUDA device. __metadata__ records the source file name, source sha256, recipe and reference.
Verification
Reproduction of the reference. The same script, run on the vanilla bf16 base (qwen_image_2512_bf16.safetensors from Comfy-Org/Qwen-Image_ComfyUI), was compared with the supermind INT8 file tensor by tensor:
| Key set, dtypes, shapes | identical (3613 tensors) |
| Non-quantized tensors, bit-identical | 1093 / 1093 (plus all 840 .comfy_quant payloads) |
| INT8 values differing | 1,185 of 20,384,317,440 (5.8 × 10⁻⁸), all by ±1 |
weight_scale tensors bit-identical | 719 / 840 |
| Scales differing by 1 ulp (≤ 2 × 10⁻⁷ relative) | 27,867 of 5,529,600 rows |
| Rows with a different clip ratio | 1 (transformer_blocks.16.img_mod.1, row 10962) |
The one row with a different clip ratio is an FP32 near-tie: the two candidate ratios give quantization errors that differ by 1.5 × 10⁻⁷ relative, about one ulp of the sum, so the choice depends on summation order. The 1-ulp scale differences have the same origin. Both are at the level of floating-point rounding, not a different recipe.
Dequantization check. Each INT8 tensor of this file was dequantized through ComfyUI's own comfy_kitchen path (inverse Hadamard rotation included) and compared with qwen-image-2512-realism-bf16.safetensors:
| Quantized tensors | 840 |
| Cosine, mean / min | 0.999962 / 0.999948 |
| Relative error, mean / max | 0.87 % / 1.02 % |
| Cosine without inverse rotation, mean (control) | 0.063 |
| Non-quantized tensors identical to the bf16 file | 1093 / 1093 |
Layout check. 3613 tensors; key set, dtypes, shapes and all 840 .comfy_quant payloads are identical to the reference. Only __metadata__ differs.
Load check. comfy.sd.load_diffusion_model (the UNETLoader path, ComfyUI 1568e6c) detects QwenImage, 840 of 846 Linear layers loaded as int8_tensorwise (ConvRot, group size 256), no missing or left-over keys.
Usage (ComfyUI)
Put the file in ComfyUI/models/diffusion_models/ and load it with Load Diffusion Model (UNETLoader).
It is a UNet only — you still need the stock Qwen-Image text encoder and VAE:
- Text encoder:
qwen_2.5_vl_7b.safetensors→ CLIPLoader, typeqwen_image - VAE:
qwen_image_vae.safetensors→ VAELoader
Anything that works with vanilla Qwen-Image-2512 (Lightning LoRAs, ControlNets, samplers) works here too.
Settings used for the example images
Two-pass, 4-step Lightning:
ModelSamplingAuraFlowshift 3.1Qwen-Image-2512-Lightning-4steps-V1.0-bf16LoRA @ 1.0- Pass 1: 1024×1536,
res_2m/bong_tangent, 16 steps, cfg 2.7, eta 0.5, denoise 1.0 (RES4LYFClownsharKSampler) - Latent upscale ×1.25 → 1280×1920, Pass 2: same sampler, denoise 0.45
- Negative (Chinese, from the Qwen-Image default set):
低分辨率,低画质,肢体畸形,手指畸形,画面过饱和,蜡像感,人脸无细节,过度光滑,画面具有AI感,构图混乱,背景模糊、散景。
A plain KSampler with the Lightning LoRA (4–8 steps, cfg 1.0) also works fine; the RES4LYF setup is just
what the samples happen to use.
Examples
examples/merged/ — this model. examples/base/ — vanilla Qwen-Image-2512 for comparison, same seed
(927056266523880), same scene, same sampler settings.
| base | merged (this model) |
|---|---|
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
The example PNGs do not carry generation metadata.
Download
pip install -U huggingface_hub
hf download beycanai/qwen-image-2512-realism qwen-image-2512-realism-bf16.safetensors \
--local-dir ComfyUI/models/diffusion_models
INT8 ConvRot:
hf download beycanai/qwen-image-2512-realism qwen-image-2512-realism-int8_convrot.safetensors \
--local-dir ComfyUI/models/diffusion_models
Notes
- The bf16 file is not quantized. For less VRAM use the INT8 ConvRot file above, or quantize it yourself (GGUF / fp8) — nothing here blocks that.
- Merged LoRA strengths are fixed. If you want a different balance, merge again from the base with your own strengths rather than trying to unbake these.
- Useful as a LoRA-training base when you want the realism prior already present; it is a full-weight model, so it trains like the base does.
Credits
- Base model: Qwen/Qwen-Image-2512 (Apache-2.0)
- SamsungCam UltraReal and NiceGirls UltraReal — credit to their authors; their Civitai license terms apply to this merge as well.



















