self-hosted/ai
§01·recipe · image

Qwen-Image-2.1 on RTX 3090 Ti: int8 ComfyUI setup, what stays resident in 24 GB, 2K and edits

imageintermediate12GB+ VRAMSep 23, 2026

This intermediate recipe sets up Qwen-Image-2.1 on the RTX 3090 Ti, needing about 12 GB of VRAM.

models
tools
prerequisites
  • NVIDIA RTX 3090 Ti 24 GB (Ampere GA102, compute capability 8.6)
  • ComfyUI v0.37.0 or newer: the v0.37.0 Windows portable (the nvidia build, not the cu126 one) or a git install
  • A CUDA 13 (cu130) build of PyTorch and an NVIDIA driver from the 580 branch or newer
  • Python 3.10 or newer for a git install (the portable ships 3.13)
  • System RAM: no measured minimum; the three files are 16.096 GiB, and whatever the card does not hold is kept in RAM
  • 18 GB free disk for the int8 diffusion model, int8 text encoder and VAE (17.28 GB as Hugging Face counts it)
  • Research or evaluation use only: the Qwen Research License forbids commercial use of the weights

What You'll Build

A local Qwen-Image-2.1 setup on a 24 GB RTX 3090 Ti in ComfyUI, using the int8 files ComfyUI's own templates load: text-to-image at 1024×1024 and at the model's native 2048×2048, RGBA output with a real alpha channel, and instruction-based editing with reference images. Qwen-Image-2.1 is a 7B single-stream diffusion transformer (32 layers, per the repo's transformer/config.json) behind a Qwen3-VL-8B text encoder and a 64-channel RGBA VAE, released 2026-09-20.

On a 24 GB card the question is not whether it fits. The template's three files are 16.096 GiB, so at 1024² the transformer, the text encoder and the VAE all stay on the card, and a new prompt only re-runs the encoder, which a 12 GB card cannot do. What this page adds for the RTX 3090 Ti is where its numbers come from: the capacity the card reports to ComfyUI on Windows and on Linux, read from RTX 3090 Ti owners' own startup logs, which decides how native 2K goes; the reports that name this card, from its Native ops line to a GGUF run and a streak report; and the only timings on this die, which are a third party's runs on an RTX 3090.

⚠️ Read the licence before you download 17 GB. The weights ship under the Qwen Research License Agreement. Section 1.i defines "Non-Commercial" as the only permitted use: it "shall mean for research or evaluation purposes only." Section 2.a grants the licence "FOR NON-COMMERCIAL PURPOSES ONLY". The grant is worldwide and there is no clause excluding any territory (section 4.a only reminds you that export controls may apply, and section 8 sets Chinese law and the courts of Hangzhou for disputes). The restriction is on purpose, not on place. Section 4.b reaches outputs in one specific case: "If you use the Materials or any outputs or results therefrom to create, train, fine-tune, or improve an AI model that is distributed or made available, you shall prominently display “Built with Qwen” or “Improved using Qwen” in the related product documentation." Every repack on this page, Comfy-Org's int8 files included, is a derivative and carries the same terms. Section 2.b gives an address for a commercial licence; a reader reports in the vendor's discussion #7 that mail to it bounces. This is a reader's summary of the text, not legal advice.

Hardware data: RTX 3090 Ti (24 GB VRAM, GA102, compute capability 8.6) · not measured on this card by this site · the three template files are 16.096 GiB and stay resident at 1024²; 7.194 GiB of the 23.540 GiB a Linux 3090 Ti reports is left after comfy-aimdo's headroom (derived) · no timing on this card; a third party's RTX 3090 timings in Results · See benchmark data

ℹ️ Nothing on this page was measured on an RTX 3090 Ti by this site. The VRAM figures are arithmetic from byte counts, from ComfyUI's source at tag v0.37.0 and from RTX 3090 Ti owners' public startup logs, added up unrounded and rounded once. No timed run of Qwen-Image-2.1 on an RTX 3090 Ti turned up, and the only timed runs on the same die are alesha-pro's, on one RTX 3090 (Results). Searched on 2026-09-23, for both cards: all 85 threads opened on the ComfyUI tracker since 2026-09-19, bodies and every comment; the 62 discussions on Qwen/Qwen-Image-2.1, Comfy-Org/Qwen-Image-2.1 and Comfy-Org/Qwen3-VL; the 56 discussions on the other 150 repositories a Hugging Face search for the model name returns (one has discussions switched off); the 196 comments of the Hacker News launch thread; the vendor's 13 GitHub issues and pull requests; SGLang's Qwen-Image-2.1 cookbook; and one web search. Reddit refused this session. If you run it, post your numbers.

ℹ️ The two places this page uses measurements from this site, both from a different card. The site's operator ran the template on one RTX 5060 Ti 16GB (Blackwell), in two sessions published as raw data. This page uses two facts from them, and names the card and links the sessions at each use: (1) the template image took 21.4 s cold on a cu130 build against 69.4 s on a cu128 build (Troubleshooting, the entry on the cu130 WARNING); (2) on that card int8 was faster than bf16 on cu130 and slower on cu128 (Running, Optional: the bf16 transformer), cited as a Blackwell result that cannot be assumed to transfer to this card. One rig, one operator, unreplicated, and neither is an estimate for this card.

Requirements

ComponentMinimumThis recipe
GPU12 GB VRAM, NVIDIA (24 GB keeps all three files resident)RTX 3090 Ti (24 GB) — not measured by this site; the budget below is derived, and the timings in Results are a third party's, on an RTX 3090 (/contribute)
RAMnot established— the three files are 16.096 GiB, and what is not on the card lives in RAM
Storage17,283,091,112 B = 16.096 GiB (int8 DiT + int8 encoder + VAE)— byte counts from the Comfy-Org tree API
SoftwareComfyUI ≥ v0.37.0, PyTorch cu130, driver ≥ 580

min_vram_gb is 12, the floor this exact install gets on this model's RTX 3060 page: 12 GB is the smallest card size in this catalogue on which every stage keeps its weights whole under both of ComfyUI's loaders. It is not this card's number and not a peak. The derivation for 24 GB is below.

The card, from primary sources

  • Ampere, compute capability 8.6, 24 GB GDDR6X, 10,752 CUDA cores, 450 W graphics card power for NVIDIA's Founders Edition. Those are the values on NVIDIA's spec page for the RTX 3090 family, which prints CUDA Capability 8.6 for this card. The number that matters is 8.6: Ampere has INT8 tensor cores and no FP8 or FP4 ones, and ComfyUI decides per device which weight formats run natively from exactly that. The same page gives the RTX 3090 10,496 cores, a 1.70 GHz boost clock against this card's 1.86 GHz, and 350 W for its Founders Edition; nothing measured says what those differences mean for this model (Results).

  • GA102. The PCI ID registry lists device 10de:2203 as GA102 [GeForce RTX 3090 Ti] and 10de:2204 as GA102 [GeForce RTX 3090] (pci.ids). The RTX 3090 is the one other consumer card with this die and 24 GB; it has its own page in this series.

  • What ComfyUI sees on this card. Searches of the ComfyUI tracker for "Total VRAM" "3090" and "VRAM Total" "3090" return 156 threads. 12 of them carry a startup log naming an RTX 3090 Ti. One, #12517, names an NVIDIA GeForce RTX 3090 TI GPU with 6,144 MB, which is neither NVIDIA's device string for this card nor its capacity, and it is left out. The other 11 hold 11 posts from 10 users, one per thread: 10 with a Total VRAM log line and 3 with a system-information block (two carry both, #5903 and #6222), counting each post once and leaving out block-quoted copies of someone else's log. Classified from each log's own evidence (Windows paths, an MSC-built Python, the portable's python_embeded or OS: nt, against a GCC-built Python, Linux paths or OS: posix):

    • Windows, 7 users: the lines read 24,563 or 24,564 MB, and both system-information blocks read 25,756,696,576 B (#6222, #7948). One Windows log reads 23,027 MB (#1065, ComfyUI 0.3.30), and nothing in it explains the difference.
    • Linux, 3 users: 24,105 MB (#14076), 24,149 MB (#4818) and a system-information block reading 25,415,909,376 B (#5903).

    This page budgets on 25,756,696,576 B = 23.988 GiB for Windows and on the lowest Linux reading, 24,105 MB = 23.540 GiB (the log rounds to the MiB). That is a small sample; the RTX 3090 readings in the same threads, from 87 accounts, show the same pattern, with Linux reporting 0.3 to 0.5 GiB less than Windows.

  • What is left for ComfyUI on a real machine. One Windows user's system-information block was taken with ComfyUI running and PyTorch holding nothing (Torch VRAM Total: 0): 24,405,606,400 B = 22.729 GiB free, so the desktop, the CUDA context and whatever else was running took 1.258 GiB (#6222). The Windows columns below use it as a realistic usable pool; it is one owner's machine, not a promise about yours. No Linux block of this card with PyTorch idle turned up; on three RTX 3090 Linux machines, a different card, 0.258 to 0.514 GiB was taken (#10906, #11109, PR #8669), which gives the scale of what the Linux columns leave out.

The three files

Byte-exact from the Comfy-Org repack's tree API at revision ace0edeb. The repo's head is now 9a44dbdb (2026-09-23, README changes only): every weight file's size and LFS hash is the same at both revisions (read 2026-09-23).

FileBytesGiBDestination
diffusion_models/qwen_image_2.1_int8_convrot.safetensors7,256,783,0646.758models/diffusion_models/
text_encoders/qwen3vl_8b_int8_convrot.safetensors9,350,798,3608.709models/text_encoders/
vae/qwen_image_2.1_vae_bf16.safetensors675,509,6880.629models/vae/

The same repo holds a bf16 DiT (14,230,280,616 B = 13.253 GiB), a bf16 encoder (17,534,334,616 B = 16.330 GiB), a w4a8 encoder (6,312,105,364 B = 5.879 GiB) and two qwen3.5_9b_…_pe_… files, which are prompt enhancers, not encoders. Its recursive tree lists ten files, and its two DiT builds are bf16 and int8: there is no fp8 or nvfp4 DiT in it, and none of the other five Comfy-Org/Qwen-Image* repos holds a file with 2.1 in its name. The ComfyUI docs page for this model agrees with the templates since a docs commit on 2026-09-22 (source): "All of them use the int8 versions of the diffusion model and the text encoder by default."

What 24 GB holds, per loader

ComfyUI has two loaders, and they budget VRAM differently. The default is DynamicVRAM: main.py at v0.37.0 enables it on any NVIDIA device once PyTorch is 2.8 or newer and comfy-aimdo initialises. You land on the legacy estimate-based loader instead if you pass --disable-dynamic-vram (or --highvram, --gpu-only, --novram, --cpu), or if the startup log says Falling back to legacy ModelPatcher. Both views come from ComfyUI's source at tag v0.37.0 (comfy/model_management.py, comfy/sampler_helpers.py, comfy/sd.py, comfy/model_patcher.py), from comfy-aimdo v0.5.5 (the version requirements.txt pins) and from the byte counts above.

DynamicVRAM (the default). ComfyUI's own memory estimates do not govern this loader. ModelPatcherDynamic.partially_load() accepts the reserve load_models_gpu() computes and never uses it, and free_memory() does not unload one dynamic model to make room for another; the comment there says "don't actually unload dynamic models for the sake of other dynamic models". The floor is comfy-aimdo's, and it differs by OS. On Linux, src/plat.h defines VRAM_HEADROOM (256 * 1024 * 1024), 0.25 GiB, kept free against the card's live free VRAM, i.e. after whatever the desktop and the CUDA context already hold. The Windows build uses src-win/shmem-detect.c instead, which keeps 512 MiB (0.5 GiB) free against both the WDDM budget and NVML's free-VRAM reading. --reserve-vram N only raises a second, capacity-based term (comfy-aimdo's own control.py says a value below 256 MB changes nothing), and --vram-headroom N adds N GiB on top of both. Weights are loaded on demand and evicted when an allocation needs the room: the comfy-aimdo README describes "on-demand offloading of model weights when the primary pytorch VRAM allocator comes under pressure". So a stage never fails for want of room for its weights; the table says whether everything can stay resident at once.

All weights resident, DynamicVRAM (weights + live headroom)WeightsTotal, Linux (+0.25)Left of 23.540 GiB, LinuxTotal, Windows (+0.5)Left of 23.988 GiB, WindowsLeft of 22.729 GiB free, Windows (one machine)
Template: int8 DiT + int8 encoder + VAE16.096 GiB16.346 GiB7.194 GiB16.596 GiB7.392 GiB6.133 GiB
bf16 DiT + int8 encoder + VAE22.591 GiB22.841 GiB0.699 GiB23.091 GiB0.897 GiB−0.361 GiB
int8 DiT + bf16 encoder + VAE23.718 GiB23.968 GiB−0.428 GiB24.218 GiB−0.230 GiB−1.488 GiB
bf16 DiT + bf16 encoder + VAE30.212 GiB30.462 GiB−6.922 GiB30.712 GiB−6.724 GiB−7.983 GiB

Every "left" figure must also hold the sampling activations, the encoder's working memory, the decode's working memory and, in the Linux columns, the CUDA context (0.258 to 0.514 GiB on the three idle RTX 3090 Linux machines above). Nothing sizes those in advance on this loader. For scale, ComfyUI's legacy planning figures are 0.960 GiB of sampling activations at 1024² and 3.840 GiB at 2048², and 1.758 GiB and 7.031 GiB for the VAE decode.

Legacy loader (only if you are on it). Here the reserve is real: minimum_inference_memory() is 0.8 GiB plus EXTRA_RESERVED_VRAM (comfy/model_management.py L877-L891). That reserve is 400 MiB on Linux; on Windows it is 600 MiB, plus 100 MiB when total VRAM exceeds 15×1024 MiB, which this card does, so 700 MiB. The floor is therefore 1.191 GiB on Linux and 1.484 GiB on Windows. Two figures come out of it for every model the loader loads, and they do different jobs:

  • The request. Before loading, load_models_gpu() asks free_memory() for 1.1 × the model's weights plus the larger of the floor and "estimate + EXTRA_RESERVED_VRAM". For the sampler that estimate is at double batch, even at cfg 1 (comfy/sampler_helpers.py L177): 0.960 GiB at 1024², 3.840 GiB at 2048², from memory_usage_factor = 6.0 and 64×64 or 128×128 latent tokens. For the VAE it is the decode estimate, 900 × h × w × 256 × dtype_size over the latent grid in comfy/sd.py with the VAE in bf16 on this card: 1.758 GiB at 1024², 7.031 GiB at 2048². The text encoder has no estimate, so its request uses the floor. If less than the request is free, free_memory() partially unloads resident models by the difference, copying those weights back to system RAM (legacy partially_unload moves modules with .to()), and they are loaded again when next needed.
  • The threshold. Whether the model then loads whole is decided by its weights plus the larger of the floor and the batch-1 estimate + EXTRA_RESERVED_VRAM (0.480 GiB and 1.920 GiB for the sampler, L178); for the VAE, its decode estimate + EXTRA_RESERVED_VRAM.

For the template's first image, in the order ComfyUI runs it, with "free" meaning the card's reported capacity minus the weights already resident, before the CUDA context and any desktop:

Stage, legacy loaderLoadsAlready residentFree, LinuxRequest / threshold, LinuxFree, WindowsRequest / threshold, WindowsFree on the one Windows machine
Text encodeencoder 8.709 GiBnothing23.540 GiB10.770 / 9.899 GiB23.988 GiB11.063 / 10.192 GiB22.729 GiB
Sample, 1024²DiT 6.758 GiBencoder14.831 GiB8.785 / 7.949 GiB15.279 GiB9.078 / 8.242 GiB14.021 GiB
Decode, 1024²VAE 0.629 GiBencoder + DiT8.073 GiB2.840 / 2.778 GiB8.521 GiB3.133 / 3.071 GiB7.262 GiB
Sample, 2048²DiTencoder14.831 GiB11.665 / 9.069 GiB15.279 GiB11.958 / 9.362 GiB14.021 GiB
Decode, 2048²VAEencoder + DiT8.073 GiB8.114 / 8.051 GiB8.521 GiB8.407 / 8.344 GiB7.262 GiB

At 1024² all three stay resident under either loader. Every legacy request is met with more than 4 GiB to spare, and under DynamicVRAM 7.194 GiB is left on Linux (6.133 GiB on the one Windows machine). A prompt change re-runs the encoder on weights already on the card; a seed-only change reuses the cached conditioning and skips it. That is the practical difference from a 12 GB card, where the encoder and the DiT take turns.

At 2048² the decode is the tight step, and the OS decides by how much. On the legacy loader the decode asks for 8.114 GiB on Linux, while a Linux 3090 Ti has at most 8.073 GiB free with the encoder and DiT resident before its CUDA context: part of one resident model's weights leave the card, at least 0.041 GiB plus whatever the CUDA context holds. On Windows the request is 8.407 GiB against 8.521 GiB before the desktop, but on the one Windows machine above only 7.262 GiB is free, so 1.144 GiB of weights leave on that machine's figures. Which model gives them up follows ComfyUI's unload order (lower reference count first, then the smaller model); they are copied to system RAM and loaded back for the next image's sampling. The VAE then loads whole, because 8.114 − 7.422 leaves 0.692 GiB for its 0.629 GiB. On the default loader the VAE is itself a dynamic model: free_memory(for_dynamic=True) does not unload the DiT for it, and the decode estimate only sizes the decode batch (comfy/sd.py L1260-L1265). Whether any weights leave the card there depends on the decode's real working memory, which no report listed at the top measures on this card; if they do, comfy-aimdo frees those pages without copying them anywhere. Either way ComfyUI keeps a fallback for a decode that still runs out: it logs "Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding." and tiles it.

The alternative sets in the DynamicVRAM table: the bf16 DiT with the int8 encoder is the only one that comes near co-residence, and it is covered under Running. Anything with the bf16 encoder cannot keep all its weights on this card under either loader.

Installation

1. ComfyUI v0.37.0 or newer, on a cu130 PyTorch

Support landed in ComfyUI core with PR #16400 (author kijai, merged 2026-09-19), and tag v0.37.0 contains it: the compare view shows the tag eight commits ahead of that merge and none behind. The v0.37.0 release was published at 07:35 UTC on 2026-09-21 with Windows portable builds, and it was still the latest release when this page was written (2026-09-23, 12:57Z). A tag v0.37.1 (commit 3f767e7f67) was cut at 19:12Z on 2026-09-22 with no release object or portable build. Its three commits are Hunyuan Image 3.5 partner nodes, a workflow-templates pin moved from 0.11.66 to 0.11.68, and the version bump; none of them changes the model's code or any of the three Qwen-Image-2.1 workflow files. The backport pull request for it, PR #16467, was closed without merging.

Windows portable. Take ComfyUI_windows_portable_nvidia.7z from that release. The ComfyUI README at the tag says "The portable above currently comes with python 3.13 and pytorch cuda 13.0.", which is the build this card needs. Do not take ComfyUI_windows_portable_nvidia_cu126.7z: the README labels it for 10-series and older cards, adding "DO NOT USE THIS ON NEWER 20 SERIES AND ABOVE GPUS", and on this card a CUDA 12 build switches off the fast int8 kernels (step 2).

Git (Linux; on Windows use the portable, or swap the activation line as noted in the block). Install PyTorch from the cu130 index first, then the requirements. The torch line in requirements.txt is unpinned, so the order decides which build you get:

git clone https://github.com/Comfy-Org/ComfyUI
cd ComfyUI
git checkout v0.37.0
python -m venv venv
source venv/bin/activate    # Windows cmd/PowerShell: venv\Scripts\activate
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu130
pip install -r requirements.txt
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.get_device_capability())"
git describe --tags

The print must show a +cu130 torch, 13.0 and (8, 6), and git describe must read v0.37.0. The README states the requirement as policy, "Using a cu130 or above version of pytorch is required on Nvidia 20 series and above.", and a CUDA 13 build needs an NVIDIA driver from the 580 branch or newer, the minimum NVIDIA's CUDA release notes give for CUDA 13.x. A ComfyUI maintainer, comfyanonymous, put the same policy plainly on 2026-09-21 in #16449, a thread from a user whose NAS driver stops at CUDA 12.9: "We only offer minimal support for cuda 12 on older GPUs that don't support cuda 13. We do not support using cuda 12 on newer GPUs." requirements.txt at the tag pins comfy-kitchen==0.2.35, comfy-aimdo==0.5.5 and comfyui-workflow-templates==0.11.66; the last is the templates release that switched the Qwen-Image-2.1 templates to the int8 encoder. Leave this shell open with the venv active: step 3 runs in it.

Tag or master? Stay on the tag. Among the changes that merged into master after it, three touch the 2.1 transformer file: PR #16429, which changes where the edit path's K/V cache is placed (see Editing), PR #16430, which adds ComfyUI's memory compiler to the 2.1 transformer blocks, and PR #16419, which lets a model file choose the attention per block. master also carries the code path of two open hard crashes (Troubleshooting): issue #16443 on image editing, and the one PR #16481 describes on the second generation. The tag has neither fix, and it is not known to be immune to the second one (see its entry). Nothing on this page needs master.

2. What Ampere gets from the int8 files, and what it does not

Both int8 files carry, per layer, the quantisation format int8_tensorwise with convrot: true and a group size of 256 (read from each file's safetensors header). What happens to those weights differs between the two models.

For the diffusion model, the formats run natively here. ComfyUI decides per device in get_disabled_quant_formats() in comfy/ops.py, from checks in model_management.py. For compute capability 8.6: supports_fp8_compute() is False (major 8, minor below 9), supports_nvfp4_compute() and supports_mxfp8_compute() are False (major below 10), and supports_int8_compute() is True; it has no compute-capability test and excludes only MPS, Intel XPU, DirectML and ixuca. At v0.37.0 comfy/quant_ops.py defines seven formats with the pinned comfy-kitchen (six unconditionally, and mxfp8 when comfy-kitchen provides its layout, which 0.2.35 does), and ComfyUI prints how they split when it loads the model. The reporter of #16175, who gives their setup as an RTX 3090 Ti on Windows 11 with ComfyUI 0.34, posted the line to expect:

Native ops: int8_tensorwise, convrot_w4a4, asym_w4a8_int8 , emulated ops: float8_e4m3fn, float8_e5m2, nvfp4, mxfp8

The order varies, because the line prints a set. An emulated layer's weight is dequantised to bf16 for the matmul.

With a cu130 PyTorch, comfy-kitchen runs them on its CUDA kernels. At v0.2.35 (pinned by commit, backends/cuda/__init__.py), int8_linear is registered for compute capability 7.5 and up; the activations are rotated and quantised in a fused kernel, and the GEMM goes through its CUTLASS INT8 path, which the source enables for compute-capability major 8 and above. The default build targets in setup.py include 80-real, and NVIDIA's Ampere compatibility guide says a cubin runs on any GPU with the same major and the same or a higher minor compute capability, which covers this card's 8.6. A Linux RTX 3090 Ti log with a CUDA 13 build, #14076 (ComfyUI 0.22.0, torch 2.12.0+cu130), shows the result on this card: Found comfy_kitchen backend cuda: {'available': True, 'disabled': False, ...}, and DynamicVRAM support detected and enabled.

Without cu130 nothing breaks for the diffusion model; it runs the slow way. The gate is in comfy/quant_ops.py: below CUDA 13 it calls ck.registry.disable("cuda") and logs "WARNING: You need pytorch with cu130 or higher to use optimized CUDA operations." comfy-kitchen then falls through to its eager int8_linear, which applies the rotation as ordinary torch ops and still runs an integer GEMM through torch._int_mm. That is a working INT8 path with the fusion gone, not a dequantisation to bf16. The Native ops line will not warn you, because it reflects the hardware, not which backend is alive; the tells are the WARNING and 'disabled': True on the backend line. One path does break without cu130: #16449 reports that on v0.37.0 with a cu128 build and a driver older than 580, any node that generates text with a Qwen3-VL encoder (the prompt enhancers' TextGenerate path, which this page does not install) fails on its first decode step with CUDA driver version is insufficient for CUDA runtime version. Text encoding for image generation was unaffected.

For the text encoder the table above does not apply. At v0.37.0 every quantised encoder is built with mixed_precision_ops(..., full_precision_mm=True) in comfy/sd1_clip.py, so each weight is dequantised for its matmul on every card. The one call that switches quantised matmuls back on, use_quantized_matmul, wraps only generate(), i.e. LLM text generation, not the conditioning encode this model uses. The encoder's file format is a memory choice, and on 24 GB the int8 encoder is already resident beside everything else. Comfy-Org's encoder repo Comfy-Org/Qwen3-VL also holds qwen3vl_8b_fp8_scaled.safetensors (10,588,637,512 B = 9.861 GiB, larger than the int8 file) and qwen3vl_8b_nvfp4.safetensors (6,305,221,764 B = 5.872 GiB); on this card neither buys speed, and the bf16 encoder breaks co-residence (table above).

Why the int8 DiT, and what is not known about its speed here. The reason this page can give is memory: with the bf16 DiT instead, the three files leave 0.699 GiB of a Linux 3090 Ti under DynamicVRAM before the CUDA context and any activations (table above), so the int8 file is what keeps all three resident. With a cu130 build its matmuls run as INT8 GEMMs on this card's INT8 tensor cores (above). How that compares with bf16 on compute capability 8.6 has open questions, and the numbers that exist are not for this model:

  • comfy-kitchen issue #98 (open) timed MiniMax H3 projections on an RTX A6000, a workstation GA102 card, with comfy-kitchen 0.2.26: at 80,661 tokens the QKV projection took 144.3 ms for int8 ConvRot under the automatic CUTLASS configuration, against 148.8 ms in bf16, and roughly 90 ms with configuration 0 forced.
  • comfy-kitchen PR #142 (open, unmerged, not in the pinned 0.2.35) adds a tile heuristic for compute capability 8.6. Its A6000 sweep over 21 shapes from LTX 2.5 and MiniMax H3 found the current heuristic, fitted on Ada and Blackwell, losing 44–50% to configuration 0 on the worst shapes.

Both are kernel measurements for other models' shapes, not Qwen-Image-2.1 timings. One dissent about this model turned up in the places listed at the top: on the repack's discussion #13 a user writes that "Int8 ConvRot is significantly slower on non blackwell or enterprise GPUs", with no numbers and no card named, and points to two reports (a Turing card on discussion #8, and #16470, an RTX 5060 Ti on a cu128 build) in which the replies pointed to the cu130 requirement. The one pair of runs on this die that turned up points the other way, with caveats: in alesha-pro's two validation records on one RTX 3090, the same die as this card (Results), both run on Linux on the legacy loader with a 1 GiB reserve (the package's launcher passes --disable-dynamic-vram --reserve-vram 1, install/setup.py L128), the int8 files took 21.823 s for a 1024², 40-step RGBA job and 84.295 s for 2048×1152 at 50 steps, and a Q4_K_M GGUF DiT in leejet's loader took 54.75 s and 153.31 s at the same sizes, steps, sampler and launcher, in a separate session with different seeds and job order. That is int8 against a GGUF, not against bf16. No whole-pipeline int8-against-bf16 comparison of this model on an Ampere card turned up in the places listed at the top or in comfy-kitchen's own tracker (all 191 issues and pull requests, read 2026-09-23).

3. Download the weights

The repo's folder names match ComfyUI's models/ layout, so --local-dir models lands each file where the loaders look. On a git install, run this from inside the ComfyUI folder with the venv active, the shell step 1 left you in. The revision pin is the one whose byte counts are in the table above:

pip install -U huggingface_hub
hf download Comfy-Org/Qwen-Image-2.1 \
  diffusion_models/qwen_image_2.1_int8_convrot.safetensors \
  text_encoders/qwen3vl_8b_int8_convrot.safetensors \
  vae/qwen_image_2.1_vae_bf16.safetensors \
  --revision ace0edeb3791a594ddfa36ed5f41a178a394e921 --local-dir models

On the Windows portable there is no pip or hf on PATH. Use the Python the portable ships, python_embeded\python.exe, the same interpreter its run_nvidia_gpu.bat starts ComfyUI with and its updater runs pip through, from the portable's top folder (the one holding python_embeded and ComfyUI):

python_embeded\python.exe -s -m pip install -U huggingface_hub
python_embeded\python.exe -s -m huggingface_hub.cli.hf download Comfy-Org/Qwen-Image-2.1 diffusion_models/qwen_image_2.1_int8_convrot.safetensors text_encoders/qwen3vl_8b_int8_convrot.safetensors vae/qwen_image_2.1_vae_bf16.safetensors --revision ace0edeb3791a594ddfa36ed5f41a178a394e921 --local-dir ComfyUI\models

(-m huggingface_hub.cli.hf is the module behind the hf command; it runs directly because cli/hf.py ends in a __main__ guard.)

Then check the bytes against the LFS hashes. On 17 GB this is worth doing, and it is the first thing to try for a load error or for images that come out as noise (Troubleshooting). On Windows, certutil -hashfile <file> SHA256 prints the same hash.

sha256sum models/diffusion_models/qwen_image_2.1_int8_convrot.safetensors
# cb74113cb03faecd79611b01fd7fd642f0aa60d6f0b95086abee214d75eaa57d
sha256sum models/text_encoders/qwen3vl_8b_int8_convrot.safetensors
# 8bfd0f6e12abf2d2d697ecc888e5e90b0d6741d6708f05799f53afa560452e8f
sha256sum models/vae/qwen_image_2.1_vae_bf16.safetensors
# bb21f7473051e1ac368515dd3f2e15cd44d7a11748ee8823e1ddca3e4876b7c9

Do not load either qwen3.5_9b_qwen_image_2.1_pe_*.int8_convrot.safetensors file as the text encoder: those are Qwen3.5-9B prompt-rewriting models for an optional LLM stage, and a reader on the repack's discussion #4 who swapped one in got garbled images; as another reader put it there, "The PE models only for PE." (Landsharkbaby, community). This page does not install them; if you add that stage, #16449 above is the cu130 caveat that applies to it.

Running

Start ComfyUI normally, with no --lowvram, no --reserve-vram, nothing: python main.py in the same shell, or run_nvidia_gpu.bat on the portable. On this card the first screen of the log should show:

  • Device: cuda:0 NVIDIA GeForce RTX 3090 Ti : cudaMallocAsync.
  • Total VRAM 24564 MB (or 24563) on Windows, or a figure around 24100 to 24240 on Linux, as in the owners' logs above.
  • pytorch version: ending in +cu130, and no line starting "WARNING: You need pytorch with cu130 or higher to use optimized CUDA operations."
  • Found comfy_kitchen backend cuda: {'available': True, 'disabled': False, ...}. The cu130 gate leaves the backend available and sets disabled, so checking available alone proves nothing.
  • DynamicVRAM support detected and enabled and ComfyUI version: 0.37.0.

On the first generation, Using mixed precision operations is followed by the Native ops line from step 2.

--lowvram is documented in comfy/cli_args.py as "Doesn't do anything if dynamic vram is enabled.", and on 24 GB there is no reason for it anyway. If you want more kept free for other software, use --vram-headroom N, which adds N GiB on top of both of comfy-aimdo's checks.

Text-to-image

Open the Template Library and load Qwen Image 2.1: Text to Image (image_qwen_image_2_1_t2i.json, read at workflow-templates v0.11.66, the version v0.37.0 pins, and unchanged in 0.11.68). The values that govern it sit on the outer subgraph node: UNETLoaderqwen_image_2.1_int8_convrot.safetensors, CLIPLoaderqwen3vl_8b_int8_convrot.safetensors with type qwen_image, VAELoaderqwen_image_2.1_vae_bf16.safetensors, 25 steps, cfg 1, euler / simple, 1024×1024. The template's own note explains the setting people change first: "negative_prompt: unused while cfg is 1." At cfg 1 ComfyUI skips the negative pass entirely; raising cfg adds a second model pass on every step. The vendor's diffusers example runs 40 steps; the template's 25 is ComfyUI's choice, not Qwen's.

On the repack's discussion #11, one user (Xenodermus, 2026-09-22 16:00Z) reported faint banding on skin, fabric and fur at the template's 25 steps at 1024×1024, with both the int8 and the bf16 files and both schedulers they tried, and wrote that the "Artifact disappeared completely at 40" steps. A second user posted their own workflow at 18:01Z. At 22:11Z the first user wrote that with that workflow, and a prompt they had toned down, they "see no streaks". A third user wrote on 2026-09-23 at 01:15Z: "Use 40 steps and choose 2k quality." So two remedies are reported, by a handful of users, with no maintainer reply (read 2026-09-23). More steps cost time in proportion.

A step-distilled option for 2.1 appeared on 2026-09-22: Viggle/Qwen-Image-2.1-viggle-turbo, a third-party 4-step distillation by Viggle, shipped as a rank-64 LoRA and as a full bf16 transformer and labelled a v0.1 preview. Its card says the release "still falls short of the base model": text-to-image at 4 steps is usable, complicated edits are clearly worse. The card documents diffusers only, with its own scheduler setting, and names no ComfyUI workflow; nothing on this page was run with it. Third-party ComfyUI conversions of it have appeared since (read 2026-09-23): t8star/Qwen-Image-2.1-viggle-turbo-4step-r64-comfy, a ComfyUI-format conversion of the LoRA, and GGUF conversions of the full transformer in Abiray/Qwen-Image-2.1-viggle-4-steps-turbo-GGUF and realrebelai/Viggle_Qwen-Image-2.1-Turbo_GGUFs; nothing on this page was run with any of them. Two reports about Qwen-Image-2.1 with a LoRA turned up in the 85 ComfyUI tracker threads listed at the top, both closed on 2026-09-23: PR #16493, an error on adding or removing a LoRA on a quantized model, reported on master and closed unmerged by its author (Troubleshooting), and issue #16496, in which one user's edits came out shifted to the left, which that user attributed at 13:16Z to Viggle's 4-step LoRA, naming no GPU or build, before closing it.

For native 2K the template note says "For native 2K, set 1:1 and 4 megapixels"; the budget for it is in Requirements. The sampling schedule does not follow the resolution: ComfyUI fixes this model's shift at 0.69 at every size, while the vendor's scheduler shifts dynamically. Issue #16447 (open) reports the mismatch, and comfyanonymous replied: "This is kind of on purpose, the higher the shift the more you see a grid pattern". A second user answered that the fixed shift makes images far noisier than they should be.

For a transparent image, wrap the prompt the way the model card does, This is an RGBA image with transparency. <your subject>. The image has alpha channel and the background is transparent., and keep the template's SaveImageAdvanced at PNG, 8-bit, sRGB, which keeps the alpha channel.

Editing with reference images

Load Qwen Image 2.1: Image Edit (image_qwen_image_2_1_image_edit.json, same release). Same three loaders, plus a TextEncodeQwenImage21 node with the VAE connected and resolution 0, and a QwenImage21Cache node at auto / default. The template's note says why the resolution is 0: "This template starts at 0: no resize beyond a multiple of 32." Reference images are seen by the encoder's vision tower and, because the VAE is connected, spliced into the sequence as latents. The text and reference tokens are the same on every step, so their attention K/V are computed once and cached; PR #16400 puts the gain at about 1.7× on edits. The cache node's tooltip in comfy_extras/nodes_qwen.py: "auto uses spare VRAM, then RAM. cpu (RAM) is prefetched behind compute and costs little speed."

On 24 GB the cache can stay on the card, but not with the defaults. The cache costs 2 × 32 layers × 4096 × 2 bytes = 524,288 B per cached token in bf16, half that with the node's dtype int8 (comfy/ldm/qwen_image21/model.py). At v0.37.0, auto places it on the GPU only if four times its size is free there, then in system RAM under the same rule, and otherwise recomputes the prefix on every step. An explicit device skips that test and asks for twice the size free. With all three files resident, at most 7.444 GiB is free on a Linux 3090 Ti before the CUDA context and activations, and 6.633 GiB on the one Windows machine above. The template's two reference images are 896×1152 each:

Template references (two), before the prompt's own tokensTokensCache, bf16Cache, dtype int8auto needs free (4×, int8)device gpu + int8 needs free (2×)
resolution 0 (896×1152 each, the template default)8,0643.938 GiB1.969 GiB7.875 GiB3.938 GiB
resolution 1056 (928×1184 each, the #16435 workaround below)8,5844.191 GiB2.096 GiB8.383 GiB4.191 GiB
resolution 512 (448×576 each)2,0160.984 GiB0.492 GiB1.969 GiB0.984 GiB

So auto does not choose the GPU for the template edit at resolution 0 or 1056 even with dtype int8, and with the default bf16 cache it needs 15.750 GiB of free system RAM at resolution 0 before it chooses RAM, or it recomputes. Set device gpu and dtype int8: the cache then fits beside all three files at resolution 0 and 1056 on both OSes on paper. The tooltip for dtype says int8 halves the cache at about bf16 accuracy. No run of these settings on this card turned up in the places listed at the top, and the author of PR #16429, which reworks this check on master only, lists as one of its problems: "It requires the VRAM to be free at the time of the check to use VRAM mode which gets disrupted by smart memory + dyn vram". On that PR's own test machine, an RTX 5080 with 32 GB RAM, an edit with two references went from the full-recompute fallback at 4.01 s/it to 1.02 it/s.

Set resolution to 1056 or 512 if edits come out speckled. Issue #16435 (open, read 2026-09-23) reports broken edits with the VAE connected at particular reference grids, and its two reports disagree on which. The original reporter (Apple MPS and CPU, bf16 DiT) got broadband noise whenever the reference resolved to a 64×64 latent grid, a 1024×1024 reference at resolution=0 or resolution=1024, while 512, 992 and 1056 were clean. A second reporter on CUDA (an RTX 5070 Ti, v0.37.0, torch 2.13.0+cu130, the official edit graph with a bf16 DiT) found that grid clean, but a 1536×1024 reference (grid 96×64) broken, over-sharpened and with the edit instruction ignored, at both resolution=0 and resolution=1248; 512, 1024, 1056 and 2048 were clean there. 512 and 1056 are clean in both reports. The template's own 896×1152 references resolve to neither failing grid at resolution 0. The two setups differ in backend, encoder precision, reference image, OS and ComfyUI build, so neither report isolates a cause, and neither comes from an Ampere card. A proposed fix, PR #16444, was closed without merging on 2026-09-22 by kijai; no fix is linked to #16435 now.

Optional: the bf16 transformer

Swapping UNETLoader to qwen_image_2.1_bf16.safetensors adds 6.495 GiB and costs the co-residence. Under DynamicVRAM the bf16 DiT, the int8 encoder and the VAE come to 22.841 GiB with headroom on Linux, 0.699 GiB under the card before the CUDA context and any activations, and 23.091 GiB on Windows, 0.361 GiB more than the one Windows machine has free; either way weights get paged while the stages alternate. On the legacy loader, loading the bf16 DiT with the encoder resident asks for 15.929 GiB on Linux against 14.831 GiB free, so at least 1.097 GiB of the encoder leaves the card first, and it comes back on the next prompt. What the swap would buy is reference precision, and its speed on this card is unknown (Installation, step 2). The whole-pipeline comparisons of the two files that turned up, in the places listed at the top, comfy-kitchen's tracker and the Hugging Face cards of the repositories this page cites, are both on Blackwell cards. On the site operator's RTX 5060 Ti 16GB, int8 was faster than bf16 on a cu130 build and slower on a cu128 build (cu130 session, cu128 session; one rig, one operator, unreplicated). On an RTX 5090, BennyDaBall's validation record timed the official BF16 file at 15.629 s and the INT8 ConvRot file at 7.553 s (warm medians, 1024×1024, 40 steps, Windows, torch 2.14.0+cu130, a patched ComfyUI 0.36.0 base). comfy-kitchen's fused INT8 path is built for compute capability 8.0 and up and runs on this card too, but neither comparison was measured on Ampere, so neither says how the two files compare here. Pairing the bf16 DiT with the bf16 encoder needs 30.212 GiB of weights and cannot co-reside on any 24 GB card.

Smaller and other builds: what they change on 24 GB

Very little. Everything already fits at 1024², so a smaller DiT file buys a smaller reload when weights do move (2K, a model switch) and nothing else that is known; on the same die the one measured pair above had the Q4_K_M GGUF slower than the int8 file, not faster.

  • GGUF, and which loader reads it. Abiray/Qwen-Image-2.1-GGUF (Q8_0 7,591,579,808 B) declares general.architecture = qwen_image in its header, which city96's loader.py accepts. leejet/Qwen-Image-2.1-GGUF (Q8_0 7,687,155,744 B) and unsloth/Qwen-Image-2.1-GGUF (Q8_0 7,640,860,384 B) carry no metadata keys at all, which sends city96's loader to a key-detection table with no 2.1 entry. City96's repository has had no commit since 2026-01-12; PR #483, which would add that entry, has been open since 2026-09-21 with no comments. leejet's fork reads them. ComfyUI-GGUF dequantises each weight to the compute dtype before the matmul, so a GGUF DiT gives up the INT8 GEMM this card has. In the places listed at the top, one GGUF run of this model on an RTX 3090 Ti was reported: on abenzerps/Qwen-Image-2.1-Uncensored-GGUF discussion #4, at 02:12Z on 2026-09-21, tommyk2025 hit a shape error with that repository's Q8_0 file and wrote that its Q4_K_M file worked, with no timing and no loader named (the error is under Troubleshooting). The repository's card describes its files as quantisations of the original upstream weights. Its main branch was rewritten on 2026-09-22 with renamed files; the Q4_K_M file at revision 44059006 (2026-09-20 23:09Z, three hours before the report) is still on the repository's base branch with the same LFS hash, and whether it changed in those three hours cannot be read, because main's earlier history is gone.
  • INT4 ConvRot and the mixed w4a8 build (toxicdog/Qwen-Image-2.1-INT4ConvRot-ComfyUI, 3,666,512,184 B, convrot_w4a4; NidAll/Qwen-Image-2.1-Mixed-Balanced, asym_w4a8_int8) are native on this card by the table in step 2 and keep a native matmul; quality at 4 bits is the open question, and on 24 GB there is no memory reason to take it.
  • FP8 and NVFP4 builds are emulated here. Third-party FP8 and (NV)FP4 DiT builds of 2.1 exist, among them unsloth/Qwen-Image-2.1-FP8 and BennyDaBall/Qwen-Image-2.1-NVFP4 in the 152 repositories a Hugging Face search for the model name returned on 2026-09-23. On compute capability 8.6 ComfyUI marks both float8 formats and nvfp4 emulated, so their weights are dequantised for every matmul: the memory saving survives and the kernel does not, and at this capacity the memory saving is not needed.

Results

  • Speed: our catalogue has no benchmark rows for this pair; /check/qwen-image-2-1/rtx-3090-ti returns verdict: unknown, and no timing on an RTX 3090 Ti turned up in the places listed at the top. What exists is a third party's timing of an RTX 3090, the other consumer card on this die with 24 GB: the validation record of alesha-pro's one-GPU install package, dated 2026-09-21, run on one RTX 3090, not this card. That RTX 3090 ran on Linux with 128 GB of RAM, driver 610.43.02 and an observed GPU power limit of 290 W; ComfyUI at commit 0f74f7fb, which is v0.37.0 plus one commit that only moves the frontend pin; comfy-kitchen 0.2.35 and comfy-aimdo 0.5.5, the versions this page installs, with Torch 2.11.0+cu130 (this page pins no torch build); and this page's three files, SHA-256 checked. The times are ComfyUI's own execution start to success, so they include encoding, sampling, decoding and saving; the record says the jobs ran one after another in this order and that model and cache warmth differ between them:

    Job on the RTX 3090 (euler / simple, cfg 1, batch 1)SizeStepsSeconds
    Text-to-image, first job1024×10244037.581
    Text-to-image2048×11525084.295
    Edit, one reference1024×10244037.106
    RGBA text-to-image1024×10244021.823
    Edit, two references1024×10244044.554

    The record lists native Windows, WSL2 and other setups as not validated and says they "must not be inferred from the Linux RTX 3090 result"; the package's README separately reports earlier runs on the author's existing install, on one RTX 3090 with the same int8 files at 2048×1152 and 50 steps, at 82–96 s per completed ComfyUI job (two reruns took 83.527 s and 85.271 s), some while other GPUs in the same host ran independent jobs, with no build or launch flags stated, and calls those end-to-end server timings, "not sampling-only timings or promises for every 24 GB card". The validation runs also differ from this page's install: the author's own flat workflows at 40 and 50 steps rather than the template's 25; the package's launcher, whose launch command starts ComfyUI with --disable-dynamic-vram --reserve-vram 1 (install/setup.py L128), i.e. the legacy loader with a 1 GiB reserve rather than DynamicVRAM (the record itself does not print its launch line); the 290 W limit; and Linux. NVIDIA lists the RTX 3090 Ti with more CUDA cores, a higher boost clock and more Founders Edition board power than the RTX 3090 (card section); what those differences mean for this model has not been measured in the places listed at the top. Do not scale these figures to 25 steps or to this card; if you time the template on an RTX 3090 Ti, /contribute is where that number belongs.

  • VRAM usage: derived, not measured by this site. At 1024² the three template files, 16.096 GiB, stay resident under either loader: under DynamicVRAM 16.346 GiB with comfy-aimdo's headroom against the 23.540 GiB a Linux 3090 Ti reports, and 16.596 GiB on Windows, which leaves 6.133 GiB of the one Windows machine's 22.729 GiB free. At 2048² the legacy decode request (8.114 GiB on Linux, 8.407 GiB on Windows) exceeds what is free with the encoder and DiT resident, so part of one model's weights leave the card for the decode; under DynamicVRAM that depends on the decode's real working memory. No VRAM reading of this model on an RTX 3090 Ti turned up in the places listed at the top. The only one found on the same die, an RTX 3090, is in the same author's GGUF validation record: with a Q4_K_M DiT from abenzerps (4,604,557,984 B at the revision that test pinned, 2.470 GiB smaller than this page's int8 file) beside this page's encoder and VAE, on the same launcher, the peak process VRAM that nvidia-smi reported, sampled every 0.5–0.7 s, was 15.39 GiB at 1024² (40 steps), 16.83 GiB at 2048×1152 and 17.15 GiB for a one-reference edit, CUDA context and allocator cache included. That is a different DiT file, so it is not this page's peak. Live data, when it exists, will be at /check/qwen-image-2-1/rtx-3090-ti.

  • Quality notes: the VAE has a reported grid artifact. The vendor's discussion #12, titled "Diamond grid pattern caused by VAE", says "It's more noticeable when you generate a high-resolution image that has people with light skin tones and zoom in on their faces." (Rkss, community), and that a plain encode–decode round trip shows it. A reply lists mitigations (a GLSL post-process node, a node pack, or re-encoding through the Flux VAE), none of them a fix; a later comment reports a 16-pixel stripe pattern on a different model's fine-tune that came from its diffusion model instead, so treat the cause as the thread's reading, not settled. No one from Qwen has replied (read 2026-09-23). On the vendor's own tracker, issue #5 (open) comes from an owner of this card, an RTX 3090 Ti on Windows with WSL Ubuntu: faint purple vertical streaks on 2048×2048 outputs, stronger on some images than others, unchanged by every decode-side setting they tried; the runtime is not stated, and a second user reports the same on an NVIDIA L4, a different architecture, so nothing in the thread ties it to this card. Inspect native-2K portraits at 100%. The banding at 25 steps under Text-to-image is a separate report.

For the full benchmark data, see /check/qwen-image-2-1/rtx-3090-ti.

Troubleshooting

TextEncodeQwenImage21 or QwenImage21Cache missing when the template loads

You are below v0.37.0. Take the v0.37.0 portable, or on a git install update to a tag rather than with a bare git pull, which lands on master (see Tag or master?): git fetch --tags && git checkout v0.37.0 && pip install -r requirements.txt, then restart and check the version line.

The startup log prints the cu130 WARNING, or 'disabled': True

That is the quant_ops.py gate from step 2: your PyTorch was built against CUDA 12.x, on Windows usually the cu126 portable. The diffusion model still runs, on the eager INT8 path. Reinstall PyTorch from the cu130 index (or switch to the nvidia portable), make sure the driver is from the 580 branch or newer, and confirm torch.version.cuda prints 13.0. How much the eager path costs on this card is unmeasured; on the operator's RTX 5060 Ti 16GB, a different card, the template image took 69.4 s on cu128 against 21.4 s on cu130 (cu128 session, cu130 session; one rig, one operator, unreplicated). kijai, a ComfyUI collaborator and the author of the core support, has answered the same symptom twice: on issue #16470, an RTX 5060 Ti whose int8 file ran slower than a Q8_0 GGUF on a cu128 build, "You need pytorch with cu130 for int8 models to work properly."; and on an RTX 3090, the same die as this card, below.

Images come out as noise or texture

Check the build and then the files. On issue #15419 (open), a different model, MiniMax H3, produced only noise on an RTX 3090, the same die as this card, running a cu128 build, where the int8 layers take the eager path. kijai replied: "Update to cu130 minimum to use the int8 models." A second RTX 3090 owner in the same thread, on cu130, traced their identical noise to corrupt downloads, fixed it by downloading again and verifying the hashes, and wrote: "checksum your checkpoints before anything else." Neither report is about Qwen-Image-2.1; both steps cost a minute here. Compare the three hashes from step 3.

JSONDecodeError: Expecting value: line 1 column 1 (char 0) from the CLIPLoader

Issue #16472 reported this for qwen3vl_8b_int8_convrot.safetensors from the edit template. kijai replied on 2026-09-22: "This is most likely a corrupt/incomplete model file." The reporter downloaded the file again, it loaded, and kijai closed the issue as completed that evening. Check the file's sha256 against step 3 and download it again if it differs.

Edit output is over-sharpened and speckled, or ignores the edit; text-to-image is clean

Issue #16435, under Editing: set resolution to 1056 (or 512, which shrinks the references). Disconnecting the VAE from TextEncodeQwenImage21 also removed the artifact in the original report, at the cost of reference adherence (on CUDA the requested edit was no longer performed at all).

Edits are far slower than text-to-image

Most likely the K/V cache found no room and fell back to recomputing the prefix every step; see the table under Editing. On this card set QwenImage21Cache to device gpu and dtype int8; with more or larger references than the template's, device cpu avoids the recompute if twice the cache is free in RAM. device off makes the recompute permanent; the node's tooltip calls that the way to rule the cache out.

On master: Fatal Python error: Aborted, at 0/25 when editing or at the end of the second generation

Two open reports, both on master code, both from other cards:

  • At 0/25, on image editing. Issue #16443, open, read in full on 2026-09-23 (last comment 2026-09-22T14:08Z). The reporter corrected the description to image editing: "I have not confirmed this crash with pure text-to-image generation." Two users report it, each with an RTX 5060 Ti 16 GB in a two-GPU machine; both said the crash is intermittent and seems tied to larger input images. The reporter also started ComfyUI with --cuda-device 0 "to force a single GPU, but the same crash still occurs". PR #16450 (open, no maintainer review) blames the allocation-recording wrapper that PR #16430 put around the block loop, code that exists only on master.
  • At the end of the second generation. PR #16481 (opened 2026-09-22T21:24Z, open, no maintainer review) reports an abort during sampler cleanup on the second generation, text-to-image and edit alike, on Windows 11 with an RTX 5090, torch 2.13.0+cu130, the template's int8 files, DynamicVRAM on and QwenImage21Cache at auto. The report says "ComfyUI 0.37.0", but the line numbers in its stack (qwen_image21/model.py line 238, model_base.py line 2678) are those of post-tag master; at v0.37.0 and v0.37.1 the same calls sit at lines 236 and 2674. The same cleanup code exists at the tag, and no report of the crash at the tag was found in the 85 tracker threads listed at the top. So the tag is not known to be immune.

If you hit either on master, go back to a tag: git checkout v0.37.0 on a git install. On the portable, update_comfyui_stable.bat checks out the highest v* tag (update.py with --stable), which since 2026-09-22 is v0.37.1, so the startup log will read 0.37.1; its three commits change neither the model's code nor its workflow files (Installation, step 1). If the second one happens at the tag, report it on the PR with your commit.

RuntimeError: Cannot set version_counter for inference tensor after adding or removing a LoRA

PR #16493, opened and closed unmerged by its author within three minutes on 2026-09-23, reports that adding or removing a LoRA on an already-resident quantized model raises this error on master, with a Qwen-Image-2.1 int8 checkpoint, and that every later generation fails the same way until the server restarts. The same error class is open for MiniMax H3 as #15733, with a fix proposed in PR #15734, open. At v0.37.0 the legacy patcher's unpatch_model restores backed-up weights through comfy.utils.set_attr_param, and that function has the same code as the PR's "before" (comfy/utils.py), so the path the PR reports exists at the tag, on the legacy loader. The default DynamicVRAM loader restores backed-up weights through the same function: ModelPatcherDynamic.load() calls restore_loaded_backups(), which passes every backed-up weight to comfy.utils.set_attr_param (comfy/model_patcher.py). Whether those backups hold quantized weights when a LoRA changes has not been shown either way, so whether the default loader can hit the error is not established. That is a reading of the code, not a report, and no report of the error at the tag turned up in the 85 tracker threads listed at the top. If you hit it after adding or removing a LoRA, such as the turbo conversion above, restart ComfyUI.

Shape errors from the text encoder: [1, 338, 5120] or [1, 512, 12288]

[1, 338, 5120]: the CLIP loader was given something other than the 4096-wide Qwen3-VL-8B. The reporter of the repack's discussion #2 saw exactly this error while trying the w4a8 encoder, then closed the thread as having loaded the wrong encoder. Load qwen3vl_8b_int8_convrot.safetensors, not a qwen3.5_9b_…_pe_… file.

Given normalized_shape=[4096], expected input with shape [*, 4096], but got input of size [1, 512, 12288]: a Qwen3-VL GGUF encoder in city96's CLIPLoaderGGUF. That loader attaches the vision tower only for qwen2vl (loader.py, pinned above), so ComfyUI builds the wrong encoder. PR #485 (opened 2026-09-23, open) would load it for qwen3vl too. Use one of Comfy-Org's safetensors encoders instead.

2K runs but the log says it retried the VAE decode tiled

That is the fallback working as designed; the decode is slower and the image should be unchanged. At 2048² the decode is the one stage that does not fit beside the other two files with room to spare (Requirements), so close what else is using the card (a browser with hardware acceleration counts) before blaming anything else.

Every generation reloads models

At 1024² it should not: all three files stay resident, a prompt change re-runs the encoder in place and a seed-only change skips it. If models reload anyway, something else is taking VRAM, or you are at 2K on the legacy loader, where the decode moves weights.

Reloads are the trigger of one open defect. Issue #16437, titled "Qwen-Image 2.1: --enable-dynamic-vram silently corrupts output after any model reload (channel slice offset, ROCm gfx1201)", reports that on an RX 9070 XT every image after the first reload comes back with its channels in a [B, A, B, A] pattern, subjects rendering bright green, until the server is restarted. Removing --enable-dynamic-vram fixed it for the reporter, who adds "I don't have an NVIDIA card to test whether this is ROCm-specific." No report of it on NVIDIA was found in the 85 tracker threads listed at the top. If your images turn green or wrong-coloured after a reload, restart ComfyUI; if it keeps happening, start it with --disable-dynamic-vram, which puts you on the legacy loader and its budget in Requirements.

GGUF: Expected weight to be of same shape as normalized_shape, but got weight of shape [136] and normalized_shape = [128]

The error the RTX 3090 Ti owner above hit with abenzerps' Q8_0 file (discussion #4). The repository's owner explained it there: the conversion quantised the 1D norm_q / norm_k weights into Q8 blocks, which their Q4_K_M, Q5_K_M and Q6_K files kept in BF16. leejet's fork has dequantised every quantized 1D tensor at load time since 2026-09-21. On this card the simpler fix is the template's int8 file, which no GGUF improves on at 24 GB.

GGUF: This model is not currently supported - (Unknown model architecture!)

A metadata-free GGUF (leejet's, unsloth's) in city96's loader; see the GGUF item under Smaller and other builds. Take a file that declares its architecture, or leejet's fork, or wait for city96 PR #483.

See also: the 2025 20B predecessor has its own page for this card, on a GGUF path with no FP8: Qwen-Image on RTX 3090 Ti. Those are the reports found for this model on 2026-09-23; the tracker moves by the hour in launch week. Report problems, or better a timed run of the template on this card with its log, via the submission form.

common questions
How much VRAM does Qwen-Image-2.1 need?

About 12 GB — the minimum this recipe targets.

Which GPUs is Qwen-Image-2.1 tested on?

RTX 3090 Ti (24 GB).

How hard is this setup?

Intermediate — follow the steps above.

next