Literature Atlas

16 papers behind the thesis: compressing and accelerating LTX-2.3 text-to-video on Intel hardware with OpenVINO.

high precision low-bit / quantized outlier / salient timestep key mechanism
Introduction

Before the papers: a visual primer

For the thesis · 16 papers · about 20 minutes to read

The thesis makes one very large model, LTX-2.3, smaller and faster on Intel hardware without breaking its videos. The sixteen papers in this atlas each solve one piece of that. This tab gives the ideas they all take for granted: diffusion, transformers, number formats and quantization, hardware, the OpenVINO stack and quality metrics, then a map of how the papers fit together.

Model
LTX-2.3 · text → video + audio
Transformer (DiT)
19B params ≈ 38 GB in BF16
Text encoder
Gemma-3 12B ≈ 24 GB in BF16
Target hardware
Intel CPU · Intel Arc GPU
Tools
Optimum Intel · OpenVINO · NNCF
Quality check
WWB similarity · VBench subset
Reading guide

Welcome to the atlas. The thesis asks one practical question: how can LTX-2.3, a model that turns a text prompt into a video with sound, be made smaller and faster on an Intel CPU and an Intel Arc GPU without spoiling its output? The answer will come from sixteen papers, and this first tab gives the vocabulary they all assume. It moves in order from the pipeline, to diffusion, to transformers, to number formats and quantization, to hardware, to the OpenVINO software stack, to quality metrics and other speed-ups, and ends with a map of all sixteen papers and a glossary. Every paper tab after this one follows the same pattern: a header, a short Before reading section, the big picture, the problem, the method, every equation and figure, the results, and a closing box on what it means for the thesis.

§1The thesis in one picture

A prompt goes in; a short video with its soundtrack comes out. One part, the diffusion transformer, is called again and again, so that is where memory and time go.

Prompt "a dog barks…" Text encoder Gemma-3 · 12B runs once Connectors small Random noise latents Dual-stream DiT · 19B Video stream 14B Audio stream 5B × N steps × up to 3 passes loop Video VAE decoder Frames Audio VAE dec. Vocoder Sound COST ≈ 24 GB weights (BF16) time: once per prompt ≈ 38 GB weights (BF16) time: called N × up to 3 times small weights time: once per clip thesis target: compress this box first
PrimerThe transformer is the bottleneck. Gemma-3 turns the prompt into embeddings once. The dual-stream diffusion transformer (DiT) then refines random noise for N steps, and with guidance each step can run it two or three times. The decoders turn the final latents into frames and sound once. Parameter counts are from the LTX-2 report.
Guide

The whole thesis fits in this diagram. A prompt goes through the Gemma-3 text encoder once, then the dual-stream diffusion transformer, with a 14 billion parameter video stream and a 5 billion parameter audio stream, refines noise for many steps, sometimes three calls per step. The decoders run once at the end. Read the cost strip at the bottom: the indigo box is both the largest and the most repeated part, so that is what gets compressed first.

Transformer (DiT) · 19B parameters BF16 38 GB INT8 19 GB INT4 ≈ 10 GB Text encoder (Gemma-3) · 12B parameters BF16 24 GB INT8 12 GB INT4 ≈ 6 GB 0 10 20 30 40 GB of weights (1 GB = 10⁹ bytes) full precision 8-bit 4-bit (plus small scales)
Primer"Smaller" means fewer bytes per weight. Memory is roughly parameters times bytes per parameter. Going from 16-bit to 4-bit weights shrinks the transformer about four times. "Faster" then follows when fewer bytes have to travel from memory at every step (§5), or when the number of steps shrinks (§8). The thesis measures both, plus quality, for every setting.
Guide

Memory is simply parameters times bytes per parameter. The teal bars are 16-bit weights, the pale rust bars 8-bit, the solid rust bars 4-bit. The transformer drops from 38 gigabytes to about 10, and Gemma from 24 to about 6. Smaller weights also mean fewer bytes to move at every step, which is where the speed comes from on memory-limited hardware. The thesis results table will pair each of these settings with latency and quality.

§2How diffusion makes a video

Diffusion starts from pure noise and removes a little of it at every step. The model never paints the video in one go.

DiT DiT DiT DiT VAE decode → pixels t = 1 (pure noise) t = 0.75 t = 0.5 t = 0.25 t = 0 (clean latent) timestep t = how much noise is left; each arrow is one full transformer call
PrimerMany small steps, one model. At each step the transformer looks at the noisy latent and the timestep and predicts which way to move toward a clean result. Real samplers use tens of steps (distilled models use far fewer). Because the same network runs at every noise level, its inputs look different early and late, which is why quantization papers care about timesteps (gold).
Guide

Diffusion builds a video by removing noise a little at a time. Read left to right: pure noise at timestep one, a clean latent at timestep zero, and every indigo arrow is one full call of the transformer. The gold axis is the timestep, the noise level. Because the same network sees very noisy inputs early and nearly clean ones late, its activations change over time, which is why the diffusion quantization papers keep talking about timesteps.

Pixels frames × H × W × 3 encoder (training) Latent diffusion runs here DiT decoder Video LTX-Video: 32 × 32 pixels × 8 frames → 1 token of 128 numbers about 192 times fewer values than the pixels
PrimerGenerate small, decode big. A variational autoencoder (VAE) squeezes video into a compact latent. Diffusion runs only on that latent, so the transformer sees thousands of tokens instead of millions of pixels. The decoder expands the final latent into frames. LTX-2 uses a second, 1-D audio VAE the same way.
Guide

The transformer never touches pixels. A variational autoencoder, or VAE, compresses video into a small latent, and diffusion runs only there. In LTX-Video, one latent token of 128 numbers stands for a block of 32 by 32 pixels over 8 frames, about 192 times fewer values. The dashed encoder is only needed for training or image input; for text to video only the decoder runs at the end.

Noisy latent xₜ DiT pass 1 with the prompt DiT pass 2 empty prompt DiT pass 3 LTX-2 cross-modal Mix push away one step 1 denoising step = 2 to 3 transformer calls
PrimerGuidance multiplies the cost. Classifier-free guidance (CFG) runs the model with and without the prompt and pushes the result away from the prompt-free answer (Eq. 1), which makes outputs follow the text more closely. LTX-2 adds a guidance pass that drops the other modality, so a step can cost up to three transformer calls.
Guide

Classifier-free guidance, or CFG, is why one step can cost several transformer calls. The model runs once with the prompt and once with an empty prompt, and the mix pushes the result away from the prompt-free answer so the video follows the text. LTX-2 adds a third, dashed pass for guidance between audio and video. When measuring time per step, count how many passes the pipeline settings actually run.

(1)\[ \hat{v} \;=\; v_\theta(x_t,\emptyset) \;+\; s\,\big(v_\theta(x_t,c) - v_\theta(x_t,\emptyset)\big) \]

Classifier-free guidance: \(v_\theta\) is the transformer's prediction, \(x_t\) the noisy latent, \(c\) the prompt, \(\emptyset\) an empty prompt, \(s\) the guidance scale. Two calls per step (three with LTX-2's extra modality term).

Guide

This is the guidance rule in one line. v hat is the final prediction used for the step. v theta of x t and empty is the model's answer without the prompt, v theta of x t and c is the answer with the prompt c, and s is the guidance scale. The bracket is the difference the prompt makes, stretched by s. Both terms need their own transformer call, which is the cost shown in the figure above.

§3Transformers in 5 minutes

A transformer is mostly two operations repeated many times: linear layers (matrix multiplies) and attention.

X activations N tokens × d_in × W weights d_in × d_out = Y outputs N tokens × d_out W: fixed, stored on disk X: new for every prompt and step
PrimerA linear layer is one matrix multiply (GEMM). Each token is a row of numbers. Multiplying all tokens by the weight matrix W at once is a general matrix multiply, or GEMM. The weights are the model's knowledge and never change; the activations X change with every prompt and step. Weight-only compression shrinks W and leaves X alone.
Guide

Almost every weight in LTX-2.3 lives in a linear layer, and a linear layer is one matrix multiply, called a GEMM. X holds the activations, one row per token; W holds the weights; Y is the output. The teal W is fixed and stored on disk, while X changes with every prompt and step. Weight-only compression, which NNCF does, shrinks W and leaves X in 16-bit.

Q N × d × Kᵀ d × N scores N × N softmax, then × V every token looks at every token N = 1 000 → 1 M scores N = 6 000 → 36 M scores per headand layer
PrimerAttention grows with tokens squared. Each token makes a query Q, key K and value V. Comparing every query with every key gives an N by N score table. A short LTX-Video clip is already about 6 000 latent tokens; doubling the video length doubles N but quadruples the attention work (Eq. 2). Attention has no weights, so weight compression does not shrink it.
Guide

Attention compares every token with every other token. Queries times transposed keys give an N by N score table, which is then turned into weights with a softmax and applied to the values. The side notes make the point: one thousand tokens give one million scores, six thousand give thirty-six million, per head and per layer. Attention has no weights, so weight quantization does not make it cheaper.

(2)\[ \text{FLOPs}_{\text{attention}} \approx 4\,N^2 d \qquad\qquad \text{FLOPs}_{\text{linear}} \approx 2\,N\,d_{\text{in}}\,d_{\text{out}} \]

Per layer, for \(N\) tokens and width \(d\): attention (\(QK^\top\) plus scores times \(V\)) grows with \(N^2\); a linear layer grows only with \(N\). For long videos attention takes a growing share of each step.

Guide

Two rough cost formulas, per layer. Attention needs about four times N squared times d operations, where N is the number of tokens and d the model width. A linear layer needs about two times N times d in times d out. The key difference is N squared versus N: longer or higher-resolution videos make attention grow much faster than the linear layers, which is where FlashAttention-style kernels matter.

tokens in Norm + AdaLN (scale, shift) Self-attention + × gate Cross-attention + Norm + AdaLN (scale, shift) Feed-forward (FFN) + × gate tokens out → next block residual timestep t → small MLP Text embeddings from Gemma-3 Other stream LTX-2: audio ↔ video
PrimerA DiT block, stacked many times. Tokens pass self-attention (tokens look at each other), cross-attention (tokens look at the text; in LTX-2 also at the other modality's stream) and a feed-forward network. Every box except the norms is built from linear layers. The timestep enters through AdaLN: a small network turns t into per-block scale, shift and gate values (gold), so the same weights behave differently at each noise level.
Guide

This is one block of a diffusion transformer, and the model stacks many of them. Tokens pass self-attention, cross-attention to the text, and a feed-forward network, each with a residual shortcut. The gold path shows AdaLN: a small network turns the timestep into scale, shift and gate values that modulate each block. In LTX-2 the dashed input adds cross-attention between the audio and video streams. Nearly every box is made of linear layers.

§4Numbers and quantization from zero

Quantization stores numbers with fewer bits. Fewer bits mean less memory and less data to move, at the cost of rounding error.

FP32 823 4 bytes BF16 87 2 bytes same range as FP32, less detail FP16 510 2 bytes more detail, smaller range INT8 8 1 byte 256 levels, −128 … 127 INT4 4 ½ byte 16 levels, −8 … 7 or 0 … 15 sign exponent (range) mantissa (detail) integer bits (need a scale)
PrimerFloats carry their own scale; integers do not. A floating-point number splits its bits into sign, exponent (how big) and mantissa (how precise). An integer is just an evenly spaced level, so INT8 and INT4 need an extra scale factor to mean a real value. LTX-2.3 is distributed in BF16; the compressed weights will be INT8 or INT4 plus scales.
Guide

Each row is one number format, drawn to scale, one cell per bit. Floating-point formats split bits into sign, exponent for range, and mantissa for detail; BF16 keeps FP32's range with less detail, FP16 the reverse. INT8 and INT4, in rust, are plain evenly spaced levels, 256 or 16 of them, so they need a separate scale to mean a real value. Bytes per parameter on the right drive the memory table below.

Weight memory at each precision (1 GB = 10⁹ bytes). INT4 adds about 0.13 bits per weight for one FP16 scale per group of 128.
PrecisionBitsBytes / paramDiT 19BGemma-3 12BWhere it appears
FP3232476 GB48 GBtraining, reference math
BF16 / FP1616238 GB24 GBreleased model, PyTorch reference
INT88119 GB12 GBNNCF INT8 weights; W8A8
INT4 (group 128)4≈ 0.52≈ 9.8 GB≈ 6.2 GBNNCF INT4 weight compression
Guide

This table turns bit-widths into gigabytes for the two big components of LTX-2.3. Read across a row: bits, bytes per parameter, then memory for the 19 billion parameter transformer and the 12 billion parameter Gemma encoder. The highlighted INT4 row includes a small overhead for one 16-bit scale per group of 128 weights, giving about 9.8 gigabytes for the transformer. These are weight sizes only; activations and runtime buffers come on top.

(3)\[ \text{memory} \;\approx\; N_{\text{params}} \times \text{bytes per parameter} \qquad 19\times10^{9} \times 0.5\ \text{B} \approx 9.5\ \text{GB} \]

The first estimate for every row of the table; scales, activations and runtime buffers come on top.

Guide

The first estimate to always make. Memory is about the number of parameters times the bytes per parameter. For the transformer at 4 bits, 19 billion times half a byte gives about 9.5 gigabytes. Scales, activations and buffers add to this, so use it as a lower bound and compare it with the IR size on disk and the measured peak memory.

(4)\[ s = \frac{x_{\max} - x_{\min}}{q_{\max} - q_{\min}} \qquad z = \operatorname{round}\!\Big(q_{\min} - \frac{x_{\min}}{s}\Big) \]

Scale \(s\) is the real-valued size of one integer step; zero-point \(z\) is the integer that stands for real 0. For INT4 asymmetric, \(q_{\min}=0\), \(q_{\max}=15\). Symmetric quantization fixes \(z\) at 0.

Guide

How the grid is chosen. The scale s is the real-valued size of one integer step: the range of the data, x max minus x min, divided by the number of steps, q max minus q min. The zero-point z is the integer that stands for real zero. For asymmetric INT4, q runs from 0 to 15. Symmetric schemes fix z at zero, which is simpler but wastes levels when the data is lopsided.

(5)\[ q = \operatorname{clamp}\!\Big(\operatorname{round}\!\big(\tfrac{x}{s}\big) + z,\; q_{\min},\; q_{\max}\Big) \]

Quantize: divide by the step, round to the nearest level, shift by the zero-point, and clip anything outside the grid.

Guide

Quantizing one number. Divide x by the scale s, round to the nearest integer, add the zero-point z, and clamp the result between q min and q max. Rounding causes the small, everyday error; clamping causes the large error for values outside the chosen range. Every quantization method in the atlas is, in some way, a smarter choice of s, z or the rounding.

(6)\[ \hat{x} = s\,(q - z) \qquad \lvert x - \hat{x}\rvert \le \tfrac{s}{2}\ \text{ inside the range} \]

Dequantize: the value the model actually computes with. The rounding error is at most half a step; values outside the range get the larger clipping error.

Guide

Dequantizing, which gives the value the model actually computes with. x hat equals s times q minus z. Inside the range, the error between x and x hat is at most half a step. Outside the range, clipping can make it much larger. This trade-off between step size and clipping is exactly what the worked example below shows with real numbers.

real x −0.6 0 0.9 INT4 q 06 = z815 0.23 0.23 ÷ 0.1 = 2.3 → round 2 → + 6 = 8 back: 0.1 × (8 − 6) = 0.2 · error 0.03 1.3 1.3 → 19 → clipped to 15 back: 0.9 · error 0.4 range −0.6 … 0.9 → s = 1.5 / 15 = 0.1, z = 6
PrimerA worked INT4 example. A block of weights spans −0.6 to 0.9. With 16 levels the step is 0.1 and the zero-point is 6 (Eq. 4). The value 0.23 becomes level 8 and comes back as 0.2, a small rounding error. A value of 1.3 outside the chosen range is clipped to 0.9, a large error (magenta). Stretching the range to include it would make every step coarser instead.
Guide

A worked example of equations four to six. The top line is real values, the rust ticks below are the sixteen INT4 levels. With a range from minus 0.6 to 0.9, the step is 0.1 and zero sits at level 6. The value 0.23 lands on level 8 and comes back as 0.2, an error of 0.03. The magenta 1.3 lies outside the range, is clipped to level 15, and returns as 0.9, an error of 0.4.

Per-tensor Per-channel Per-group Per-token 1 scale for thewhole matrix 1 scale per row(output channel) 1 scale per group ofg inputs, e.g. 128 activations: 1 scale pertoken, computed live coarse, cheap NNCF INT4 default style NNCF INT8 weights dynamic, at runtime
PrimerWho shares a scale? The fewer numbers share one scale, the tighter it fits them and the smaller the error, at the cost of storing more scales. Weights are usually quantized per output channel (INT8) or per group of inputs, commonly 64 or 128 (INT4). Activations change every step, so papers often scale them per token on the fly (gold).
Guide

Granularity means which numbers share a scale. From left to right: one scale for the whole matrix, one per row or output channel, one per group of inputs such as 128, and for activations one per token computed at run time, in gold. Darker shades stand for different scale values. Finer sharing fits the data better but stores more scales. NNCF typically uses per-channel scales for INT8 and group-wise scales for INT4.

Weight-only · W4A16 INT4 weights + scales dequantize to FP16 in kernel FP16 activations untouched FP16 GEMM → output saves memory and bandwidth math still in 16-bit · what NNCF compress_weights does Weights + activations · W8A8 INT8 weights + scales FP16 activations quantize to INT8 INT8 GEMM → rescale → FP16 saves memory and can use faster integer math activation outliers now matter · nncf.quantize path W4A8, W4A4: same idea with fewer bits; they only pay off with matching hardware and kernels
Primer"WxAy" names the bits of weights and activations. W4A16 means 4-bit weights and 16-bit activations. Weight-only schemes decompress weights inside the kernel and compute in 16-bit, so they mainly save memory and memory traffic. W8A8, W4A8 and W4A4 also quantize activations, which enables integer matrix units but exposes activation outliers. The core track of the thesis is weight-only.
Guide

Two families of quantization. On the left, weight-only W four A sixteen: INT4 weights are expanded to 16-bit inside the kernel and multiplied with untouched 16-bit activations, saving memory and bandwidth. On the right, W8A8: activations are also quantized so the multiply runs in integer arithmetic, which needs matching hardware and makes activation outliers dangerous. The core track of the thesis is the left side, with W8A8 as an optional comparison.

Largest |value| per channel outlier outlier channel index magnitude One scale for all channels normal values fall into 1–2 levels outlier sets the range Common fixes: finer groups · per-token scales · clipping move outliers into weights (SmoothQuant, AWQ) rotate them away · keep them in 16-bit (SVDQuant)
PrimerOutliers break shared scales. In large transformers a few channels carry values far bigger than the rest (magenta). If one scale must cover them, the step becomes huge and ordinary values collapse onto one or two levels. Bars are illustrative, not measured. Most quantization papers in this atlas are, at heart, different ways to handle outliers.
Guide

The chart on the left shows the typical picture in large transformers: most channels have small values, and a few magenta channels are huge. The bars are illustrative. On the right, a single shared scale must stretch to cover the outlier, so ordinary values squeeze into one or two levels and lose almost all detail. The fixes listed at the bottom are the main ideas of SmoothQuant, AWQ, ViDiT-Q and SVDQuant.

PTQ · post-training quantization trained model calibration data prompts × timesteps measure statistics pick scales, rounding quantized model minutes to hours no training · this thesis QAT · quantization-aware training trained model train with simulated rounding forward quantized, gradients update weights quantized model GPU-days, training data e.g. QVGen · out of scope Mixed precision · one bit-width per layer INT4 · most layers INT8 · sensitive layers FP16 · kept layers of the transformer, first to last NNCF: ratio of INT4 vs INT8, sensitivity metric, ignored_scope
PrimerThree words that appear in every paper. Post-training quantization (PTQ) needs only a trained model and a small calibration set: example inputs, which for a diffusion model must cover many timesteps. Quantization-aware training (QAT) retrains with rounding simulated, costing days of GPU time. Mixed precision gives each layer its own bit-width, keeping the few sensitive layers at higher precision. The layer pattern shown is illustrative.
Guide

Three terms that appear in every paper. Post-training quantization, or PTQ, needs only the trained model and a small calibration set, which for a diffusion model must cover many timesteps. Quantization-aware training, or QAT, retrains with rounding simulated and costs days of GPU time, like QVGen. The bottom strip shows mixed precision: most layers in INT4, a few sensitive ones in INT8 or 16-bit. The pattern is illustrative.

§5Hardware, and why speed is not just FLOPs

Chips are often waiting for data rather than doing arithmetic. Whether a layer gets faster depends on which of the two limits it.

CPU few strong cores + vector units large caches (on-chip SRAM) system RAM (DDR): big, slower GPU many small cores + matrix units smaller caches / shared memory own VRAM: GDDR (Arc), HBM (A100/H100) fast, but limited size PCIe link Memory hierarchy registers on-chip cache / SRAM DRAM / VRAM / HBM SSD (IR files) faster, smaller An integrated Intel GPU shares system RAM with the CPU; a discrete Arc card has its own VRAM.
PrimerCompute is close; data is far. A CPU has a few powerful cores with wide vector units; a GPU has many simpler cores plus matrix units, and usually its own fast memory. Each level of the hierarchy is faster but smaller than the one below it. A 38 GB model cannot sit in any cache, so every step streams the weights from DRAM or VRAM.
Guide

Two kinds of chips and the memory ladder behind them. A CPU has a few strong cores with vector units and large caches; a GPU has many small cores with matrix units and its own video memory. The pyramid on the right shows the rule: the closer to the cores, the faster and smaller. LTX-2.3 is far too big for any cache, so every step must stream its weights from main memory.

arithmetic intensity (FLOPs per byte moved) → achieved speed (FLOP/s) → peak compute memory bandwidth memory-bound compute-bound norms, adds few tokens × big W INT4 weights: fewer bytes many tokens × W (big GEMM)
PrimerThe roofline idea. An operation that does little math per byte it loads is memory-bound: speed is capped by bandwidth, and shrinking the bytes (INT4 weights) moves it up the slope. One that does a lot of math per byte is compute-bound: only faster arithmetic helps, and weight-only compression saves memory but little time. Where LTX-2.3's layers sit on the Intel CPU and Arc is something to measure, not assume.
Guide

The roofline explains when a speed-up is possible. The horizontal axis is how much arithmetic an operation does per byte it loads; the vertical axis is the speed it can reach. On the rising slope an operation is memory-bound, and shrinking its bytes, as INT4 weights do, moves it up. On the flat roof it is compute-bound, and only faster arithmetic helps. Measure where LTX-2.3's layers land on the target Intel hardware.

Unfused: 3 kernels MatMul Add bias GELU DRAM DRAM each intermediate is written out and read back Fused: 1 kernel MatMul + Add + GELU intermediates stay in on-chip memory same math, far less memory traffic
PrimerKernels and fusion. A kernel is one compiled routine that runs an operation on the chip. Running operations as separate kernels sends every intermediate result out to DRAM and back. A fused kernel does several steps in one pass, keeping data on chip. FlashAttention is this idea applied to attention; OpenVINO fuses common patterns automatically when it compiles the model.
Guide

A kernel is one compiled routine for one operation. In the top row, three separate kernels each write their result to slow memory and read it back. In the bottom row, one fused kernel does all three steps and keeps the intermediate values on chip. The math is identical but the memory traffic is far lower. OpenVINO performs many of these fusions automatically when it compiles the model.

What a paper measures Method, e.g. W4A4 custom CUDA kernel (hand-fused) Tensor Cores with that low-bit format NVIDIA A100 / H100 / RTX 4090 What runs here Same method? OpenVINO's built-in kernels only CPU vector units (AVX-512…) · Arc XMX Intel CPU · Intel Arc GPU kernel may not exist format may lack a fast path other bandwidth and compute Quality results usually transfer; speed results must be re-measured on the target hardware.
PrimerA speed-up belongs to its hardware. Many papers report speed from custom CUDA kernels on NVIDIA GPUs. Tensor Cores are NVIDIA's matrix-multiply units, which run certain low-precision formats much faster; XMX (Xe Matrix Extensions) are the matching matrix engines in Intel Arc GPUs. If a format has no fast kernel in OpenVINO, the method's accuracy may still help but its speed-up will not appear.
Guide

Many papers report speed from custom CUDA kernels on NVIDIA GPUs such as the A100, H100 or RTX 4090, using Tensor Cores for their low-bit format. The thesis stack on the right uses only OpenVINO's built-in kernels, CPU vector units and the XMX matrix engines of Arc. The magenta gaps are the reasons a speed-up may not carry over. Quality findings usually transfer, but every speed claim has to be measured again.

§6The software stack

The project code path: a Hugging Face model becomes an OpenVINO model, gets compressed, and is compiled for a device.

PyTorch model diffusers / HF Hub BF16 weights Optimum Intel export patch → trace → convert each part HF ↔ OpenVINO bridge OpenVINO IR .xml = graph .bin = weights one per component (DiT, VAEs, …) NNCF compress_weights INT8 · INT4 · group, ratio AWQ · scale est. · GPTQ (quantize for W8A8) compressed IR compile_model( "CPU" or "GPU") plugin picks kernels OV pipeline (OVLTX2Pipeline) denoising loop in Python video + audio Evaluation harness same prompts + seeds vs PyTorch reference latency · peak memory · IR size · WWB · VBench reference outputs custom op = an operation OpenVINO does not have; it needs a custom kernel, which this thesis avoids
PrimerExport, compress, compile, compare. Optimum Intel traces each part of the diffusers pipeline into OpenVINO's intermediate representation (IR): an .xml graph plus a .bin weight file. NNCF rewrites the weights of the IR as INT8 or INT4 with scales. At load time OpenVINO compiles the IR for the CPU or GPU plugin, which picks its own kernels. Every setting is then compared with the PyTorch reference on the same prompts and seeds.
Guide

This is the actual code path of the project. The diffusers model in PyTorch is exported by Optimum Intel into OpenVINO IR, an xml graph and a bin weight file per component. NNCF then compresses the weights to INT8 or INT4, with options such as AWQ, scale estimation and GPTQ. The compressed IR is compiled for CPU or GPU and run by the OpenVINO pipeline. The gold harness compares every result with the PyTorch reference.

§7How quality is measured

Papers disagree on metrics because they measure different things. Know which question each metric answers.

Same as the reference? (paired) compare with the full-precision output, same prompt and seed PSNR, SSIM ↑pixel / structure matchSVDQuant, QVGen, TeaCache LPIPS ↓perceptual distanceSVDQuant, TeaCache, LTX-Video WWB similarity ↑optimized vs referencethis thesis Best for compression: it isolates what the change broke. Good on its own? (unpaired) judge against real data, the prompt, or a judge model FID, sFID ↓image realismQ-Diffusion, PTQ4DiT, DeepCache FVD ↓video realismViDiT-Q, LTX-Video CLIP score ↑matches the textQ-Diffusion, DeepCache, ViDiT-Q ImageReward ↑learned preferenceSVDQuant, ViDiT-Q VBench ↑16 video dimensionsthis thesis ViDiT-Q, DVD-Quant, QVGen, Wan2.2 paper, TeaCache Language and audio Perplexity ↓LLM surprise on real textGPTQ, AWQ, SmoothQuant Zero-shot acc. ↑LLM task scoresGPTQ, SmoothQuant WER ↓speech word errorsoption for the audio People Human preference"which is better?"LTX-Video, LTX-2 Human alignmentdo metrics rank like people?VBench The ground truth every automatic metric tries to predict. ↑ higher is better · ↓ lower is better · FlashAttention-2 is exact, so it reports speed only
PrimerPaired versus unpaired metrics. Paired metrics compare the compressed model's output with the full-precision output for the same prompt and seed, so they directly measure damage. Unpaired metrics score realism, text match or video properties and are used to compare different models. The thesis plan combines both: WWB similarity (a tool from OpenVINO's GenAI project) for paired checks and a VBench subset for video dimensions.
Guide

Metrics answer different questions. The teal box holds paired metrics that compare with the full-precision output for the same prompt and seed, including the WWB similarity used in this project. The white box holds unpaired metrics that judge realism, text match or video dimensions, like FID, CLIP score and VBench. The lower boxes cover language models, audio and human judgement. The paper names show who uses what, so numbers can be compared correctly.

§8Speeding up without fewer bits

Quantization makes each step cheaper. The other levers cut the number of steps or the work inside a step, and they stack.

Baseline Quantized Step caching Fewer steps Quantized + cached signal says "barely changed" → reuse distilled sampler: few large steps (needs training) gains multiply; errors add up, so test the combination wall-clock time → (bars illustrative) full-precision step quantized step reused result distilled step Inside each step: fused attention (FlashAttention-style) cuts attention's memory traffic, same result
PrimerFour levers that stack. Quantization shortens each step. Step caching (DeepCache, TeaCache) reuses an earlier result when a cheap signal says the output barely changed, skipping the expensive call. Distillation retrains the model to need fewer steps, which is outside the scope of the thesis. Efficient attention does the same attention math with less memory traffic. Caching needs no calibration and no custom kernels, which is why TeaCache is the optional extra.
Guide

Each row is a timeline of denoising steps, and shorter means faster. Quantization shortens every step. Step caching reuses results when the gold signal says little has changed, which is what TeaCache does. Distillation cuts the number of steps but needs training, so it is outside the scope of the thesis. The last row shows that quantization and caching combine, with gains multiplying and errors adding up. The bar lengths are illustrative.

§9Map of the 16 papers

Five groups, left to right: what gets compressed, the LLM tools, their diffusion versions, other speed-ups, and how to judge the result.

TARGET MODELS QUANT. FOUNDATIONS (LLM) QUANTIZING DIFFUSION BEYOND QUANTIZATION EVALUATION LTX-Video 1:192 video VAE, fast DiT ancestor of LTX-2.3 LTX-2 19B audio + video DiT the model to compress GPTQ 4-bit weights; rounding error pushed to later cols SmoothQuant move activation outliers into weights → W8A8 AWQ scale up ~1% salient weight channels → W4A16 Q-Diffusion calibrate across timesteps (U-Net, W4A8) PTQ4DiT DiT channel balancing, timestep-weighted stats ViDiT-Q video DiT; per-layer sensitivity → mixed prec. SVDQuant 16-bit low-rank branch absorbs outliers, W4A4 DVD-Quant video DiT PTQ with no calibration data QVGen training (QAT) for W4A4 video models SVDQuant-GPTQ Wan W4A4 on a 14B video DiT; finds sensitive layers FlashAttention-2 exact attention, tiled in on-chip memory DeepCache reuse deep U-Net features across steps TeaCache skip a step when the timestep signal is small VBench 16 separate video quality dimensions every other paper is a tool applied to LTX-2 Legend core for the thesis optional track (W8A8, caching) background: ideas and limits builds on (idea reused) builds on (combined as a part) same line of work In NNCF today: GPTQ · AWQ SmoothQuant (W8A8) Method to copy: ViDiT-Q sensitivity TeaCache loop Yardstick: VBench subset + WWB
PrimerHow the sixteen papers connect. The LLM quantizers (GPTQ, SmoothQuant, AWQ) are the tools NNCF already implements. The diffusion papers adapt them to timesteps, video tokens and outliers: SmoothQuant-style scaling reappears in PTQ4DiT, ViDiT-Q and SVDQuant, and the Wan2.2 paper combines SVDQuant and GPTQ. Indigo boxes are the ones the thesis uses directly; the others explain limits and alternatives. Arrows mark only links stated in the papers or their tabs.
Guide

This map groups the sixteen papers into five columns. Indigo boxes are the ones the thesis uses directly: LTX-2 as the target, GPTQ and AWQ inside NNCF, ViDiT-Q's sensitivity method, and VBench. Dashed indigo boxes, SmoothQuant and TeaCache, are optional tracks. Arrows show which ideas are reused, for example SmoothQuant scaling in PTQ4DiT, ViDiT-Q and SVDQuant, and SVDQuant plus GPTQ in the Wan 2.2 paper.

Suggested reading order. First pass: LTX-2 → GPTQ → AWQ → ViDiT-Q → VBench → TeaCache. Second pass: LTX-Video → SmoothQuant → Q-Diffusion → PTQ4DiT → SVDQuant-GPTQ for Wan2.2. Background as needed: SVDQuant, DVD-Quant, QVGen, FlashAttention-2, DeepCache.

How to use this atlas

  1. Start here. Read this tab once, or press Play introduction for the narrated tour.
  2. Open a paper tab from the sidebar and press Play intro: a two-minute "Before reading" on what that paper assumes.
  3. Press Play guided tour for the paper's story in about five minutes, with the page scrolling to each key figure.
  4. Open the Guide under any figure, equation or table for a short spoken-style explanation, or use Open all guides.
  5. End with the thesis box at the bottom of each tab: what to do with the paper in OpenVINO and NNCF.
Guide

This list is the routine for every paper. Start with this tab, then open a paper and press Play intro for a two-minute primer on what that paper assumes. Next press Play guided tour for the paper's story in about five minutes. Whenever a figure or equation is unclear, open its Guide note. Always finish with the thesis box, because it turns the paper into a concrete step in OpenVINO and NNCF.

§10Glossary

Glossary

Activation
The numbers flowing between layers for a given input; they change with every prompt and step.
AdaLN
Adaptive layer norm: the timestep sets a scale, shift and gate inside each DiT block.
Attention
The operation where every token weighs every other token using queries, keys and values.
BF16 / FP16
16-bit floating-point formats; BF16 keeps FP32's range with less precision.
Calibration data
A small set of real inputs used to measure value ranges before quantizing.
CFG (classifier-free guidance)
Running the model with and without the prompt and mixing the results to follow the text better.
Compute-bound
Limited by how fast the chip can do arithmetic.
Custom op
An operation the runtime does not provide, so someone must write its kernel.
Distillation
Training a model to reproduce a bigger or slower one, for example with fewer steps.
DiT
Diffusion transformer: the denoising network, built from transformer blocks.
Fused kernel
One kernel doing several operations so intermediates stay on chip.
GEMM
General matrix multiply, the core computation of every linear layer.
Group size
How many weights share one scale in group-wise quantization, for example 128.
INT4 / INT8
4-bit and 8-bit integers: 16 or 256 levels, used with a scale.
IR (OpenVINO)
Intermediate representation: the .xml graph plus .bin weights that OpenVINO compiles.
Kernel
A compiled routine that runs one operation on a CPU or GPU.
Latent
The compressed representation produced by a VAE, where diffusion happens.
Memory-bound
Limited by how fast data can be moved from memory, not by arithmetic.
Mixed precision
Different bit-widths for different layers, keeping sensitive layers higher.
NNCF
Neural Network Compression Framework: Intel's library for quantizing and compressing OpenVINO models.
Optimum Intel
The Hugging Face library that exports and runs Transformers and diffusers models with OpenVINO.
Outlier
A value or channel far larger than the rest, which stretches a shared scale.
Per-channel / per-group / per-token
Which numbers share one scale: a row, a block of a row, or one token's activations.
PTQ
Post-training quantization: quantize a finished model without retraining.
QAT
Quantization-aware training: retrain with simulated rounding so the model adapts.
Roofline
A plot showing whether an operation is capped by memory bandwidth or by compute.
Salient channel
A channel whose errors hurt the output most, often found from activation size.
Scale and zero-point
The step size and integer offset that map integers back to real values.
Step caching
Reusing a previous step's result when the model output barely changes.
Tensor Core
NVIDIA's matrix-multiply units for low-precision math.
Timestep
The noise level of the current denoising step.
Token
One unit the transformer processes: a word piece for text, or a patch of latent video.
VAE
Variational autoencoder: compresses pixels or sound into latents and decodes them back.
VBench
A benchmark that scores generated videos on 16 separate dimensions.
Vocoder
The network that turns a decoded spectrogram into an audio waveform.
W4A16, W8A8…
Bits of weights (W) and activations (A); W4A16 is 4-bit weights, 16-bit activations.
Weight-only quantization
Only the weights are stored in low bits; math still runs in 16-bit.
WWB
Who What Benchmark: an OpenVINO GenAI tool that scores how similar optimized outputs are to reference outputs.
XMX
Xe Matrix Extensions: the matrix engines in Intel Arc GPUs.
Guide

Keep this glossary open while reading. It lists the terms that appear across many papers, in alphabetical order, each with a one-line definition in plain words. When a paper tab uses an unfamiliar word, such as salient channel, roofline or AdaLN, come back here first. Each paper also has its own short glossary in its Before reading section for terms specific to that paper.

Target models

LTX-Video: Realtime Video Latent Diffusion

Y. HaCohen, N. Chiprut, B. Brazowski, D. Shalem, … O. Bibi · Lightricks · arXiv:2501.00103, Dec 2024

LTX-Video is the ancestor of LTX-2.3. Its video autoencoder squeezes every 32×32×8 block of pixels into a single 128-channel latent “token” (1:192 compression). That leaves the diffusion transformer (DiT) with very few tokens, so it can run full 3-D attention fast. The VAE decoder also does the final denoising step, so fine detail comes back without a separate upsampler.

VAE compression
1:192
Pixels per token
32×32×8 = 8192
Latent channels
128 (no patchifier)
DiT
1.9B · 28 blocks · d=2048
Speed (H100)
121 fr 768×512 in 2 s
Human win rate
85% T2V · 91% I2V
Reading guide

LTX-Video asks how to make a video diffusion model fast enough to generate faster than real time without losing quality. Its answer is to compress the video so hard in the autoencoder that the transformer only has a few thousand tokens to attend over, and to let the decoder finish the last denoising step. The result is a 1.9 billion parameter model that makes five seconds of video in about two seconds on an H100, and wins most human comparisons. The tab opens with the big picture, then three problems, the method steps, every equation, every figure, the results tables, and finally a thesis box. This is the first of sixteen papers and the first of the two target-model papers, followed by LTX-2. It describes the ancestor architecture of LTX-2.3, so it explains what the thesis will be compressing before the quantization and caching papers explain how.

§0Before reading

This paper builds on three ideas: a video autoencoder (VAE) squeezes pixels into a small grid of “latent” tokens, a diffusion transformer (DiT) removes noise from that grid step by step, and attention cost grows with the square of the number of tokens. LTX-Video is here because it is the direct ancestor of LTX-2.3: the VAE, DiT and denoising decoder that the thesis compresses are all introduced in this paper.

video frames pixels, h × w × f VAE encoder latent grid each cell = 1 token 128 numbers 32 × 32 px × 8 frames → 1 token
PrimerA VAE turns a video into a small grid of tokens. The encoder of a variational autoencoder (VAE) compresses each block of pixels into one short vector, the “latent”. In LTX-Video a block of 32×32 pixels over 8 frames becomes one token with 128 channels, and the decoder can turn the grid back into pixels. The diffusion model never sees pixels, only this grid.
Guide

Before any diffusion happens, the video is compressed. The stacked frames on the left are pixels, the VAE encoder in the middle squeezes them, and the grid on the right is the latent, where each cell is one token. The highlighted block of 32 by 32 pixels over 8 frames becomes a single token of 128 numbers. The transformer only ever works on this small grid, and the decoder turns it back into pixels at the end.

typical video model ≈47k × 47k token pairs every token vs every token LTX-Video ≈6k × 6k same 5 s clip ≈60× less attention
PrimerAttention cost grows with tokens squared. In self-attention every token compares itself with every other token, so the work is proportional to \( n^2 \) for \( n \) tokens (the area of each square). For a 5-second 768×512 clip a typical pipeline makes about 47k tokens, LTX-Video about 6k: 7.75× fewer tokens, so roughly 60× less attention work. Areas are to scale.
Guide

Fewer tokens pay off twice, because attention compares every token with every other token. Each square's area is the number of token pairs. A typical video model makes about forty seven thousand tokens for a five second clip, LTX-Video about six thousand. That is 7.75 times fewer tokens, and since the cost grows with the square, roughly sixty times less attention work. This is the main source of the paper's speed.

noise DiT noisy DiT less noisy DiT … almost clean decoder last step video latent space (small grid) pixels t = 1 (pure noise) t = 0.05 t = 0 each solid arrow = one full DiT pass (20 to 40 per video)
PrimerDiffusion = remove noise in many small steps. Generation starts from random noise in the latent grid. At each step the diffusion transformer (DiT) looks at the grid, the text prompt and the current timestep \( t \) (the noise level, gold) and predicts which direction points towards a clean video. LTX-Video uses rectified flow, where that direction is a straight line from noise to data. Its twist: the decoder performs the very last step, from \( t = 0.05 \) straight to pixels. Every DiT arrow is a full pass through the network, which is why speed and quantization error both live here.
Guide

Diffusion generates by cleaning noise in small steps. Read left to right: pure noise, then ever cleaner latents, each arrow one full pass through the diffusion transformer, while the gold timestep falls from one towards zero. LTX-Video's twist is the indigo box: the decoder takes the almost clean latent at a noise level of 0.05 and finishes the job while turning it into pixels. The repeated transformer passes are where the thesis saves time and where quantization error builds up.

TARGET MODELS Start here the whole field LTX-Video this paper LTX-2 adds audio Quantization GPTQ → Wan2.2 Speed + eval caching, VBench adds: VAE latent + DiT + denoising decoder the skeleton of LTX-2.3 to compress
PrimerWhere this paper sits. LTX-Video is the first paper tab of the atlas. It defines the architecture: the compressing VAE, the diffusion transformer and the denoising decoder. The next tab, LTX-2, keeps this skeleton and adds sound, giving the audio+video model family that LTX-2.3 belongs to. Everything after that (quantization, then caching and attention speed-ups, then VBench for evaluation) is about making this kind of model cheaper without hurting the videos.
Guide

LTX-Video is the first paper tab of the atlas, right after the Start here tab. It introduces the skeleton that LTX-2.3 still uses: a compressing VAE, a diffusion transformer and a denoising decoder. The next tab, LTX-2, adds sound to that skeleton. After that come the quantization papers, then caching and attention speed-ups, and finally VBench, all about making this kind of model cheaper without spoiling the videos.

Terms used in this paper

Diffusion model
A generator that starts from random noise and removes it step by step until a clean image or video remains.
VAE (video autoencoder)
A network pair: the encoder compresses pixels into a small latent, the decoder turns a latent back into pixels. LTX-Video compresses by 1:192.
Latent / token
The latent is the compressed grid; each cell of that grid is one token, a vector of 128 numbers that the transformer processes.
Patchify
Grouping neighbouring cells into one token to reduce the token count. LTX-Video does all of this inside the VAE, so its transformer patch size is 1.
DiT (diffusion transformer)
The transformer that does the denoising. In LTX-Video it has 28 blocks and about 1.9 billion parameters, and it is where most compute happens.
Self- and cross-attention
Self-attention lets every video token look at every other one; cross-attention lets video tokens look at the text tokens of the prompt.
Timestep \( t \)
The current noise level, from 1 (pure noise) to 0 (clean). The network is told \( t \) at every step, and in LTX-Video each token can have its own \( t \).
Rectified flow / velocity
A diffusion variant where the noisy latent is a straight-line blend of clean data and noise. The network predicts the velocity, the direction of that line.
T5-XXL
A large pretrained language model from Google used only as a text encoder: it turns the prompt into text tokens for cross-attention.
RoPE
Rotary positional embedding: tells attention where each token is (position in the frame and in time) by rotating its query and key vectors.
AdaLN
Adaptive layer normalisation: the timestep is turned into a scale and shift that modulate each transformer block.
Nvidia H100
A data-centre GPU with Tensor Cores and high-bandwidth memory, far more powerful than an Intel laptop CPU or Arc GPU. The paper’s “2 seconds” is measured on it.
Win rate
The human-study score: wins divided by wins plus losses in side-by-side comparisons, with ties left out.
Guide

These are the words the paper uses without explaining. The most important are latent and token, the diffusion transformer, the timestep, and rectified flow, because the whole method is built from them. T5, RoPE and AdaLN are parts of the transformer that appear in the architecture figure. The H100 entry is a reminder that the paper's two second speed is measured on a data centre GPU, not on Intel hardware.

§2Big picture

Typical video LDM (CogVideoX, HunyuanVideo, …)videoVAE enc8×8×4, 16 chpatchify2×2×1 in DiTDiT (N steps)47,616 tokensVAE decplain decodevideo1:1024 px/token(+ 7B upsamplerin MovieGen)LTX-Video (holistic)videopatchify + causal VAE enc32×32×8 → 128 ch (1:192)DiT (N−1 steps)6,144 tokensdenoising declast step t₁video1:8192 px/tokenno upsamplertimestep t₁7.75× fewer tokens≈ 60× less attention
OverviewMove patchify into the VAE, and give the last denoising step to the decoder. Token counts are for 121 frames at 768×512. A typical 8×8×4 VAE with a 2×2 patchifier gives 31×32×48 = 47,616 tokens. LTX gives 16×16×24 = 6,144 (our arithmetic). Attention cost grows with tokens squared: (47,616/6,144)² ≈ 60.
Guide

The whole paper in one picture: the top row is a typical video latent diffusion pipeline, the bottom row is LTX-Video. LTX moves patchifying into the VAE and hands the final denoising step to the decoder. For 121 frames at 768 by 512 that cuts the token count from about 47 thousand to about 6 thousand, 7.75 times fewer, and since attention grows with tokens squared, roughly 60 times less attention work. Every later block explains one piece of this diagram.

Two ideas carry the paper. (1) A deep VAE that compresses hard and dense (32×32×8 pixels → one 128-channel token), so the DiT has few tokens and can attend over all space and time. (2) A decoder that is itself a one-step diffusion model, so it can regenerate the fine detail that such heavy compression throws away.

§3The problem

0k10k20k30k40k50ktokens (121 fr, 768×512)8×8×4 + 2×2 patch47,6168×8×8 + 2×2 patch23,808LTX 32×32×86,144
Problem AAttention cost is set by token count. Self-attention is quadratic in tokens. With usual VAEs a 5-s 768×512 clip is tens of thousands of tokens. Counts are our arithmetic from Table 1’s ratios (8×8×8 assumes a causal 1+120/8 frame layout).
Guide

Token count sets the cost of attention, and the bars make the gap visible. Each bar is the number of transformer tokens for the same five second clip. A standard 8 by 8 by 4 VAE with a 2 by 2 patchifier gives about 47 thousand tokens, a temporally stronger VAE about 24 thousand, and LTX only about 6 thousand. The counts are the tab's own arithmetic from Table 1. This is the first problem the method solves.

DiT stepsfinite Nẑ₀ ≈ z₀ + residualplain decoder DOOD input → artifacts(worse at 1:192, high freq.)Fixes elsewhereMovieGen: 7B latent upsamplerSora: pixel-space upsamplerboth add large runtime cost
Problem BLeftover noise breaks a plain decoder. With a finite number of steps the predicted latent never fully converges. A normal VAE decoder only saw clean latents in training, so it turns the leftover noise into visible artifacts. The heavier the compression, the worse this gets.
Guide

The second problem: after a finite number of diffusion steps the predicted latent still holds some leftover noise. A normal decoder was trained only on clean latents, so this residual is out of distribution and turns into visible artifacts, worse at LTX's heavy compression. Other systems fix it with large upsamplers, which cost a lot of runtime. LTX's fix is the denoising decoder that appears in the method steps and in equation u5.

per-channel log-var (standard KL)one shared log-var (LTX)grey = “sacrificed” channels (μ→0, σ²→1)KL pressure spread evenly
Problem CIn a wide latent, KL loss kills some channels. With 128 channels, a standard KL loss lets some channels collapse to the prior and carry nothing. Sharing one predicted log-variance across all channels fixes this (§2.1.4). Illustrative bars.
Guide

The third problem is about the width of the latent. The left bars show a standard per-channel KL loss, where some of the 128 channels collapse to the prior and carry no information, drawn in grey. The right bars show LTX's fix: one shared log-variance for all channels, which spreads the KL pressure evenly. The bars are illustrative, not measured. Figure 3 later shows that the trained channels really are dense.

  • Token count: usual 1:48–1:96 VAEs plus a 2×2 patchifier still leave far too many tokens for full 3-D attention at high resolution.
  • Naive patchify does not remove redundancy. It only regroups latent pixels (Fig. 3). The VAE has to learn a decorrelated latent itself.
  • Hard compression loses high frequencies: L2 blurs, LPIPS adds texture artifacts, and a Patch-GAN cannot tell depth-of-field blur from a fake.

§4Method

  1. Patchify at the VAE input, not the DiT input. A causal 3-D conv encoder maps a video of h×w×f to a latent of h/32 × w/32 × (f+7)/8 with 128 channels. The first frame gets its own latent frame. The DiT patch size is 1×1×1.
  2. Train the VAE with four losses: MSE, 3-D video DWT (L1 over 8 wavelet sub-bands), LPIPS, and Reconstruction-GAN. Plus uniform log-variance and per-channel learned noise injection in the decoder.
  3. Make the decoder a denoiser. D(zt, t) is conditioned on t through AdaNorm scale/shift and trained on noise levels t ∈ [0, 0.2], so it maps a slightly noisy latent straight to clean pixels.
  4. DiT = PixArt-α block with RMSNorm, QK-RMSNorm, 3-D RoPE on normalised fractional coordinates (pixels and seconds, relative to a max size, with exponentially spaced frequencies), T5-XXL text via cross-attention, and AdaLN timestep modulation.
  5. Per-token timestep for image-to-video: conditioning-frame tokens get a small tc, all others t = 1. No extra parameters.
  6. Rectified-flow training with velocity prediction. A log-normal t-sampler is shifted towards high noise as the token count grows, with the pdf clamped at the 0.5 and 99.9 percentiles. Multi-resolution batches keep a roughly constant token count (0–20% random token dropping), and images are trained jointly as 1-frame clips.
Guide

This is the recipe in order. First the VAE takes over patchifying and compresses each 32 by 32 by 8 pixel block into one 128-channel latent, trained with four reconstruction losses. Then the decoder is made a small denoiser so it can finish the last step. The transformer is a PixArt-style block with normalisation and rotary positions, and image-to-video works by giving conditioning tokens their own small timestep. Training uses rectified flow with a noise schedule shifted for many tokens.

xEnc ℰz128 chDec 𝒟x̂1 shared logvarnoise inject ×layersMSEpixelDWT L18 sub-bandsLPIPSperceptualrGANpair D
Method 1The Video-VAE training recipe. Four losses compare the input x with the reconstruction x̂. Reconstruction-GAN (rust) is the new adversarial term (Fig. 5).
Guide

The VAE training loop at a glance. The encoder maps the input x to a 128-channel latent with one shared log-variance, and the decoder, with noise injected at each layer, produces the reconstruction x hat. Four losses compare the two: pixel MSE, a wavelet L1 over eight sub-bands, LPIPS for perceptual similarity, and the new reconstruction GAN in rust. Together they let the VAE survive 1 to 192 compression, as Figure 16 shows.

Inference loop (rectified flow)DiTt=1.0DiTt=0.8DiTt=0.55DiTt=0.3𝒟(z,t₁)t=0.05gold bar = noise level of current zz ← z − Δt · v̂θ(z, t) (Euler step)last: x₀ = 𝒟(z(t₁), t₁) in pixel spacepaper study: t₁ = 0.05 vs 0.0 → 0.05 strongly preferred
Method 2N−1 latent steps, then one pixel step. The DiT runs Euler steps on the velocity. The last, low-noise step happens inside the decoder, which outputs pixels directly (Fig. 2, §4.4).
Guide

Inference runs N minus 1 steps in latent space, then one step straight to pixels. Each DiT box is one Euler step that moves the latent along the predicted velocity, and the gold bar shows the noise level shrinking from 1 down to 0.05. The last box is the decoder, which removes the final bit of noise while decoding. The paper found t one equal to 0.05 clearly preferred over 0. For the thesis, the DiT boxes are where compute and quantization error accumulate.

The paper has no Algorithm box. The pseudo-code below is reconstructed from §2.1.1, §2.4 and §2.5.

LTX-Video inference (reconstructed, not an Algorithm box of the paper) input : prompt p, optional first frame I, schedule 1 = t_N > ... > t_2 > t_1 c ← T5-XXL(p) # text tokens, via cross-attn z ← N(0, I) shape (128, (f+7)/8, h/32, w/32) tau ← 1 for every token if I given: # image-to-video z_c ← CausalVAE.Enc(I) # 1 latent frame z[frame 0] ← (1-t_c) z_c + t_c · eps ; tau[frame 0] ← t_c # t_c small, e.g. 0 for k = N .. 2: # latent-to-latent steps v ← DiT(z, tau, c) # RoPE, QK-norm, AdaLN(tau per token) z ← z - (t_k - t_{k-1}) · v (only on non-conditioning tokens) x0 ← VAE.DenoisingDecoder(z, t_1) # final latent-to-pixel denoising return x0
Guide

This pseudo-code is reconstructed by the tab, not copied from the paper. The logic is simple: encode the prompt once with T5, start from pure noise, and if an image is given, place its latent in frame zero with a small timestep. Then loop the transformer, each time subtracting a velocity step from the noisy tokens only. Finally the denoising decoder turns the slightly noisy latent into pixels. The loop body is the part the thesis will quantize and possibly cache.

§5Every equation

The paper has no numbered equations. Below is all of its display and inline math in paper order (u1–u10), plus two lines (u11–u12) that spell out the compression arithmetic behind Table 1.

(u1)\[ z_{t_i} = (1-t_i)\,z_0 + t_i\,\epsilon,\qquad \epsilon\sim\mathcal N(0,I) \]

Rectified-flow forward noising (§2.1.1, §2.5.1): a straight line between the clean latent and Gaussian noise, with t ∈ [0,1].

Guide

This is how noise is added in rectified flow. z sub t i is the noisy latent at noise level t i, z zero is the clean latent, and epsilon is Gaussian noise. The noisy latent is simply a straight-line blend: one minus t times the clean latent plus t times the noise. At t equal to 0 it is clean, at t equal to 1 it is pure noise. Every later equation builds on this line.

(u2)\[ f^{\theta}(z_{t_i}, t_i) = z_0 \]

The ideal denoiser recovers the clean latent. In practice fθ predicts an intermediate quantity (the velocity) from which z0 follows in closed form (footnote 3).

Guide

The goal of the denoiser in one line. f theta is the neural network with weights theta, and given the noisy latent z sub t i and its noise level t i, it should return the clean latent z zero. In practice the network predicts a velocity, from which the clean latent follows directly, as equation u8 defines. Quantizing theta perturbs exactly this prediction.

(u3)\[ \{t_N, t_{N-1}, t_{N-2}, \dots, t_2, t_1\} \]

Decreasing noise levels used when iteratively refining z0, starting from pure noise.

Guide

The sampling schedule: a decreasing list of noise levels, from t N at pure noise down to t one, the lowest level. Generation refines the latent one level at a time along this list. In LTX the transformer covers t N down to t two, and the last level t one is handled by the decoder, as equation u6 states. Fewer levels means fewer transformer passes, which is the other lever on speed.

(u4)\[ z_0 = \mathcal E(x_0),\qquad x_0 = \mathcal D(z_0) \]

Standard latent diffusion: the encoder compresses the sample x0 and the decoder maps the latent back to pixels.

Guide

Standard latent diffusion in two halves. The encoder, script E, compresses a video x zero into a latent z zero, and the decoder, script D, maps a latent back to pixels. Diffusion happens only on the small latent. LTX keeps this structure but changes the decoder, which is what equation u5 introduces next.

(u5)\[ x_0 = \mathcal D(z_{t_i}, t_i) = \mathcal D\big((1-t_i)\,z_0 + t_i\,\epsilon,\; t_i\big) \]

Denoising decoder: 𝒟 is trained as a diffusion model that maps noisy latents to clean pixels, with ti ∈ [0, 0.2] during training.

Guide

The key change: the decoder also takes a noise level. It receives a noisy latent, the blend of clean latent and noise from equation u1, together with t i, and must output clean pixels x zero. It is trained on noise levels from 0 to 0.2 only, so it learns to clean up small residual noise while decoding. This is the fix for the leftover-noise problem in Problem B.

(u6)\[ x_0 = \mathcal D(z_{t_1}, t_1) \]

Because 𝒟 changes dimensionality it cannot be iterated. It performs only the final step, from the lowest latent noise level t1 to pixels.

Guide

How the denoising decoder is used at inference. Because the decoder changes the size of the data, from latent to pixels, it cannot be applied repeatedly. So it performs exactly one step, taking the latent at the lowest noise level t one and producing the final video x zero. The paper sets t one to 0.05.

(u7)\[ t\sim\mathcal U(0,1) \]

Original timestep sampling during training. LTX instead uses a shifted log-normal (SD3), clamped at the 0.5 and 99.9 percentiles (Fig. 10).

Guide

The baseline way to pick training noise levels: t drawn uniformly between 0 and 1. LTX replaces this with a shifted log-normal sampler from Stable Diffusion 3 that favours higher noise when there are more tokens, and clamps the tails at the 0.5 and 99.9 percentiles. Figure 10 draws the resulting distributions.

(u8)\[ v = \epsilon - z_0 \]

Velocity target (SD3). This regression task is more evenly difficult across t than noise prediction.

Guide

The training target. v is the velocity, epsilon is the noise, and z zero is the clean latent, so v equals noise minus clean latent: the direction of the straight line in equation u1. The transformer learns to predict v. This target is about equally hard at every noise level, which makes training more even than predicting noise.

(u9)\[ z_{t-\Delta t} = z_t - \Delta t\; v^{\theta}_t \]

Euler sampling step: move from pure noise z1 towards clean z0 along the predicted velocity.

Guide

One sampling step. The next latent, at noise level t minus delta t, equals the current latent z t minus delta t times the predicted velocity v theta. It walks back along the straight line from noise towards the clean latent. Each such step is one full transformer pass, so step count times DiT cost is the inference budget the thesis attacks.

(u10)\[ \text{win rate} = \frac{\text{wins}}{\text{wins} + \text{losses}} \]

Human-survey metric for Table 2 and Fig. 15. Skipped votes are excluded.

Guide

The human-survey metric. The win rate is the number of wins divided by wins plus losses, with skipped votes left out. So 85 percent means that in comparisons where raters expressed a preference, LTX was preferred 85 times out of 100. Table 2 and Figure 15 report this number.

(u11)\[ \frac{32\cdot 32\cdot 8\cdot 3}{128} = 192,\qquad \frac{8\cdot 8\cdot 4\cdot 3}{16}=48,\qquad \frac{8\cdot 8\cdot 8\cdot 3}{16}=96 \]

Total VAE compression = (pixel values per latent cell × 3 RGB) / latent channels (Table 1; arithmetic made explicit).

Guide

Total VAE compression made explicit. Take the pixels covered by one latent cell, times three colour values, and divide by the number of latent channels. For LTX that is 32 times 32 times 8 times 3 over 128, which is 192. Typical VAEs reach 48 or 96. So LTX's latent is two to four times smaller in raw numbers, as Table 1 lists.

(u12)\[ \underbrace{32\times 32\times 8}_{\text{LTX, patch }1\times1\times1} = 8192 \quad\text{vs.}\quad \underbrace{(8\cdot 2)\times(8\cdot 2)\times 4}_{\text{typical, patch }2\times2\times1}=1024 \]

Pixels per transformer token: LTX has 4–8× fewer tokens for the same video.

Guide

Pixels per transformer token, which is what really sets the token count. LTX has 32 by 32 by 8, so 8192 pixels per token, because its transformer patch size is one. A typical model has an 8 by 8 by 4 VAE plus a 2 by 2 patch, so 1024 pixels per token. That is why LTX sees four to eight times fewer tokens for the same video.

§6Every figure

T2V: man, forestlooks leftgaze lingerslooks rightlens flareI2V: car, wet streetinput framedrifts, sprayturns toward cammotion-blur passI2V: cartoon dancerinput framearms raiseddancingcrowd movesgold = conditioning frame; teal = generated frames (evenly spaced over 5 s)
Fig. 1Text-to-video and image-to-video samples. Row 1 is text-to-video from a long, detailed prompt. Rows 2–3 are conditioned on the left frame. The takeaway is strong prompt adherence and coherent motion over 5 s. Panels are schematic (the originals are photos).
Guide

Sample outputs, drawn schematically since the originals are photos. The first row is text-to-video from a long prompt, and the next two rows are image-to-video, where the gold frame on the left is the given image and the teal frames are generated over five seconds. The point is prompt adherence and coherent motion. These are the qualities the compressed model must preserve.

z ~ 𝒩(0,I)h/32w/32(f+7)/8tn−1tn−2t₂…t₁x₀clean videohwflatent-to-latent denoising steps (DiT)latent-to-pixels step
Fig. 2Holistic denoising: DiT steps in latent space, final step in the decoder. Pure-noise latent (h/32 × w/32 × (f+7)/8) → DiT denoising at tn−1…t2 → the decoder takes the t1-noisy latent and outputs the clean h×w×f video.
Guide

The holistic denoising idea as a flow. Start with a pure-noise latent of size h over 32, w over 32, and f plus 7 over 8. The transformer denoises it down to noise level t two, then the decoder takes the latent at t one and outputs the clean full-size video. This is the paper's Figure 2 and the visual form of equations u5 and u6.

Latent channels cumulative explained variance0.20.40.60.81.0020406080100120componentcum. explained variance2%4%8%16%25%50%70%100%(b) at 4% of training(c) final|correlation| between latent channels(ink = high; diagonal = 1)
Fig. 3Training makes the 128 latent channels decorrelated, and so dense. (a) PCA over the latent pixels of 128 videos. Early in training (blue) a few components explain most of the variance, so the channels are redundant. At the end (rust) the variance is spread almost evenly over all ~128 components. (b, c) Channel correlation matrices: many strong off-diagonal values at 4%, near zero at the end. Curve shapes redrawn.
Guide

Training makes the 128 latent channels independent, and so dense. Panel a plots cumulative explained variance against principal component: early curves in blue rise fast, meaning a few directions hold everything, while the final curve in rust is almost a straight line, meaning all channels matter. Panels b and c show channel correlations fading from strong to near zero. For the thesis, a dense latent means little redundancy to hide quantization error.

CausalConv3D OutResBlock ×7DownsampleResBlock ×3DownsampleResBlock ×3DownsampleResBlock ×4CausalConv3D InPatchifyz: h/32 × w/32 × (f+7)/8video(a) Causal EncoderResBlock ×NCausalConv3DSiLUPixelNormCausalConv3DSiLUPixelNorm↑ hidden state inhidden state out ↑UnPatchifyConv3D OutCondResBlock ×5UpsampleCondResBlock ×6UpsampleCondResBlock ×7UpsampleCondResBlock ×8Conv3D Invideoz_t (noisy latent)(b) Denoising DecoderCondResBlock ×NNoise InjectConv3DSiLUScale, ShiftPixelNormNoise InjectConv3DSiLUScale, ShiftPixelNormt emb.t
Fig. 4The Video-VAE: causal 3-D conv encoder, and a decoder conditioned on the timestep. (a) Patchify → CausalConv3D → ResBlocks (×4,3,3,7) with three Downsample stages → 128-ch latent at 32×32×8. Each ResBlock is two PixelNorm→SiLU→CausalConv3D units plus a skip connection. The first frame is encoded as its own latent frame. (b) Conv3D In → CondResBlocks (×8,7,6,5) with three Upsample stages → Conv3D Out → UnPatchify. Each CondResBlock injects the timestep embedding by scale/shift after PixelNorm and adds learned per-channel noise after each Conv3D. A 4×4 patchify with three 2×2×2 downsamples would give 32×32×8, but that split is our inference, not stated in the paper.
Guide

The Video-VAE architecture. Panel a is the causal encoder: patchify, then stacks of residual blocks with three downsampling stages, giving a 128-channel latent at 32 by 32 by 8. Panel b is the denoising decoder, whose conditioned residual blocks inject the timestep by scale and shift and add learned noise. The exact patchify split is the tab's inference. The decoder is conv-heavy, which matters when deciding what to quantize.

(a) Traditional GANDrealEncDecDfake(b) Reconstruction GANEncDecD(real, fake)EncDecD(fake, real)
Fig. 5Reconstruction GAN: the discriminator sees the original and its reconstruction side by side. (a) A traditional discriminator judges one image alone, real or reconstructed. (b) The rGAN discriminator gets both versions of the same sample, concatenated in either order, and must say which is the original. This relative task is easier and more stable, and it also acts as a reconstruction loss.
Guide

The reconstruction GAN in two panels. In panel a, a normal discriminator sees one image and guesses real or fake. In panel b, it sees the original and its reconstruction side by side, in either order, and must say which is the original. This relative task is easier and more stable, and it also pushes reconstructions closer to the input. It is the rust loss in Method 1.

Transformer block ×28RMS NormScale, ShiftQ K VQK RMS NormRoPESelf AttentionScale⊕Q K VQK RMS NormCross Attention⊕RMS NormScale, ShiftFFNScale ⊕z_t (latent tokens)3D positionalembeddingText encoderT5-XXLText promptK,VAdaLNtimestep t
Fig. 6The 3-D transformer block: PixArt-α plus RMSNorm, QK-norm and RoPE. Each block runs self-attention (with RoPE and QK-RMSNorm) → cross-attention to T5-XXL text tokens → FFN, each with a residual connection. Timestep t reaches the blocks through AdaLN scale/shift/scale modulation (gold). In LTX this t can differ per token (§2.4).
Guide

One of the 28 transformer blocks. Latent tokens pass through self-attention with rotary positions and QK normalisation, then cross-attention to T5 text tokens, then a feed-forward network, each with a residual. The timestep enters in gold through AdaLN scale and shift, and in LTX it can differ per token. These attention and feed-forward matrix multiplies are the layers NNCF weight compression will target.

(a) absolute0,00,10,20,31,01,11,21,32,02,12,22,33,03,13,23,3(b) fractional0,00,.250,.50,.75.25,0.25,.25.25,.5.25,.75.5,0.5,.25.5,.5.5,.75.75,0.75,.25.75,.5.75,.75(c) relative fractional0,00,.20,.40,.6.1,0.1,.2.1,.4.1,.6.2,0.2,.2.2,.4.2,.6.3,0.3,.2.3,.4.3,.6
Fig. 7Positional coordinate options for RoPE. Relative-fractional (c) works best. (a) Integer indices. (b) Fractions of the current size (÷4). (c) Fractions of a predefined maximum size, e.g. rows ÷10 and columns ÷5, with space measured in pixels and time in seconds. The same position then keeps the same code across resolutions, lengths and FPS. Leading zeros dropped (.25 = 0.25).
Guide

Three ways to give tokens positions for rotary embeddings. Panel a uses integer indices, panel b uses fractions of the current size, and panel c, which works best, uses fractions of a fixed maximum size, measured in pixels and seconds. With c, the same place keeps the same code across resolutions, lengths and frame rates. This is part of the transformer design in the method steps.

Exponential spacing (LTX)0246810frequency indexInverse-exponential spacing0246810frequency index0.00.51.0fractional position≈1.90value
Fig. 8Exponentially increasing RoPE frequencies (left) cover the useful range. Inverse-exponential (right) is almost all low frequency. Cell value = fractional position × frequency. With inverse-exponential spacing (the default in many open-source codebases) most channels rotate very little. LTX uses exponential spacing, which is consistent with work showing that truncating low frequencies can help. Colour ramp is shape redrawn.
Guide

Two heat maps of rotary frequencies, each cell being position times frequency. On the left, LTX's exponential spacing covers a useful range of rotation speeds. On the right, the common inverse-exponential spacing leaves most channels barely rotating. The colours are redrawn, not exact. Figure 17 shows the payoff in training loss.

input frameVAEEncnoisetokenstimestepspositionst_ct_cttttTransformer
Fig. 9Image-to-video by per-token timestep, not by special tokens. The first frame is encoded by the causal VAE into one latent frame and concatenated with noise tokens. Conditioning tokens get tc (small, e.g. 0: clean), all others t = 1. Each token keeps its 3-D position for RoPE.
Guide

How image-to-video works without extra parameters. The input frame is encoded into one latent frame and placed before the noise tokens. Its tokens get a small timestep t c, often zero, meaning clean, while all other tokens get t equal to 1. Each token keeps its 3-D position. This per-token timestep is why activation ranges vary across tokens in the same step.

μ = 1 (~256 tokens)00.511.522.50.00.20.40.60.81.0timestep tpdfstretched shifted (used)shiftedμ = 2 (~4096 tokens)0123450.00.20.40.60.81.0timestep tpdfstretched shifted (used)shifted
Fig. 10More tokens push the training timesteps toward high noise. Clamping keeps the tails alive. Log-normal t-sampling (SD3) shifted by μ that depends on token count: about 256 tokens → μ=1, about 4096 → μ=2. The “stretched” version (teal, used by LTX) clamps the pdf at the 0.5/99.9 percentiles so near-0 and near-1 timesteps are never starved. Shape redrawn from a simulated shifted logit-normal.
Guide

Training noise levels shift toward high noise as token count grows. Each panel plots the probability of sampling each t: the left for about 256 tokens, the right for about 4096. The shifted curve peaks at higher t, and the teal stretched version that LTX uses is clamped so very low and very high t are still sampled. The shapes are simulated, not copied from the paper.

Input ShotsCrop BlackBarsEstimate MotionLevelGenerate ThumbnailsMid-Frame CLIPEmbeddingFinal ShotsResize ShotsFilter ShotsCluster &De-DuplicateEstimate Aesthetics
Fig. 11The data-processing pipeline. Shots → crop black bars → motion level (static clips removed) → thumbnails → mid-frame CLIP embedding → aesthetic score (Siamese net trained on tagged pairs) → cluster/de-duplicate → filter → resize → final shots.
Guide

The data pipeline, read left to right and then back. Raw shots are cropped, static clips are removed by a motion check, a CLIP embedding and an aesthetic score are computed, then clips are clustered, de-duplicated, filtered and resized into the final training set. It explains where quality comes from, but it is not relevant to compression.

dragon puppethead close-upcrowd cheerspuppet turnslong bodylong caption: puppet, crowd, street, camera, lightingDalmatianon ledgelooks leftcrouchesjumpscaption: dog, building, static camera, sunlight
Fig. 12The internal captioner writes long, structured captions. Input videos (generated by Sora) → captions covering the subject, action, environment, camera motion and lighting, ending with the style (“captured in real-life footage”). The whole training set was re-captioned this way.
Guide

Examples of the internal captioner. Each row is a video, here generated by Sora, with the long structured caption it received: subject, action, setting, camera motion and lighting, ending with the style. The whole training set was re-captioned this way. It explains why LTX works best with long, detailed prompts, which is worth copying in the evaluation prompts.

whiteblackwearingcamerabackgroundscenehairbluemanwomanshirtrightleftfacedarkgreenlightfootagebehindhandbrownlookingexpressionstandinglargestationaryslightlyreallife
Fig. 13Caption vocabulary centres on appearance, colour and camera. Word cloud of the training captions. The largest words are colours (white, black, blue), people (man, woman, hair), camera/background/scene, and “real-life footage”. Schematic: word sizes only approximate the original.
Guide

A word cloud of the training captions, with word size roughly showing frequency. Colours, people, camera and background terms dominate, along with the phrase real-life footage. The sizes are approximate. It shows what kind of prompts the model has seen most, which helps in picking realistic test prompts.

0.0000.0040.0080.0120.0160255075100125150175number of wordsfrequency(a) words per caption0.000.050.100.150.20051015202530duration (s)frequency(b) clip duration
Fig. 14Captions are long (about 75–100 words), and clips are short (mostly under 5 s). (a) Words per caption peak around 75–85, with a tail past 175. (b) Clip durations are strongly right-skewed, with most under 5 s and a long tail to 30 s. Bar heights read off the plot; shape redrawn.
Guide

Two histograms of the training data. Panel a shows words per caption, peaking around 75 to 85 words with a long tail. Panel b shows clip length, mostly under five seconds with a tail to thirty. The bar heights are read off the original plot. Together they say the model is trained on long captions and short clips.

(a) Text-to-VideoOS-PlanCogVX-2BPyrFlowLTXOS-PlanN/A0.350.300.04CogVX-2B0.65N/A0.360.15PyrFlow0.700.64N/A0.28LTX0.960.850.72N/A(b) Image-to-VideoOS-PlanCogVX-2BPyrFlowLTXOS-PlanN/A0.240.340.05CogVX-2B0.76N/A0.650.12PyrFlow0.660.35N/A0.09LTX0.950.880.91N/A
Fig. 15Pairwise win ratios: LTX-Video wins 72–96% of its matchups. Each row is a model’s win ratio against each column model; all pairs were evaluated. LTX (bottom row) is 0.96/0.85/0.72 for T2V and 0.95/0.88/0.91 for I2V against Open-Sora Plan / CogVideoX-2B / PyramidFlow. Darker = higher.
Guide

Pairwise human preference matrices, text-to-video in panel a and image-to-video in panel b. Each cell is how often the row model beat the column model, and darker is higher. The bottom row, LTX, wins between 72 and 96 percent of its matchups. This is the detailed version of Table 2, and the baseline the compressed model's quality should be compared against.

input framelighthouse + scaffoldstandard GAN lossscaffold smeared, artifactsReconstruction GANscaffold lines kept ≈ input
Fig. 16At 1:192, rGAN keeps fine, fast-moving structure that a standard GAN loss smears. VAE reconstruction of a lighthouse wrapped in scaffolding, a hard case of intricate high-frequency detail. With a standard GAN loss the scaffold shows artifacts. With Reconstruction GAN it stays close to the input. Panels are schematic (the originals are photos).
Guide

A hard reconstruction case, drawn schematically: a lighthouse covered in scaffolding, full of thin high-frequency lines. With a standard GAN loss the scaffold smears into artifacts, while with the reconstruction GAN it stays close to the input. This is the evidence for the rust loss in Method 1, and a reminder that fine detail is fragile at 1 to 192 compression.

Training loss for different RoPE frequency spacing0.60.70.80.90k20k40k60k80k100k120k140ktraining steploss (log)exponential (LTX)inverse-exponential
Fig. 17Exponential RoPE spacing gives consistently lower diffusion loss. Two full LTX training runs that differ only in RoPE frequency spacing, over 140k steps. The inverse-exponential run (rust) stays above the exponential one (indigo) the whole time. Shape redrawn: start about 0.9 vs 0.8, end about 0.59 vs 0.58.
Guide

Training loss against step for two otherwise identical runs. The rust curve uses inverse-exponential rotary frequencies and stays above the indigo exponential curve for all 140 thousand steps, ending around 0.59 versus 0.58. The gap is small but consistent. It justifies the frequency choice shown in Figure 8.

Mongolian dressbehind curtainpeeks throughface visiblesmileswoman in carlooks rightslight smileturnssmilesbloodied womanlooks downlooks rightback upspeaksman, rotary phoneon phonetalkinghangs upsad lookman enters roomenters leftwalks inhand on chairfaces couchwoman, classroomphone calllistensconcernhangs upman at windowwalkslooks outturningback turnedall rows: text-to-video, 5 s; frames evenly spaced; prompt details followed
Fig. 18More text-to-video samples: the prompt details show up in the frames. Seven prompts (cinematic people and scenes). The paper colours the prompt words that the video realises in green, and most of each prompt is green. Schematic grid.
Guide

More text-to-video samples, drawn as a schematic grid. Each row is one prompt, and the frames are evenly spaced over five seconds. In the paper, the prompt words the video realises are coloured green, and most of each prompt is green. The takeaway is prompt adherence on detailed cinematic prompts.

robot, flowersinput frameframe 2walks forwardframe 4dragon readinginput frameframe 2turns pageframe 4bearded maninput frameframe 2turns awayframe 4origami rabbitinput frameframe 2hops, turnsframe 4boy + dog, forestinput frameframe 2walk to cameraframe 4flower-crown figureinput frameframe 2turns aroundframe 4neon streetinput frameframe 2walker crossesframe 4seahorse, coralinput frameframe 2swims, camera driftsframe 4potion brewerinput frameframe 2stirs, steamframe 4
Fig. 19More image-to-video samples: identity and style of the input frame are kept while it moves. Nine conditioning frames (gold, left) and the generated continuations (teal). The text prompt is not shown. Motion includes turning, walking and camera drift. Schematic grid.
Guide

More image-to-video samples, drawn schematically. The gold frame on the left of each row is the input, and the teal frames are generated. The model keeps the identity and style of the input while adding motion such as turning, walking or camera drift. Identity drift over time is a good thing to check after quantization.

§7Results

Table 1. Comparison of model specifications
MovieGenHunyuanVideoPyramidFlowCogVideoXLTX-Video
Base model size30B13B2B2B / 5B1.9B
Transformer hidden dim6144307215361920 / 30722048
FFN dim factor2/3 × 44444
VAE spatio-temporal compression8×8×88×8×48×8×88×8×432×32×8
VAE output channels16161616128
VAE total compression1:961:481:961:481:192
Transformer input patchifier2×2×12×2×12×2×12×2×11×1×1
Tokens to pixels ratio1:20481:10241:20481:10241:8192
Transformer blocks48602430 / 4228
Attention blocksSelf + CrossSelf-onlySelf-onlySelf-onlySelf + Cross
Upsampling model7B paramsN/AN/AN/AN/A
Guide

Model specifications side by side, with LTX in the last column. Read down the LTX column: the smallest model at 1.9 billion parameters, but the strongest VAE at 32 by 32 by 8 with 128 channels, a patch size of one, and 8192 pixels per token, four to eight times more than the others. Only MovieGen needs a separate 7 billion parameter upsampler. The table backs the claims in equations u11 and u12.

Table 2. Human survey: % of pairwise tests won (wins / (wins + losses)); 1,000 prompts per task, 20 raters, 768×512, 5 s, 40 steps
Open-Sora PlanCogVideoX 2BPyramidFlowLTX-Video (ours)
Text-to-video20%38%51%85%
Image-to-video20%47%35%91%
Guide

The headline result: human preference in pairwise tests over 1,000 prompts per task and 20 raters. LTX wins 85 percent for text-to-video and 91 percent for image-to-video, far above Open-Sora Plan, CogVideoX 2B and PyramidFlow. All models ran at the same resolution, length and 40 steps. So speed did not cost quality.

0255075100win rate %2020OS-Plan3847CogVX-2B5135PyrFlow8591LTXT2V (solid)I2V (outline)
Chart ATable 2 as bars: LTX wins 85% (T2V) and 91% (I2V). It is also the fastest model in the comparison: 2 s for 121 frames at 20 steps on an H100.
Guide

Table 2 as a bar chart: win rate by model, solid bars for text-to-video and outlined bars for image-to-video. LTX's bars, at 85 and 91 percent, clearly tower over the others. It is also the fastest model in the comparison, at about two seconds for 121 frames and 20 steps on an H100.

HunyuanVideo1024 px · 1:48CogVideoX1024 px · 1:48MovieGen2048 px · 1:96PyramidFlow2048 px · 1:96LTX-Video8192 px · 1:19202048409661448192pixels per transformer token (VAE compression)
Chart BTable 1 as bars: 4–8× more pixels per token than its peers. The latent is also 2–4× more compressed in bytes (1:192), because the 128 channels are dense rather than redundant.
Guide

Table 1 as a bar chart of pixels per transformer token, with VAE compression in the labels. HunyuanVideo and CogVideoX sit at 1024, MovieGen and PyramidFlow at 2048, and LTX at 8192. The latent is also two to four times more compressed in raw size, because its 128 channels are dense. This is the root of LTX's speed.

Denoising-decoder study (§4.4, no numbers given): in an internal user study, decoding with t = 0.05 (the decoder denoises) was “strongly preferred” over t = 0.0 (no denoising), especially for high-motion videos. rGAN (§4.3.1) and RoPE spacing (§4.3.2) ablations are Figs. 16–17.

§8Why it matters for this thesis

LTX-Video → LTX-2.3 on OpenVINO / NNCF

  • The dense latent leaves no slack for error. Fig. 3 shows all 128 channels carry decorrelated information, and each token stands for 8192 pixels. A small error in the DiT’s velocity output (for example INT4 weight noise) is not averaged away by redundant channels; the decoder spreads it over a whole 32×32×8 block. Expect it to show up as blocky or temporal artifacts, and measure quality per frame and over time (FVD/VBench-type metrics), not just a single-image PSNR.
  • Compute sits in the DiT’s linear layers. 28 blocks at d=2048 with self-attn, cross-attn and a 4× FFN: these are the MatMuls that NNCF compress_weights (INT8/INT4 weight-only, data-free or AWQ/GPTQ-style with calibration) targets. Few tokens (about 6k for a 5-s 768×512 clip) means inference is closer to weight-bandwidth-bound on CPU/Arc, which is where weight-only compression pays off most.
  • Activation ranges depend on the timestep. AdaLN scale/shift (and in LTX a per-token t) change activation ranges from step to step. Any activation quantization (W8A8) or calibration set must sample latents from all timesteps, not only t≈1. QK-RMSNorm helps by keeping attention logits bounded (fewer outliers).
  • Keep the denoising VAE decoder at higher precision to start. It is a conv-heavy 3-D network (Conv3D, PixelNorm, noise injection) whose job is to rebuild high frequencies. Quantization noise here goes straight to pixels. Its last-step denoising (t≈0.05) may partly absorb small DiT errors, which is worth measuring. OpenVINO supports 3-D convolution natively; decoding 121 frames at full resolution is memory-heavy on CPU, so plan for temporal/spatial tiling.
  • The text encoder is big too. T5-XXL’s encoder has more parameters than the 1.9B DiT, but it runs only once per prompt, so INT8 weight compression there is a cheap memory win. Check what LTX-2.3 actually uses and what carries over (audio branch, larger DiT): this paper describes the v0.9 design, not 2.3.
Guide

Use this box as the plan of attack. Target the DiT's linear layers with NNCF weight-only INT8 or INT4 compression first, since with only about six thousand tokens the model is close to weight-bandwidth bound on CPU and Arc. Calibrate across all timesteps, keep the denoising decoder at higher precision at first, and compress T5 cheaply. Judge quality with temporal video metrics, and confirm which of these design points still hold in LTX-2.3.

Target models

LTX-2: Efficient Joint Audio-Visual Foundation Model

Y. HaCohen, B. Brazowski, N. Chiprut, Y. Bitterman, … Z. Farbman (Lightricks) · Technical report, arXiv:2601.03233 · January 2026 · weights and code: github.com/Lightricks/LTX-2

LTX-2 makes a video and its soundtrack together from one text prompt. A big video transformer and a smaller audio transformer run side by side and talk to each other at every layer, so lips, footsteps and music line up in time. This is the model the thesis compresses: almost all of its weight sits in two parts, the 19B dual-stream DiT and the 12B Gemma-3 text encoder.

Denoiser (DiT)
19B = 14B video + 5B audio
Text encoder
Gemma-3 12B (frozen)
Speed (H100, 720p, 121 fr.)
1.22 s / step
vs Wan 2.2-14B
≈18× faster per step
Audio latent
128-d token per 1/25 s
Output
≤20 s · 1080p · 24 kHz stereo
Reading guide

LTX-2 asks whether one open model can generate a video and its soundtrack together from a single text prompt, with lips, footsteps and music in sync. Its answer is an asymmetric dual-stream transformer: a 14 billion parameter video stream and a 5 billion parameter audio stream that exchange information at every layer, conditioned on a frozen Gemma-3 12B text encoder. This is the exact model family the thesis compresses, so the tab is written as a map of where the weights and the compute sit. It moves from the big-picture component map, to the problem of joint generation and memory, to the method, every equation, every figure, the results, and a closing thesis box. Among the sixteen papers it is the second target-model paper, after LTX-Video, and everything that follows, from GPTQ to TeaCache to VBench, is a tool applied to it.

§0Before reading

LTX-2 is a latent diffusion transformer: it never touches pixels or sound waves while generating, only compact latent tokens that a denoiser cleans up step by step. It builds on three ideas: latents, self- versus cross-attention, and classifier-free guidance. It is in the atlas because it is the model family of the thesis model, LTX-2.3, so this report shows where the weights and the compute are.

start: pure noise clean latents decode output video latent audio latent text embedding Dual-stream DiT video stream · 14B audio stream · 5B talk every layer repeat N steps σ = 1, noise σ = 0, clean 1 token ≈ 1/25 s video VAE decoder audio decoder + vocoder frames stereo sound
PrimerGeneration happens in latent space, one denoising step at a time. A VAE (variational autoencoder) squeezes video into a small grid of latent tokens, and a mel spectrogram of the sound into a row of audio tokens, about one per 1/25 s. Generation starts from pure noise in both latent spaces. The DiT (diffusion transformer) removes a little noise per step while the noise level \(\sigma\) goes from 1 to 0. Only then do the decoders, plus a vocoder for sound, turn latents into frames and a waveform. For the thesis, the DiT is the part that runs N times.
Guide

LTX-2 never generates pixels or sound waves directly. Read the drawing from left to right: noisy video and audio latents enter the dual-stream transformer, which removes a little noise per step while sigma, the noise level, falls from one to zero. Only at the end do the video decoder and the audio decoder with its vocoder turn the clean latents into frames and stereo sound. The transformer is the box that runs many times, so it is the main target.

Self-attention one sequence video tokens video: 3D positions audio: 1D time Cross-attention two sequences video queries audio keys, values aligned by time only
PrimerSelf-attention mixes one stream; cross-attention lets one stream read another. In self-attention every token builds a query \(Q\) and compares it with the keys \(K\) of all tokens in the same sequence, then averages their values \(V\). In cross-attention the queries come from one sequence and the keys and values from another. LTX-2 uses it twice per block: to read the text, and to let video and audio read each other. RoPE (rotary position embedding) tells attention where each token sits; for the audio-video link only the time axis is used.
Guide

Attention comes in two flavours in this paper. On the left, self-attention: tokens of one stream look at each other, with three dimensional positions for video and time only for audio. On the right, cross-attention: queries from the video stream read keys and values from the audio stream, matched only by time. LTX-2 uses cross-attention to read the text and to let the two streams exchange information in every block.

full condition pass 1 text dropped pass 2 other stream dropped pass 3 combine s_t = 3 s_m = 3 guided step 1 step = up to 3 DiT passes
PrimerGuidance multiplies the DiT work per step. Classifier-free guidance (CFG) runs the model with and without a condition and pushes the result away from the weaker prediction. LTX-2 has two conditions per stream, the text and the other modality, so a guided step needs up to three passes. The weights \(s_t\) and \(s_m\) are the guidance scales (video uses 3 and 3, audio 7 and 3). The speed table in the paper was measured with guidance switched off, so real runs cost more.
Guide

Guidance is why one denoising step can cost three transformer passes. The model runs once with full conditioning, once with the text dropped and once with the other stream dropped, then combines the three with two weights, s t for text and s m for the other modality. Video uses three and three, audio seven and three. The paper's speed table switches guidance off, so real generation is slower than those numbers suggest.

Target models Compression and speed LTX-Video previous LTX-2 this paper GPTQ next 13 more compressed latent fast video DiT + audio stream + Gemma-3 text + guidance per modality family of LTX-2.3 int4 weight rounding first compression paper
PrimerWhere this paper sits. LTX-Video gave the family its highly compressed video latent and fast DiT. LTX-2 keeps that and adds an audio stream, a Gemma-3 text pipeline and two-way guidance, which makes it the model this thesis compresses. From GPTQ onward, every paper is a tool for shrinking or speeding up exactly the blocks this report shows.
Guide

LTX-2 sits between LTX-Video and GPTQ. LTX-Video gave the family its compressed video latent and fast transformer. LTX-2 adds an audio stream, a Gemma-3 text pipeline and guidance per modality, and it is the family of LTX-2.3, the thesis model. From GPTQ onward, the remaining fourteen papers are tools for shrinking or speeding up the blocks this report describes.

Terms used in this paper

DiT (diffusion transformer)
A transformer used as the denoiser in a diffusion model. It works on a sequence of latent tokens instead of an image grid of pixels.
VAE latent
The compact code a variational autoencoder makes from video or audio. The encoder compresses, the decoder turns latents back into frames or sound.
Denoising step, timestep \(\sigma\)
One call of the denoiser. \(\sigma\) is the noise level: 1 means pure noise, 0 means a clean sample. Fewer steps means faster generation.
Rectified flow / flow matching
A training recipe where the model learns the straight-line direction (a velocity) from noise to data, so good samples need fewer steps.
Mel spectrogram
A picture of sound: time on one axis, frequency bands spaced like human hearing on the other, loudness as brightness.
Vocoder (HiFi-GAN)
A small network that turns a mel spectrogram back into an audio waveform. LTX-2 uses a HiFi-GAN style vocoder for 24 kHz stereo.
Cross-attention
Attention where queries come from one sequence and keys and values from another, for example video tokens reading text or audio tokens.
RoPE
Rotary position embedding: rotates queries and keys by an angle that depends on position, so attention knows where tokens are (3D for video, 1D time for audio).
AdaLN
Adaptive layer normalisation: small layers compute a scale, a shift and a gate from the timestep and apply them inside each block.
CFG (classifier-free guidance)
Running the model with and without a condition and extrapolating away from the unconditioned result. Stronger adherence, but extra forward passes.
Gemma-3 12B
An open decoder-only language model from Google. LTX-2 keeps it frozen and uses its hidden states from all layers as the text encoding.
BF16
A 16-bit floating-point format (2 bytes per number) with the same range as FP32 but fewer precision bits. The usual full-precision baseline here.
NVIDIA H100
A data-centre GPU from NVIDIA's Hopper generation, where the paper measures speed. It has far more memory and bandwidth than an Intel Arc card, so its timings will not transfer directly.
Wan 2.2
An open video generation model family from Alibaba. The paper compares its 14B version against LTX-2 for speed per step.
Guide

These fourteen terms cover what the report takes for granted. The most important are the diffusion transformer, the VAE latent, the timestep sigma and classifier-free guidance, because they explain where compute goes. RoPE and AdaLN appear inside every block, and AdaLN layers are small ones likely to stay in high precision. The H100 is the NVIDIA data-centre GPU used for the speed numbers, which will not transfer directly to Intel hardware.

§1Big picture: the full component map

Text prompt Gemma-3 12B text encoder ≈12B params frozen · runs once all L layers tapped Feature extractor W: D·L → D Text connector A + thinking tokens Text connector V + thinking tokens Audio latent noise 128-d · 25 tok/s Video latent noise 3D latent grid Dual-stream DiT · 19B · ×N steps Audio stream 5B params 1D temporal RoPE narrow width A↔V Video stream 14B params 3D RoPE (x, y, t) wide width self · text · AV · FFN timestep σ Audio VAE decoder latent → stereo mel Vocoder (HiFi-GAN) 2× ch · 16→24 kHz Stereo audio 24 kHz Latent upscaler 0.5 MP → hi-res Video VAE decoder latent → frames Frames up to 1080p main low-bit target (≈31B) small · keep FP16 / INT8 AV cross-attention optional (multi-scale only)
Where the weights live. Only three blocks carry paper-stated parameter counts: video stream 14B, audio stream 5B, Gemma-3 12B. Together that is ≈31B, nearly the whole model. The feature extractor, connectors, VAEs, vocoder and upscaler get no count in the paper and are small next to these. For text-to-audio+video only the VAE decoders are needed. The encoders are used in training (Fig. A1a) and for image or video conditioning.
Guide

Almost all of the model's weight sits in three boxes: the video stream at 14 billion parameters, the audio stream at 5 billion, and Gemma-3 at 12 billion, about 31 billion in total. Read the diagram left to right: the prompt goes through Gemma, a feature extractor and two connectors, then both noisy latents are denoised together for N steps, and finally decoders turn latents into sound and frames. For text-to-audio-and-video only the decoders are needed, not the VAE encoders.

The model has three parts: modality-specific causal VAEs, a text pipeline built on Gemma-3, and an asymmetric dual-stream DiT that denoises audio and video latents together. Because the DiT runs at every step, it dominates compute. Gemma-3 runs once per prompt but holds more than a third of the weights.

§2The problem

Decoupled (T2V → V2A) Text T2V model V2A model one-way only:weak foley/lip-sync Joint (LTX-2) Text Audio stream 5B Video stream 14B joint p(video, audio)sync both ways
Why a joint model. In a sequential pipeline the second model cannot change the first. Lip motion depends on the audio, while reverb and foley depend on the scene. LTX-2 captures both directions with bidirectional cross-attention.
Guide

A sequential pipeline cannot fix its own first step. On the left, a text-to-video model runs first and a video-to-audio model follows, so the sound can never influence the picture and lip-sync and foley suffer. On the right, LTX-2 runs both streams together and models the joint distribution of video and audio, so information flows both ways. This is the paper's core motivation for the dual-stream design described in the Method section.

Parameters by component (paper) 0 5 10 15 parameters (billions) Video stream 14B Gemma-3 encoder 12B Audio stream 5B Video VAE not given (small) Audio VAE + vocoder not given (small) Extractor + connectors not given (small)
Three blocks hold ≈31B parameters. Video stream 14B, Gemma-3 12B and audio stream 5B are paper numbers. The other bars are placeholders: the paper gives no count for them. Note that the conclusion instead says "13B video + 3B audio", which conflicts with the abstract. Check the real numbers by counting weights in the exported IRs.
Guide

Three components hold about 31 billion parameters, and everything else is small. Each bar is one component, measured in billions of parameters; only the video stream, Gemma-3 and the audio stream have numbers from the paper, and the remaining bars are placeholders. Be careful: the conclusion says 13 billion video plus 3 billion audio, which contradicts the abstract. For the thesis, count the weights in the exported OpenVINO models and report those instead.

Weight memory (derived: params × bytes) BF16 INT8 INT4 0 10 20 30 40 GB 38 19 9.5 24 12 6 16 GB · Arc A770 DiT 19B Gemma-3 12B weights only; ignores activations, KV and scale overhead
BF16 does not fit a consumer Intel GPU. These are atlas estimates (params × bytes), not paper numbers. The DiT alone needs about 38 GB in BF16. With weight-only INT4, both big blocks fit under 16 GB, and the DiT at INT8 comes close. Gemma is only needed at the start, so it can be offloaded once the embeddings are computed.
Guide

In sixteen bit precision the model does not fit a sixteen gigabyte Arc A770. The bars are the tab author's estimates, parameters times bytes, for BF16, INT8 and INT4, and the dashed line marks sixteen gigabytes. The DiT needs about 38 gigabytes in BF16, 19 in INT8 and 9.5 in INT4, so weight-only INT4 brings both big blocks under the line. Since Gemma runs only at the start, it can also be offloaded after the text embeddings are computed.

Calls per generated clip Gemma-3×1 Connect.×1 DiT: N steps × k passes VAE dec×1 Vocoder×1 k = forward passes per stream per step 1 CFG off (Table 1 timing) 2 text CFG only 3 text + modality CFG (reported settings) plus refinement passes on each tile in multi-scale mode
Compute is dominated by repeated DiT calls. Everything else runs once per clip. The DiT runs at every step, up to three times per step with modality-CFG (§4.1), and again for each tile during 1080p refinement. Speeding up the transformer therefore gives the biggest gain in latency.
Guide

Latency is almost entirely repeated transformer calls. Each box counts how often a component runs per clip: Gemma, the connectors, the VAE decoder and the vocoder run once, while the DiT runs N steps times k passes, where k grows from one with guidance off to three with text and modality guidance. Refinement tiles add even more DiT calls. So speeding up the transformer, by quantization or by caching, gives the largest gain.

  • Silent T2V models and sequential T2V→V2A (or A2V) pipelines cannot model the joint distribution. The paper's fix is one model with two streams.
  • Symmetric twin backbones (e.g. Ovi: two 5B Wan streams) waste capacity, since audio carries less information than video. The fix is an asymmetric 14B/5B split.
  • Decoder-only LLM encoders use causal attention, and their last layer alone is a weak conditioning signal. The fix is to extract features from all layers and refine them bidirectionally.

§3Method

  1. Encode. Video goes through a spatiotemporal causal VAE (the LTX-Video latent space). Audio is converted to stereo 16 kHz, each channel becomes a mel spectrogram, the two are stacked as 2 channels, and a causal audio VAE turns them into 1D tokens (128-d, one per ≈1/25 s).
  2. Text. Gemma-3 12B stays frozen. Hidden states from all L layers are mean-centred and scaled per layer, flattened to D·L and projected by W to D. W is trained once, early, with the diffusion MSE loss, then frozen.
  3. Connectors. Each stream gets its own connector: bidirectional transformer blocks. Learnable "thinking tokens" replace the padding positions. A caption projection then feeds the result to the DiT by cross-attention.
  4. Dual-stream block (×depth), run per stream: self-attention (3D RoPE for video, 1D for audio) → text cross-attention → AV cross-attention (temporal RoPE only, AdaLN on Q and on K/V, output gate driven by the other modality's timestep) → FFN. RMSNorm sits between the operations.
  5. Sample with modality-aware CFG (§4.1). Video uses st=3, sm=3; audio uses st=7, sm=3.
  6. Multi-scale, multi-tile. Generate a base latent at ≈0.5 MP, upscale it in latent space, split it into overlapping spatial and temporal tiles, refine each tile with the same model, blend in latent space, then VAE-decode.
  7. Decode. The video VAE decoder produces frames. The audio VAE decoder produces a stereo mel, and a HiFi-GAN vocoder (2× channels) turns it into a 24 kHz stereo waveform.
Guide

The pipeline runs in a clear order. First, video and audio are compressed into latents, audio as one 128-dimensional token per twenty-fifth of a second. Next, the frozen Gemma model turns the prompt into features that are merged across all its layers and refined by one connector per stream. Then the dual-stream blocks denoise both latents together, guided by modality-aware guidance, optionally refined tile by tile at high resolution, and finally decoded into frames and 24 kilohertz stereo sound.

Multi-layer feature extractor (shapes) [B,T,D,L] all L layers Gemma hidden states mean-centre + scale per layer, over T, D [B,T,D·L] [B,T,D] W Training schedule for W brief joint stage (MSE, LLM frozen) → W frozen for rest of training
A single big linear layer. W maps D·L to D. With Gemma-3 12B's width and depth this matrix is large. It runs once per prompt, so compressing it saves memory rather than time.
Guide

The feature extractor is just one large linear layer. The diagram follows tensor shapes: Gemma's hidden states from all L layers, shaped batch by tokens by width by layers, are normalised per layer, flattened so width times L becomes one axis, and projected by W back to width D. W is trained briefly at the start and then frozen. Because it runs once per prompt, compressing it saves memory, not time.

One sampling step, one stream M(x, t, m) full M(x, ∅, m) no text M(x, t, ∅) no other mod. s_t s_m combine (§4.1) guided M̂ Euler step σ → σ − Δσ ∅ for m = the cross-modal attention input is dropped
Guidance triples the DiT work. Each stream needs the full, text-dropped and modality-dropped predictions. That means three transformer passes per step, which is why the per-step speed in Table 1 (CFG off) is a lower bound.
Guide

Guidance makes every sampling step three times as expensive. For one stream, the model is run with full conditioning, with the text dropped, and with the other modality dropped; the two differences are scaled by s t and s m and combined, as in the equation in section four point one, before a single Euler step lowers the noise level sigma. This is why Table 1's timing, measured with guidance off, is a lower bound on real cost.

Multi-scale, multi-tile inference (§4.2) base latent≈0.5 MP full DiT, all steps latent upscalerspatial ↑, time kept overlap overlapping tiles (x, y, t) refine each tilesame DiT weights blendin latent VAE decode1080p
Peak memory is set by the tile size, not the output size. Only the refinement stage sees high-resolution latents, and each tile is processed on its own. This matters on a memory-limited Arc GPU. The upscaler is one more exported component.
Guide

Peak memory depends on the tile size, not on the final 1080p output. The flow goes left to right: the full DiT first generates a base latent of about half a megapixel, a latent upscaler enlarges it, the result is cut into overlapping tiles in space and time, each tile is refined by the same DiT weights, and the tiles are blended before decoding. On a memory-limited Arc GPU this is what makes high resolution feasible.

Inference loop (atlas summary of §3 and §4, not an Algorithm box from the paper)

e_V, e_A = ConnectorV(FeatExt(Gemma3(prompt))), ConnectorA(FeatExt(Gemma3(prompt))) # once z_V, z_A = noise(video_latent_shape), noise(audio_latent_shape) for σ in schedule (N steps): for stream s in {V, A}: # both run inside one DiT call full = M_s(z_s, e_s, m = other stream) no_txt = M_s(z_s, ∅, m = other stream) no_mod = M_s(z_s, e_s, m = ∅) v_s = full + s_t(full − no_txt) + s_m(full − no_mod) z_s = Euler(z_s, v_s, σ) if multiscale: z_V = LatentUpscaler(z_V); z_V = blend(refine(tile) for tile in tiles(z_V)) frames = VideoVAE.decode(z_V); wav24k = Vocoder(AudioVAE.decode(z_A))
Guide

The whole inference loop fits in a few lines. The text is encoded once into one embedding per stream. Then, for every noise level, each stream computes three predictions, full, without text and without the other modality, mixes them with the guidance weights and takes an Euler step. After optional upscaling and tile refinement, the latents are decoded. Note that this is the tab author's summary, not an algorithm box from the paper.

Component inventory (exported parts)

Parameter counts are from the paper where stated. "n/g" means the paper gives no count.
ComponentRoleParamsRuns per clipCompression priority
Transformer: video streamdenoise 3D video latents14BN × k (+ tiles)1st: INT8 / INT4 weights
Transformer: audio streamdenoise 1D audio latents5BN × k1st, together with video
Text encoder: Gemma-3multilingual prompt features12B12nd: INT4/INT8 (memory)
Feature extractor (W)D·L → D projectionn/g1INT8 optional
Text connectors ×2bidirectional refine + thinking tokensn/g1keep FP16
Video VAE (dec.)latent → framesn/g1 (tiled)FP16; activation-heavy
Audio VAE (dec.)latent → stereo meln/g1keep FP16
Vocoder (HiFi-GAN, 2× ch)mel 16 kHz → wave 24 kHzn/g1keep FP16
Latent upscalerbase → high-res latentn/g1optional
Guide

This table is a compression plan. Each row is a component with its role, parameter count, how often it runs per clip, and a suggested precision. The two transformer streams run N times k times and hold 19 billion parameters, so they come first for INT8 or INT4 weights. Gemma runs once and is compressed second, mainly to save memory. The small parts, with counts marked not given, stay in sixteen bit because they are cheap but sensitive.

§4Every equation

The paper has no numbered equations and only one display equation, the modality-aware CFG. The other entries below are written out from the paper's prose and are marked as such.

(§4.1)\[ \hat{\mathcal{M}}(x,t,m)=\mathcal{M}(x,t,m)+s_t\big(\mathcal{M}(x,t,m)-\mathcal{M}(x,\varnothing,m)\big)+s_m\big(\mathcal{M}(x,t,m)-\mathcal{M}(x,t,\varnothing)\big) \]

The paper's only display equation. x is this stream's latent, t the text condition, m the other modality's features. st scales text guidance and sm scales cross-modal guidance. With st=sm=0 it reduces to one conditional pass.

Guide

The paper's only displayed equation is its guidance rule. M hat is the guided prediction for one stream, where x is that stream's noisy latent, t is the text condition and m is the other modality's features. It starts from the fully conditioned prediction, then adds s t times its difference from the text-dropped prediction and s m times its difference from the modality-dropped prediction. With both weights zero it reduces to one ordinary pass; otherwise it costs three.

(§4.1 values)\[ \text{video: } s_t=3,\; s_m=3 \qquad\qquad \text{audio: } s_t=7,\; s_m=3 \]

Guidance weights used for all reported results. Larger sm improves sync and semantic coherence.

Guide

These are the guidance weights behind every reported result. Video uses a text weight s t of three and a cross-modal weight s m of three; audio uses a stronger text weight of seven and the same cross-modal weight of three. The paper says a larger s m improves synchronisation and semantic coherence. When benchmarking on CPU or Arc, keep these settings fixed so the quality and speed numbers are comparable to the paper's.

(§3.2.1*)\[ \tilde h_\ell=\operatorname{scale}\!\big(h_\ell-\mu_\ell\big),\quad h_\ell\in\mathbb{R}^{B\times T\times D};\qquad e=\big[\tilde h_1\,\Vert\,\cdots\,\Vert\,\tilde h_L\big]\,W,\quad W\in\mathbb{R}^{(D\cdot L)\times D} \]

*Written from the three prose steps: mean-centre and scale each layer over (T, D), flatten to [B,T,D·L], project with a learned dense W to D. ‖ is concatenation. The paper does not specify the exact scaling statistic.

Guide

This equation reconstructs the feature extractor from the paper's prose; the paper gives no formula. For each Gemma layer l, the hidden state h l is centred by subtracting its mean mu l and then scaled. All L layers are concatenated side by side and multiplied by the learned matrix W, which maps width times L down to width D, giving the embedding e. The exact scaling statistic is not specified, so treat the details as approximate.

(A1*)\[ z_\sigma=(1-\sigma)\,z_0+\sigma\,\epsilon,\qquad \mathcal{L}=\mathbb{E}_{z_0,\epsilon,\sigma}\big\lVert v_\theta(z_\sigma,\sigma,c)-(\epsilon-z_0)\big\rVert_2^2 \]

*Standard rectified-flow form. Fig. A1 only says "match their velocity fields using a flow-matching loss", applied to both the audio and video latents. The exact sign and time conventions are not given.

Guide

Training uses the standard rectified-flow objective, written here in its usual form because the paper only names it. The noisy latent z sigma is a straight-line blend of the clean latent z zero and Gaussian noise epsilon, weighted by the noise level sigma. The network v theta, given the condition c, is trained to predict the velocity, epsilon minus z zero, with a squared-error loss, separately for audio and video. Signs and time conventions may differ in the real code.

§5Every figure

In the faithful redraws below, colours follow the paper: video = blue audio = yellow text = pink.

MelSpectrogram Audio VAEEncoder + Audio Noise AudioLatents T Text Encoder FeatureExtractor TextEmbedding TextConnector TextConnector Video VAEEncoder + Video Noise VideoLatents ×N Audio Stream Video Stream A-V Cross-Attn Audio Pred Video Pred Audio Loss Video Loss
Fig. 1LTX-2 architecture overview (training view). Audio (mel → causal audio VAE) and video (causal video VAE) latents are noised. Text passes through the encoder, feature extractor and embedding, then into one connector per stream. N dual-stream blocks denoise both modalities and exchange information by A-V cross-attention. Each stream has its own loss.
Guide

The architecture is two parallel denoisers joined in the middle. Read it from the outside in: audio as a mel spectrogram and video each pass through their own VAE encoder and receive noise, while text passes through the encoder, feature extractor and one connector per stream. N dual-stream blocks then denoise both latents, exchanging information through audio-visual cross-attention, and each stream has its own prediction and loss. This is the training view of the component map above.

VideoHidden State TextHidden State AudioHidden State Self Attention Self Attention T2V CrossAttention T2A CrossAttention A2V CrossAttention V2A CrossAttention FFN FFN
Fig. 2aDual-stream backbone block. Each stream runs self-attention, then text cross-attention (T2V / T2A), then audio-visual cross-attention (A2V / V2A, dotted box, crossing links), then FFN. Both streams share the text hidden state and have the same depth. Only their width differs.
Guide

Each backbone block runs the same four operations in both streams. Top to bottom: self-attention within the stream, text cross-attention, audio-visual cross-attention in the dotted box, where the links cross between streams, and a feed-forward network. Both streams share the text hidden state and have the same depth; only their width differs, with the audio stream narrower. That asymmetry is why the audio stream costs 5 billion parameters instead of 14.

VideoHidden State AudioHidden State Q K V V K Q Scale, Shift A2V Scale, Shift VideoTimestep AudioTimestep Temporal 1D RoPE Temporal 1D RoPE Cross Attention Cross Attention Gate Gate AudioTimestep VideoTimestep
Fig. 2bAudio-visual cross-attention in detail. Q, K and V are projected, then modulated (scale and shift) by the stream's own timestep. Temporal-only 1D RoPE is applied to Q and K. Video queries attend to audio K/V (left), and audio queries attend to video K/V (right). Each output is gated by the other modality's timestep: this is cross-modality AdaLN.
Guide

The cross-modal link aligns sound and picture in time, not in space. Queries, keys and values are projected and modulated by the stream's own timestep, then a temporal-only rotary position encoding is applied to queries and keys. Video queries attend to audio keys and values on the left, audio queries attend to video on the right, and each output is gated by the other modality's timestep. These small modulation and gate layers are precision-sensitive when quantizing.

V2A attention (Q: audio · KV: video) A2V attention (Q: video · KV: audio) car far: faint hot on car car near: hot <Car passing by> diffuse spots diffuse spots on car <Car passing by> speaker face clapping hands clapping hands “Listen to this” · <Clapping> diffuse hands / torso hands “Listen to this” · <Clapping> S1 mouth S2 mouth both mouths S1 “I’m James” · S2 “I’m Arnold” · Both S1 mouth S2 mouth both mouths S1 “I’m James” · S2 “I’m Arnold” · Both lips lips lips “Welcome… to LTX-2” lips lips lips “Welcome… to LTX-2”
Fig. 3Cross-attention maps show sync in time, where it happens in the frame. Schematic of the paper's heat-map gallery: 4 clips × 3 frames. The blue line is the audio waveform and magenta ticks mark each displayed frame. Maps are averaged over heads and layers. V2A is taken from the first third of inference steps, A2V from the last third. Attention follows the moving car, switches from speaker 1 to speaker 2 to both, and locks onto the lips in the close-up. In the car and clapping rows, A2V is more diffuse than V2A.
Guide

Cross-attention maps show that the model finds the source of each sound in the frame. The schematic shows four clips at three frames each, with V2A maps on one side and A2V maps on the other, averaged over heads and layers. Attention follows the passing car, switches from the first speaker to the second to both, and locks onto the lips in the close-up. This is the paper's qualitative evidence that the bidirectional design actually synchronises the two modalities.

T Gemma312B T × D Multilayeractivations L layers FeatureExtractor T × D TextEmbedding T × D R × D R × D R × D thinking tokens Text Connector Transformer Block Transformer Block
Fig. 4Text understanding pipeline. Gemma3-12B produces T×D activations at each of its L layers. The feature extractor turns them into one T×D embedding. Learned thinking tokens (R×D blocks) fill the padded positions, and a bidirectional text connector (transformer blocks) refines the sequence for the modality-specific DiT stream. There is one connector per stream.
Guide

Text conditioning uses every Gemma layer, not just the last one. Gemma-3 12B produces a tokens-by-width activation at each of its L layers, the feature extractor merges them into one embedding, and learned thinking tokens replace the padding positions. A small bidirectional transformer connector then refines the sequence for one stream, and there is one connector per stream. For quantization this means an error in early Gemma layers still reaches the DiT.

M(x, t, null) M(x, null, m) M(x, t, m) s_t s_m M′(x, t, m)
Fig. 5Modality-CFG has two independent guidance directions. Start at the fully conditioned output (orange). Move away from the text-dropped prediction (green) by st, then away from the modality-dropped prediction (blue) by sm. The result is the guided output M′ (red). Arrow lengths are illustrative.
Guide

Modality guidance pushes the prediction along two independent directions. Start at the fully conditioned output M of x, t, m; move away from the text-dropped prediction by the weight s t, then away from the modality-dropped prediction by the weight s m. The end point is the guided output M prime. Arrow lengths are illustrative. It is the geometric picture of the guidance equation in section four point one.

Melspectrogram Audio VAEencoder + Audio noise Audiolatents T Text encoder Video VAEencoder + Video noise Videolatents Denoisingmodel Audio pred Video pred Audio loss Video loss
Fig. A1aTraining pipeline. Audio and video are encoded to latents and noised. The denoiser, conditioned on text, learns to match each modality's velocity field with a flow-matching loss. This is where the VAE encoders are needed.
Guide

The training pipeline is the only place the VAE encoders are needed. Audio, as a mel spectrogram, and video are encoded into latents and noised, and the denoiser, conditioned on text, learns to match each modality's velocity field with a flow-matching loss, the objective in equation A1. For the thesis this figure mainly shows which parts can be left out of the exported inference graph.

Audio noise T Text encoder Video noise Denoisingmodel ×N Audio pred Audio VAEdecoder Upsamplingvocoder Video pred Video VAEdecoder
Fig. A1bInference pipeline, which is the one exported. Start from noise in both latent spaces, run the denoiser N times with text conditioning, then decode: audio VAE decoder plus upsampling vocoder for sound, video VAE decoder for frames.
Guide

This is the inference pipeline, the one exported to OpenVINO. Start from noise in both latent spaces, run the denoiser N times with text conditioning, then decode: the audio VAE decoder and an upsampling vocoder produce sound, and the video VAE decoder produces frames. Every box here becomes an exported model, and only the denoiser repeats, which is why it is the main compression target.

z_t RMS Norm Scale, Shift Self Attention Gate + RMS Norm Text CrossAttention + AV Cross Attention + RMS Norm Scale, Shift FFN Gate + RoPE (x,y,t) for video(t) for audio AV Cross Attention(Other Branch) Embedding Connector Text Encoder Text Prompt AdaLN timestep
Fig. A2One stream in full detail; audio and video have the same layout. zt → RMSNorm → AdaLN scale/shift → self-attention (RoPE on (x,y,t) or (t)) → gate → residual. Then RMSNorm → text cross-attention (from embedding connector ← text encoder) → residual. Then AV cross-attention with the other branch → residual. Then RMSNorm → scale/shift → FFN → gate → residual. The timestep AdaLN feeds every scale/shift and gate. These small modulation layers are the usual candidates to keep in high precision.
Guide

One stream of one block, in full detail; audio and video share this layout. The latent passes through RMS norm, a timestep-driven scale and shift, self-attention with rotary positions, a gate and a residual add, then text cross-attention, then audio-visual cross-attention with the other branch, then a modulated and gated feed-forward network. The timestep AdaLN feeds every scale, shift and gate, and those small layers are the usual candidates to keep in high precision.

§6Results

Table 1: Inference speed, time per diffusion step on an H100 GPU (121 frames, 720p, single-step Euler, CFG = 1).
ModelModalityParamsSec/Step
Wan 2.2-14BVideo only14B22.30 s
LTX-2Audio + Video19B1.22 s
Guide

LTX-2 is about eighteen times faster per step than Wan 2.2, despite having more parameters. On an H100 at 720p with 121 frames, Wan 2.2 with 14 billion parameters takes 22.3 seconds per step for video only, while LTX-2 with 19 billion takes 1.22 seconds for audio and video. The paper credits its compact latent space. Note that guidance was off, so real runs with modality guidance cost up to three times more.

That is ≈18× faster with more parameters and an extra modality. The speed comes from LTX-Video's highly compressed latent space, which produces far fewer tokens. The paper says the gap grows with resolution and duration, and that LTX-2 is also faster than Ovi (two 5B Wan-2.2 streams), but gives no number for Ovi.

Seconds per diffusion step (H100) 0510152025 seconds (lower is better) Wan 2.2-14B 22.30 LTX-2 (19B) 1.22 (≈18×)
Table 1 as bars. Drawn to scale.
Guide

The eighteen times speed-up is plain when the bars are drawn to scale. The horizontal axis is seconds per diffusion step on an H100, and lower is better: Wan 2.2 reaches 22.3 seconds while LTX-2 barely leaves the axis at 1.22. This is the paper's main efficiency claim, and it gives the baseline setting, 121 frames, 720p, guidance off, to reuse when reporting CPU and Arc timings.

Temporal scope: maximum continuous clip length (§6.3).
ModelTypeMax length
LTX-2open, A+V20 s
Sora 2proprietary16 s
Veo 3proprietary12 s
Oviopen10 s
Wan 2.5open10 s
Guide

LTX-2 generates the longest continuous clips in its comparison, up to twenty seconds with synchronised stereo audio. The table lists each model, whether it is open or proprietary, and its maximum clip length: Sora 2 reaches sixteen seconds, Veo 3 twelve, and Ovi and Wan 2.5 ten each. Longer clips mean more latent tokens, which matters for memory and attention cost when running on Intel hardware.

Max continuous clip length 05101520 seconds LTX-220 Sora 216 Veo 312 Ovi10 Wan 2.510
Longest clips among the compared models. Past about 20 s the paper reports temporal drift and weaker sync (§7).
Guide

LTX-2 leads on clip length, at twenty seconds against sixteen for Sora 2 and ten for the open alternatives. Each bar is one model's maximum continuous length in seconds. The paper's limitations section adds that beyond about twenty seconds the output drifts in time, loses synchronisation or loses scene variety, so twenty seconds is a practical ceiling, not just a record.

Guidance weights used for all results (§4.1).
Streamst (text)sm (cross-modal)
Video33
Audio73
Guide

The guidance settings are the same for every result in the paper. Each row is a stream with its text weight and cross-modal weight: video uses three and three, audio uses seven and three. Audio leans more than twice as hard on the text prompt as video does. These values repeat equation 4.1's settings in table form, and they fix the three-pass cost per step that the thesis benchmarks should state.

Qualitative and ranking results (§6.1, §6.2). The paper gives no numeric human-preference scores.
EvaluationResult
Human preference vs Ovi (open)LTX-2 significantly better
Human preference vs Veo 3, Sora 2comparable
Artificial Analysis, Image-to-Video (6 Nov 2025)3rd
Artificial Analysis, Text-to-Video (6 Nov 2025)4th
Beats in video-only rankingSora 2 Pro, Wan 2.2-14B
Guide

The quality claims are rankings and preferences, not numbers. In human studies LTX-2 was significantly preferred over the open model Ovi and judged comparable to Veo 3 and Sora 2, and in the Artificial Analysis rankings of November 2025 it placed third for image-to-video and fourth for text-to-video, ahead of Sora 2 Pro and Wan 2.2. Because no numeric scores are given, the thesis needs its own metric, such as VBench, to measure quality loss after compression.

Limitations (§7): quality is uneven across languages; speaker attribution can go wrong with several speakers; drift beyond about 20 s; no explicit reasoning or world model.

§7Why it matters for this thesis

LTX-2(.3) on Intel CPU / Arc with OpenVINO + NNCF

  • Compress the transformer first. The 19B dual-stream DiT runs N steps × up to 3 CFG passes, plus tile refinements, so it dominates both latency and memory (≈38 GB BF16). NNCF weight-only INT8, or INT4 (e.g. nncf.compress_weights with a group size and mixed INT4/INT8 ratio), runs with standard OpenVINO ops and needs no custom kernels. Data-free methods need no calibration. AWQ, scale estimation or GPTQ need a few denoising-step activations, collected across several σ values.
  • Compress Gemma-3 12B second. It runs only once per prompt, so compressing it frees memory (24 → ≈6 GB at INT4) more than it saves time. LLM-style INT4 weight compression is mature. Validate on the feature-extractor output, which depends on all layers, not only the last one. Errors in early layers matter here.
  • Keep the small parts in FP16/BF16. VAE decoders, vocoder, connectors, the timestep/AdaLN modulation and gate linears, and the patchify and output projections have few weights but are precision-sensitive. Exclude them with an NNCF ignored_scope, and compare Fig. A2's scale/shift/gate paths before and after. The video VAE decoder is activation-bound at 1080p, so tiling matters more than bit-width for it.
  • Reduce passes before shrinking bits. Modality-CFG means 3 forward passes per step (§4.1), so caching or skipping guidance passes on some steps is a cheap extra speed-up that stacks with quantization. Table 1's 1.22 s/step used CFG = 1 on an H100. Report CPU and Arc numbers under the same stated settings (frames, resolution, steps, CFG).
  • Check the paper against the exports. This report describes LTX-2, not 2.3, and it contradicts itself on parameter counts (14B+5B in the abstract and §3.1, 13B+3B in the conclusion). Sum the weight constants in each exported IR (text_encoder, transformer, connectors, video/audio VAE, vocoder, and the upscaler if multi-scale is used) and publish that as the thesis parameter table.
Guide

Act on this in four steps. First, compress the 19 billion parameter transformer with NNCF weight-only INT8 or INT4, calibrating data-aware methods on activations from several noise levels. Second, compress Gemma for memory and check the feature-extractor output. Third, keep the decoders, vocoder, connectors and the AdaLN modulation layers in sixteen bit with an ignored scope, and reduce guidance passes with caching. Finally, count parameters in the actual exported models, since the paper describes LTX-2, not 2.3.

Quantization foundations (LLMs)

GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers

Elias Frantar, Saleh Ashkboos, Torsten Hoefler, Dan Alistarh · IST Austria, ETH Zurich, NeuralMagic · ICLR 2023 (arXiv 2210.17323)

GPTQ quantizes a trained model's weights to 3–4 bits, one layer at a time, using a small calibration set. Every time a column of weights is rounded, the rounding error is pushed onto the columns that are still in full precision, weighted by second-order (Hessian) information. Three engineering tricks — one shared column order, lazy block updates and a Cholesky form of the inverse Hessian — make this fast enough for 175B-parameter models.

Bits (weights only)
4 / 3 (2, ternary w/ groups)
Largest model
OPT-175B, BLOOM-176B
Quantization time
≈4 GPU-h for 175B
OPT-175B Wiki2 PPL
8.34 → 8.37 (4b)
Calibration
128 × 2048 C4 tokens
Speed-up (3b kernel)
3.24× A100, 4.53× A6000
Reading guide

GPTQ asks whether a huge trained language model can have its weights squeezed to three or four bits in a few GPU hours, without retraining and without losing quality. Its answer is yes: round the weights one column at a time and push each rounding error onto the columns not yet rounded, guided by second-order information from a small calibration set. The tab opens with the big picture, then the problem of plain rounding and slow exact solvers, then the method and its three speed tricks, every equation, the paper's figures, the result tables, and finally a box on what this means for the thesis. Among the sixteen papers, GPTQ is the first of three quantization foundations for large language models, followed by SmoothQuant and AWQ. The diffusion quantization papers later in the atlas, and NNCF's int4 weight compression, build directly on its error compensation idea.

§0Before reading

GPTQ builds on three ideas: what it means to store a weight in 4 or 3 bits, why a layer's inputs decide which rounding errors hurt (the Hessian), and why low-bit weights make text generation faster. GPTQ is in the atlas because its error-compensating weight quantization is the method behind NNCF's data-aware int4 compression, the tool most likely to be used on LTX-2.3.

FP16 weights: any value0123456789101112131415Δ = scale (step)16 levels = 4 bitsgroup 1: own Δgroup 2: own Δ
Primer4 bits means 16 levels plus a scale. A weight stored in 4 bits can only take one of 16 evenly spaced values; the step \(\Delta\) between them is the scale, kept in FP16 alongside. Rounding each weight to its nearest level (rust arrows) is round-to-nearest. With groups, every block of weights (e.g. 128) gets its own \(\Delta\), so a few large weights don't stretch the grid for everyone.
Guide

Storing a weight in four bits means it may only take one of sixteen evenly spaced values. The green dots are the original full precision weights, and the rust arrows snap each one to its nearest level, which is plain round to nearest. The gap between levels is the scale, delta. With grouping, every block of weights, often one hundred and twenty eight, gets its own scale, which is the group size set in NNCF.

weight w₁weight w₂FP16 weightsRTN: nearest pointerror-aware pointsame output erroroutput errorRTNerror-aware
PrimerThe Hessian says which errors are cheap. Each grey dot is an allowed pair of quantized values for two weights. Points on the same indigo ellipse give the same change in layer output; the ellipse's shape comes from \(\mathbf{H}=2\mathbf{X}\mathbf{X}^\top\), i.e. from the calibration inputs. The nearest point (rust) is not the best one: a farther point along the long axis changes the output far less. GPTQ exploits this by rounding one column, then nudging the remaining weights along such cheap directions.
Guide

Not every rounding error hurts the layer equally, and the Hessian shows which ones do. Each grey dot is an allowed pair of quantized values for two weights. Points on the same indigo ellipse change the layer output by the same amount, and the ellipse's shape comes from the calibration inputs. The nearest point, in rust, is worse than a farther point along the long axis. GPTQ uses this by rounding one column and nudging the rest.

GPU memory all weights bottleneck: bytes moved each weight read once compute cores mostly waiting bits read per weight FP16 16 4-bit 4 3-bit 3 (+ small scales)
PrimerFewer bits, less waiting. When a language model generates one token at a time (batch 1), every weight is read from memory once and used for a single multiply-add, so the time is set by memory traffic, not arithmetic. Reading 3-bit instead of 16-bit weights is why GPTQ's custom kernels speed up OPT-175B. A video diffusion transformer processes thousands of tokens per weight read, so there the main gain is memory, not speed.
Guide

When a language model writes one token at a time, each weight is fetched from memory and used for a single multiply add, so the chip mostly waits for data. The bars show how many bits must be read per weight: sixteen for full precision, four or three after GPTQ. That is where the paper's speed ups come from. A video diffusion transformer reuses each weight across thousands of tokens, so for the thesis expect memory savings first.

before this paper next LTX-2 the model to shrink (FP16 / BF16) GPTQ 3–4 bit weights error compensation activations stay FP16 SmoothQuant 8-bit activations outliers tamed NNCF int4 weights gptq=True idea returns later: SVDQuant-GPTQ, Wan2.2
PrimerWhere this paper sits. After the two LTX papers describe the model the thesis compresses, GPTQ opens the quantization part of the atlas: it shrinks only the weights, to 3 or 4 bits, and fixes rounding errors with calibration data. SmoothQuant, next, tackles the harder problem of 8-bit activations. GPTQ's idea is built into NNCF and comes back in the SVDQuant-GPTQ paper on Wan2.2.
Guide

GPTQ is the first quantization paper in the atlas. Before it, the two LTX papers describe the model the thesis compresses. GPTQ shrinks only the weights, to three or four bits, and corrects rounding errors using calibration data, while activations stay in full precision. SmoothQuant, next, tackles eight bit activations. The indigo arrow points to the thesis toolchain: NNCF's int4 weight compression has a GPTQ option, and the idea returns in the Wan two point two paper.

Terms used in this paper

Post-training quantization (PTQ)
Converting an already trained model to fewer bits without retraining it. GPTQ only needs a small calibration set and a few GPU hours.
Weight-only quantization
Only the stored weights become low-bit; activations stay FP16. The paper's "3-bit" and "4-bit" always mean weights only (W3A16, W4A16).
Round-to-nearest (RTN)
The baseline: snap every weight to its closest grid level independently. Simple and data-free, but it breaks down at 3 bits on large models.
Calibration set
A few real inputs run through the model to record layer inputs \(\mathbf{X}\). GPTQ uses 128 random text segments of 2048 tokens from C4.
Hessian
Here \(\mathbf{H}=2\mathbf{X}\mathbf{X}^\top\): a matrix built from the calibration inputs that says which combinations of weight errors change the layer output most.
OBS / OBQ
Optimal Brain Surgeon and Optimal Brain Quantizer: older second-order methods that quantize one weight at a time and correct the others. Accurate, but far too slow for billions of weights; GPTQ is their fast version.
Cholesky decomposition
A standard, numerically stable way to factor a symmetric positive matrix into a triangular one. GPTQ uses it to get all needed inverse-Hessian rows at once.
Group size (g128)
Instead of one scale per row, every block of 128 consecutive weights gets its own scale and zero point. Costs a fraction of a bit, recovers most 4-bit accuracy.
Perplexity (PPL)
How surprised a language model is by real text; lower is better. The paper's main quality metric, measured on WikiText2, PTB and C4.
WikiText2, PTB, C4
Standard text corpora: Wikipedia articles, Penn Treebank news text, and a large cleaned web crawl. Used to measure perplexity.
LAMBADA, ARC, PIQA
Zero-shot benchmarks: predict a story's last word, answer school science questions, and pick the sensible solution to an everyday physical task.
OPT, BLOOM
Two open families of GPT-style language models, up to about 175 billion parameters. GPTQ's test subjects.
NVIDIA A100, A6000
A100: a datacenter GPU (80 GB version used here). A6000: a cheaper 48 GB workstation GPU with lower memory bandwidth. Neither is Intel hardware; speed-ups must be measured on the target Intel devices.
Guide

These are the terms the paper uses without explaining. The most important are round to nearest, the simple baseline GPTQ beats; the Hessian, built from calibration inputs, which ranks weight errors; group size, the per block scales that recover most four bit accuracy; and perplexity, the language model quality score where lower is better. The hardware entries are NVIDIA GPUs, not Intel devices, so treat the paper's speed numbers as context, not as predictions.

§1Big picture

RTN: round each weight alone errors e₁…e₁₀ discarded e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 ‖WX − ŴX‖² grows 3-bit OPT-175B: PPL 7.3e3 GPTQ: quantize, then compensate quantized col j FP16, still free δ = −e_j · H⁻¹ row j H = 2XXᵀ from 128 × 2048-token calibration set
Round, then compensate. Left: round-to-nearest (RTN) throws each rounding error away. Right: GPTQ rounds column j and nudges every not-yet-quantized column so the layer output stays close to FP16.
Guide

Rounding errors should not be thrown away but paid back. On the left, round to nearest, or RTN, rounds each weight alone, so the errors pile up and 3-bit OPT one hundred seventy-five B reaches a perplexity of about seven thousand. On the right, GPTQ rounds column j and then nudges the full-precision columns to its right, using the inverse Hessian built from calibration inputs. This one picture is the whole paper; everything later makes it accurate and fast.

Only weights are quantized; activations stay FP16. The model is stored as low-bit integers plus a scale (and zero point) per row or group, and dequantized on the fly.

§2The problem

0 2 4 6 8 10 12 14 8.34 FP16 10.54 RTN 4b 8.37 GPTQ 4b 7.3e3 RTN 3b 8.68 GPTQ 3b WikiText2 PPL ↓ OPT-175B (Table 3)
RTN collapses at 3 bits. Plain rounding costs 2.2 PPL at 4 bits on OPT-175B and destroys the model at 3 bits (7.3e3, bar clipped). GPTQ stays within 0.03 / 0.34.
Guide

Plain rounding is acceptable at four bits and catastrophic at three. Bars show WikiText2 perplexity for OPT one hundred seventy-five B, where lower is better. RTN at four bits costs about 2.2 points, and at three bits the model is destroyed, with the bar clipped at a perplexity of about seven thousand three hundred. GPTQ stays within 0.03 at four bits and 0.34 at three bits. This gap is the problem the method section solves.

1e10 1e11 1e12 1e13 1e14 1e15 1e16 1e17 2.3e+16 OBQ d_row·d_col³ 1.9e+12 GPTQ max(d_row·d_col², d_col³) One 12288×12288 layer (OPT-175B width) ≈12 288× fewer
Accurate solvers don't scale. OBQ (the accurate second-order predecessor) costs \(O(d_{\text{row}} d_{\text{col}}^3)\) per layer; illustrative op counts for one square 12288-wide layer, log scale.
Guide

The accurate older method, OBQ, is far too slow for billion-parameter layers. The log-scale bars count operations for one square layer twelve thousand two hundred eighty-eight wide, the width of OPT one hundred seventy-five B. OBQ scales with rows times columns cubed; GPTQ needs about twelve thousand times fewer operations. The counts are illustrative, derived from the cost formulas, not measured. This motivates the shared column order introduced a few blocks later.

H⁻¹ (SPD)start of layer Eq. (5) × d_col/B+ explicit block inverses H⁻¹ indefiniteround-off accumulates wild updates δlayer ruined "almost certainly" hits a few layers once models exceed a few billion parameters
Numerics break at scale. Repeated inverse-Hessian updates drift until \(\mathbf{H}^{-1}\) is indefinite, and compensation then pushes weights the wrong way.
Guide

Speed is not the only obstacle: the numbers themselves go bad at scale. Starting from a healthy, positive definite inverse Hessian, repeatedly applying the removal update of equation five lets round-off error build up until the matrix becomes indefinite. From then on the compensation pushes weights the wrong way and the layer is ruined. The paper says this almost certainly happens in a few layers of models beyond a few billion parameters, which motivates the Cholesky trick.

  • Prior LLM quantizers (ZeroQuant, LLM.int8(), nuQmm) all just round to nearest: fine at 8 bits, not at 3–4.
  • Accurate post-training methods (AdaRound, BRECQ, OBQ) take ≈1 h for a 25M-parameter ResNet-50 — hopeless for 175B.
  • Activation outliers are not the issue here: GPTQ is weight-only.

§3Method

Background: OBS → OBQ

OBQ (Optimal Brain Quantization) adapts the classic OBS (Optimal Brain Surgeon) pruning rule to quantization: each row is solved separately; quantize one weight at a time (greedy), then update the rest with Eq. (2) and shrink \(\mathbf{H}^{-1}\) with Eq. (3).

Step 1 — arbitrary (shared) order

OBQ: greedy order per row each row owns its F and H_F⁻¹ 3 1 6 2 5 4 2 5 1 4 6 3 6 2 4 1 3 5 1 4 3 6 2 5 4 6 2 5 1 3 GPTQ: same order, all rows one shared F and H_F⁻¹ 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 H⁻¹ update per weight: d_row·d_col times O(d_row · d_col³) H⁻¹ update per column: d_col times O(max(d_row·d_col², d_col³)) arbitrary order ≈ as good done now later
Same order for every row. Greedy ordering barely beats a fixed left-to-right order on big layers. With a shared order, all rows share one \(F\) and one \(\mathbf{H}_F^{-1}\) (it depends only on \(\mathbf{X}\)), so the inverse is updated once per column, not once per weight.
Guide

The first trick is to quantize columns in the same fixed order for every row. OBQ picks a greedy order per row, so each row keeps its own inverse Hessian to update, once per weight. Because the Hessian depends only on the inputs X, a shared order means all rows share one inverse, updated once per column. The paper finds arbitrary order is about as good as greedy on large layers, and the cost drops to the formula in the equations section.

t = 1 −e₁ · H⁻¹ row t = 2 −e₂ · H⁻¹ row t = 3 −e₃ · H⁻¹ row t = d_col all quantized: Q …
Column-by-column error pushing. At step t, column t is rounded (indigo); its scaled error times row t of the inverse Hessian is subtracted from all columns to its right (teal), which absorb it. Rust columns are frozen.
Guide

Here is the core loop in motion. Each panel is one step t: column t, in indigo, is rounded, its error is scaled and multiplied by row t of the inverse Hessian, and that correction is subtracted from the teal columns to its right, which absorb it. Rust columns are already frozen. After the last column the whole matrix is quantized, giving Q. This is the picture behind Algorithm 1.

Step 2 — lazy batch updates

Naive: update everything after each column rank-1 touch of whole W, every column memory-bound Lazy batch: block of B = 128 columns in-block (B) one rank-B GEMM after block compute-bound, ~10× faster
Defer the big update. Rounding column i only depends on updates to column i. So updates stay inside a block of B = 128 columns; once the block is done, the rest of W is updated with one matrix multiply (Eqs. 4–5). Same FLOPs, ~10× faster on GPUs because it is no longer memory-bound.
Guide

The second trick keeps the same arithmetic but reorders it for the GPU. Updating the whole weight matrix after every column is memory-bound, because each update touches everything but does little math. Since rounding column i only needs the updates to column i, GPTQ keeps updates inside a block of one hundred twenty-eight columns, then applies one large matrix multiply to the rest. Same operation count, about ten times faster in practice.

Step 3 — Cholesky reformulation

H⁻¹ = (2XXᵀ + λI)⁻¹ symmetric, dense Cholesky, once U = Cholesky(H⁻¹)ᵀ upper-triangular row j from diagonal = row j of H_Fj⁻¹ / √[H_Fj⁻¹]jj e = (w − q) / U_jj W[:, j:] −= e · U[j, j:] no Eq. (3)/(5) chain → stable
Precompute all needed rows stably. Quantizing column q only needs row q of \(\mathbf{H}^{-1}_{F_q}\) from the diagonal on. Those rows are exactly the rows of the upper Cholesky factor (up to a \(\sqrt{\cdot}\) scale), so one well-optimized Cholesky call plus 1% dampening replaces the error-prone chain of Eq. (5).
Guide

The third trick fixes the numerical drift from figure four. Quantizing column q only needs one row of the shrinking inverse Hessian, from the diagonal onward, and those rows are exactly the rows of the upper Cholesky factor, up to a square-root scale. So one stable Cholesky call, plus one percent dampening, gives every row in advance and replaces the error-prone chain of equation five. The error is then divided by the diagonal entry of U.

Whole-model pipeline

Calibration128 × 2048 C4 tok Block ℓ on GPU (FP16) 6 linear layers accumulate H = 2XXᵀ per layer GPTQAlg. 1 per layer Block ℓ quantized re-run calib inputs through it Inputs X for ℓ+1(partially quantized) next block
One Transformer block at a time. Only one block (6 linear layers) sits on the GPU; Hessians are built from inputs that already passed through the quantized earlier blocks, which gives a noticeable accuracy gain at negligible cost.
Guide

GPTQ never holds the whole model on the GPU. It loads one Transformer block of six linear layers, runs the calibration set through it to build a Hessian per layer, quantizes each layer, then re-runs the inputs through the now quantized block to feed the next one. Using inputs that already carry earlier quantization error gives a noticeable accuracy gain at almost no cost. For a diffusion transformer, the same loop would run over its blocks.

  1. Run 128 random 2048-token C4 segments to the current block; for each linear layer build \(\mathbf{H}=2\mathbf{X}\mathbf{X}^\top\).
  2. Damp (\(+\lambda\mathbf{I}\), \(\lambda\) = 1% of mean diagonal), invert, take the upper Cholesky factor.
  3. Sweep columns in blocks of B = 128: round column j to the per-row asymmetric min-max grid (or per-group grid, with group params fitted on the current updated weights), push the scaled error into the rest of the block.
  4. After each block, apply one GEMM update to all remaining columns.
  5. Re-run the block with quantized weights to get inputs for the next block.
Guide

The recipe walks through the network one block at a time. Each linear layer gets its Hessian, which is damped, inverted and turned into a Cholesky factor once. Then the columns are swept in blocks of one hundred twenty-eight: round, push the error inside the block, and after the block update everything else in one go. Grid parameters are fitted on the already updated weights. Finally, the quantized block produces inputs for the next.

Algorithm 1 Quantize W given inverse Hessian H⁻¹ = (2XXᵀ + λI)⁻¹ and blocksize B. Q ← 0_{d_row × d_col} // quantized output E ← 0_{d_row × B} // block quantization errors H⁻¹ ← Cholesky(H⁻¹)ᵀ // Hessian inverse information for i = 0, B, 2B, … do for j = i, …, i + B − 1 do Q[:, j] ← quant(W[:, j]) // quantize column E[:, j−i] ← (W[:, j] − Q[:, j]) / [H⁻¹]_jj // quantization error W[:, j:(i+B)] ← W[:, j:(i+B)] − E[:, j−i] · H⁻¹[j, j:(i+B)] // update weights in block end for W[:, (i+B):] ← W[:, (i+B):] − E · H⁻¹[i:(i+B), (i+B):] // update all remaining weights end for
Guide

Algorithm 1 is the entire quantizer for one layer, and it combines all three tricks. It takes the damped inverse Hessian, replaces it by its Cholesky factor once, and then loops over blocks of B columns. Inside a block it rounds each column, divides the error by the diagonal entry, and subtracts that error times the matching Cholesky row from the remaining columns of the block. The saved block errors then update all later columns with one matrix multiply.

§4Every equation

(1)\[ \operatorname{argmin}_{\widehat{\mathbf{W}}}\ \lVert \mathbf{W}\mathbf{X}-\widehat{\mathbf{W}}\mathbf{X}\rVert_2^2 \]

Layer-wise reconstruction: find quantized weights \(\widehat{\mathbf{W}}\) (on a fixed grid) whose outputs on calibration inputs \(\mathbf{X}\) (m samples) match the FP layer \(\mathbf{W}\).

Guide

Equation one is the goal for each layer. Find quantized weights W hat, restricted to the grid, that minimise the squared difference between W times X and W hat times X, where W is the full-precision weight matrix and X holds the layer inputs from the calibration samples. It matches layer outputs, not weights, so errors on unimportant directions are cheap. Every later equation is a way to solve this problem approximately and quickly.

§3\[ \mathbf{H}_F = 2\,\mathbf{X}_F\mathbf{X}_F^{\top} \]

Hessian of the per-row quadratic objective restricted to the set \(F\) of still full-precision weights. Depends only on inputs, not on weights.

Guide

H sub F equals two times X sub F times X sub F transposed. This is the Hessian, the curvature, of the layer objective for one row, restricted to F, the set of weights still in full precision. It tells how costly an error in each direction is. The key point is that it depends only on the inputs, not on the weights, which is why all rows can share it once the column order is fixed.

(2)\[ w_q=\operatorname{argmin}_{w_q}\frac{(\operatorname{quant}(w_q)-w_q)^2}{[\mathbf{H}_F^{-1}]_{qq}},\qquad \boldsymbol{\delta}_F=-\frac{w_q-\operatorname{quant}(w_q)}{[\mathbf{H}_F^{-1}]_{qq}}\cdot(\mathbf{H}_F^{-1})_{:,q} \]

OBQ: greedily pick the weight whose rounding costs least, then shift all remaining weights by \(\boldsymbol{\delta}_F\) to cancel its error. \(\operatorname{quant}\) = round to nearest grid point.

Guide

Equation two is the OBQ rule that GPTQ inherits. The first part picks the weight whose rounding error squared, divided by its diagonal entry of the inverse Hessian, is smallest. The second part, delta F, shifts all remaining weights by minus that scaled error times the matching column of the inverse Hessian, cancelling its effect on the output. Quant means rounding to the nearest grid point. GPTQ keeps the update but drops the greedy choice.

(3)\[ \mathbf{H}^{-1}_{-q}=\Big(\mathbf{H}^{-1}-\frac{1}{[\mathbf{H}^{-1}]_{qq}}\,\mathbf{H}^{-1}_{:,q}\mathbf{H}^{-1}_{q,:}\Big)_{-p} \]

Remove row/column \(q\) directly in the inverse via one Gaussian-elimination step (subscript printed as \(-p\) in the paper; it means \(-q\)).

Guide

Equation three removes a quantized weight from the problem without inverting a new matrix. It subtracts from the inverse Hessian an outer product of its q-th column and q-th row, divided by the q-th diagonal entry, which is one step of Gaussian elimination, and then drops row and column q. The paper prints the subscript as minus p but means minus q. Repeated use of this update is what drifts numerically at scale.

§3\[ O(d_{\text{row}}\cdot d_{\text{col}}^{3})\ \longrightarrow\ O\big(\max\{d_{\text{row}}\cdot d_{\text{col}}^{2},\ d_{\text{col}}^{3}\}\big) \]

OBQ cost vs. GPTQ cost with a shared column order: a \(\min\{d_{\text{row}},d_{\text{col}}\}\) speed-up.

Guide

This line is the cost argument in one step. OBQ costs on the order of rows times columns cubed per layer. With a shared column order GPTQ costs the larger of rows times columns squared and columns cubed. That is a speed-up by a factor of the smaller dimension, thousands of times for large models, and it is what makes one hundred seventy-five billion parameters feasible in hours.

(4)\[ \boldsymbol{\delta}_F=-(\mathbf{w}_Q-\operatorname{quant}(\mathbf{w}_Q))\,([\mathbf{H}_F^{-1}]_{QQ})^{-1}\,(\mathbf{H}_F^{-1})_{:,Q} \]

Multi-weight (block) version of (2): compensation for quantizing a whole index set \(Q\) (e.g. B = 128 columns) at once.

Guide

Equation four is the block version of the update in equation two. Instead of one weight, a whole index set Q, such as one hundred twenty-eight columns, is quantized together. The correction delta F is minus the block error times the inverse of the Q by Q sub-block of the inverse Hessian, times the matching columns. This is the lazy batch update that applies once per block in Algorithm 1.

(5)\[ \mathbf{H}^{-1}_{-Q}=\Big(\mathbf{H}^{-1}-\mathbf{H}^{-1}_{:,Q}\,([\mathbf{H}^{-1}]_{QQ})^{-1}\,\mathbf{H}^{-1}_{Q,:}\Big)_{-Q} \]

Multi-row removal from the inverse; repeated use accumulates round-off and motivates the Cholesky reformulation.

Guide

Equation five removes many rows and columns from the inverse Hessian at once, the block version of equation three. It subtracts the Q columns times the inverse of the Q by Q sub-block times the Q rows. Applied over and over through a large layer, it accumulates round-off error and can make the matrix indefinite, as figure four shows. That failure is why GPTQ switches to the Cholesky form.

§4\[ \mathbf{H}\leftarrow\mathbf{H}+\lambda\mathbf{I},\qquad \lambda=0.01\cdot\operatorname{mean}\big(\operatorname{diag}(\mathbf{H})\big) \]

Dampening: add 1% of the average diagonal to keep \(\mathbf{H}\) well-conditioned.

Guide

Dampening adds lambda times the identity to the Hessian, with lambda equal to one percent of the average diagonal value. This small boost keeps the matrix well-conditioned, so inverting it and taking a Cholesky factor stay stable even when some input directions are almost never used. It is a cheap safety step and a setting worth keeping in mind in NNCF's GPTQ options.

§4\[ \big[\operatorname{Cholesky}(\mathbf{H}^{-1})^{\top}\big]_{q,\,q:}=\frac{[\mathbf{H}^{-1}_{F_q}]_{q,\,q:}}{\big([\mathbf{H}^{-1}_{F_q}]_{qq}\big)^{1/2}} \]

Row \(q\) of the upper Cholesky factor equals the needed row of \(\mathbf{H}^{-1}_{F_q}\) (from the diagonal on), just scaled; so all rows can be precomputed stably.

Guide

This identity is the heart of the Cholesky trick. Row q of the upper Cholesky factor of the inverse Hessian, from the diagonal onward, equals the row GPTQ needs from the shrinking inverse, divided by the square root of its diagonal entry. So instead of updating the inverse column after column, one Cholesky factorisation computed at the start gives every needed row, stably. Algorithm 1 uses exactly these rows.

Alg. 1\[ \mathbf{H}^{-1}=(2\mathbf{X}\mathbf{X}^{\top}+\lambda\mathbf{I})^{-1} \]

Input to Algorithm 1: the damped inverse Hessian of the layer, computed once per layer.

Guide

The input to Algorithm 1 is H inverse, the inverse of two X X transposed plus lambda times the identity. X is the layer's calibration inputs and lambda the one percent dampening. It is computed once per layer, then replaced by its Cholesky factor. Its size depends only on the number of input columns, which keeps the cost modest even on a CPU.

§5\[ \bar b\approx b+\frac{16+b}{g} \]

Average bits/weight with grouping (FP16 scale + b-bit zero point per group of g): 3-bit g1024 ≈ +0.02, g128 ≈ +0.15; 2-bit g128 ≈ 2.2, g32 ≈ 2.6 (derived from the text).

Guide

Grouping costs a few extra bits. The average bits per weight, b bar, is about b plus sixteen plus b, divided by g, because each group of g weights stores a sixteen-bit scale and a b-bit zero point. Three-bit with groups of one thousand twenty-four adds about 0.02 bits, groups of one hundred twenty-eight add about 0.15, and two-bit ranges from about 2.2 to 2.6 bits. These figures are derived from the text.

A.2.1\[ \operatorname{PPL}=\exp\Big(-\frac{1}{N}\sum_{t=1}^{N}\log p(x_t\mid x_{\lt t})\Big) \]

Perplexity as used in all language-generation tables: non-overlapping 2048-token segments, exponentiated mean next-token negative log-likelihood (described in words in the paper).

Guide

Perplexity is the language quality score in all the tables, and lower is better. It is the exponential of minus the average log probability the model gives each true next token, over N tokens, using non-overlapping segments of two thousand forty-eight tokens. A perplexity of eight means the model is roughly as unsure as choosing among eight words. The paper describes it in words; the formula is the standard one.

§5Every figure

5 10 15 20 25 30 35 40 45 50 0.1 1 10 100 OPT family — 4 bit #params (billions, log) Perplexity on WikiText2 110↑ 10 20 30 40 50 60 1 10 100 BLOOM family — 3 bit #params (billions, log) Perplexity on WikiText2 571↑ 4bit RTN 4bit GPTQ FP16 3bit RTN 3bit GPTQ FP16
Fig. 1GPTQ tracks FP16; RTN falls apart. WikiText2 perplexity vs. model size: OPT at 4 bit (left) and BLOOM at 3 bit (right). RTN spikes (OPT-66B 110, BLOOM-176B 571; clipped with ↑). Data from Tables 3–4.
Guide

GPTQ tracks full precision across model sizes, while plain rounding falls apart. Each panel plots WikiText2 perplexity against parameter count on a log scale: OPT at four bits on the left and BLOOM at three bits on the right. The RTN curve spikes, to one hundred ten for OPT sixty-six B and five hundred seventy-one for BLOOM one hundred seventy-six B, while GPTQ hugs the FP16 line. It summarises tables three and four.

Inverse layer Hessian (Cholesky form) computed initially B rows Weight matrix / block col j block i quantized recursively column-by-column quantized weights unquantized, updated
Fig. 2GPTQ quantization procedure. A block of consecutive columns (bold outline) is quantized using the inverse Hessian stored in Cholesky form; the remaining (blue) weights are updated at the end of the step. Inside the block, columns are quantized one by one; the white column is the current one.
Guide

The paper's own sketch of the procedure matches Algorithm 1. On the right is the inverse Hessian in Cholesky form, computed once. On the left, a bold block of consecutive columns is quantized one column at a time, with the white column being the current one. The blue weights to the right are updated only once the block is finished. Compare it with the lazy-batch and Cholesky figures above.

FP16 4bit GPTQ 4bit RTN 3bit GPTQ 3bit RTN 0.0 0.2 0.4 0.6 0.8 0.1 1 10 100 OPT family #params (billions, log) Accuracy on LAMBADA 0.0 0.2 0.4 0.6 0.8 1 10 100 BLOOM family #params (billions, log)
Fig. 3Zero-shot LAMBADA accuracy. At 4 bit even RTN is mostly fine (except OPT-66B); at 3 bit RTN drops to ≈0 while GPTQ keeps most of the accuracy, and larger models degrade less. Data from Tables 13–14.
Guide

Zero-shot task accuracy tells the same story as perplexity. The plots show LAMBADA accuracy against model size for OPT and BLOOM, where higher is better. At four bits even RTN mostly holds, except OPT sixty-six B. At three bits RTN drops to about zero, while GPTQ keeps most of the accuracy, and bigger models lose less. The data come from tables thirteen and fourteen.

9 10 11 12 13 14 15 16 1 10 OPT 1.3B → 30B, 4 bit #params (billions, log) Perplexity on WikiText2 4bit 4bit/g1024 4bit/g128 FP16
Fig. 4Grouping closes most of the 4-bit gap. OPT 1.3B–30B, 4-bit GPTQ with row-wise, g1024 and g128 grids vs FP16. Row-wise and FP16 points from Table 3; grouped curves shape redrawn from the plot.
Guide

Grouping closes most of the remaining four-bit gap. Curves show WikiText2 perplexity for OPT models from 1.3 to 30 billion parameters: plain row-wise four-bit GPTQ, groups of one thousand twenty-four, groups of one hundred twenty-eight, and FP16. The g128 curve sits closest to FP16. The grouped curves are redrawn from the plot, so read their shape, not exact values. This is the basis for int4 with group size one hundred twenty-eight in NNCF.

§6Results

8.0 8.4 8.8 9.2 9.6 2.0 2.5 3.0 3.5 4.0 2b/g128 2b/g64 2b/g32 3b 3b/g128 4b ≈ average bits per weight (incl. group scale/zero) WikiText2 PPL ↓ OPT-175BBLOOM-176B FP16 (dashed)
Bits vs. quality on 175B models. From Tables 5 and 7: 2-bit with small groups gets within ≈0.6 PPL; 3-bit/g128 within 0.1–0.15 of FP16 (dashed). Bit counts computed from group overhead.
Guide

On the largest models bits can be traded for quality smoothly. The horizontal axis is average bits per weight including group overhead, the vertical axis WikiText2 perplexity, with FP16 dashed. Two-bit with groups of thirty-two gets within about 0.6 points, and three-bit with groups of one hundred twenty-eight comes within 0.1 to 0.15. The data come from tables five and seven, with bit counts computed from the grouping formula.

0 100 200 300 400 500 600 589 ms 8 GPUs 130 ms 2 GPUs A6000 48GB 4.53× 230 ms 5 GPUs 71 ms 1 GPU A100 80GB 3.24× ms / token ↓ FP163-bit GPTQ
Weight-only low-bit = faster decoding. OPT-175B token latency (Table 6). Speed comes from moving fewer bytes in memory-bound matrix-vector products, and from needing fewer GPUs.
Guide

Low-bit weights make token generation faster because decoding at batch one is memory-bound. For OPT one hundred seventy-five B, latency drops from 589 to 130 milliseconds per token on A6000 cards, 4.53 times faster, and from 230 to 71 milliseconds on A100s, 3.24 times faster, while needing far fewer GPUs. The gain comes from moving fewer bytes, which matters for the thesis because video diffusion is mostly compute-bound.

Main tables

Table 1 — ImageNet top-1 (%) of post-training methods on ResNets (FP: RN18 69.76, RN50 76.13).
MethodRN18 4bitRN18 3bitRN50 4bitRN50 3bit
AdaRound69.3468.3775.8475.14
AdaQuant68.1259.2174.6864.98
BRECQ69.3768.4775.8875.32
OBQ69.5668.6975.7275.24
GPTQ69.3767.8875.7174.87
Guide

GPTQ is a fast approximation, not the most accurate solver on small models. On ResNet eighteen and fifty for ImageNet, it performs on par with AdaRound, BRECQ and OBQ at four bits, and slightly worse at three bits, for example 74.87 versus 75.32 for BRECQ on ResNet fifty. The table exists to show that the speed tricks cost little accuracy before the paper scales up to language models.

Table 2 — GPTQ runtime for full quantization (single A100 80GB).
OPT13B30B66B175B
Runtime20.9m44.9m1.6h4.2h
BLOOM1.7B3B7.1B176B
Runtime2.9m5.2m10.0m3.8h
Guide

Quantization time stays practical even at the largest scale. On one A100 GPU, full GPTQ takes about twenty-one minutes for OPT thirteen B, 1.6 hours for sixty-six B and 4.2 hours for one hundred seventy-five B, and 3.8 hours for BLOOM one hundred seventy-six B. Earlier accurate methods would need weeks, which is the gap the shared order and lazy batching close.

Table 3 — OPT perplexity on WikiText2 ↓ (bold teal = better of RTN/GPTQ at same bits).
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1627.6522.0014.6312.4710.8610.139.569.348.34
RTN437.2825.9448.1716.9212.1011.3210.9811010.54
GPTQ431.1224.2415.4712.8711.3910.319.639.558.37
RTN31.3e364.571.3e41.6e45.8e33.4e31.6e36.1e37.3e3
GPTQ353.8533.7920.9716.8814.8611.6110.2714.168.68
Guide

This is the paper's main table. Rows are full precision, RTN and GPTQ at four and three bits; columns are OPT sizes from one hundred twenty-five million to one hundred seventy-five billion; cells are WikiText2 perplexity, lower being better. GPTQ wins almost everywhere, and at three bits RTN explodes into the thousands while GPTQ stays near FP16 for large models, for example 8.68 versus 8.34 at one hundred seventy-five B.

Table 4 — BLOOM perplexity on WikiText2 ↓.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1622.4217.6915.3913.4811.378.11
RTN425.9022.0016.9714.7612.108.37
GPTQ424.0319.0516.4814.2011.738.21
RTN357.0850.1963.5939.3617.38571
GPTQ332.3125.0821.1117.4013.478.64
Guide

The BLOOM family confirms the OPT result on a different architecture. Cells are WikiText2 perplexity, lower being better. At four bits GPTQ improves on RTN at every size, and at three bits RTN reaches five hundred seventy-one for the one hundred seventy-six B model while GPTQ gets 8.64, against 8.11 for FP16. As with OPT, larger models tolerate quantization better.

Table 5 — OPT-175B and BLOOM-176B summary (PPL ↓, LAMBADA acc ↑). g1024 / g128 = group sizes.
MethodBitsOPT Wiki2PTBC4LAMB.↑BLOOM Wiki2PTBC4LAMB.↑
Baseline168.3412.0110.1375.598.1114.5911.7167.40
RTN410.5414.2211.6171.348.3715.0012.0466.70
GPTQ48.3712.2610.2876.808.2114.7511.8167.71
RTN37.3e38.0e34.6e30571.107.598.0.17
GPTQ38.6812.6810.6776.198.6415.5712.2765.10
GPTQ3/g10248.4512.4810.4777.398.3515.0111.9867.47
GPTQ3/g1288.4512.3710.3676.428.2614.8911.8567.86
Guide

This summary covers only the two giant models, across three perplexity datasets and LAMBADA accuracy. Four-bit GPTQ is nearly lossless, three-bit GPTQ loses a little, and three-bit RTN is broken. The last two rows add grouping: three-bit with groups of one thousand twenty-four or one hundred twenty-eight reaches 8.45 perplexity on OPT, close to the four-bit result. Grouping is the cheap lever the thesis box recommends.

Table 6 — Average per-token latency, OPT-175B, batch 1, generating 128 tokens.
GPUFP163bitSpeedupGPU reduction
A6000 – 48GB589ms130ms4.53×8→2
A100 – 80GB230ms71ms3.24×5→1
Guide

Latency is measured per generated token for OPT one hundred seventy-five B at batch size one. Three-bit GPTQ with a custom kernel runs 4.53 times faster on A6000 cards, dropping from eight GPUs to two, and 3.24 times faster on A100s, dropping from five to one. The speed-up relies on memory-bound matrix-vector products, so it will not transfer directly to a compute-bound video transformer.

Table 7 — 2-bit GPTQ with varying group size; WikiText2 PPL ↓ (3-bit row-wise for reference).
ModelFP16g128g64g323-bit
OPT-175B8.349.589.188.948.68
BLOOM8.119.559.178.838.64
Guide

Two-bit quantization becomes usable with small groups. Cells are WikiText2 perplexity for the two giant models. Smaller groups help steadily: OPT goes from 9.58 with groups of one hundred twenty-eight to 8.94 with groups of thirty-two, just above the 8.68 of plain three-bit and against 8.34 for FP16. This extreme regime shows how far error compensation plus grouping can go.

Table 8 — GPTQ vs full greedy OBQ (BERT-base/SQuAD F1 ↑, FP 88.53; OPT-125M/WikiText2 PPL ↓, FP 27.66).
MethodBERT 4bitBERT 3bitOPT-125M 4bitOPT-125M 3bit
OBQ88.2385.2932.5269.32
GPTQ88.1886.0231.1253.85
Guide

Dropping OBQ's greedy order costs almost nothing. GPTQ is compared with full OBQ on BERT base, scored by SQuAD F1 where higher is better, and on OPT one hundred twenty-five M, scored by perplexity. The two are close, and at three bits GPTQ is even better, with a perplexity of 53.85 against 69.32. This backs the claim in the shared-order figure that arbitrary order is about as good.

Appendix tables (PTB / C4 perplexity, zero-shot accuracy)

Table 9 — OPT perplexity on PTB ↓.
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1638.9931.0820.2917.9715.7714.5214.0413.3612.01
RTN453.8936.7957.3031.0518.8416.5115.40225.6614.22
GPTQ445.1734.5221.8519.1416.5614.9414.2613.8112.26
RTN31.4e388.041.3e41.4e45.7e32.8e31.2e35.0e38.0e3
GPTQ373.1947.0832.1024.8121.8816.6815.3628.1212.86
Guide

On PTB perplexity for OPT, the pattern repeats. GPTQ at four bits stays close to FP16, RTN has an outlier at sixty-six B with 225.66, and at three bits RTN is in the thousands while GPTQ stays usable, reaching 12.86 against 12.01 at one hundred seventy-five B. This appendix table shows the main result does not depend on the WikiText2 dataset.

Table 10 — BLOOM perplexity on PTB ↓.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1643.6957.9630.0025.3420.8314.59
RTN451.1066.8533.5827.6822.4215.00
GPTQ446.9762.4731.8426.4921.6714.75
RTN3126.185.106.66.7835.04107.
GPTQ370.3587.0446.1134.0226.1415.57
Guide

BLOOM on PTB perplexity gives the same ranking. GPTQ beats RTN at every size and bit width, and the margin is largest at three bits, where the one hundred seventy-six B model scores 15.57 with GPTQ against 107 with RTN and 14.59 in FP16. Like the other appendix tables, it confirms robustness across datasets.

Table 11 — OPT perplexity on C4 ↓ (calibration is from C4 train: not fully zero-shot).
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1626.5622.5916.0714.3412.7112.0611.4410.9910.13
RTN433.9126.2124.5118.4314.3613.3613.46309.11.61
GPTQ429.2224.6316.9715.0013.1812.2611.5711.2310.28
RTN383455.495.2e31.1e45.3e33.1e31.4e33.5e34.6e3
GPTQ342.4131.3321.6318.1717.1413.3412.2314.5910.67
Guide

OPT on C4 perplexity shows the same pattern, with one caveat. The calibration samples come from C4's training split, so this test is not fully zero-shot. GPTQ still wins clearly: at three bits the one hundred seventy-five B model scores 10.67, against 10.13 for FP16 and about four thousand six hundred for RTN.

Table 12 — BLOOM perplexity on C4 ↓ (not fully zero-shot).
BLOOMBits560M1.1B1.7B3B7.1B176B
full1626.6022.0519.4917.4915.2011.71
RTN429.8924.4421.2618.7616.0612.04
GPTQ428.0023.2520.5518.1015.6011.81
RTN367.4960.71113.80.4922.59598.
GPTQ335.7828.8325.3421.2517.6712.27
Guide

BLOOM on C4 perplexity, again not fully zero-shot because calibration used C4 training text. GPTQ tracks FP16 closely at four bits and stays reasonable at three bits, with 12.27 against 11.71 for the largest model, while RTN at three bits jumps to five hundred ninety-eight. It rounds out the appendix evidence.

Table 13 — OPT accuracy on LAMBADA ↑.
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1639.1646.6758.8064.8268.7270.2372.3974.9375.59
RTN418.3440.6236.3159.2764.6667.3870.4813.0871.34
GPTQ434.7448.3856.4562.9766.3769.1272.4074.5076.80
RTN30.1027.360.000.000.000.061.462.000.00
GPTQ313.9332.3137.2652.2654.9864.1869.6957.0276.19
Guide

LAMBADA accuracy for OPT, where higher is better, is the data behind figure three. Three-bit RTN falls to about zero for most sizes, while three-bit GPTQ keeps 76.19 percent on the one hundred seventy-five B model, slightly above FP16's 75.59. OPT sixty-six B is a weak spot for both methods, echoing its outlier in the perplexity tables.

Table 14 — BLOOM accuracy on LAMBADA ↑.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1634.0642.8546.7152.1257.7967.40
RTN426.0039.0641.9245.8450.4866.70
GPTQ431.7539.8046.2851.4154.6567.71
RTN39.1015.9515.0224.5529.900.17
GPTQ321.3128.7033.6543.1247.4165.10
Guide

LAMBADA accuracy for BLOOM, higher being better, is the second half of figure three. Four-bit GPTQ is close to FP16 throughout, and at three bits the one hundred seventy-six B model keeps 65.10 percent with GPTQ against 0.17 with RTN. Smaller models lose more, again showing that scale makes quantization easier.

Table 15 — OPT accuracy on PIQA ↑.
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1662.0264.7472.3674.8176.3976.8878.1879.7681.07
RTN461.4363.4467.6373.7276.4476.0177.2660.0778.23
GPTQ461.2663.7170.7373.9976.2876.6179.0079.3381.00
RTN356.0960.6152.7751.9050.4952.9956.3750.8751.25
GPTQ359.2561.3268.3471.3873.2975.2477.5871.2780.03
Guide

PIQA accuracy for OPT, a physical common-sense task where higher is better. Four-bit GPTQ matches FP16 almost exactly, for example 81.00 against 81.07 at one hundred seventy-five B. Three-bit RTN sits near fifty percent, which is chance for this two-choice task, while three-bit GPTQ reaches 80.03 on the largest model.

Table 16 — BLOOM accuracy on PIQA ↑.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1665.0767.1469.9770.5173.7279.16
RTN463.1165.2967.7469.8672.6979.00
GPTQ464.3166.0568.7769.4272.9679.00
RTN358.6060.8060.8866.2869.7053.32
GPTQ361.6262.6265.1868.3470.9577.70
Guide

PIQA accuracy for BLOOM, higher being better. At four bits RTN and GPTQ are both close to FP16, so easy tasks hide differences. At three bits the gap opens on the largest model: 77.70 with GPTQ against 53.32 with RTN and 79.16 in FP16.

Table 17 — OPT accuracy on ARC-easy ↑.
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1639.6940.3650.9354.3460.1461.8365.4067.2671.04
RTN436.3238.5549.2052.9057.6861.3161.1140.6663.93
GPTQ439.0237.9259.9753.1159.7261.3265.1165.3568.69
RTN330.4336.0727.9726.0525.0430.6034.2225.8426.77
GPTQ336.1536.9146.1748.1953.4156.8259.7252.4465.36
Guide

ARC-easy accuracy for OPT, grade-school science questions where higher is better. Four-bit GPTQ is close to FP16, and at three bits it keeps 65.36 on the one hundred seventy-five B model while RTN drops to about the level of random guessing. Small models are noisier, including one GPTQ entry above FP16 at 1.3 B, so read trends rather than single cells.

Table 18 — BLOOM accuracy on ARC-easy ↑.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1641.7145.4148.1153.2457.3767.47
RTN439.4042.5144.7051.3556.1466.33
GPTQ440.2444.4944.4952.8256.1467.42
RTN345.4446.8737.5845.0848.6128.87
GPTQ339.1441.7942.8546.6351.5662.84
Guide

ARC-easy accuracy for BLOOM, higher being better. For small BLOOM models RTN at three bits sometimes scores higher than GPTQ, a reminder that zero-shot accuracy on small models is noisy. On the one hundred seventy-six B model the usual order returns: 62.84 for GPTQ against 28.87 for RTN.

Table 19 — OPT accuracy on ARC-challenge ↑.
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1622.8724.0629.4431.3134.5635.7538.1440.0243.94
RTN422.4423.8124.9129.1832.5935.2435.4122.8737.71
GPTQ422.9524.8328.2430.1233.7034.9037.8039.1642.75
RTN321.7622.1823.5525.4325.8523.8119.9725.7723.81
GPTQ322.5325.0927.6527.8231.9133.0235.8431.6641.04
Guide

ARC-challenge accuracy for OPT, the harder science set where higher is better. Scores for small models are near chance for every method. For large models GPTQ holds up, with 41.04 at three bits on one hundred seventy-five B against 43.94 in FP16, while RTN falls to about 24.

Table 20 — BLOOM accuracy on ARC-challenge ↑.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1624.1525.6826.7930.5533.4544.97
RTN423.8923.3426.4529.5232.1743.17
GPTQ423.4625.5125.9428.9232.2544.20
RTN321.6722.8623.2927.1331.3124.74
GPTQ323.2124.0624.9128.5830.9740.70
Guide

ARC-challenge accuracy for BLOOM, higher being better. Differences among small models are within noise. On the largest model, three-bit GPTQ reaches 40.70 against 24.74 for RTN and 44.97 in FP16, the same large-model pattern seen in every other table.

Table 21 — OPT accuracy on StoryCloze ↑.
OPTBits125M350M1.3B2.7B6.7B13B30B66B175B
full1659.9663.2170.7871.7474.6076.6477.2877.3479.82
RTN460.0263.0859.1370.7873.6574.4775.3751.2478.04
GPTQ459.5863.4669.6470.4673.9076.1977.0877.1580.08
RTN349.6556.7847.6146.9848.1249.2049.8448.1946.47
GPTQ357.0360.1565.2568.4370.9773.0775.6871.2378.04
Guide

StoryCloze accuracy for OPT, choosing the right ending to a short story, where higher is better. Four-bit GPTQ matches or slightly beats FP16 on the largest model, and three-bit GPTQ reaches 78.04 against about 46 for RTN, which is below chance on this two-choice task.

Table 22 — BLOOM accuracy on StoryCloze ↑.
BLOOMBits560M1.1B1.7B3B7.1B176B
full1661.9463.2765.4467.7971.9976.89
RTN460.1560.6662.9567.0970.7276.00
GPTQ461.1762.3264.4867.2271.3676.32
RTN354.8756.0855.7959.8366.2048.50
GPTQ357.8059.7761.8163.9769.2675.37
Guide

StoryCloze accuracy for BLOOM, higher being better, closes the appendix. Four-bit GPTQ stays within about half a point of FP16 on the largest model, and three-bit GPTQ gets 75.37 against 48.50 for RTN. Across all these tasks the conclusion is the same: GPTQ keeps large models usable at three bits.

§7Why it matters for this thesis

GPTQ → LTX-2.3 on OpenVINO / NNCF

  • It is already in the toolchain. NNCF's data-aware int4 weight compression (nncf.compress_weights(..., mode=INT4_SYM/INT4_ASYM, group_size=128, dataset=..., gptq=True), optionally with scale_estimation=True) applies GPTQ-style error compensation. The output is ordinary compressed weights (int4 + scale/zero point) in OpenVINO IR, which run on OpenVINO's standard weight-compressed MatMul kernels on CPU and Arc GPU. No custom kernels are needed.
  • It needs calibration data, and for a diffusion model that data must cover the timesteps. \(\mathbf{H}=2\mathbf{X}\mathbf{X}^\top\) comes from real layer inputs. For LTX-2.3, collect DiT inputs across prompts and across denoising steps (early, noisy steps and late steps differ), for both the video and the audio streams. Otherwise the error compensation is fitted to the wrong input statistics.
  • Grouping is the lever the paper recommends. Fig. 4 and Table 5 show that g128 recovers most of the 4-bit loss. This matches NNCF's int4 group_size. Keep sensitive layers (embeddings, final projection, possibly adaLN/timestep MLPs) in int8 or FP16 using NNCF's ratio or ignored scopes, as GPTQ keeps embeddings and the output layer in FP16.
  • Expect memory savings more than latency gains for video. GPTQ's speed-ups come from memory-bound matrix-vector products at batch 1 (Table 6). A video DiT processes thousands of tokens per step, so it is mostly compute-bound. int4 weights will mainly cut RAM/VRAM and load time, and speed-ups on Intel hardware must be measured, not assumed. Pair it with caching or activation int8 for compute savings.
  • The compute cost is modest. GPTQ needs one \(d_{\text{col}}\times d_{\text{col}}\) Hessian per linear layer plus a Cholesky factorization, so it is feasible on a workstation CPU. Budget the extra compression time and report RTN (NNCF data-free) vs GPTQ vs AWQ/scale-estimation as an ablation.
Guide

Treat GPTQ as a ready-made option in NNCF rather than something to implement. Turn on the GPTQ flag in int4 weight compression with group size one hundred twenty-eight, and feed it calibration inputs gathered across prompts, denoising timesteps, and both the video and audio streams of LTX-2.3. Keep sensitive layers in int8 or FP16. Expect memory savings more than speed, measure latency on the Intel hardware, and report RTN, GPTQ and AWQ side by side as an ablation.

Quantization foundations (LLMs)

SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models

Guangxuan Xiao, Ji Lin, Mickael Seznec, Hao Wu, Julien Demouth, Song Han · MIT & NVIDIA · ICML 2023 (PMLR 202) · arXiv:2211.10438

Weights of big transformers are easy to quantize, but their activations have a few huge “outlier” channels that ruin INT8. SmoothQuant divides each activation channel by a factor \(s_j\) and multiplies the matching weight row by the same \(s_j\) — the product is unchanged, but now both operands are smooth enough for plain INT8 × INT8 matrix multiplication (W8A8). It is training-free, done offline from a small calibration set.

Format
W8A8 (INT8 GEMM + BMM)
Key knob
α = 0.5 (OPT/BLOOM), 0.75 (GLM)
OPT-175B avg acc.
66.8% vs 66.9% FP16
Speed-up
up to 1.56× (FasterTransformer)
Memory
≈ 2× less (1.96×)
Calibration
512 Pile sentences, once
Reading guide

SmoothQuant asks why large transformers break when both weights and activations are cast to eight-bit integers, and how to fix that without retraining. Its answer is to divide each troublesome activation channel by a scale and multiply the matching weight row by the same scale, so the product stays identical but both sides become easy to quantize. That gives W eight A eight, meaning eight-bit weights and eight-bit activations, running on ordinary integer matrix kernels. The tab moves from the big picture, to the outlier problem, to the smoothing method and its equations, then every figure from the paper, the results tables, and a closing box on what this means for LTX-2.3 with NNCF. Among the sixteen papers it is the second of three language-model quantization foundations, after GPTQ and before AWQ. GPTQ and AWQ compress weights only, while SmoothQuant is the one that makes activations quantizable too.

§0Before reading

SmoothQuant builds on three ideas: how rounding to 8-bit integers works (one step size for many numbers), the difference between quantizing only the weights and quantizing the activations too, and which numbers share a step size. The paper is in the atlas because it is the classic fix for activation outliers, and its “smoothing” trick reappears in NNCF and in almost every diffusion quantizer that follows.

256 ticks, one step sizeno outlier: max = 1fine step-10+1one outlier: max = 60coarse step-600outliernormal values: a few ticksstep = max|x| / 127
PrimerOne large value ruins the ruler for everyone. INT8 has 256 levels; with a single step size \(\Delta=\max|x|/127\), a lone outlier at 60 stretches the step so that all the ordinary values near zero land on just a handful of levels. Ticks are drawn schematically. This is the whole problem SmoothQuant attacks.
Guide

Rounding to eight-bit integers gives a ruler with two hundred fifty six ticks, and one step size is set by the largest value. Without an outlier the ticks are fine and every dot keeps its detail. Add one value at sixty and the step stretches so far that all the ordinary values near zero share just a few ticks. That lost detail is exactly the error SmoothQuant sets out to remove.

Weight-only vs W8A8Weight-only (GPTQ, AWQ)W int4/8W FP16FP16 GEMMX FP16saves memory; math stays FP16W8A8 (SmoothQuant)W INT8INT8 GEMMX INT8offlinequantized livesaves memory and uses fast INT8 units
PrimerWeight-only saves memory; W8A8 also speeds up the math. GPTQ, AWQ and NNCF’s compress_weights store weights in few bits but turn them back into FP16 before multiplying. W8A8 also rounds the activations \(\mathbf{X}\) to INT8, so the multiply runs on integer hardware. Activations are only known at run time, and that is where the outliers live.
Guide

There are two ways to quantize a linear layer. Weight-only methods like GPTQ, AWQ and NNCF's compress weights store the weights in few bits but turn them back into sixteen-bit floats before multiplying, so they mainly save memory. W eight A eight also rounds the activations to eight bits, so the multiply itself runs on fast integer units. Activations are only known at run time, and that is where the outliers appear.

Who shares one scale?per-tensor1 scaleoutlier hurtsper-token1 per rowoutlier still hurtsper-channel1 per columnnot GEMM-friendlystatic = fixed from calibrationdynamic = measured liverows = tokens, columns = channels, magenta = outlier channel
PrimerGranularity decides which numbers share a step size. Activations form a tokens × channels matrix. Outliers sit in fixed channels (magenta column), so per-token scales do not help and per-channel would, but a per-channel scale on \(\mathbf{X}\) cannot be pulled out of a fast INT8 GEMM. SmoothQuant’s way out is to fold that per-channel factor into the weights instead.
Guide

Activations form a matrix with one row per token and one column per channel, and granularity says which numbers share a step size. One scale for everything lets the outlier column ruin all values. One scale per token row still mixes the outlier into every row. One scale per channel column would fix it, but it cannot be pulled out of a fast integer matrix multiply. SmoothQuant moves that per-channel factor into the weights instead.

Where this paper sitsbeforethis papernextGPTQweights only3 to 4 bitSmoothQuantactivations tooW8A8AWQweights onlyactivation-awaresmoothing reused laterPTQ4DiT · ViDiT-Q · SVDQuant
PrimerWhere this paper sits. GPTQ (before) shrinks weights only. SmoothQuant adds the activation side by moving outlier scale from \(\mathbf{X}\) into \(\mathbf{W}\). AWQ (next, same MIT lab) reuses per-channel scaling to protect important weights in weight-only 4-bit. Later, PTQ4DiT, ViDiT-Q and SVDQuant all build on this smoothing for diffusion transformers, and NNCF runs a SmoothQuant step in its full INT8 path.
Guide

SmoothQuant is the fourth paper in the atlas. GPTQ, just before it, compresses weights only. SmoothQuant adds the activation side by shifting outlier scale from the activations into the weights, which gives W eight A eight. AWQ, next, comes from the same lab and reuses per-channel scaling for four-bit weight-only models. Later diffusion papers like PTQ4DiT, ViDiT-Q and SVDQuant build on this smoothing, and NNCF uses it in its full integer path.

Terms used in this paper

Activation
The numbers flowing between layers for one input, the \(\mathbf{X}\) in \(\mathbf{Y}=\mathbf{XW}\). Unlike weights they change with every input, so they are only known at run time.
Outlier channel
A feature dimension of \(\mathbf{X}\) whose values are far larger (up to about 100 times) than the rest. In LLMs above about 6.7B parameters these channels stay the same across tokens.
W8A8
Weights stored in 8-bit integers and activations cast to 8-bit integers, so the matrix multiply itself runs in INT8. Compare W4A16: 4-bit weights, activations left in FP16.
Step size (scale)
The gap \(\Delta\) between neighbouring integer levels, usually \(\max|x|/127\) for INT8. Every value is divided by it and rounded.
Per-tensor / per-token / per-channel
How many values share one step size: the whole matrix, each token row, or each channel column.
Static vs dynamic
Static: activation scales fixed once from calibration data (cheapest). Dynamic: scales computed on the fly from each input. SmoothQuant-O3 is static per-tensor; O1 is dynamic per-token.
Calibration set
A small batch of real inputs run once through the model to record activation ranges. Here: 512 random sentences from the Pile text corpus.
GEMM / BMM
General matrix multiply (a linear layer) and batched matrix multiply (the two matmuls inside attention). They dominate compute, so they are what should go to INT8.
A100
NVIDIA's Ampere-generation data-centre GPU, used here in its 80 GB version. Its Tensor Cores run INT8 matrix multiplies faster than FP16 ones.
Tensor Core
NVIDIA's dedicated matrix-multiply units. Intel's rough counterparts are XMX engines on Arc GPUs and VNNI/AMX instructions on recent Xeon CPUs.
FasterTransformer
NVIDIA's optimised C++/CUDA inference library for transformers. The paper's biggest speed-ups (up to 1.56 times) are measured inside it.
LLM.int8()
The main competitor: it keeps outlier channels in FP16 and the rest in INT8. Accurate, but the mixed-precision split makes it slower than plain FP16 in most of the paper's tests.
OPT, BLOOM, GLM-130B
Open large language models used as test subjects, up to 175 billion (OPT) and 176 billion (BLOOM) parameters.
LAMBADA, WikiText
Language benchmarks. LAMBADA: accuracy at predicting the last word of a passage (higher is better). WikiText-2: perplexity, how surprised the model is by real text (lower is better).
Guide

These are the words the paper uses without explaining. The most important are outlier channel, W eight A eight, the difference between static and dynamic scales, and per-tensor versus per-token versus per-channel granularity. The hardware and benchmark names matter too: the results come from NVIDIA A100 GPUs and the FasterTransformer library, and accuracy is measured on language tasks such as LAMBADA and WikiText, not on images or video.

§2Big picture

Before: W8A8 failsAfter SmoothQuant: W8A8 works|X| per channelhard (outliers)×|W| per in-channeleasy (flat)offlineX ÷ s, W × ss from calib.|X̂| = |X|/seasy×|Ŵ| = s·|W|still easyY unchangedX̂Ŵ = XW
OverviewMove the difficulty, not the math. Left: a few activation channels (magenta) are ~100× larger than the rest, so one INT8 scale wastes almost all levels. Right: dividing channel \(j\) by \(s_j\) and multiplying weight row \(j\) by \(s_j\) flattens the activations; the weights get slightly bumpier but stay easy. The product is mathematically identical.
Guide

The whole paper in one picture: move the difficulty, do not change the math. On the left, a few activation channels, drawn in magenta, are about a hundred times larger than the rest, so a single eight-bit scale wastes almost every level. On the right, each activation channel is divided by s and the matching weight row multiplied by s, done offline. The activations flatten, the weights get slightly bumpier but stay easy, and the output is unchanged.

SmoothQuant is a per-input-channel rescaling \(\mathbf{Y}=(\mathbf{X}\,\mathrm{diag}(\mathbf{s})^{-1})(\mathrm{diag}(\mathbf{s})\mathbf{W})\). The scale is folded into the previous op offline, so at runtime only plain INT8 GEMMs run. One knob, \(\alpha\), sets how much difficulty moves to the weights.

§3The problem

Per-tensor INT8 grid set by the outlierm0input channels of X (one token row)normal: m_i/m ≈ 1%→ 2–3 of 256 levelsoutlier ≈100×
P1Outliers steal the grid. With one scale \(\Delta=\max|\mathbf{X}|/127\), a channel whose max \(m_i\) is 1% of \(m\) gets about \(2^8 m_i/m \approx 2\text{–}3\) effective levels. (8 of 256 levels drawn.)
Guide

Outliers steal the grid. With one step size set by the largest value in the whole activation matrix, a normal channel whose maximum is only one percent of that value lands on just two or three of the two hundred fifty six integer levels. The drawing shows eight levels for clarity. This is the core problem the paper states in Section 3, and the effective-levels equation further down puts a number on it.

Which activation granularity keeps accuracy? (Table 1)FP16per-tensorper-tokenper-channel*0204060806.7B13B30B66B175Bavg acc. %OPT model size
P2Per-token does not help; per-channel would. Beyond 6.7B, per-tensor and per-token INT8 activations drop OPT to ~33% (near random). Simulated per-channel (*) activation scales recover FP16 — because outliers sit in fixed channels.
Guide

Accuracy against OPT model size for different ways of scaling the activations, taken from Table 1. Per-tensor and per-token eight-bit activations collapse to about thirty three percent, close to random guessing, once models reach six point seven billion parameters. Only per-channel scaling, marked with a star because it is simulated, stays on the FP16 line. That tells us the outliers live in fixed channels, which is the observation the whole method builds on.

Which scales can leave an INT8 GEMM?X̄ (T × C_i)C_i (inner)Tper-token ✓per-C_i scale ✗·W̄ (C_i × C_o)per-out-channel ✓per-C_i ✗Σ over C_i runs inside the INT8 kernel:only T- and C_o-scales factor out (Eq. 2)
P3…but per-channel activation scales are not GEMM-friendly. Scaling can only be applied on the outer dims (token \(T\), output channel \(C_o\)) after the matmul. SmoothQuant's trick: push the per-\(C_i\) scale into the weights offline, the one place it is free.
Guide

Why per-channel activation scaling cannot simply be used. In an integer matrix multiply, the sum runs over the input-channel dimension, C i, inside the kernel, so only scales along the token rows and the output columns can be pulled out afterwards, as in equation 2. A per-input-channel scale would have to be applied inside the sum. SmoothQuant's escape is to push that scale into the weights offline, the one place where it costs nothing.

  • Activations >> weights in difficulty. Weights are flat (INT8 or even INT4 weight-only is fine); activation outliers are ~100× larger than typical values.
  • Outliers persist in fixed channels across all tokens; variation within a channel is small (Fig. 4).
  • Existing W8A8 baselines (naive, ZeroQuant, Outlier Suppression) give near-random OPT-175B; LLM.int8() keeps accuracy by running outliers in FP16 but is slower than FP16.

§4Method

Migration strength α on the Fig. 5 example (per-channel max of X̂ and Ŵ)α = 0: all to activations41649max|X̂_j|1111max|Ŵ_j|s = [0.5, 1, 0.5, 1]α = 0.5: split evenly2423max|X̂_j|2423max|Ŵ_j|s = [1, 4, 1, 3]α = 1: all to weights1111max|X̂_j|41649max|Ŵ_j|s = [2, 16, 2, 9]
M1α slides the outliers from X to W. Using the paper's toy numbers (channel maxima \(|X|=[2,16,2,9]\), \(|W|=[2,1,2,1]\)). Per channel, Eq. (4) gives \(\max|\hat X_j|=\max|X_j|^{1-\alpha}\max|W_j|^{\alpha}\) and \(\max|\hat W_j|=\max|X_j|^{\alpha}\max|W_j|^{1-\alpha}\): at \(\alpha=0.5\) both equal \([2,4,2,3]\) — the largest ratio drops from 8× to 2×. Magenta = values >5.
Guide

The migration strength alpha decides how much of the outlier burden slides from activations to weights, shown on the paper's toy example with X channel maxima of 2, 16, 2 and 9. At alpha zero the activations keep their spike of 16; at alpha one the weights inherit it. At alpha one half both sides end up with maxima of 2, 4, 2 and 3, so the worst ratio drops from eight times to two times, as the derived equation predicts.

Where the scale s lives (all offline) and what runs at inferenceFP16 modelLayerNorm(γ, β)XLinear W (FP16)Yγ ÷ s, β ÷ srows × s, then INT8Smoothed + quantized (runtime)LN(γ/s, β/s)X̂quantize÷Δ_X, roundint8INT8 GEMMŴ = diag(s)W, int8int32dequant× Δ_X Δ_W (Eq. 2)Y (FP16)If X comes from somewhere elseprevious Linear W_prevfold: W_prev · diag(s)⁻¹ (its out-cols)residual add / no foldable opinsert explicit Multiply(1/s)NNCF / OpenVINOMultiply(1/s) node + rescaled W const
M2Fused scale placement. \(\mathrm{diag}(\mathbf{s})^{-1}\) is absorbed into whatever produced \(\mathbf{X}\) (LayerNorm affine, or the output columns of a previous linear); \(\mathrm{diag}(\mathbf{s})\) is absorbed into the rows of \(\mathbf{W}\) before it is quantized. For a residual-add input the paper adds an extra scaling on the residual branch (as Wei et al.). The gold box is how NNCF implements it (our annotation, not from the paper). In the paper, smoothing is applied to the inputs of self-attention (QKV) and FFN (FC1); O3 uses static per-tensor \(\Delta_X\).
Guide

Where the scale actually lives. The division by s is folded into whatever produced X, such as the LayerNorm gamma and beta or a previous linear layer, and the multiplication by s goes into the weight rows before quantization, so nothing extra runs at inference. The gold box, the tab's own annotation, shows NNCF inserting an explicit Multiply node when nothing can be folded, which is the case for LTX-2.3's adaptive LayerNorm.

  1. Calibrate. Run 512 random Pile sentences; record per-input-channel \(\max|\mathbf{X}_j|\) for each smoothed linear (and static step sizes \(\Delta\) for O3).
  2. Pick α. Quick grid search on a Pile validation subset: 0.5 for OPT/BLOOM, 0.75 for GLM-130B, 0.8–0.9 for Llama/Mistral (Tables 6–7).
  3. Compute s per channel with Eq. (4).
  4. Fold. Divide the producer (LayerNorm \(\gamma,\beta\) or previous linear) by \(\mathbf{s}\); multiply the weight rows by \(\mathbf{s}\) (Eq. 3). No runtime op added.
  5. Quantize all linear weights and BMM inputs to INT8 (Fig. 6), choose O1/O2/O3 granularity (Table 2).
  6. Run with off-the-shelf INT8 GEMM kernels (CUTLASS); dequantize with Eq. (2).
Guide

The recipe runs in five stages, all offline except the last. First, measure the largest absolute value of every input channel on 512 calibration sentences. Then pick alpha by a quick search, which gives about one half for OPT and BLOOM and higher values for Llama-style models. From alpha, compute the scales, fold them into the previous operation and the weights, quantize every linear layer and attention product to eight bits, and finally run on standard integer kernels.

Procedure SmoothQuant (summary of Sec. 4–5; the paper has no Algorithm box) input : FP16 transformer, calibration set D (512 Pile sentences), α for each block: for each smoothed linear L with input X (QKV after LN1, FC1 after LN2): a_j ← max over D, tokens of |X[:, j]| # per input channel w_j ← max over out-channels of |W[j, :]| # rows of all layers sharing X s_j ← a_j^α / w_j^(1−α) # Eq. (4) producer(X) ← producer(X) · diag(s)^−1 # e.g. LN γ,β ÷ s W ← diag(s) · W # Eq. (3) quantize every Linear / BMM: W → INT8 (per-tensor), X → INT8 (O1/O2/O3) keep LayerNorm, Softmax, ReLU/GELU, residual adds in FP16 # Fig. 6
Guide

The procedure as pseudocode written by the tab, since the paper has no algorithm box. For each smoothed linear layer, the attention QKV input and the first feed-forward input, it collects activation channel maxima and weight row maxima, turns them into a scale with equation 4, and folds that scale in with equation 3. Then every matrix multiply is quantized to eight bits, while LayerNorm, Softmax, activation functions and residual adds stay in FP16.

§5Every equation

(1)\[ \bar{\mathbf{X}}^{\text{INT8}} = \left\lceil \frac{\mathbf{X}^{\text{FP16}}}{\Delta} \right\rfloor, \qquad \Delta = \frac{\max(|\mathbf{X}|)}{2^{N-1}-1} \]

Symmetric uniform quantizer: step \(\Delta\) from the absolute max, \(\lceil\cdot\rfloor\) = round, \(N=8\). \(\Delta\) from calibration = static; from runtime stats = dynamic. Asymmetric case adds a zero-point.

Guide

The basic symmetric quantizer used throughout the paper. X bar, the integer version of the floating-point activation X, is X divided by the step size delta and rounded. Delta is the largest absolute value in X divided by two to the power N minus one, minus one, which is 127 for eight bits. Delta from calibration is called static, delta measured at run time is dynamic. Because the largest value sets delta, outliers hurt everything else.

(–)\[ \mathbf{Y} = \mathbf{X}\cdot\mathbf{W},\quad \mathbf{Y}\in\mathbb{R}^{T\times C_o},\ \mathbf{X}\in\mathbb{R}^{T\times C_i},\ \mathbf{W}\in\mathbb{R}^{C_i\times C_o} \]

Linear layer: \(T\) tokens, \(C_i\) input channels (the summed, inner dim), \(C_o\) output channels (batch omitted).

Guide

The shape bookkeeping for a linear layer. Y equals X times W, where X has T rows, one per token, and C i columns, the input channels. W has C i rows and C o columns, the output channels. The important detail is that C i is the inner dimension that gets summed over, so later arguments about which scales can leave the kernel all refer back to these three names.

(–)\[ \text{effective levels of channel } i = 2^{8}\cdot \frac{m_i}{m} \]

\(m_i\) = max of channel \(i\), \(m\) = max of the whole matrix. With outliers ~100×, non-outlier channels get only 2–3 levels (Sec. 3).

Guide

A back-of-the-envelope count of how many integer levels a channel really uses. It is two to the eighth, or 256, times m i over m, where m i is that channel's maximum and m is the maximum of the whole matrix. When outliers are about a hundred times larger, ordinary channels get only two or three levels. This is the numeric form of the grid picture in P1 and the reason naive W8A8 collapses.

(2)\[ \mathbf{Y} = \operatorname{diag}\!\left(\mathbf{\Delta}_{\mathbf{X}}^{\text{FP16}}\right)\cdot\left(\bar{\mathbf{X}}^{\text{INT8}}\cdot\bar{\mathbf{W}}^{\text{INT8}}\right)\cdot\operatorname{diag}\!\left(\mathbf{\Delta}_{\mathbf{W}}^{\text{FP16}}\right) \]

Vector-wise INT8 GEMM: per-token scales (length \(T\)) and per-output-channel scales (length \(C_o\)) are applied after the integer matmul. Scales along \(C_i\) cannot be.

Guide

How an eight-bit matrix multiply is dequantized. The integer product of X bar and W bar is computed first, then multiplied on the left by a diagonal matrix of per-token step sizes, delta X, and on the right by a diagonal matrix of per-output-channel step sizes, delta W. Both scales sit on the outer dimensions, so they can be applied after the integer kernel. A scale along the inner input-channel dimension cannot, which is the constraint SmoothQuant is designed around.

(3)\[ \mathbf{Y} = \left(\mathbf{X}\operatorname{diag}(\mathbf{s})^{-1}\right)\cdot\left(\operatorname{diag}(\mathbf{s})\mathbf{W}\right) = \hat{\mathbf{X}}\hat{\mathbf{W}} \]

Smoothing: \(\mathbf{s}\in\mathbb{R}^{C_i}\) divides activation channels and multiplies the matching weight rows; exact equivalence. \(\operatorname{diag}(\mathbf{s})^{-1}\) is fused into the previous op offline.

Guide

The smoothing identity, the heart of the method. X is multiplied by the inverse of diag of s, which divides each activation channel j by s j, and W is multiplied by diag of s, which multiplies weight row j by the same s j. The two cancel, so Y equals X hat times W hat exactly. Because the division can be folded into the previous operation offline, the model gains easier activations at no runtime cost.

(–)\[ \mathbf{s}_j = \max(|\mathbf{X}_j|),\quad j=1,2,\dots,C_i \qquad\text{vs.}\qquad \mathbf{s}_j = 1/\max(|\mathbf{W}_j|) \]

The two extremes: left pushes all difficulty into the weights (every \(\hat{\mathbf{X}}\) channel has max 1); right pushes it all into the activations. Both hurt accuracy (Fig. 10).

Guide

The two extreme choices of scale, shown side by side. Setting s j to the maximum of activation channel j makes every smoothed activation channel peak at one and dumps all the difficulty into the weights. Setting s j to one over the maximum of weight row j does the opposite and leaves everything in the activations. Figure 10 shows that both extremes lose accuracy, which motivates the balanced formula in equation 4.

(4)\[ \mathbf{s}_j = \max(|\mathbf{X}_j|)^{\alpha} \,/\, \max(|\mathbf{W}_j|)^{1-\alpha} \]

Migration strength \(\alpha\in[0,1]\): \(j\) = input channel, \(\mathbf{X}_j\) = activation column \(j\) (over calibration tokens), \(\mathbf{W}_j\) = weight row \(j\). \(\alpha=0.5\) balances; larger \(\alpha\) moves more to weights.

Guide

The paper's scale formula. For each input channel j, s j equals the maximum absolute activation in that channel raised to the power alpha, divided by the maximum absolute weight in row j raised to the power one minus alpha. Alpha, the migration strength, runs from zero to one: one half splits the difficulty evenly, and larger values push more of it into the weights. This single knob is what the steps block tunes and what Figure 10 sweeps.

(Fig. 5)\[ \mathbf{s} = \sqrt{\max|\mathbf{X}| \,/\, \max|\mathbf{W}|},\qquad \hat{\mathbf{X}} = \mathbf{X}\operatorname{diag}(\mathbf{s})^{-1},\qquad \hat{\mathbf{W}} = \operatorname{diag}(\mathbf{s})\mathbf{W} \]

Eq. (4) at \(\alpha=0.5\), as annotated in Fig. 5 (channel-wise max over tokens for \(\mathbf{X}\), over output channels for \(\mathbf{W}\)).

Guide

Equation 4 at alpha equal to one half, written the way Figure 5 annotates it. The scale is the square root of the activation channel maximum divided by the weight row maximum. X hat is X with each channel divided by its scale, and W hat is W with each row multiplied by it. Applied to the toy example this gives scales of 1, 4, 1 and 3.

(derived)\[ \max|\hat{\mathbf{X}}_j| = \max|\mathbf{X}_j|^{1-\alpha}\max|\mathbf{W}_j|^{\alpha},\qquad \max|\hat{\mathbf{W}}_j| = \max|\mathbf{X}_j|^{\alpha}\max|\mathbf{W}_j|^{1-\alpha} \]

Not printed in the paper; follows from (3)–(4). At \(\alpha=0.5\) both equal \(\sqrt{\max|\mathbf{X}_j|\max|\mathbf{W}_j|}\) — “same quantization difficulty”.

Guide

A derived line the tab adds, not printed in the paper. After smoothing, the maximum of activation channel j becomes the old activation maximum to the power one minus alpha times the old weight maximum to the power alpha, and the weight maximum is the mirror image. At alpha one half both equal the square root of the product, which is what the paper means by giving weights and activations the same quantization difficulty.

§6Every figure

0.010.11101001000201720182019202020212022size (B params) / memory (GB)Transformer 0.05BGPT 0.11BBERT 0.34BGPT-2 1.5BMegatronLM 8.3BT-NLG 17BGPT-3 175BMT-NLG 530BTPUv2 16GBV100 32GBTPUv3 32GBA100 40GBA100 80GBGapModel sizeAccelerator memory
Fig. 1Model size outruns accelerator memory. Log scale, 2017–2022. LLM parameters grew ~10,000× (Transformer 0.05B → MT-NLG 530B) while GPU/TPU memory grew only 16 GB → 80 GB, leaving a widening gap that quantization helps close. Years for points approximate (redrawn).
Guide

Model size and accelerator memory over time, on a log scale from 2017 to 2022. Language models grew about ten thousand times, from 0.05 billion parameters to 530 billion, while GPU and TPU memory grew only from 16 to 80 gigabytes. The widening gap is the motivation for the paper. The point positions are approximate, since the plot is redrawn.

100|X|hard to quantize0.10|W|very easy to quantize(a) Originaloutlierlow effective bits10|X̂|easy to quantize10|Ŵ|easy to quantize(b) SmoothQuantmigrate difficulty
Fig. 2Intuition: outliers stretch the range; migrate the scale variance to W. Horizontal lines = quantization levels. (a) An outlier forces a range of 10, so ordinary activation values use only the bottom level or two; weights (range 0.1) fill the grid. (b) After smoothing, \(\hat{\mathbf{X}}\) and \(\hat{\mathbf{W}}\) both span the grid well. Shape redrawn.
Guide

The intuition in two panels, where horizontal lines are quantization levels. In the original panel, one activation outlier stretches the range to 10, so normal values crowd into the bottom level or two, while weights with a range of 0.1 fill their grid. After smoothing, both X hat and W hat span their grids well. This is the qualitative version of the effective-levels argument, and the shapes are redrawn.

XC_iT∗WC_oC_iΔ_X [1]Δ_W [1]per-tensorper-tensor(a) per-tensor quantizationXC_iT∗WC_oC_iΔ_X [T×1]per-tokenΔ_W [1×C_o]per-channel (C_o)(b) per-token + per-channel quantization
Fig. 3Granularities that INT8 GEMM supports. (a) Per-tensor: one step size for all of \(\mathbf{X}\) and one for \(\mathbf{W}\) — cheapest. (b) Vector-wise: one step per token row of \(\mathbf{X}\) (\(\Delta_X\in\mathbb{R}^{T\times1}\)) and per output channel of \(\mathbf{W}\) (\(\Delta_W\in\mathbb{R}^{1\times C_o}\)). Scales along the inner \(C_i\) dim are not allowed. (Group-wise = per-channel over channel groups.)
Guide

The two scale layouts an eight-bit matrix multiply supports. Per-tensor uses one step size for all of X and one for all of W, which is cheapest. Vector-wise uses one step per token row of X and one per output channel of W. Neither allows scales along the inner input-channel dimension. These are the granularities that the O1, O2 and O3 settings in Table 2 choose between.

z-axis max 70channel →tokenActivation (Original)Hard to quantizez-axis max 10channel →Activation (SmoothQuant)Easy to quantizez-axis max 5in-channel →out-ch.Weight (Original)Very easy to quantizez-axis max 5in-channel →Weight (SmoothQuant)Harder but still easySmoothMigrate difficulty
Fig. 4Real OPT-13B layer: outlier channels move from activation to weight. Paper shows 3-D magnitude surfaces (~5000 channels × ~300 tokens); redrawn as heatmaps, darkness = |value| relative to each panel's z-axis max (70 / 10 / 5 / 5). (1) A few activation channels exceed 70 — magenta columns; (2) each channel varies little across tokens; (3) weights are flat. After smoothing, activations show only faint stripes and the weights gain thin ridges in the same channels but stay easy. Cell values synthetic.
Guide

A real OPT-13B layer, redrawn as heatmaps where darkness shows magnitude relative to each panel's maximum. The original activations have a few channels above 70, visible as magenta columns that stay large across all tokens, while the original weights are flat. After smoothing, the activation panel peaks near 10 with faint stripes, and the weights gain thin ridges in the same channels but remain easy. The cell values are synthetic; the pattern follows the paper.

OriginalSmoothQuant (α = 0.5)X1-1626-28-1-9abs max21629∗21-21-1-12-1-2-1-11W2121abs maxs = √(max|X| / max|W|)X̂ = X diag(s)⁻¹1-422-22-1-31413s∗Ŵ = diag(s) W21-24-4-42-1-2-3-33all offline; at runtime only X̂ and quantized Ŵ exist
Fig. 5Worked example at α = 0.5. Per-channel abs-max of \(\mathbf{X}\) is \([2,16,2,9]\), of \(\mathbf{W}\)'s rows \([2,1,2,1]\), so \(\mathbf{s}=[1,4,1,3]\). Activation range shrinks from 16 to 4; the weight range grows from 2 to 4 — both now equally easy. \(\hat{\mathbf{X}}\hat{\mathbf{W}}=\mathbf{X}\mathbf{W}\) exactly.
Guide

The paper's worked example at alpha one half. Activation channel maxima are 2, 16, 2 and 9, weight row maxima are 2, 1, 2 and 1, so the scales come out as 1, 4, 1 and 3. The activation range shrinks from 16 to 4 while the weight range grows from 2 to 4, and the two are now equally easy. The product is unchanged, and all of this happens offline.

LayerNormQKVBMMSoftmaxBMMProjection+LayerNormFC1ReLUFC2+FP16INT8
Fig. 6Precision map of a transformer block. All compute-heavy ops — Q/K/V, both attention BMMs, output projection, FC1, FC2 — take INT8 inputs (rust). Light element-wise ops — LayerNorm, Softmax, ReLU, residual adds — stay FP16 (teal). Arrows are coloured by the precision of the tensor they carry (approximately as in the paper).
Guide

A precision map of one transformer block. Every compute-heavy operation, meaning the query, key and value projections, both attention matrix products, the output projection and the two feed-forward layers, takes eight-bit inputs, drawn in rust. Light element-wise operations such as LayerNorm, Softmax, ReLU and residual adds stay in FP16, drawn in teal. Quantizing the attention products too is what separates SmoothQuant from weight-only methods, and it maps directly onto a DiT block.

30%39%48%57%66%75%1.3B2.7B6.7B13B30B66B175BOPT model sizeFP16 / LLM.int8()W8A8ZeroQuantSmoothQuant-O3
Fig. 7SmoothQuant-O3 tracks FP16 at every OPT scale. Naive W8A8 and ZeroQuant are fine up to 2.7B but collapse to ~33% from 6.7B on (when outliers emerge). SmoothQuant-O3 matches FP16; LLM.int8() also matches but needs mixed precision and is slow. Points ≥6.7B from Tables 1/4; 1.3B/2.7B read from the plot.
Guide

Average accuracy against OPT model size. Naive W8A8 and ZeroQuant are fine up to 2.7 billion parameters, then crash to about thirty three percent from 6.7 billion on, exactly where outliers emerge. SmoothQuant O3 stays on the FP16 line at every size. LLM.int8 also matches FP16, but only by keeping outlier channels in floating point, which makes it slow. The points for the two smallest models are read from the plot.

FP16LLM.int8()SmoothQuant01002003004008419063128153237112256296371223512Latency (ms)0132624.412.812.612824.913.312.925625.914.313.6512Memory (GB)OPT-13B
Fig. 8aPyTorch, OPT-13B (1×A100-80GB). x = sequence length, batch 4, context stage. SmoothQuant-O3 is fastest at every length (e.g. 223 vs 296 ms at 512) and halves memory; LLM.int8() is slower than FP16.
Guide

Latency and memory for OPT-13B in PyTorch on one A100, with sequence length on the x axis and a batch of four. SmoothQuant is fastest at every length, for example 223 milliseconds against 296 for FP16 at length 512, and it roughly halves memory. LLM.int8 is slower than FP16, the cost of its mixed-precision path. This is the first speed evidence for the efficiency half of the paper's claim.

FP16LLM.int8()SmoothQuant0175350525700190276136128343388228256660655458512Latency (ms)0306056.629.128.912857.33029.32565931.630.4512Memory (GB)OPT-30B
Fig. 8bPyTorch, OPT-30B: up to 1.51× faster, 1.96× less memory. At seq 256: 228 ms vs 343 ms FP16 (1.51×); memory 28.9 vs 56.6 GB at 128 (1.96×). Values read from the paper's bar labels (Fig. 8 is one figure, split here in two panels).
Guide

The same PyTorch comparison for OPT-30B. At sequence length 256, SmoothQuant takes 228 milliseconds against 343 for FP16, or 1.51 times faster, and at length 128 memory drops from 56.6 to 28.9 gigabytes, 1.96 times less. The gains grow with model size, since bigger layers are more dominated by matrix multiplies. Values are read from the paper's bar labels.

FP16SmoothQuant-O30501001502002822128443325687635121811251024Latency (ms)0153027151282716256271751230191024Memory (GB)OPT-13B
Fig. 9aFasterTransformer, OPT-13B. Single A100. Up to 1.45× faster (181→125 ms at 1024); memory 30→19 GB. x = sequence length; values from the paper's bar labels (Fig. 9 split into four panels).
Guide

OPT-13B running in FasterTransformer, a highly optimised inference engine, on one A100. SmoothQuant O3 is up to 1.45 times faster, going from 181 to 125 milliseconds at sequence length 1024, and memory falls from 30 to 19 gigabytes. The point is that the speed-up survives even against a strong FP16 baseline, not only against plain PyTorch.

FP16SmoothQuant-O30100200300400594312898652561861195123802491024Latency (ms)0357059321286032256613451264371024Memory (GB)OPT-30B
Fig. 9bFasterTransformer, OPT-30B. Single A100. Up to 1.56× faster (186→119 ms at 512); memory ~halved (64→37 GB).
Guide

OPT-30B in FasterTransformer on one A100. SmoothQuant O3 reaches the paper's headline speed-up of 1.56 times, 186 against 119 milliseconds at sequence length 512, and memory is roughly halved, from 64 to 37 gigabytes. Together with Figure 9a it shows the gain holds across lengths from 128 to 1024 tokens.

FP16 (2 GPUs)SmoothQuant (1 GPU)012525037550079751281221312562362295124894901024Latency (ms)070140130661281316725613469512139741024Memory (GB)OPT-66B
Fig. 9cFasterTransformer, OPT-66B. SmoothQuant on 1 GPU matches FP16 on 2 GPUs (e.g. 490 vs 489 ms at 1024); memory 139→74 GB.
Guide

OPT-66B in FasterTransformer, where the comparison changes: FP16 needs two GPUs while SmoothQuant fits on one. Latency is essentially equal, 490 against 489 milliseconds at length 1024, and memory drops from 139 to 74 gigabytes. Halving the hardware at the same speed is a different kind of win from raw speed-up.

FP16 (8 GPUs)SmoothQuant (4 GPUs)02254506759001391221282281942564323665128487201024Latency (ms)02004003691821283721842563781895123892001024Memory (GB)OPT-175B
Fig. 9dFasterTransformer, OPT-175B. SmoothQuant on 4 GPUs beats FP16 on 8 GPUs (720 vs 848 ms at 1024); memory 389→200 GB.
Guide

OPT-175B in FasterTransformer. SmoothQuant on four GPUs beats FP16 on eight, 720 against 848 milliseconds at length 1024, while memory falls from 389 to 200 gigabytes. Half the GPUs and still faster is the strongest serving result in the figure set, and it anticipates the 530 billion parameter result in Table 10.

0%20%40%60%80%00.10.20.30.40.50.60.70.80.91Migration strength αOPT-175B acc. (LAMBADA)Weight easyActivation hardSweet spotWeight hardActivation easyFP16W8A16W16A8W8A8
Fig. 10The α sweet spot is 0.4–0.6 (OPT-175B). Small α leaves outliers in activations: anything with A8 collapses to 0%. Large α overloads weights: anything with W8 collapses. Only 0.4–0.6 keeps W8A8 near FP16 (74.7% LAMBADA). Shape redrawn from the plot; FP16 level from Table 3.
Guide

LAMBADA accuracy of OPT-175B as the migration strength alpha sweeps from 0.1 to 0.9, with separate lines for weight-only, activation-only and full eight-bit quantization. When alpha is small, outliers stay in the activations and anything with eight-bit activations collapses to zero. When alpha is large, the weights become too hard and anything with eight-bit weights collapses. Only 0.4 to 0.6 keeps W8A8 near the FP16 level of 74.7 percent. The shape is redrawn from the plot.

§7Results

0%20%40%60%80%66.9FP1635.5W8A835.8ZeroQ.66.7LLM.int8()36OutlierS.66.5SQ-O166.4SQ-O266.8SQ-O3OPT-175B, average of 7 zero-shot tasks (Table 3)
Chart R1Only LLM.int8() and SmoothQuant survive OPT-175B. Naive W8A8, ZeroQuant and Outlier Suppression fall to ~36% (random-level); SmoothQuant O1–O3 stay within 0.5 pt of FP16 — with pure INT8 kernels.
Guide

Average accuracy over seven zero-shot tasks for OPT-175B, from Table 3. Naive W8A8, ZeroQuant and Outlier Suppression all fall to about thirty six percent, essentially random. LLM.int8 and all three SmoothQuant settings stay within half a point of FP16's 66.9 percent. The difference is that SmoothQuant gets there with pure eight-bit kernels, which is the accuracy half of the paper's claim.

FP16LLM.int8()SQ-O1SQ-O2SQ-O3017535052570013B / 25613B / 51230B / 25630B / 512Latency (ms)OPT model / sequence length, batch 4 (Table 11)
Chart R2Coarser = faster: O1 > O2 > O3 latency. Per-token dynamic (O1) → per-tensor dynamic (O2) → per-tensor static (O3) each shave latency; all beat FP16, LLM.int8() is slower in 3 of 4 cases.
Guide

Latency for OPT-13B and OPT-30B at two sequence lengths, from Table 11. Coarser activation scaling is faster: per-token dynamic, O1, is slowest of the three, per-tensor dynamic, O2, is quicker, and per-tensor static, O3, is quickest. All three beat FP16, while LLM.int8 is slower than FP16 in three of the four cases. Since accuracy barely differs between O1 and O3, the static setting is the natural default.

Table 1 — activation granularity (OPT, avg of WinoGrande, HellaSwag, PIQA, LAMBADA)

Only per-channel activation quantization keeps accuracy, but it is not compatible with INT8 GEMM (grey in the paper).
Model size (OPT-)6.7B13B30B66B175B
FP1664.9%65.6%67.9%69.5%71.6%
INT8 per-tensor39.9%33.0%32.8%33.1%32.3%
INT8 per-token42.5%33.0%33.1%32.9%31.7%
INT8 per-channel (not GEMM-compatible)64.8%65.6%68.0%69.4%71.4%
Guide

Table 1 tests which activation granularity keeps OPT accurate. From 13 billion parameters up, per-tensor and per-token eight-bit activations fall to about thirty three percent, while per-channel scaling matches FP16 within about two tenths of a point at every size. The catch, marked in the caption, is that per-channel activation scales do not fit an integer matrix multiply. This table is the evidence behind P2 and the motivation for smoothing.

Table 2 — quantization settings

All weights and activations INT8 unless stated. SmoothQuant efficiency improves O1 → O3.
MethodWeightActivation
W8A8per-tensorper-tensor dynamic
ZeroQuantgroup-wiseper-token dynamic
LLM.int8()per-channelper-token dynamic + FP16
Outlier Suppressionper-tensorper-tensor static
SmoothQuant-O1per-tensorper-token dynamic
SmoothQuant-O2per-tensorper-tensor dynamic
SmoothQuant-O3per-tensorper-tensor static
Guide

Table 2 defines the baselines and the three SmoothQuant settings compared in every result. All SmoothQuant variants use per-tensor weights; they differ only in the activations, going from per-token dynamic in O1, to per-tensor dynamic in O2, to per-tensor static in O3. Moving from O1 to O3 is cheaper at run time. Note that LLM.int8 keeps some activations in FP16, which is why it is accurate but slow.

Table 3 — OPT-175B, 7 zero-shot tasks + WikiText

*ZeroQuant also tried keeping the self-attention input in FP16 (their GPT-NeoX-20B fix); it does not fix OPT-175B.
OPT-175BLAMBADAHellaSwagPIQAWinoGrandeOpenBookQARTECOPAAverage ↑WikiText ↓
FP1674.7%59.3%79.7%72.6%34.0%59.9%88.0%66.9%10.99
W8A80.0%25.6%53.4%50.3%14.0%49.5%56.0%35.5%93080
ZeroQuant0.0%*26.0%51.7%49.3%17.8%50.9%55.0%35.8%84648
LLM.int8()74.7%59.2%79.7%72.1%34.2%60.3%87.0%66.7%11.10
Outlier Suppression0.00%25.8%52.5%48.6%16.6%53.4%55.0%36.0%96151
SmoothQuant-O174.7%59.2%79.7%71.2%33.4%58.1%89.0%66.5%11.11
SmoothQuant-O275.0%59.0%79.2%71.2%33.0%59.6%88.0%66.4%11.14
SmoothQuant-O374.6%58.9%79.7%71.2%33.4%59.9%90.0%66.8%11.17
Guide

Table 3 is the main accuracy result on OPT-175B across seven zero-shot tasks plus WikiText perplexity, where lower is better. Naive W8A8, ZeroQuant and Outlier Suppression collapse, with LAMBADA at zero and perplexity in the tens of thousands. SmoothQuant O3 averages 66.8 percent against 66.9 for FP16, with a perplexity of 11.17 against 10.99. The chart R1 above plots its average column.

Table 4 — three largest open LLMs

OPT/BLOOM: avg of WinoGrande, HellaSwag, PIQA, LAMBADA. GLM*: avg of LAMBADA, MMLU, MNLI, QNLI (not column-comparable).
MethodOPT-175BBLOOM-176BGLM-130B*
FP1671.6%68.2%73.8%
W8A832.3%64.2%26.9%
ZeroQuant31.7%67.4%26.7%
LLM.int8()71.4%68.0%73.8%
Outlier Suppression31.7%54.1%63.5%
SmoothQuant-O171.2%68.3%73.7%
SmoothQuant-O271.1%68.4%72.5%
SmoothQuant-O371.1%67.4%72.8%
Guide

Table 4 extends the test to the three largest open models of the time, OPT-175B, BLOOM-176B and GLM-130B. SmoothQuant stays within about one point of FP16 on all three, while baselines fail on OPT and GLM. BLOOM is milder, since even naive W8A8 keeps 64.2 percent. GLM uses a different task average, so its column should not be compared with the other two.

Table 5 — instruction-tuned OPT-IML-30B

OPT-IML-30BLAMBADA ↑WikiText ↓
FP1669.12%14.26
W8A84.21%576.53
ZeroQuant5.12%455.12
LLM.int8()69.14%14.27
Outlier Suppression0.00%9485.62
SmoothQuant-O369.77%14.37
Guide

Table 5 checks an instruction-tuned model, OPT-IML-30B. The baselines fail again, with LAMBADA near zero and perplexities in the hundreds or thousands. SmoothQuant O3 reaches 69.77 percent LAMBADA, slightly above FP16, with perplexity 14.37 against 14.26. So the fix is not specific to base pretrained models.

Table 6 — LLaMA (WikiText-2 PPL, seq 512, per-token act., α=0.8)

Wiki PPL ↓7B13B30B65B
FP1611.5110.057.536.17
W8A8 SmoothQuant11.5610.087.566.20
Guide

Table 6 applies SmoothQuant to the original LLaMA family, with per-token activations and alpha set to 0.8. WikiText perplexity rises by only about 0.03 to 0.05 at every size, for example 11.56 against 11.51 for the 7 billion model. LLaMA outliers are less severe than OPT's, but the result shows the method carries over to a different architecture.

Table 7 — Llama-2, Falcon, Mistral, Mixtral

WikiText-2 PPL, seq 2048; SmoothQuant with per-token activation + per-channel weight quantization.
ModelFP16 PPLW8A8 SQ PPLα
Llama-2-7B5.4745.5150.85
Llama-2-13B4.9504.9290.85
Llama-2-70B3.3203.3590.9
Falcon-7B6.5906.6290.6
Falcon-40B5.2285.2550.7
Mistral-7B5.2535.2770.8
Mixtral-8x7B3.8423.8930.8
Guide

Table 7 covers newer models: Llama-2, Falcon, Mistral and the mixture-of-experts Mixtral. W8A8 perplexity stays within about 0.05 of FP16 across the board. The alpha column matters most here: these models need 0.6 to 0.9, higher than OPT's one half, so alpha has to be tuned per model family rather than copied.

Table 8 — decoding stage (FasterTransformer)

Per-token decoding latency and memory.
BS / SeqLenFP16 msOurs msSpeedupFP16 GBOurs GBSaving
OPT-30B (1 GPU)
1 / 5124223141.35×57301.91×
1 / 10245594401.27×58311.87×
16 / 512248817531.42×69441.59×
16 / 1024OOM3947–OOM61–
OPT-175B (8 GPUs)
1 / 5124263591.19×44231.87×
1 / 10245714751.20×44241.85×
16 / 512221216281.36×50301.67×
16 / 1024413332311.28×56371.52×
Guide

Table 8 measures the decoding stage, where tokens are generated one at a time, in FasterTransformer. SmoothQuant is 1.19 to 1.42 times faster than FP16 and saves 1.5 to 1.9 times the memory, and at batch 16 with length 1024 it runs where FP16 is out of memory. Speed-ups are smaller than in the prompt stage because decoding is limited more by memory traffic than by arithmetic.

Table 9 — MT-NLG 530B accuracy

LAMBADAHellaSwagPIQAWinoGr.Avg
FP1676.6%62.1%81.0%72.9%73.1%
INT877.2%60.4%80.7%74.1%73.1%
Guide

Table 9 shows that SmoothQuant scales to MT-NLG, a 530 billion parameter model. The eight-bit model averages 73.1 percent across four tasks, identical to FP16, with small wins and losses on individual tasks. This is the largest model in the paper and the accuracy side of the serving result in Table 10.

Table 10 — serving MT-NLG 530B

INT8 on 8 GPUs (one node) ≈ FP16 on 16.
SeqLenPrec.#GPUsLatencyMemory
128FP1616232ms1040GB
INT88253ms527GB
256FP1616451ms1054GB
INT88434ms533GB
512FP1616838ms1068GB
INT88839ms545GB
1024FP16161707ms1095GB
INT881689ms570GB
Guide

Table 10 is the serving result for MT-NLG 530B. Eight-bit weights and activations on eight GPUs, a single node, give about the same latency as FP16 on sixteen, for example 839 against 838 milliseconds at length 512, while memory roughly halves. Fitting the model in one node instead of two is the practical payoff.

Table 11 — latency per scheme (ms, batch 4)

PyTorch, A100.
Model / SeqLen13B/25613B/51230B/25630B/512
FP16152.6296.3343.0659.9
LLM.int8()237.1371.5387.9654.9
SmoothQuant-O1124.5243.3246.7490.7
SmoothQuant-O2120.5235.1240.2478.3
SmoothQuant-O3112.1223.1227.6458.4
Guide

Table 11 gives the exact PyTorch latencies behind chart R2, in milliseconds at batch four. Each step from O1 to O3 shaves a few percent, and O3 is fastest everywhere, for example 223.1 against 296.3 milliseconds for FP16 on OPT-13B at length 512. LLM.int8 is slower than FP16 except for a tie on OPT-30B at length 512.

Appendix A (text only): weight-only methods such as GPTQ dequantize to FP16 on the fly and shine at batch-1 generation (memory-bound); W8A8 wins in the context stage and with batching (compute-bound), and also shrinks the KV cache. The authors see the two as orthogonal (GPTQ-style weights + SmoothQuant activations → possibly W4A4).

§8Why it matters for this thesis

SmoothQuant → LTX-2.3 on OpenVINO / NNCF

  • It is only needed for the INT8-activation path. Weight-only INT8/INT4 (nncf.compress_weights) never quantizes activations, so outliers there are harmless and SmoothQuant does not apply. It matters when trying full W8A8 with nncf.quantize(..., model_type=nncf.ModelType.TRANSFORMER), where NNCF runs its SmoothQuant step before inserting FakeQuantize nodes (per-MatMul α via AdvancedSmoothQuantParameters; default for MatMul is high, ~0.95 in recent releases — check the installed version and sweep it as in Fig. 10).
  • No custom kernels. Everything is plain ops: a per-channel Multiply (or a folded LayerNorm/linear) plus a rescaled weight constant, then OpenVINO's standard INT8 MatMul (VNNI/AMX on Xeon, XMX/DP4A on Arc). This is exactly the “off-the-shelf INT8 GEMM” argument of Eq. (2).
  • Calibration must cover the diffusion timesteps. Static per-tensor activation scales (O3-style, what OpenVINO FakeQuantize uses) are tuned to calibration statistics; in a DiT the activation ranges drift with timestep and adaLN modulation, so the calibration set should sample prompts × several denoising steps, not just one step.
  • Fold targets differ in a DiT. LTX-style blocks use adaLN (LN(x)·(1+scale(t))+shift(t)), so \(1/\mathbf{s}\) cannot simply be folded into a static LayerNorm γ; NNCF's explicit Multiply node sidesteps this at a small element-wise cost. Attention BMMs and FFN inputs are the natural candidates (Fig. 6).
  • Why W8A8 can pay off for video. A video DiT processes thousands of latent tokens per step — the compute-bound “context stage” regime where the paper's speed-ups appear (Appendix A), whereas weight-only compression mainly saves bandwidth/memory. Compare both on Arc/CPU before choosing.
Guide

Use SmoothQuant only when trying full eight-bit activations for LTX-2.3; weight-only compression with nncf compress weights does not need it. With nncf quantize and the transformer model type, NNCF already applies smoothing, so sweep its alpha as in Figure 10 rather than trusting the default. Calibrate on several prompts times several denoising steps, expect explicit Multiply nodes around adaptive LayerNorm, and benchmark W8A8 against weight-only on Arc and CPU before choosing.

Quantization foundations (LLMs)

AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration

Ji Lin, Jiaming Tang, Haotian Tang, Shang Yang, Wei-Ming Chen, Wei-Chen Wang, Guangxuan Xiao, Xingyu Dang, Chuang Gan, Song Han — MIT / SJTU / NVIDIA / Tsinghua / MIT-IBM / UMass. MLSys 2024 (Best Paper Award).

Only about 1% of weight channels really matter, and they are found by looking at the activations, not at the weights. AWQ protects them by multiplying those channels by a scale before 4-bit rounding (and dividing the activations by the same scale), so every weight stays in one simple INT4 format. The companion runtime TinyChat turns the 4× smaller weights into about 3× faster token generation on edge GPUs and CPUs.

Format
W4A16 / W3A16, g128
Salient channels
~0.1–1%, by |activation|
Search
1 scalar α, grid of 20
Calibration
16 seqs ≈ enough (10× < GPTQ)
Speed-up (TinyChat)
3.2–3.3× avg, up to 3.9×
Llama-2-7B INT4 PPL
5.60 (FP16 5.47)
Reading guide

AWQ asks how to squeeze a large language model's weights down to four or three bits without retraining and without losing accuracy. Its answer: only about one percent of weight channels really matter, they are found by looking at activation sizes, and they are protected by scaling them up before rounding, so every weight stays in one simple INT4 format. The tab moves from a big picture diagram to the problem, the method and its kernels, every equation and figure, the result tables, and a thesis box. This is the fifth of sixteen papers and the last of the three language model foundations, after GPTQ and SmoothQuant. It is the most directly usable for the LTX-2.3 study, because NNCF offers AWQ as an option in INT4 weight compression. The diffusion papers that follow adapt these ideas to image and video transformers.

§0Before reading

To follow AWQ, three ideas are needed: what weight-only 4-bit storage with one scale per group of 128 weights looks like, what an "input channel" of a linear layer is and why a large activation there magnifies that weight's rounding error, and why generating text one token at a time is limited by memory traffic rather than arithmetic. AWQ is in the atlas because it is the method NNCF offers as its awq option for INT4 weight compression, the exact tool used on LTX-2.3 in this project.

Stored: one group 128 weights along the input axis … FP16, 16 bit each round to 16 levels … 312 70 915 58 INT4 codes, 4 bit 1 scale Δ (FP16) shared by all 128 = "g128" At run time code × Δ FP16 weight FP16 input x multiply-add W4 A16 weights 4 bit, inputs 16 bit
Primer"W4A16, g128" means 4-bit weights, 16-bit activations, one scale per 128 weights. Each run of 128 weights gets one step size \(\Delta\) (largest absolute weight divided by the top level) and every weight becomes one of 16 whole-number levels (say 0 to 15). At run time the codes are multiplied back by \(\Delta\) and the arithmetic happens in FP16. Nothing about the activations changes: this is weight-only quantization. RTN ("round to nearest") is this procedure with no extra tricks; AWQ changes what goes into it.
Guide

Everything in AWQ is stored in one simple format, W four A sixteen with group size one twenty eight. Each run of one hundred twenty eight weights shares a single step size, and every weight becomes one of sixteen whole number levels. At run time those codes are multiplied back by the step size and the math happens in FP16, so the activations are never touched. Plain round to nearest is this recipe with no tricks, the baseline AWQ beats.

Input channels y = x · W, one token |x_j| 12 34 56 channel j weight row j (INT4) salient channel big |x| on every token ≈ 1% of channels output error ≈ row error × |x_j| same rounding, 10× bigger damage
PrimerA "channel" is one position of the input vector, and it multiplies one row of weights. Rounding gives every weight a similar small error, but in the output that error is multiplied by the input value it meets. In language models a few channels carry large activations on almost every token (activation outliers, magenta), so errors on their weights hurt most. AWQ calls those weights salient and finds them by averaging \(|x_j|\) over a small calibration set, not by looking at the weights themselves. (The "10×" is illustrative.)
Guide

Each position of the input vector is a channel, and it multiplies one row of weights. Rounding gives every weight a similar small error, but in the output that error is multiplied by the input it meets. A few channels, shown in magenta, carry large inputs on almost every token, so errors on their weights do the most damage. AWQ calls these salient channels and finds them from average activation size, which is the whole idea behind the paper's name.

Why smaller weights run faster memory all weights FP16 INT4: 4× less Context stage whole prompt at once many tokens per weight compute-bound matrix × matrix Generation stage one new token per step 1 token per weight memory-bound matrix × vector Fewer bytes to read → faster steps, only if the kernel unpacks INT4 on the fly
PrimerChat-style generation spends most of its time waiting for weights to arrive from memory. Each new token needs every weight once and does roughly one multiply-add per weight read, a low arithmetic intensity (work per byte). Shrinking weights 4× then means roughly 4× less waiting, which is where TinyChat's speed-ups come from. A diffusion transformer step like LTX-2.3's processes thousands of video tokens at once, so it behaves more like the context stage: there INT4 weights mainly save memory, and speed depends on the kernel.
Guide

Speed-ups in this paper come from memory traffic, not arithmetic. When a chatbot generates text, each new token must read every weight once and does only about one multiply-add per weight, so the processor mostly waits for memory. Four times smaller weights mean roughly four times less waiting. A diffusion transformer step like LTX-2.3's handles thousands of tokens at once, closer to the context stage, so there INT4 weights mainly save memory.

Where this paper sits GPTQ W4, fix error with second-order math SmoothQuant W8A8, move outliers into weights AWQ W4A16, scale salient channels by |x| Q-Diffusion PTQ across timesteps LLM foundations diffusion from here What AWQ adds no backprop, no weight updates one format for all weights kernels that make INT4 fast This thesis NNCF compress_weights, INT4, awq=True on LTX-2.3 linears
PrimerAWQ is the last of the three language-model foundations and the one run directly in this project. GPTQ showed 4-bit weights can work by correcting errors; SmoothQuant showed activation outliers can be moved into weights by a per-channel scale. AWQ reuses that scaling trick, but for weight-only 4-bit, and picks the scale from activation statistics with a tiny search. Next, Q-Diffusion asks what changes when the model runs many denoising timesteps instead of generating tokens.
Guide

AWQ is the fifth paper in the atlas and the last language model foundation. GPTQ showed four bit weights can work by correcting errors, and SmoothQuant showed outliers can be moved with a per-channel scale. AWQ uses that scaling for weight-only four bit, chooses it from activation statistics, and needs no backpropagation. Q-Diffusion comes next and brings timesteps into the picture. For this project, AWQ is the awq option in NNCF weight compression.

Terms used in this paper

Weight-only quantization (W4A16, W3A16)
Only the weights are stored in low precision (4 or 3 bits); activations stay FP16. Saves memory and bandwidth without needing integer activation kernels.
Group size (g128)
How many consecutive weights share one scale. Smaller groups follow the data more closely but store more scales; 128 is the common default and the one AWQ uses.
RTN (round-to-nearest)
The plain baseline: compute each group's scale from its largest value and round every weight to the nearest level. No calibration data.
Salient channel
An input channel whose activations are consistently large, so errors on its weights matter most. AWQ finds about 0.1 to 1 percent of them from activation averages.
Calibration set
A small batch of ordinary inputs run through the model only to measure statistics. AWQ uses a few samples from the Pile, a large public text dataset, and needs no labels or gradients.
Perplexity (PPL), WikiText-2
Perplexity measures how surprised a language model is by real text; lower is better. WikiText-2 is a standard set of Wikipedia articles used to compute it.
Instruction-tuned and multimodal models
Vicuna is a chat-tuned Llama; OpenFlamingo, VILA and LLaVA take images plus text. AWQ shows it works on them because it does not overfit the calibration data.
Context vs. generation stage
Context (prefill) reads the whole prompt in one pass; generation (decode) then produces one token per step, which is the slow, memory-bound part.
Arithmetic intensity, roofline
Arithmetic intensity is computation per byte moved from memory. A roofline plot shows whether a workload is limited by memory speed (low intensity) or by compute (high intensity).
Kernel, kernel fusion
A kernel is one compiled routine that runs on the GPU or CPU, such as a matrix multiply. Fusion merges several small ones so data stays on chip instead of going back to memory.
TinyChat
The authors' own inference engine for AWQ models, with kernels that unpack INT4 weights inside the matrix multiply. It is the source of the reported speed-ups.
RTX 4090, RTX 4070 laptop
NVIDIA consumer GPUs: a desktop card and a laptop chip (the paper's has 8 GB of memory). Used to show speed on ordinary PCs.
Jetson Orin
NVIDIA's embedded computer for robots and edge devices, with CPU and GPU sharing one memory. The paper's main "on-device" GPU.
Raspberry Pi 4B
A small, cheap single-board computer with an ARM CPU. The paper runs a 7B model on its CPU to show deployment on very weak hardware.
Guide

These are the terms the paper uses without explaining. The most important are weight-only quantization with group size one twenty eight, salient channels, and the calibration set, a few text samples used only to measure activation sizes. Perplexity on WikiText-2 is the main accuracy score, where lower is better. The hardware names, RTX 4090, Jetson Orin and Raspberry Pi, mark the range of devices from desktop GPU down to a tiny ARM computer.

§2Big picture

Plain RTN int4 AWQ: scale, then round |x| per channel salient weight rows W same rounding error error ≈ Δ · RoundErr · |x| big |x| on salient channel amplifies its rounding error OPT-6.7B INT3: PPL 23.54 keep 1% FP16? PPL 11.39, but mixed precision is slow x ÷ s (folded) ÷ s W · s, all INT4 × s, then round error ≈ Δ′ · RoundErr · |x| / s Δ′ ≈ Δ, so salient error shrinks by 1/s W·diag(s) · diag(s)⁻¹·X = W·X exactly OPT-6.7B INT3: PPL 11.39 (AWQ)
Guide

The whole paper fits in these two panels. On the left, plain round to nearest gives every weight the same rounding error, but that error is multiplied by the input, so channels with large activations hurt the most. Keeping them in FP16 fixes accuracy but mixes formats, which is slow. On the right, AWQ multiplies those weights by a scale s and divides the input by s, so the product is unchanged while the salient error shrinks by about one over s, and all weights stay INT4.

Error from rounding a weight is multiplied by its input activation, so channels with big activations dominate the error. AWQ scales those weight channels up (smaller relative rounding error) and the activations down by the same factor, which is folded into the previous op. No retraining, no mixed precision, no custom data format.

§3The problem

Error contribution per input channel (illustrative) input channel |x| · Δ · RoundErr ~1% channels dominate Which 1% to keep FP16? (OPT-6.7B, INT3) FP16 model 10.86 RTN (none kept) 23.54 by weight norm 22.37 random 24.23 by activation 11.39 WikiText-2 PPL ↓ (Table 1)
Guide

A handful of input channels dominate the error. The left chart is illustrative: each channel's error is roughly activation size times step size times rounding error, and about one percent stand out. The right bars are real, from Table 1, for OPT six point seven B at three bits. Keeping one percent in FP16 chosen by activation brings perplexity from 23.54 to 11.39, near FP16's 10.86; choosing by weight size or at random barely helps. The method is built on this observation.

RTN at 3–4 bit salient channels get same rounding error as the rest OPT-1.3B INT3: 14.62 → 119 1% FP16 (mixed precision) accurate but irregular layout: no fast kernel "bad hardware efficiency" GPTQ reconstruction second-order updates can overfit calibration domain +2.3 to +4.9 PPL off-domain
Guide

Here are the three existing options AWQ wants to beat, each with its weakness. Plain round to nearest at three or four bits wrecks small models, for example OPT one point three B goes from a perplexity of 14.62 to 119. Keeping one percent in FP16 is accurate but gives an irregular layout with no fast kernel. GPTQ's second order reconstruction can overfit its calibration data, costing 2.3 to 4.9 perplexity when tested on a different domain. AWQ aims for accuracy, one uniform format, and robustness at once.

  • Plain RTN collapses at 3 bits (OPT-1.3B: PPL 14.62 → 119).
  • Keeping the 1% of channels with large activations in FP16 recovers most of it; picking by weight norm is no better than random (Table 1).
  • But mixed FP16/INT storage needs irregular kernels; GPTQ-style reconstruction can overfit the calibration domain.
  • On-device decoding (batch 1) is memory-bound: weight bytes, not FLOPs, set the speed (Fig. 3).

§4Method

A. Activation-aware scaling search

Calibration small Pile subset s_X = mean |X| per input channel grid search α ∈ [0,1] s = s_X^α (20 points) Q(W·diag(s))·(X/s) L = ‖… − W·X‖ weight clip min MSE INT4 g128 stored weights prev. op LayerNorm / Linear × diag(s)⁻¹ folded in Q(W·diag(s)) uniform INT4 GEMM ≈ W·X α*, s*
Guide

The method has two halves. Offline, a small slice of the Pile runs through the model, the average activation size per input channel is measured, and a grid search over alpha picks the scale with the lowest layer output error; clipping is then tuned. At inference, the inverse scale is folded into the previous operation, such as a LayerNorm, so the stored INT4 weights feed an ordinary uniform matrix multiply. Equations four and five are the loss and search shown here.

  1. Run a small generic calibration set (Pile) through the model; cache each linear layer's input X.
  2. Per input channel, compute the average activation magnitude sX.
  3. For α on a 20-point grid in [0,1], set s = sXα, quantize W·diag(s) (INT4/INT3, g128) and measure the output error ‖Q(W·diag(s))(X/s) − WX‖; keep the best α.
  4. Apply weight clipping chosen to minimise quantization MSE.
  5. Fold diag(s)−1 into the preceding operator; store uniform low-bit weights + FP16 group scales. No backprop, no weight reconstruction.
Guide

The procedure is deliberately cheap. It only needs forward passes on a small generic calibration set, to cache each layer's inputs and measure how large each channel's activations are. From that it tries twenty strengths of scaling, quantizes, and keeps whichever gives the smallest output error. Clipping is then set, the inverse scale disappears into the previous operator, and plain low bit weights are stored with FP16 group scales. There is no backpropagation and no weight reconstruction, which is why AWQ generalizes well across domains.

Salient error falls, collateral rises (Table 2) 0 0.25 0.5 0.75 1 1 1.25 1.5 2 4 scale s on 1% salient channels (Δ′/Δ)·1/s % groups with Δ′≠Δ (×4) 10 15 20 25 1 1.25 1.5 2 4 OPT-6.7B WikiText-2 PPL vs s 23.54 12.87 12.48 11.92 12.36 FP16 10.86 best at s = 2
Why a search, not a fixed s. Larger s keeps shrinking salient error (indigo) but changes more group maxima Δ (rust), amplifying non-salient error; perplexity is best at s = 2. AWQ's α search balances this automatically.
Guide

Scaling up the salient channels is not free, which is why AWQ searches rather than fixing s. In the left chart the indigo curve, the salient error factor, keeps falling as s grows, while the rust curve, the share of groups whose maximum and so step size changes, keeps rising and hurts the other weights. The right chart shows perplexity for OPT six point seven B is best at s equals two, 11.92, and worse again at four. Equation five's alpha search finds this balance automatically per layer.

AWQ per linear layer (reconstructed from §3.2 / §5.1 — the paper has no Algorithm box) input : FP16 weight W, cached calibration inputs X (small Pile subset), bits N, group 128 s_X ← mean_over_tokens |X| # per input channel best ← ∞ for α in {0, 1/20, 2/20, …, 1}: # grid size 20 s ← s_X ^ α Wq ← Q_N,g128( W · diag(s) ) # Eq. (1) L ← ‖ Wq · (diag(s)^-1 · X) − W · X ‖ # Eq. (4) if L < best: best, s* ← L, s W' ← clip( W · diag(s*) ) with clip range chosen to minimise MSE of quantisation fold diag(s*)^-1 into the preceding op (LayerNorm / previous Linear) store Q(W') as INT4/INT3 g128 + FP16 group scales
Guide

The tab reconstructs this box from sections 3.2 and 5.1, since the paper has none. For each linear layer it measures the mean activation size per input channel, then tries twenty values of alpha from zero to one, using the statistic raised to alpha as the scale, quantizing the scaled weights and measuring output error against full precision. The best scale wins, clipping is applied, the inverse scale is folded into the preceding operator, and weights are stored at four or three bits in groups of 128.

B. TinyChat runtime

On-the-fly dequantization fused into GEMM / GEMV DRAM INT4 packed W + scales 4× less one fused kernel (registers / shared mem) shift + AND FMA scale → FP16 FP16 FMA with activation FP16 output no dequantized W written to DRAM Kernel fusion (each FP16 kernel ≈ 0.01 ms ≈ launch overhead on 4090) LayerNorm mul div sqrt … one kernel Attention Q K V RoPE fused QKV + on-the-fly pos. emb. KV cache pre-allocated buffers update inside attention kernel CPU: whole graph lowered to C++ backend: CUDA/PTX, Neon, AVX
Turning 4× fewer bytes into speed. INT4 × FP16 has no hardware instruction, so weights are dequantized inside the matmul kernel (both GEMM and GEMV) and never written back to DRAM. Platform-aware packing (Fig. 4) makes unpacking cheap; kernel fusion removes launch overhead, which matters because each FP16 kernel takes only ~0.01 ms on a 4090.
Guide

Fewer bytes only become speed if the kernel is built for it. There is no hardware instruction that multiplies INT4 by FP16, so TinyChat unpacks and dequantizes the weights inside the matrix multiply kernel, in registers, and never writes full precision weights back to memory. It also fuses small operations like LayerNorm and attention pieces into single kernels, because on an RTX 4090 each tiny FP16 kernel takes about as long as its launch overhead. In this project, the OpenVINO CPU and GPU plugins play this role.

§5Every equation

—\[ y = \mathbf{w}\mathbf{x}, \qquad y = Q(\mathbf{w})\mathbf{x} \]

A group/block of weights \(\mathbf{w}\) applied to input \(\mathbf{x}\), and its weight-quantized counterpart (activations stay FP16).

Guide

This sets up the notation. y equals w times x is a normal linear operation, where w is a group of weights and x is the input. The second form, y equals Q of w times x, is the same operation with only the weights quantized, Q being the quantizer, while the activations x stay in FP16. This is weight only quantization, the W4A16 setting that the rest of the paper and NNCF's INT4 compression use.

(1)\[ Q(\mathbf{w}) = \Delta \cdot \operatorname{Round}\!\left(\frac{\mathbf{w}}{\Delta}\right), \qquad \Delta = \frac{\max(|\mathbf{w}|)}{2^{N-1}} \]

Symmetric absmax round-to-nearest with \(N\) bits; \(\Delta\) is the step size of the group (g128 in the paper).

Guide

Equation one is the basic quantizer. Q of w equals delta times the rounded value of w divided by delta, so weights are snapped to a grid of evenly spaced levels. Delta, the step size, is the largest absolute weight in the group divided by two to the power N minus one, where N is the number of bits. Because delta depends on the group maximum, a group of 128 weights shares one step size, which is the detail equation two exploits.

(2)\[ Q(w\cdot s)\cdot\frac{x}{s} = \Delta' \cdot \operatorname{Round}\!\left(\frac{ws}{\Delta'}\right)\cdot x \cdot \frac{1}{s} \]

Scale one weight \(w\) up by \(s\gt 1\) and its input \(x\) down by \(s\): mathematically the same product; \(\Delta'\) is the new group step size.

Guide

Equation two is the key trick. Multiply one weight w by a scale s greater than one, and divide its input x by the same s. Mathematically the product is unchanged, but now the weight is rounded at a larger size, so after dividing by s its rounding error is relatively smaller. Delta prime is the group's new step size, which may differ slightly from delta if the scaled weight becomes the group maximum.

—\[ \mathtt{RoundErr}(\cdot) \sim 0.25, \qquad \Delta' \approx \Delta \]

Empirical facts: rounding error is ~uniform on [0, 0.5] (mean 0.25); scaling one element rarely changes the group max; \(\Delta\), \(x\) are FP16 (no error).

Guide

These are two empirical facts that make the argument work. First, the rounding error of a single weight is spread roughly evenly between zero and one half, so its average is about 0.25 and does not depend on scaling. Second, scaling one weight rarely changes the group maximum, so delta prime is about equal to delta. The step size and the input are FP16 and add no error. Equation three and the ratio that follows rely on both facts.

(3)\[ \begin{aligned} \operatorname{Err}\big(Q(w)x\big) &= \Delta \cdot \mathtt{RoundErr}\!\left(\frac{w}{\Delta}\right)\cdot x \\ \operatorname{Err}\!\left(Q(w\cdot s)\left(\frac{x}{s}\right)\right) &= \Delta' \cdot \mathtt{RoundErr}\!\left(\frac{ws}{\Delta'}\right)\cdot x \cdot \frac{1}{s} \end{aligned} \]

Output error before and after scaling; the error is proportional to \(|x|\), which is why large-activation channels are salient.

Guide

Equation three writes out the output error before and after scaling. Before, it is delta times the rounding error of w over delta, times x. After, it is delta prime times the rounding error of the scaled weight, times x, times one over s. The first line shows why saliency comes from activations: the error grows with the size of x, so channels with large inputs contribute most. The second line shows the extra factor one over s that scaling adds.

—\[ \frac{\operatorname{Err}_{\text{new}}}{\operatorname{Err}_{\text{orig}}} = \frac{\Delta'}{\Delta}\cdot\frac{1}{s} \]

With \(\Delta'\approx\Delta\) and \(s\gt 1\), the salient weight's relative error shrinks by ~\(1/s\); non-salient channels in the group are amplified by \(\Delta'/\Delta\) (Table 2).

Guide

Dividing the two errors gives the ratio: new error over original error equals delta prime over delta, times one over s. With delta prime about equal to delta and s greater than one, the salient weight's error shrinks by roughly one over s. The catch is the other weights in the group, which see their step size grow by delta prime over delta. Table 2 measures exactly this trade off.

(4)\[ \mathbf{s}^* = \arg\min_{\mathbf{s}} \mathcal{L}(\mathbf{s}), \qquad \mathcal{L}(\mathbf{s}) = \big\lVert Q\big(\mathbf{W}\cdot\operatorname{diag}(\mathbf{s})\big)\big(\operatorname{diag}(\mathbf{s})^{-1}\cdot\mathbf{X}\big) - \mathbf{W}\mathbf{X} \big\rVert \]

Per-input-channel scale that minimizes a layer's output error after quantization; \(\mathbf{X}\) = cached calibration inputs; \(\operatorname{diag}(\mathbf{s})^{-1}\) is fused into the previous operator.

Guide

Equation four turns the idea into an optimization. The best scale vector s star is the one that minimizes L of s, the size of the difference between the quantized layer output and the full precision output W times X. Here W is the weight matrix, X is the cached calibration input, and diag of s is a diagonal matrix of per input channel scales whose inverse is folded into the previous operator. Because Q is not differentiable, the paper solves it by the simple search in equation five.

(5)\[ \mathbf{s} = \mathbf{s_X}^{\alpha}, \qquad \alpha^* = \arg\min_{\alpha} \mathcal{L}\big(\mathbf{s_X}^{\alpha}\big) \]

Search space: \(\mathbf{s_X}\) = per-channel average activation magnitude; one scalar \(\alpha\in[0,1]\) (grid of 20) trades salient vs non-salient protection (0 = no scaling).

Guide

Equation five shrinks the search to one number. The scale is s X raised to the power alpha, where s X is the average activation size per input channel. Alpha between zero and one sets how strongly salient channels are protected: zero means no scaling, one means scaling fully by activation size. The best alpha is found by trying twenty grid points and keeping the one with the lowest loss from equation four.

—\[ \text{AI}_{\text{gen, FP16}} \approx 1\ \tfrac{\text{FLOP}}{\text{Byte}} \;\Rightarrow\; 1\ \text{TFLOPS}; \qquad \text{AI}_{\text{gen, W4A16}} \approx 4 \;\Rightarrow\; 4\ \text{TFLOPS}; \qquad \text{AI}_{\text{ridge}} = \tfrac{165\ \text{TFLOPS}}{1\ \text{TB/s}} = 165 \]

Roofline numbers (§4.1, RTX 4090): below 165 FLOP/Byte a workload is memory-bound, so cutting weight bytes 4× raises attainable throughput ~4×.

Guide

These roofline numbers explain the speed up. Arithmetic intensity is operations done per byte loaded. On an RTX 4090, with 165 TFLOPS and one terabyte per second, anything below 165 operations per byte is memory bound. FP16 token generation sits near one, reaching about one TFLOPS; four bit weights raise it to about four, so throughput rises about four times. A video diffusion transformer processes many tokens at once and sits much higher, so expect a smaller latency gain.

—\[ \text{index offset of adjacent packed weights} = \tfrac{1}{8}\times 2^{n} \quad (2^{n}\text{-bit SIMD register}) \]

Packing rule (§4.2): a 128-bit NEON register holds 16 bytes, so pairs are (wi, wi+16); on GPUs 8 weights are packed as w{0,2,4,6,1,3,5,7}.

Guide

This is the packing rule from section 4.2. For a SIMD register of two to the n bits, weights that share a byte should be one eighth of two to the n positions apart. For a 128 bit ARM NEON register this means pairing weight i with weight i plus 16, and on GPUs eight weights are stored in the interleaved order zero, two, four, six, one, three, five, seven. It is an engineering detail that makes unpacking cheap; Figure 4 illustrates it.

§6Every figure

TinyChat Computer Jetson Orin Nano Raspberry Pi ARM CPU MacBook Apple M1 AI PC CPU / GPU fp16 int4 FP16 LLM large AWQ INT4 Quantization Algorithm: AWQ Inference System: TinyChat 3–4× faster than FP16 on edge platforms
Fig. 1AWQ (algorithm) + TinyChat (system). Schematic redraw: an FP16 LLM is compressed to 4-bit weights by AWQ and executed by TinyChat on edge hardware (Jetson Orin Nano "TinyChat computer" with 8 GB / 15 W, Raspberry Pi, MacBook M1, AI PC), giving a 3–4× boost over FP16.
Guide

Figure one presents the paper as two parts working together. AWQ, the algorithm, compresses an FP16 language model to four bit weights, and TinyChat, the inference system, runs it on edge devices such as a Jetson Orin Nano, a Raspberry Pi, an Apple M1 MacBook, and an AI PC. The claimed payoff is three to four times faster than FP16. This is a schematic redraw, so read it as an overview, not a result.

W (FP16)Q(W) INT3+1.2−0.2−2.4−3.4−2.5−3.5+1.9+1.4−0.9+1.6−2.5−1.9−3.5+1.5+0.5−0.1+1.8−1.6−3.2−3.4+2.4−3.5−2.8−3.9+0.1−3.8+2.4+3.4+0.9+3.3−1.9−2.3+1+0−2−3−3−4+2+1−1+2−3−2−4+2+1+0+2−2−3−3+2−4−3−4+0−4+2+3+1+3−2−2Q(a) RTN: PPL 43.2Q(W) MixPrecbad hardware efficiency+1+0−2−3−2.5−3.5+1.9+1.4−1+2−3−2−4+2+1+0+2−2−3−3+2−4−3−4+0−4+2+3+1+3−2−2FP16 channelX*salient byactivation(b) keep 1% salient FP16: PPL 13.0Q(W) INT3X*avg |x|scale ∝ avg|x|^α(c) scale before quantize: PPL 13.0
Fig. 2Activation-aware saliency: keep or scale 1% of channels. OPT-6.7B, INT3-g128. (a) Plain round-to-nearest: PPL 43.2. (b) Rows (input channels) whose activation column in X is large are kept FP16 (magenta row): PPL 13.0 but mixed-precision storage. (c) AWQ instead multiplies those rows by a per-channel scale derived from average |x| before quantizing (darker = larger scale), keeping one uniform INT3 format: PPL 13.0. Matrix values transcribed from the paper.
Guide

Figure two walks through the three options on a small weight matrix, OPT six point seven B at three bits with group size 128. Panel a is plain rounding, with a perplexity of 43.2 in this figure. Panel b keeps the row whose activation column is large in FP16, bringing perplexity to 13.0 but mixing formats. Panel c instead scales that row before quantizing, darker meaning a larger scale, and also reaches 13.0 while keeping one uniform INT3 format. That match is the paper's central claim.

10 ms 310 ms Context (200 tok) Generation (20 tok) (a) generation is slower 0 36 72 108 144 180 0 75 150 225 300 gen. W4A16: AI=4→ 4 TFLOPS gen. W16A16: AI=1 → 1 TFLOPS context: AI ≥ 165 peak TFLOPS arithmetic intensity (FLOPs/Byte) (b) generation is memory-bound 1e-2 1e-1 1e0 1e1 1e2 1e3 134 1.7 79× Attention 271 0.2 1700× FFN memory (MB, log) weight activation (c) weight loading dominates
Fig. 3Why weight-only int4 speeds up on-device LLMs. Llama-2-7B, RTX 4090, batch 1. (a) Generating 20 tokens takes 310 ms vs 10 ms for a 200-token prompt. (b) Roofline (165 TFLOPS, 1 TB/s): FP16 generation has arithmetic intensity ≈1 (1 TFLOPS); W4A16 raises it to ≈4 (4 TFLOPS); prefill (AI ≥ 165) is compute-bound. (c) Per-layer weight bytes exceed activation bytes by 79× (attention) and 1700× (FFN).
Guide

Figure three argues that weight only four bit quantization pays off because generation is memory bound. Panel a shows generating 20 tokens takes 310 milliseconds against 10 for a 200 token prompt on Llama two seven B. Panel b places generation far left on the roofline, at an arithmetic intensity near one, and four bit weights move it to about four. Panel c shows weights outweigh activations by 79 times in attention and 1700 times in the feed forward layers. Equation nine gives the same numbers.

Original WPacked P_w w31w30…w16w15…w1w0 1270 4 bit reorder offline w31w15…w2w17w1w16w0 1270 runtimeunpack W_low = P_w & Mask 0w15…w20w10w0 W_high = (P_w >> 4) & Mask 0w31…w180w170w16 Mask = 0x0F…0F (128-bit) 3 SIMD ops unpack 32 weights 0 300 600 900 1200 latency (µs) 248 215 (4k,4k) 472 399 (11k,4k) 489 400 (4k,11k) 1172 954 (4k,32k) original weights packed weights GEMV shape (out, in) on ARM NEON up to 1.2× faster
Fig. 4SIMD-aware weight packing (ARM NEON, 128-bit). Offline, 32 INT4 weights are reordered as w0,w16,w1,w17,…,w15,w31 so each byte holds wi (low nibble) and wi+16 (high nibble). At runtime one AND with a 0x0F mask yields w0–w15 as bytes and one shift+AND yields w16–w31: 3 SIMD instructions for 32 weights instead of 3 scalar ops per weight. Right: latency 248→215, 472→399, 489→400, 1172→954 µs.
Guide

Figure four shows how TinyChat unpacks four bit weights quickly on an ARM CPU. Offline, 32 weights are reordered so each byte holds weight i in the low half and weight i plus 16 in the high half. At runtime one AND with a mask gives the first sixteen, and one shift plus AND gives the other sixteen, so three SIMD instructions unpack 32 weights. The latency chart on the right drops, for example, from 248 to 215 microseconds. It is the concrete case of equation ten.

0 20 40 60 80 RTN 6 3 71 GPTQ 4 1 75 AWQ 23 5 52 (a) Vicuna-7B 0 20 40 60 80 RTN 14 9 57 GPTQ 17 6 57 AWQ 22 11 47 (b) Vicuna-13B quantized win tie quantized lost
Fig. 5Instruction-tuned models: AWQ wins more GPT-4 comparisons. INT3-g128 Vicuna vs its FP16 counterpart on 80 questions, judged both orders (160 trials; bars sum to 80 per order as plotted). AWQ: 23 wins/5 ties/52 losses (7B) and 22/11/47 (13B) vs RTN 6/3/71, 14/9/57 and GPTQ 4/1/75, 17/6/57.
Guide

Figure five tests instruction tuned chat models, where perplexity says little. Three bit Vicuna answers are compared with their FP16 originals on 80 questions, judged by GPT-4. The bars count how often the quantized model wins, ties, or loses. AWQ loses least: for Vicuna seven B it has 23 wins and 52 losses, against 71 losses for plain rounding and 75 for GPTQ. This supports the claim that AWQ keeps behaviour, not just perplexity.

meme image: fried chicken nuggets shaped like a world map caption: "…pictures of the Earth from space…" Q: Can you explain this meme in detail? INT4-g128 RTN — wrong claims small pictures of Earth and planets are placed on top of the food (hallucination) INT4-g128 AWQ — correct humorous take: nuggets resemble Earth seen from space; food + Earth context is the joke
Fig. 6Visual reasoning survives AWQ, not RTN. Schematic of the LLaVA-13B example (photo replaced by a description). At INT4-g128, RTN hallucinates Earth pictures on the plate; AWQ understands that the nuggets look like Earth from space.
Guide

Figure six is a qualitative example on LLaVA thirteen B, a vision language model, at four bits with group size 128. Asked to explain a meme of chicken nuggets arranged like a world map, the plain rounding model hallucinates tiny pictures of Earth on the food, while the AWQ model gets the joke that the nuggets look like Earth from space. The photo is replaced by a description here. It shows AWQ carries over to multimodal models without special tuning.

image: toy airplanes on grass W4-RTN — wrongmodel airplaneflying in the sky W4-AWQ — correcttwo toy airplanessit on grass field image: man, child, elephant W4-RTN — wrongman holding babyelephant in arms W4-AWQ — correctman and daughterpose with elephant image: two dogs on street W4-RTN — wronga man and a dogwalking past bushes W4-AWQ — correcttwo dogs walkingon the street
Fig. 7Captioning (OpenFlamingo-9B, 4-shot, INT4-g128). Schematic gallery (photos described). RTN captions contain wrong content (airplane "flying", man "holding a baby elephant", "a man and a dog"); AWQ captions match the image.
Guide

Figure seven repeats the multimodal story with image captioning on OpenFlamingo nine B, four shot, at four bits. The photos are described in words. Plain rounding produces wrong content, like a toy airplane said to be flying or a man holding a baby elephant, while AWQ's captions match the images. Table 6 gives the matching numbers, with AWQ losing only about one CIDEr point at 32 shots.

13 13.5 14 8 16 32 64 128 192 256 GPTQ AWQ (ours) # calibration sequences (×2048 tokens) perplexity (a) needs a smaller calibration set calib ↓ / eval → GPTQ PubMedEnron 32.48 50.41 34.81 45.52 +4.89 off-domain +2.33 off-domain AWQ (ours) PubMedEnron 32.56 45.07 33.16 44.57 +0.50 off-domain +0.60 off-domain PubMedEnron (b) robust to calibration distribution
Fig. 8Data-efficient and robust calibration (OPT-6.7B, INT3-g128). (a) AWQ with 16 sequences already beats GPTQ with 192 (10× less data); curve shape redrawn, endpoints ≈13.0 (AWQ) vs ≈14.0→13.1 (GPTQ). (b) Calibrating on one Pile subset and evaluating on the other (off-diagonal) costs AWQ only +0.50/+0.60 PPL vs +4.89/+2.33 for GPTQ; diagonal (teal) = same domain.
Guide

Figure eight shows AWQ needs little calibration data and does not overfit it. Panel a plots perplexity against the number of calibration sequences for OPT six point seven B at three bits: AWQ with 16 sequences already beats GPTQ with 192, about ten times less data; the curve shape is redrawn. Panel b calibrates on one Pile subset and tests on another: AWQ loses only 0.5 to 0.6 perplexity off domain, GPTQ loses 2.3 to 4.9. This backs the robustness claim from the problem section.

(a) RTX 4090 desktop GPU 0 50 100 150 200 tokens / s 52 62 194 Llama-2 7B FP16 OOM FP16 OOM 110 Llama-2 13B 59 63 158 MPT 7B FP16 OOM FP16 OOM 49 MPT 30B 33 53 124 Falcon 7B (b) Jetson Orin mobile GPU 0 10 20 30 40 11 12 39 Llama-2 7B FP16 OOM FP16 OOM 21 Llama-2 13B 11 12 38 MPT 7B FP16 OOM FP16 OOM 9 MPT 30B 7 9 22 Falcon 7B (c) RTX 4070 laptop GPU (8 GB) 0 15 30 45 60 FP16 OOM 61 Llama-2 7B FP16 OOM 33 Llama-2 13B FP16 OOM 60 MPT 7B FP16 OOM 52 Falcon 7B Huggingface (FP16) TinyChat (FP16) TinyChat (AWQ, W4A16)
Fig. 9TinyChat turns 4-bit into 2.7–3.9× real speed. Tokens/s, batch 1, 4-token prompt, 200 generated tokens. FP16 kernel fusion alone lifts Llama-2-7B on 4090 from 52→62 tok/s; AWQ W4A16 kernels add another 3.1× (194). Up to 3.9× (4090) and 3.5× (Orin) vs Huggingface FP16. On the 8 GB laptop 4070, FP16 does not fit even 7B, while AWQ runs Llama-2-13B at 33 tok/s.
Guide

Figure nine is the system result, in tokens per second at batch one with 200 generated tokens. On an RTX 4090, kernel fusion alone takes Llama two seven B from 52 to 62 tokens per second, and AWQ four bit kernels add another 3.1 times, to 194. Speed ups reach 3.9 times on the 4090 and 3.5 times on Jetson Orin. On an eight gigabyte laptop GPU, FP16 does not even fit a seven B model, while AWQ runs Llama two thirteen B at 33 tokens per second.

0 10 20 30 40 13.4 22.5 15.9 39.1 Llama-2 7B 0 8 16 24 8 13.3 9.1 21.2 Llama-2 13B 0 5 10 2.9 5.8 3.2 8.8 LLaMA 30B 0 2 4 1.3 3 1.4 3.5 Llama-2 70B 0 10 20 6 17 StarCoder 15.5B 0 15 30 10 32 StableCode 3B 0 20 40 14 37 Mistral 7B 0 10 20 3 22 Falcon 7B tokens / s (a) Jetson Orin (64 GB) mobile GPU — separate y-scale per model AutoGPTQ llama.cpp exllama TinyChat 0 1 2 3 4 tokens / s 0.7 0.7 Llama-2 7B NS 0.7 OPT 6.7B NS 3 OPT 1.3B (b) Raspberry Pi 4 (llama.cpp vs TinyChat) NS = not supported by llama.cpp TinyChat runs 7B at 0.7 tok/s and OPT-1.3B at 3.0 tok/s
Fig. 10TinyChat beats other 4-bit edge runtimes. (a) Jetson Orin: 1.2–3.0× over existing systems on Llama models (e.g. Llama-2-7B 39.1 vs 22.5 tok/s for llama.cpp), and ≥2.6× over AutoGPTQ on StarCoder, StableCode, Mistral, Falcon, which llama.cpp/exllama do not support. (b) Raspberry Pi 4: 7B models at 0.7 tok/s; OPT models only run under TinyChat.
Guide

Figure ten compares TinyChat with other four bit edge runtimes. Panel a, on Jetson Orin, shows 1.2 to 3.0 times speed ups on Llama models, for example 39.1 against 22.5 tokens per second for llama.cpp on Llama two seven B, and at least 2.6 times over AutoGPTQ on models that other runtimes do not support. Panel b shows that even a Raspberry Pi 4 runs seven B models at 0.7 tokens per second. The point is that the system side matters as much as the algorithm.

§7Results

Table 1. Keeping 0.1–3% of weight channels FP16 (INT3-g128, WikiText PPL ↓). Only activation-based selection helps.
PPL ↓FP16RTN w3-g128act 0.1%act 1%act 3%W 0.1%W 1%W 3%rand 0.1%rand 1%rand 3%
OPT-1.3B14.62119.0025.0316.9116.68108.7198.5598.08119.76109.3861.49
OPT-6.7B10.8623.5411.5811.3911.3623.4122.3722.4523.5424.2324.22
OPT-13B10.1346.0410.5110.4310.4246.0748.9654.4944.8742.0039.71
Guide

Table one is the evidence for activation aware saliency. At three bits, keeping 0.1, 1, or 3 percent of channels in FP16 helps only when channels are chosen by activation size. For OPT six point seven B, one percent by activation gives 11.39 against 23.54 for plain rounding, while one percent by weight size gives 22.37 and random gives 24.23. OPT one point three B shows the same pattern more dramatically. Figure two's bars are drawn from this table.

Table 2. OPT-6.7B, scaling the 1% salient channels by s (INT3-g128).
OPT-6.7Bs=1s=1.25s=1.5s=2s=4
proportion of Δ′≠Δ0%2.8%4.4%8.2%21.2%
average Δ′/Δ11.0051.0131.0381.213
average (Δ′/Δ)·(1/s)10.8040.6760.5190.303
Wiki-2 PPL23.5412.8712.4811.9212.36
Guide

Table two measures the cost of scaling from equation six. As s grows from one to four, the share of groups whose step size changes rises from zero to 21.2 percent, and the average step size ratio grows to 1.213. The combined error factor for salient weights still falls, to 0.303, but perplexity is best at s equals two, 11.92, and gets worse at four, 12.36. Too much scaling hurts the other weights, which motivates the alpha search.

Table 3. AWQ vs RTN vs 1% FP16 vs fixed s=2 (OPT, INT3-g128, PPL ↓).
OPT (PPL ↓)1.3B2.7B6.7B13B30B
FP1614.6212.4710.8610.139.56
RTN119.47298.0023.5446.0418.80
1% FP1616.9113.6911.3910.439.85
s=218.6314.9411.9210.8010.32
AWQ16.3213.5811.3910.569.77
Guide

Table three compares four strategies on OPT models at three bits. Plain rounding collapses, for example 298 perplexity on two point seven B. Keeping one percent in FP16 and full AWQ are close, AWQ even better on the smallest three models and slightly behind on thirteen B, but AWQ does it with a uniform format. A fixed scale of two is clearly worse than AWQ everywhere, so the searched per layer scale earns its place.

Table 4. LLaMA / Llama-2 WikiText-2 PPL ↓ (g128).
BitsMethodL2-7BL2-13BL2-70BL-7BL-13BL-30BL-65B
FP16–5.474.883.325.685.094.103.53
INT3RTN6.665.523.987.015.884.884.24
INT3GPTQ6.435.483.888.815.664.884.17
INT3GPTQ-R6.425.413.866.535.644.744.21
INT3AWQ6.245.323.746.355.524.613.95
INT4RTN5.734.983.465.965.254.233.67
INT4GPTQ5.694.983.426.225.234.243.66
INT4GPTQ-R5.634.993.435.835.204.223.66
INT4AWQ5.604.973.415.785.194.213.62
Guide

Table four is the main accuracy result on LLaMA and Llama two, from seven to seventy billion parameters, reported as WikiText two perplexity where lower is better. AWQ has the lowest perplexity in every column at both four and three bits, beating plain rounding, GPTQ, and GPTQ with reordering. The gaps are largest at three bits; at four bits all methods are close to FP16. Chart A plots the three bit gaps.

Table 5. AWQ on Mistral-7B-Instruct-v0.2 and Mixtral-8x7B-Instruct-v0.1 (GQA / MoE), WikiText-2 PPL ↓.
Wikitext2 PPL ↓Mixtral-8x7BMistral-7B
FP165.944.14
INT4-g1286.054.30
INT3-g1286.524.83
Guide

Table five checks newer architectures: Mistral seven B, which uses grouped query attention, and Mixtral eight by seven B, a mixture of experts model. At four bits, perplexity rises only by about 0.1 to 0.16 over FP16, and at three bits by roughly 0.6 to 0.7. The takeaway is that AWQ does not depend on a particular transformer layout, which is encouraging for other architectures such as a diffusion transformer.

Table 8. INT4-g128: CodeLlama-7b-Instruct on MBPP, Llama-2 on GSM8K (↑).
MethodMBPP p@1MBPP p@10GSM8K 7B13B70B
FP1638.5349.7713.8726.1656.41
RTN37.5148.4911.0721.2353.98
GPTQ31.9744.7512.1324.2656.03
AWQ40.6449.2513.5725.2556.40
Guide

Table eight, labelled so in the paper, tests harder tasks: code generation on MBPP with CodeLlama seven B, and math word problems on GSM8K with Llama two, both at four bits, where higher is better. AWQ stays close to FP16 and generally ahead of plain rounding and GPTQ; on MBPP pass at one it even slightly exceeds FP16, 40.64 against 38.53. GPTQ drops noticeably on code. This shows the method preserves reasoning ability, not only perplexity.

Table 6. OpenFlamingo-9B, COCO captioning CIDEr ↑ (quantize language part only).
BitsMethod0-shot4-shot8-shot16-shot32-shotΔ(32-shot)
FP16–63.7372.1876.9579.7481.70–
INT4RTN60.2468.0772.4674.0977.13−4.57
INT4GPTQ59.7267.6872.5374.9874.98−6.72
INT4AWQ62.5771.0274.7578.2380.53−1.17
INT3RTN46.0755.1360.4663.2164.79−16.91
INT3GPTQ29.8450.7756.5560.5464.77−16.93
INT3AWQ56.3364.7368.7972.8674.47−7.23
Guide

Table six gives the numbers behind the captioning figure, COCO CIDEr scores for OpenFlamingo nine B with only the language part quantized, higher being better. At four bits AWQ loses 1.17 points at 32 shots, against 4.57 for plain rounding and 6.72 for GPTQ. At three bits the gap widens for everyone, but AWQ loses 7.23 versus about 17 for the others. Chart B plots the four bit rows.

Table 7. VILA INT4-g128 on 11 visual-language benchmarks (accuracy ↑): essentially lossless.
ModelVQAv2GQAVizWizSQA-IVQA-TPOPEMMEMMBSEEDllava-benchMM-Vet
VILA-7B80.363.159.668.062.686.31489.469.861.775.235.1
VILA-7B-AWQ80.163.057.868.061.985.31486.368.861.375.835.9
VILA-13B80.563.663.170.564.086.31553.673.862.878.342.6
VILA-13B-AWQ80.463.663.071.263.587.01552.973.662.277.642.0
Guide

Table seven checks the VILA vision language models on eleven benchmarks at four bits. Each AWQ row sits within about a point of its FP16 row, sometimes above it, for example 87.0 against 86.3 on POPE for VILA thirteen B. The authors call this essentially lossless. For the thesis it is the closest evidence in this paper that four bit weights can keep multimodal quality.

Table 9. INT2-g64 OPT, WikiText-2 PPL ↓: AWQ is orthogonal to GPTQ.
OPT1.3B2.7B6.7B13B30B
FP1614.6212.4710.8610.139.56
RTN104761932107622175648170
GPTQ46.6728.1516.6516.7411.75
AWQ + GPTQ35.7125.7015.7113.2511.38
Guide

Table nine pushes to two bits with group size 64 on OPT, where plain rounding produces perplexities in the thousands or more. GPTQ recovers usable models, and combining AWQ scaling with GPTQ is better still, for example 13.25 against 16.74 on thirteen B. The point is that AWQ is orthogonal to GPTQ, so the two can be stacked, just as NNCF allows AWQ to be enabled together with its GPTQ or scale estimation options.

Table 10. VILA throughput (tokens/s ↑) with TinyChat.
ModelPrecisionA1004090Orin
VILA-7BFP1681.658.511.5
VILA-7B-AWQW4A16155.3168.135.6
VILA-13BFP1648.5OOM6.1
VILA-13B-AWQW4A16102.199.017.5
Guide

Table ten reports TinyChat throughput for VILA in tokens per second. Four bit AWQ roughly doubles or triples speed: VILA seven B goes from 58.5 to 168.1 on the RTX 4090 and from 11.5 to 35.6 on Jetson Orin. VILA thirteen B does not fit the 4090 in FP16 but runs at 99 tokens per second with AWQ. Memory savings can decide whether a model runs at all, which matters for Arc GPUs and laptops.

0 0.8 1.6 2.4 3.2 ΔPPL vs FP16 1.19 0.96 0.95 0.77 L2-7B 0.64 0.6 0.53 0.44 L2-13B 0.66 0.56 0.54 0.42 L2-70B 1.33 3.13 0.85 0.67 L-7B 0.79 0.57 0.55 0.43 L-13B 0.78 0.78 0.64 0.51 L-30B 0.71 0.64 0.68 0.42 L-65B RTN GPTQ GPTQ-R AWQ INT3-g128, WikiText-2 (from Table 4); lower is better
Chart AINT3 degradation: AWQ lowest everywhere. Bar = quantized PPL minus FP16 PPL (Table 4, INT3-g128). GPTQ without reorder blows up on LLaMA-7B (+3.13).
Guide

Chart A plots Table four's three bit rows as degradation, each bar being quantized perplexity minus FP16 perplexity, so shorter is better. Within each model the four bars are plain rounding, GPTQ, GPTQ with reordering, and AWQ, and AWQ is lowest in every group. The standout is GPTQ without reordering on LLaMA seven B, which loses 3.13 points, showing how fragile reconstruction can be.

0 60 120 180 tokens / s 81.6 155.3 VILA-7B A100 58.5 168.1 VILA-7B 4090 11.5 35.6 VILA-7B Orin 48.5 102.1 VILA-13B A100 OOM 99 VILA-13B 4090 6.1 17.5 VILA-13B Orin FP16 AWQ W4A16 0 30 60 90 CIDEr 0-shot 4-shot 8-shot 16-shot 32-shot FP16 RTN GPTQ AWQ VILA throughput with TinyChat (Table 10) OpenFlamingo-9B INT4-g128 CIDEr (Table 6)
Chart BSpeed up ~3×, quality within ~1 CIDEr. Left: TinyChat + AWQ lifts VILA-7B up to 3.1× (Orin 11.5→35.6) and fits VILA-13B on a 24 GB 4090. Right: at INT4, AWQ stays closest to FP16 in every shot setting (32-shot gap 1.17 vs 4.57 RTN).
Guide

Chart B puts speed and quality side by side for multimodal models. The left bars, from Table ten, show TinyChat with AWQ lifting VILA seven B up to 3.1 times on Jetson Orin and letting VILA thirteen B fit on a 24 gigabyte 4090. The right lines, from Table six, show AWQ's captioning score tracking FP16 across all shot counts, 1.17 CIDEr behind at 32 shots versus 4.57 for plain rounding. Together they summarize the paper's promise: about three times faster, nearly no quality loss.

§8Why it matters for this thesis

AWQ → LTX-2.3 on OpenVINO / NNCF

  • Directly available: nncf.compress_weights(model, mode=INT4_SYM|INT4_ASYM, group_size=128, ratio=…, dataset=calib, awq=True) runs this algorithm on an OpenVINO IR. It needs a calibration dataset (activation statistics), but no training and no custom kernels: the OpenVINO CPU/GPU plugins dequantize INT4 weights inside their own matmul kernels, i.e. they play TinyChat's role.
  • Folding constraint: the inverse scale diag(s)−1 must be absorbed by a preceding op. NNCF only applies AWQ where it finds such a pattern (e.g. a MatMul/Multiply feeding the next MatMul, as in gated MLPs); other layers get plain data-aware INT4. Check which DiT linears (attention out-projection, FFN down-projection, adaLN) are actually matched.
  • Calibration for a diffusion transformer: activation magnitudes in a DiT change with the denoising timestep and with prompt/audio-video modality. Build the NNCF calibration set from latents sampled across many timesteps and prompts, otherwise sX reflects only one noise level. AWQ's low data need (Fig. 8) keeps this cheap.
  • Speed expectation differs from LLMs: AWQ's 3× speed-up relies on batch-1 decoding being memory-bound (arithmetic intensity ≈1, Fig. 3). A video DiT processes thousands of latent tokens per step, so it is mostly compute-bound: INT4 weight-only will mainly cut memory and model size (fits Arc / laptop RAM), with smaller latency gains. Measure it, and compare against INT8 weight+activation (W8A8) for compute-bound layers.
  • Mixed precision in practice: use AWQ INT4 for the bulk of linears and keep sensitive layers (first/last projections, timestep/text embedding, adaLN modulation) in INT8 or FP16 via NNCF's ratio / ignored scope. AWQ can be combined with NNCF's scale estimation or GPTQ options, just as the paper combines AWQ with GPTQ (Table 9).
Guide

Use AWQ through NNCF by calling compress weights with an INT4 mode, group size 128, a calibration dataset, and awq set to true, then check which transformer linears it actually matched, since AWQ needs a preceding operation to absorb the inverse scale. Calibrate on many denoising timesteps and prompts, because activation sizes change with noise level. Expect mainly memory savings, since a video diffusion transformer is largely compute bound; compare against W8A8 and keep sensitive layers in INT8 or FP16.

Quantizing diffusion models

Q-Diffusion: Quantizing Diffusion Models

Xiuyu Li, Yijiang Liu, Long Lian, Huanrui Yang, Zhen Dong, Daniel Kang, Shanghang Zhang, Kurt Keutzer · ICCV 2023 (arXiv 2302.04304v3)

Standard post-training quantization (PTQ) breaks on diffusion models for two reasons: the same U-Net sees very different activations at different denoising steps, and U-Net skip concatenations glue together channels with wildly different ranges. Q-Diffusion fixes the first with time-step-aware calibration (sample calibration inputs uniformly across all steps, then BRECQ/AdaRound block reconstruction) and the second with shortcut-splitting quantization (separate quantizers for the two concatenated halves). Result: 4-bit weights, 8-bit activations with near-FP quality, no training.

Precision
W4A8 (also W8A8, W4A32)
CIFAR-10 W4A8 FID
4.93 vs 188.11 linear
Max FID increase (W4A8)
≤ 2.34 over FP
Calibration set
5 120 samples, every 20th step
Models
DDIM, LDM-4/8, Stable Diffusion v1.4
Training needed
None (data-free PTQ)
Reading guide

Q-Diffusion asks why ordinary post-training quantization, which works well on classifiers, falls apart on diffusion models, and how to fix it without any retraining. Its answer: calibrate on inputs sampled evenly across every denoising step, and give the two halves of each U-Net skip concatenation their own quantizers. With these two changes, four-bit weights and eight-bit activations, called W four A eight, stay within about 2.3 FID points of full precision, while naive quantization collapses. The tab starts with a big-picture drawing, then the two problems, the method with its algorithms, every equation and figure, the result tables, and a box on what this means for the thesis. Among the sixteen papers, this is the first of the diffusion-specific quantization group, after the general LLM methods GPTQ, SmoothQuant and AWQ, and it is the ancestor that PTQ4DiT, ViDiT-Q, SVDQuant and the later video methods build on.

§0Before reading

To follow this paper, three ideas are needed: a diffusion model makes an image by running the same network over many denoising steps, quantization uses a small calibration set to choose its scales, and a U-Net copies features through skip connections. Q-Diffusion is in the atlas because it was the first to make post-training quantization work on diffusion models, and its step-aware calibration recipe is what the thesis reuses when building the NNCF calibration set for LTX-2.3.

Sampling: one U-Net reused at every stept = 100pure noiseU-Nett = 75U-Nett = 50U-Nett = 25U-Nett = 0imageInput range at that step±4.5±1.8range shrinks over time
PrimerA diffusion model runs one network many times. Sampling starts from pure noise and applies the same U-Net at every step, each time on its own previous output. The gold bars show how the input range narrows from about \(\pm 4.5\) to \(\pm 1.8\) as the image appears (the paper's Fig. 5, 100 DDIM steps). A quantizer calibrated at one step therefore fits the others badly, which is the first problem the paper fixes.
Guide

A diffusion model does not produce an image in one pass. It starts from pure noise and runs the same U-Net again and again, each time on its own previous output. The gold bars show the input range shrinking from about plus or minus 4.5 to plus or minus 1.8 as the picture appears. So a quantizer tuned at one step fits the other steps badly, which is the first problem Q-Diffusion solves.

xxxcalibration inputsrecord min / maxchoose step size sFP16almost continuousW4: weights16 levelssA8: activations256 levelsRange too wide: small values round to 0
PrimerCalibration sets the quantizer's scale. PTQ runs a few example inputs through the model, records each tensor's range and turns it into a step size \(s\). W4A8 means 4-bit weights (16 levels) and 8-bit activations (256 levels). If the recorded range is wider than most values need, small values all land on the level zero, so what goes into the calibration set matters.
Guide

Quantization needs a scale, and calibration is how it gets one. A few example inputs pass through the model, record the range of each tensor, and turn that range into a step size. W four A eight means four bit weights with sixteen levels and eight bit activations with two hundred and fifty six. If the calibration inputs give a range that is too wide, small values all round to zero.

EncoderDecoderbottleneckskipInside one decoder block±40deep±1skipconcatenatedconvone scale?
PrimerU-Net skips glue very different tensors together. Each decoder block concatenates the deep features coming up from below with the shallow features copied across from the encoder. In the paper the deep half reaches about \(\pm 40\) while the skip half stays near \(\pm 1\) (Fig. 7), so one shared 4-bit scale erases the small half. LTX-2.3 is a transformer without these concatenations, but the lesson about mixed ranges carries over.
Guide

A U-Net shrinks the image in an encoder, grows it back in a decoder, and copies encoder features across through skip connections. Inside a decoder block those copied features are concatenated with the deep features from below. In the paper the deep half reaches about plus or minus forty while the copied half stays near one, so one shared four bit scale wipes out the small half. That is the second problem the paper fixes.

Before: LLM quantizationThis paperNext: diffusion transformersGPTQSmoothQuantAWQQ-DiffusionPTQ4DiTViDiT-Q …text models, one passno timesteps+ step-aware calibration+ split skip quantizerU-Nets, W4A8same ideas on a DiTLTX-2.3 in NNCFcalibration recipe
PrimerWhere this paper sits. GPTQ, SmoothQuant and AWQ quantize language models, which run once per token and have no timesteps. Q-Diffusion is the first paper in the atlas about diffusion models: it adds step-aware calibration and a split quantizer for skip concatenations, tested on U-Nets. PTQ4DiT then carries these ideas to diffusion transformers, the family LTX-2.3 belongs to.
Guide

GPTQ, SmoothQuant and AWQ quantize language models, which have no denoising steps. Q-Diffusion is the first paper in the atlas about diffusion models. It adds two things: calibration data drawn from every part of the denoising trajectory, and separate quantizers for the two halves of a skip concatenation. PTQ4DiT comes next and moves these ideas to diffusion transformers, the family LTX-2.3 belongs to. Its calibration recipe feeds directly into the NNCF setup.

Terms used in this paper

Denoising step (timestep)
One pass of the network in the sampling loop. Generation starts from pure noise at the highest step \(t=T\) and removes a little noise per step until \(t=0\) gives the image.
DDPM and DDIM
DDPM is the classic diffusion model and training recipe. DDIM is a faster sampler for the same trained network that needs far fewer steps; the paper samples its CIFAR-10 model with 100 DDIM steps.
U-Net
The convolutional network that predicts the noise in these models. An encoder shrinks the image, a decoder grows it back, and skip connections copy encoder features across to the decoder.
Latent diffusion model (LDM)
A diffusion model that works in the small latent space of an autoencoder instead of on pixels; a decoder turns the final latent into an image. LTX-2.3 is also a latent model.
Stable Diffusion
A widely used text-to-image latent diffusion model. The paper quantizes version 1.4 and generates 512 by 512 images from text prompts.
Classifier-free guidance
At each step the model runs twice, with and without the prompt, and the two noise predictions are mixed. This is why calibration stores both branches.
Post-training quantization (PTQ)
Converting a trained model to low-bit numbers without retraining it, using only a small set of example inputs. NNCF works this way.
Calibration set
The example inputs fed through the model during PTQ so the quantizer can measure value ranges and set its scales. Q-Diffusion builds it from the model's own intermediate steps, so no training data is needed.
W4A8
Weights stored with 4 bits (16 levels) and activations with 8 bits (256 levels). W4A32 means only the weights are quantized.
BRECQ, AdaRound, LSQ
The PTQ recipe the paper builds on. BRECQ tunes the quantized model one block at a time to match the full-precision block output; AdaRound learns whether each weight rounds up or down; LSQ learns the activation step sizes.
FID
Fréchet Inception Distance: compares feature statistics of generated and real images using an Inception network. Lower is better; it is the paper's main quality metric.
Inception Score and CLIP score
Inception Score rewards images that are clearly recognisable and varied (higher is better). CLIP score measures how well an image matches its text prompt (higher is better).
CIFAR-10, LSUN, MS-COCO
Benchmark datasets: CIFAR-10 has tiny 32 by 32 images in ten classes, LSUN Bedroom and Church are scene photos at 256 by 256, and MS-COCO captions provide the text prompts for Stable Diffusion.
Bit operations (Bops)
A hardware-free estimate of compute: the number of multiply-adds weighted by the bit widths used. The paper reports Bops and model size, not measured speed on any device.
Guide

These are the words the paper uses without explaining. The most important are post-training quantization, which compresses a trained model without retraining, the calibration set that sets the scales, and W4A8. For results, remember that FID compares generated and real images and lower is better, while CLIP score measures how well an image matches its prompt. Note that the paper reports model size and bit operations, not measured speed on hardware.

§2Big picture

Naive PTQQ-Diffusiont = T (noise)t = 0 (image)calibrate at one stept = T (noise)t = 0 (image)uniform samples, all stepsX1 deepX2 shallow⊕one quantizer Qrange clashX1 deepX2 shallowQ_X1Q_X2⊕4-bit convranges fit
Two fixes, both drawn here. Top: gold bars are the activation range of the U-Net input at each denoising step (wide when noisy, narrow near the image). Naive PTQ calibrates on one arbitrary step; Q-Diffusion samples every c-th step. Bottom: skip concatenation merges a large-range deep tensor and a small-range shallow tensor; Q-Diffusion quantizes each half with its own scale before concatenating.
Guide

Both of the paper's fixes fit in one picture. On top, the gold bars show how wide the U-Net's input range is at each denoising step: wide while the image is still noise, narrow near the end. Naive quantization calibrates on one step; Q-Diffusion samples every c-th step. At the bottom, a skip concatenation joins a large-range deep tensor with a small-range shallow one, so Q-Diffusion gives each half its own scale. Keep these two ideas in mind; everything below expands them.

Same weights, one quantized U-Net, reused at every step. Calibrate it on inputs from all steps, and never share one quantizer across a skip concatenation.

§3The problem

θqxt=TθqxT-1θqxT-2θqx…θqt=0same quantized U-Net applied T timesaccumulated error (magenta)
Error compounds over the chain. Each step feeds the quantized model its own slightly wrong output, so a T-step sampler behaves like a network T times deeper; Fig. 3 measures this.
Guide

A small error at each step becomes a large error at the end. The same quantized U-Net, theta q, is applied T times, and each step takes the previous step's slightly wrong output as its input, so the magenta error band grows along the chain. In effect, a sampler with T steps acts like a network T times deeper. This is the first reason diffusion is harder to quantize than a classifier, and Figure 3 later measures the growth directly.

input channels of one shortcut convX1: deep, range ≈ 40X2: shallow, range ≈ 116 levels (4-bit)X2 falls in bin 0
Bimodal channels break one scale. A single 4-bit scale chosen for the big deep half makes the whole shallow half round to (almost) zero. The same bimodality appears in the matching weight rows (Fig. 7).
Guide

One scale cannot serve two very different populations. The input channels of a shortcut convolution come in two groups: deep features with a range of about 40 and shallow features with a range of about 1. A four-bit quantizer has only sixteen levels, so a scale sized for the deep half puts nearly all shallow values into bin zero, and their information is lost. This is the second problem, the one shortcut splitting in Equations 6 to 8 solves.

  • Error accumulation: INT4 linear quantization gives MSE that climbs to ~100 by the last steps (Fig. 3).
  • Timestep-varying activations: ranges shrink from about ±5 at t=100 to ±2 at t=1 (Fig. 5). Calibrating on only part of the trajectory raises W4 FID to 6–99 (Fig. 4).
  • Shortcut outliers: input activations of DDIM shortcut convs are up to 200× larger than neighbouring layers (Fig. 6), because deep and shallow features are concatenated.
  • Traditional calibration data (training images, random noise, ZeroQ-style synthesis) does not match the noisy intermediate xt the network really sees (Fig. 1a).

§4Method

1. Run FP model once per random seed, record x_tx_Tx_0every c-th step: keep n samples (indigo)calibration set D (N=5120)2. BRECQ block reconstruction with AdaRound (weights)ResBlockAttn blockDownResBlockUp + skipmin MSE( block_FP(D) , block_Q(D) ) per block, in order3. Then LSQ step sizes for activation quantizers (no rounding learnt)
Time-step-aware calibration pipeline. Uniform sampling over the whole trajectory (here c=5 of T=25 shown), then the standard BRECQ recipe: per-block output reconstruction, AdaRound for weights, learned step size (LSQ) for activations.
Guide

Here is fix number one as a pipeline. First, run the full-precision model from random noise and keep samples from every c-th step, building a calibration set of 5,120 inputs. Second, apply the standard BRECQ recipe: reconstruct each block in turn so its quantized output matches the full-precision output, with AdaRound learning how to round each weight. Third, learn activation step sizes with LSQ. The novelty is the calibration data, not the optimiser, which is reused from earlier work.

Shortcut-splitting: Q(X) Q(W) = Q1(X1)Q1(W1) + Q2(X2)Q2(W2)X1X2c1 | c2 channels×W1 (c1×cout)W2 (c2×cout)=Q(X1)Q(W1)+Q(X2)Q(W2)same output, 2 scalesscale s1 ≈ range(X1)/2^b, s2 ≈ range(X2)/2^b: no extra FLOPs
Split before the concatenation. Concatenation along input channels means the conv is a sum of two partial matmuls; each half gets its own activation quantizer and its own weight quantizer (Eqs. 6–8). Memory/compute overhead is negligible.
Guide

Fix number two costs nothing at inference time. Concatenating along input channels means the convolution is really two partial matrix products added together: X1 times W1 plus X2 times W2. So each half can have its own activation scale and its own weight scale, s1 sized for X1 and s2 sized for X2, and the output is the same sum, with no extra operations. The drawing is the visual form of Equation 8.

  1. Pick sampler (DDIM 100 steps, LDM 200/500, PNDM 50 for SD) and calibration interval c, per-step count n (Table 4).
  2. Run the FP model from random noise; at every step with t mod c = 0 store n intermediate inputs xt (plus time embedding, and for SD both conditional and unconditional text features).
  3. Split every skip-concatenation conv into two quantizer pairs (Eqs. 6–8).
  4. Block-wise reconstruction (BRECQ): for each residual / transformer block, learn AdaRound rounding and weight clipping to minimise output MSE vs FP; other layers per-layer.
  5. If activations are quantized: calibrate activation step sizes block by block with LSQ.
  6. Keep SoftMax, SiLU, GroupNorm in FP; for SD W8A8/W4A8, attention scores in INT16 (q, k, v still 8-bit).
Guide

The recipe runs in a fixed order. First choose the sampler and the calibration interval, then run the full-precision model and collect inputs at the chosen steps, including time embeddings and, for Stable Diffusion, both conditional and unconditional text features. Next, split the shortcut layers, then reconstruct weights block by block with AdaRound, and only afterwards calibrate activation step sizes. Fragile operations like SoftMax, SiLU and GroupNorm stay in full precision, and Stable Diffusion attention scores use sixteen-bit integers.

Algorithm 1 — Q-Diffusion Calibration

Require: pretrained FP model and quantized model [W_θ, Ŵ_θ] Require: empty calibration dataset D Require: number of denoising sampling steps T Require: calibration sampling interval c, amount of calibration data per step n for t = 1, ..., T time step do if t % c = 0 then Sample n intermediate inputs x_t^(1), ..., x_t^(n) randomly at t from W_θ and add them to D end if end for for all i = 1, ..., N blocks do Update the weight quantizers of the i-th block in Ŵ_θ with D and W_θ end for if do activation quantization then for all i = 1, ..., N blocks do Update the activation quantizers step sizes of the i-th block with Ŵ_θ, W_θ, D end for end if
Guide

Algorithm 1 is the unconditional version of time-step-aware calibration. The first loop walks through the denoising steps and, whenever the step number is a multiple of c, stores n intermediate inputs from the full-precision model. The second loop visits the blocks one by one and fits the weight quantizers against the full-precision outputs. An optional third loop then fits activation step sizes. The key design choice is that calibration data comes from the model's own trajectory, so no training images are needed.

Algorithm 2 — Q-Diffusion Calibration for Text-guided Image Generation (App. A.2)

Require: pretrained FP model and quantized model [W_θ, Ŵ_θ] Require: empty calibration dataset D Require: number of denoising sampling steps T Require: calibration sampling interval c, amount of calibration data per step n for t = 1, ..., T time step do if t % c = 0 then Sample 2n intermediate inputs (x_t^(1), c_t^(1), t_t^(1)), (x_t^(1), uc_t^(1), t_t^(1)), ..., (x_t^(n), c_t^(n), t_t^(n)), (x_t^(n), uc_t^(n), t_t^(n)) randomly at t from W_θ and add them to D end if end for for all i = 1, ..., N blocks do Update the weight quantizers of the i-th block in Ŵ_θ with D and W_θ end for if do activation quantization then for all i = 1, ..., N blocks do Update the activation quantizers step sizes of the i-th block with Ŵ_θ, W_θ, D end for end if
Guide

Algorithm 2 is the same procedure for text-to-image models like Stable Diffusion. The only change is in the sampling loop: each stored sample is a triple of latent, text feature and time step, and it is stored twice, once with the prompt's conditional features and once with the unconditional ones, because classifier-free guidance runs both branches at inference. That is why Table 4 lists twice as many Stable Diffusion samples as prompts. This is the version that maps onto LTX-2.3, which also uses guidance.

ct = conditional text feature, uct = unconditional (empty-prompt) feature, tt = time embedding: classifier-free guidance runs the U-Net on both, so both go into calibration.

§5Every equation

(1)\[ q(\mathbf{x}_t \mid \mathbf{x}_{t-1}) = \mathcal{N}\!\left(\mathbf{x}_t;\ \sqrt{1-\beta_t}\,\mathbf{x}_{t-1},\ \beta_t \mathbf{I}\right) \]

Forward diffusion: add Gaussian noise with variance schedule \(\beta_t \in (0,1)\); as \(T\to\infty\), \(\mathbf{x}_T\) becomes isotropic Gaussian.

Guide

Equation 1 is the forward diffusion step, which adds noise. It says x t, the image at step t, is drawn from a Gaussian centred at the square root of one minus beta t times the previous image x t minus one, with variance beta t times the identity. Beta t is the noise schedule, a small number between zero and one. After enough steps, x T is pure Gaussian noise. This is background; it is not quantized, but it defines what the U-Net sees.

(2)\[ p_\theta(\mathbf{x}_{t-1} \mid \mathbf{x}_t) = \mathcal{N}\!\left(\mathbf{x}_{t-1};\ \tilde{\boldsymbol{\mu}}_{\theta,t}(\mathbf{x}_t),\ \tilde{\beta}_t \mathbf{I}\right) \]

Learned reverse step, starting from \(\mathbf{x}_T \sim \mathcal{N}(\mathbf{0},\mathbf{I})\). Its output is the next step's input, which is why quantization errors accumulate.

Guide

Equation 2 is the learned reverse step, the part the network performs. P theta of x t minus one given x t is a Gaussian with mean mu tilde, computed by the network, and variance beta tilde times the identity. Sampling starts from pure noise x T and applies this step repeatedly. The important point for quantization is that each output becomes the next input, which is exactly why errors accumulate, as Figure 2 and Figure 3 show.

(3)\[ \tilde{\boldsymbol{\mu}}_{\theta,t}(\mathbf{x}_t) = \frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\,\boldsymbol{\epsilon}_{\theta,t}\right) \]

Mean from the predicted noise \(\boldsymbol{\epsilon}_{\theta,t}\) (the U-Net output that gets quantized).

Guide

Equation 3 shows where the network enters the reverse step. The mean mu tilde equals one over the square root of alpha t, times the current image x t minus a scaled copy of epsilon theta, the noise predicted by the U-Net. The scaling factor is one minus alpha t over the square root of one minus alpha bar t. Epsilon theta is the quantized part, so any quantization error in the predicted noise flows straight into the next image.

(4)\[ \tilde{\beta}_t = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\cdot \beta_t, \qquad \alpha_t = 1-\beta_t,\quad \bar{\alpha}_t = \prod_{i=1}^{t}\alpha_i \]

Reverse-step variance; the definitions of \(\alpha_t, \bar{\alpha}_t\) follow the equation in the paper.

Guide

Equation 4 gives the variance of the reverse step and defines the helper symbols. Beta tilde t equals one minus alpha bar at t minus one, divided by one minus alpha bar at t, times beta t. Alpha t is one minus beta t, and alpha bar t is the product of all alphas up to step t. These are fixed schedule constants, not learned and not quantized; they complete the diffusion background before the paper turns to quantization.

(5)\[ \hat{w} = s\cdot \operatorname{clip}\!\left(\operatorname{round}\!\left(\frac{w}{s}\right),\ c_{\min},\ c_{\max}\right) \]

Uniform quantize/de-quantize: scale \(s\), clipping bounds \(c_{\min}, c_{\max}\); round is nearest (linear-quant baseline) or adaptive (AdaRound/BRECQ in Q-Diffusion).

Guide

Equation 5 is the basic uniform quantizer used for both weights and activations. Divide w by the step size s, round to an integer, clip between c min and c max, then multiply by s again to get w hat, the de-quantized value. With four bits there are only sixteen integers available. Plain linear quantization uses round-to-nearest; Q-Diffusion keeps the same form but lets AdaRound learn whether each weight rounds up or down, and learns the clipping range too.

(6)\[ \mathcal{Q}_X(X) = \mathcal{Q}_{X_1}(X_1) \oplus \mathcal{Q}_{X_2}(X_2) \]

Split activation quantizer: quantize deep part \(X_1\in\mathbb{R}^{w\times h\times c_1}\) and shallow part \(X_2\in\mathbb{R}^{w\times h\times c_2}\) separately, then concatenate (\(\oplus\)).

Guide

Equation 6 splits the activation quantizer of a shortcut layer. Q X of X, the quantized input, is formed by quantizing X1, the deep part with c1 channels, with its own quantizer, quantizing X2, the shallow part with c2 channels, with another, and then concatenating the two. This directly answers the range clash in Figure 3: the small shallow values now get a scale that fits them instead of being rounded to zero.

(7)\[ \mathcal{Q}_W(W) = \mathcal{Q}_{W_1}(W_1) \oplus \mathcal{Q}_{W_2}(W_2) \]

Split weight quantizer on the matching input-channel rows \(W_1\in\mathbb{R}^{c_1\times c_{out}}\), \(W_2\in\mathbb{R}^{c_2\times c_{out}}\).

Guide

Equation 7 applies the same split to the weights. The weight matrix W has one row per input channel, so it divides into W1, the c1 rows that multiply the deep features, and W2, the c2 rows that multiply the shallow features. Each part gets its own weight quantizer. This matters because Figure 7 shows the weights are bimodal too, with W1 small and W2 much larger, so one shared weight scale would waste precision.

(8)\[ \mathcal{Q}_X(X)\,\mathcal{Q}_W(W) = \mathcal{Q}_{X_1}(X_1)\,\mathcal{Q}_{W_1}(W_1) + \mathcal{Q}_{X_2}(X_2)\,\mathcal{Q}_{W_2}(W_2) \]

The layer output is the sum of two independently quantized partial products, so splitting costs no extra compute; \(X\in\mathbb{R}^{w\times h\times c_{in}}\), \(W\in\mathbb{R}^{c_{in}\times c_{out}}\), \(c_{in}=c_1+c_2\).

Guide

Equation 8 explains why splitting is free. The quantized input times the quantized weights equals the quantized X1 times the quantized W1, plus the quantized X2 times the quantized W2. The input has c in channels, equal to c1 plus c2. Because a matrix product over concatenated channels is just the sum of two smaller products, the layer computes the same amount of work with two scales instead of one, which is why the paper reports negligible overhead.

App. F.1\[ N_t = \frac{s_t}{\sum_{t} s_t}\,N \]

"Std" non-uniform sampling (did not beat uniform): draw calibration samples from step \(t\) in proportion to the pixel-wise std \(s_t\) of \(\mathbf{x}_t\) (estimated from 256 samples); \(N=5120\). "Norm Std" uses the std of \(\lVert \mathbf{x}_t\rVert_2\) instead.

Guide

This appendix equation defines a non-uniform alternative the authors tried and rejected. N t, the number of calibration samples taken from step t, is set to s t divided by the sum of s t over all steps, times the total N of 5,120. Here s t is the pixel-wise standard deviation of x t, so noisier steps get more samples. Table 7 shows it did slightly worse than plain uniform sampling, which supports the paper's simple choice.

§6Every figure

(a) Calibration dataset creation(b) Model inferenceTraditional PTQQ-DiffusionTraining dataSynthesized by NNRandom samplingCalibration setInputθqOutputone passx_Tx_tx_t-1x_t-5x_0pθ(x_t-1 | x_t)time-step-aware uniformCalibration seterrors accumulate at each stepx_Tθqx_T-1θq…θqx_0noisy x_0naive linear quant: severe loss
Fig. 1Q-Diffusion differs in calibration data and in inference. (a) Traditional PTQ draws calibration data from the training set, NN-synthesized images or random noise, none of which matches real intermediate inputs; Q-Diffusion samples the FP model's own xt uniformly across steps (data-free). (b) Traditional PTQ runs θq once; a diffusion model runs it T times, so errors accumulate and naive linear quantization yields a noisy x0.
Guide

Q-Diffusion changes two things compared with ordinary quantization. Panel a is about calibration data: traditional methods use training images, synthetic images or random noise, none of which look like the real inputs at intermediate steps, while Q-Diffusion samples the model's own x t evenly across steps, with no data needed. Panel b is about inference: a classifier runs the quantized network once, but a diffusion model runs it T times, so naive quantization ends with a noisy final image.

x_0x_t-10x_t-1x_tx_Tq(x_t | x_t-1)(a) forward diffusion: add noisex_Tx_tx_t-1x_t-10x_0pθ(x_t-1 | x_t)(b) reverse diffusion: trained net denoises
Fig. 2Forward adds noise, reverse removes it. Gold overlay = noise level. The reverse process uses the same noise-estimation network at every step, so its inputs range from pure noise to nearly clean images, which is the root of the timestep-dependent activation problem.
Guide

The forward process adds noise and the reverse process removes it, and that is the root of the problem. The gold overlay shows the noise level. Panel a goes from a clean image to noise; panel b runs the trained network backwards. Because the same noise-estimation network is used at every reverse step, its inputs range from pure noise to nearly clean images, so its activation statistics change with the step. Figures 5 and 14 quantify this drift.

1e-61e-51e-41e-31e-21e-11e01009080706050403020100time step tMSE vs FP32INT4INT5INT8INT4 Q-Diffusion
Fig. 3INT4 error explodes and accumulates; Q-Diffusion INT4 behaves like INT8. MSE between FP32 and weight-quantized outputs xt across 100 DDIM steps on CIFAR-10 (batch 64). Linear INT4 reaches ~100; Q-Diffusion INT4 stays near the INT8 curve. Shape redrawn.
Guide

Four-bit weights with naive rounding make errors explode, while Q-Diffusion's four-bit model behaves like an eight-bit one. The vertical axis is the mean squared error between full-precision and weight-quantized x t, on a log scale; the horizontal axis runs over 100 DDIM steps. Linear INT4 climbs toward an error of about one, INT5 is in between, and Q-Diffusion INT4 stays close to INT8. The curve shape is redrawn, but it gives the evidence for the accumulation argument in Figure 2.

1.0010.00100.0045.36First 2531.98First 506.07Mid 5014.29Last 5098.56Last 25Q-Diffusion all steps: 5.09FID (log)calibration data from part of the trajectory
Fig. 4Calibrating on only part of the trajectory hurts W4. 5120 samples drawn uniformly from the first / middle / last n steps (DDIM CIFAR-10, 4-bit weights). Middle steps cover the range best; endpoints worst; covering the full process (dashed, 5.09 from Table 7) wins.
Guide

Calibrating on only part of the trajectory hurts four-bit weights badly. Each bar is the FID, on a log scale, when all 5,120 calibration samples come from one slice of the steps. The last 25 steps are worst at about 98.6, the first 25 give about 45, and the middle 50 do best among the slices at about 6.1. Covering all steps, the dashed line, gives 5.09. This motivates uniform sampling across the whole process.

-4-20241009590858075706560555045403530252015105time step (denoising runs left to right)activation
Fig. 5Input range shrinks as denoising proceeds. Box-and-whisker ranges of xt (1000 random samples) at each of 100 DDIM steps (FP32, CIFAR-10). About ±4.5 while noisy, narrowing to about ±1.8 near t=1; neighbouring steps are similar, distant ones differ. Shape redrawn.
Guide

The U-Net's input range shrinks steadily as denoising proceeds. Each box and whisker shows the spread of x t over 1,000 samples at one of 100 DDIM steps, with denoising running left to right. Early values span about plus or minus 4.5, late ones about plus or minus 1.8. Neighbouring steps look alike but distant steps differ, so a calibration set needs to cover the whole range, and sampling every c-th step is enough. The shape is redrawn from the paper.

020040060080010001200153576165697387919599103107111layer numberactivation range3 shortcuts withabnormal input rangesX1 channels⊕X2 channelsconcatenated input
Fig. 6Shortcut layers have abnormal input ranges. Activation ranges of DDIM FP32 layers averaged over time steps (x-axis broken, as in the paper). Three shortcut convs (layers ~53, 57, 61; magenta) reach 300–1250, far above neighbours. Inset: the shortcut input is a concatenation of a large-amplitude deep tensor X1 and a small-amplitude shallow tensor X2. Values approximate, shape redrawn.
Guide

A few shortcut layers have abnormally large input ranges. The horizontal axis is layer number and the vertical axis is the activation range averaged over all steps, with the axis broken as in the paper. Three shortcut convolutions, in magenta around layers 53, 57 and 61, reach roughly 300 to 1,250, far above their neighbours. The inset explains why: their input is a concatenation of a large deep tensor X1 and a small shallow tensor X2. Values are approximate.

X2 (shallow skip)concatenate with X1UNet encoderUNet decoderpoolingupsamplingothersSplit activations and weightsX1X2input channel(rows: w×h)W1W2input channel(rows: out ch.)
Fig. 7Deep and shallow halves differ, in activations and in weights. Left: UNet shortcut layers concatenate deep decoder features X1 with shallow encoder features X2. Right: heat maps (opacity = magnitude) of a DDIM shortcut conv. X1 ranges up to ±40 while X2 is near 0; the weights are bimodal the other way (W1 small, W2 up to ±1). Cutting at the dashed line gives each half its own quantizer.
Guide

The deep and shallow halves differ in both activations and weights. On the left, the U-Net decoder concatenates deep features X1 with shallow encoder features X2 through skip connections. On the right, heat maps of one shortcut convolution, where darker means larger: X1 reaches about plus or minus 40 while X2 stays near zero, and the weights are bimodal the other way, W1 small and W2 up to about plus or minus one. The dashed cut is where Equations 6 and 7 split the quantizers.

Bedroom Q-Diffsharp beds, lampsvaried colour, lightrealistic roomsBedroom Linearwashed-out, blurrygrey-white hazefew detailsChurch Q-Diffclear domes, skyfine towers≈ FP qualityChurch Linearover-contrastedcolour shiftdistorted facadesrow 1row 2row 3
Fig. 8W4A8: Q-Diffusion keeps LSUN quality, linear quantization does not. Schematic of the 3×3 sample grids (256×256 LSUN-Bedroom and LSUN-Church, W4A8). Linear quantization gives faded/blurry bedrooms and colour-shifted churches; Q-Diffusion samples look like FP outputs.
Guide

At W4A8, Q-Diffusion keeps the look of real bedrooms and churches while linear quantization does not. This is a schematic of the paper's three by three sample grids at 256 by 256 pixels. Linear quantization gives faded, blurry bedrooms and colour-shifted, over-contrasted churches; Q-Diffusion samples resemble full-precision output. It is the visual companion to Tables 2 and 3, where the FID gap tells the same story in numbers.

Full precisionpuppies in hatsQ-Diffusion W4A8same scenes as FPLinear W4A8heavy noise texture8 samples
Fig. 9Stable Diffusion W4A8 remains usable only with Q-Diffusion. "A puppy wearing a hat", 512×512, 8 samples per method. Q-Diffusion outputs resemble FP (with small low-level semantic differences such as hat shape); linear quantization produces noisy, psychedelic or broken images.
Guide

On Stable Diffusion at W4A8, only Q-Diffusion produces usable images. The prompt is a puppy wearing a hat, at 512 by 512 pixels, with eight samples for each method. Q-Diffusion's images resemble the full-precision ones, differing only in small details such as the hat's shape, while linear quantization produces noisy, broken pictures. This shows the method scales from small unconditional models to a large text-conditioned model, the setting closest to the thesis.

51015202530352500500075001000012500150001750020000number of samples in calibration setFID (W4A32)First 50 stepsLast 50 stepsEvery 20 stepsEvery 100/10/50Every 20 stepsEvery 20Q-Diffusion: every 20 steps, 5120partial timestepsother uniform settings★chosen setting
Fig. 10Any uniform, full-trajectory sampling works; partial does not. DDIM CIFAR-10, W4A32. Partial-step calibration: FID 31.98 (first 50) and 14.29 (last 50). Uniform settings with different intervals and 2 560–20 480 samples all land near FID 5; the default (every 20 steps, 5 120 samples) gives 5.09. Uniform points' exact values approximated.
Guide

Any uniform sampling that covers the whole trajectory works about equally well; partial coverage does not. The horizontal axis is the number of calibration samples and the vertical axis is FID for four-bit weights on CIFAR-10. Using only the first 50 steps gives 31.98 and only the last 50 gives 14.29. Uniform settings with different intervals and from 2,560 to 20,480 samples all land near five, and the chosen default gives 5.09. More data does not help much.

110100141.476.585.09W4A32188.1154.224.93W4A8FP 4.22Linear quant+ calibration+ split shortcutsFID (log)
Fig. 11Calibration alone is not enough at W4A8; split shortcuts close the gap. DDIM CIFAR-10. W4A32: 141.47 → 6.58 (calibration) → 5.09 (+split). W4A8: 188.11 → 54.22 → 4.93. Dashed = FP (4.22).
Guide

This ablation separates the two fixes. Bars show FID on a log scale for DDIM on CIFAR-10, with the dashed line at full precision, 4.22. For four-bit weights only, calibration alone takes FID from 141.47 to 6.58, and splitting brings it to 5.09. With eight-bit activations added, calibration alone reaches only 54.22, and splitting is what brings it down to 4.93. So splitting becomes essential once activations are quantized.

W6A32 Linearteeth distortedW6A32 Splitteeth fixedW4A32 Q-Diffusioneyes consistentW32A32 (FP)referenceportrait
Fig. 12Split fixes local detail; calibration fixes semantics. Stable Diffusion portrait. Linear W6 quantization degrades the teeth; shortcut splitting repairs them; full Q-Diffusion (calibration + split) at W4 also restores consistent eyes, matching FP.
Guide

Splitting fixes local detail and calibration fixes overall semantics. In these Stable Diffusion portraits, six-bit linear weight quantization distorts the teeth, and adding shortcut splitting repairs them. Full Q-Diffusion at four-bit weights, with both calibration and splitting, also makes the eyes consistent and matches the full-precision reference. It is the qualitative version of the ablation in Figure 11: the two fixes address different kinds of damage.

02004006008001000120011325374961738597109DDIM (CIFAR-10)05010015020025030014080120160200240280Stable Diffusion (T2I)020406080100120406080100120LDM (LSUN-Bedroom)05101520125497397121145161LDM (LSUN-Church)layer number
Fig. 13Residual/shortcut layers dominate activation ranges, except in LDM-Church. Per-layer activation ranges (FP32, averaged over time steps). DDIM: shortcut layers up to ~1200 while most layers stay < 50. Stable Diffusion: two layers near 300. LDM-Bedroom: peaks ~90. LDM-Church: all layers < 15–20 (uniform). Magenta = outlier layers. Shape redrawn with approximate values.
Guide

Across most models, the widest activation ranges sit in residual and shortcut layers. Each panel plots per-layer activation range, averaged over steps, with outlier layers in magenta. DDIM has shortcut layers near 1,200 while most layers stay below 50; Stable Diffusion has two layers near 300; LDM-Bedroom peaks around 90; and LDM-Church is fairly uniform, below about 20. Values are approximate. This shows the outlier problem depends on the model, so each network needs its own check.

-40-200204060801001009080706050403020100down.3.block.0.conv1-100-500501001501009080706050403020100up.1.upsample.conv-30-20-10010203040501009080706050403020100up.2.upsample.conv-800-600-400-20002004006008001009080706050403020100up.0.block.0.shortcuttime step (100 → 0)
Fig. 14Per-layer activation ranges drift with the time step, differently per layer. DDIM CIFAR-10. down.3.block.0.conv1 widens toward the end (outliers to ~100); up.1.upsample.conv shrinks from ~±130 to ~±60; up.2.upsample.conv peaks around t≈85; the shortcut conv spans ±800 early and ±300 late. A single static scale calibrated at one step fits none of them. Shapes redrawn.
Guide

Each layer's activation range changes with the time step, and each layer changes differently. Four DDIM layers are shown over 100 steps. One widens toward the end, one upsampling layer shrinks from about plus or minus 130 to about 60, another peaks around step 85, and the shortcut convolution goes from about plus or minus 800 early to 300 late. A single static scale calibrated at one step cannot fit all of them, which is the case for multi-step calibration.

0.0015.0030.0045.0060.0020.3220.23W8A3228.6920.13W4A3237.1618.69W8A857.9018.46W4A8FP 20.00Linear quantQ-DiffusionFID (lower better)0.240.25500.270.28500.30.28650.2863W8A320.26870.2858W4A320.27520.2845W8A80.25890.2836W4A8FP 0.2865Linear quantQ-DiffusionCLIP score (higher better)(a) FID(b) CLIP score
Fig. 15Stable Diffusion on COCO: Q-Diffusion keeps FID and CLIP at FP level. 512×512, cfg 7.5, 10k COCO-2017-val prompts. (a) Linear FID rises to 57.90 at W4A8; Q-Diffusion stays 18.46–20.23 (FP 20.00). (b) CLIP score (ViT-B/16): linear drops to 0.2589 at W4A8; Q-Diffusion keeps 0.2836–0.2863 (FP 0.2865); axis starts at 0.24.
Guide

On Stable Diffusion with 10,000 COCO prompts, Q-Diffusion keeps both image quality and text alignment at full-precision level. Panel a shows FID, lower is better: linear quantization rises to 57.90 at W4A8 while Q-Diffusion stays between about 18.5 and 20.2, against 20.00 for full precision. Panel b shows CLIP score, higher is better, with the axis starting at 0.24: linear falls to 0.2589, while Q-Diffusion stays near 0.2865, the full-precision value.

astronaut + horsesame compositionsame compositionpuppy, blue hatblue floppy hatwhite hat, new posered helicopterside viewfront viewfantasy castlemisty castledarker, foresthouse in forestlake cabinwooden cabinPNDM 50 stepsDPM-Solver++ 20
Fig. 16W4A32 Q-Diffusion also works with a fast 20-step solver. INT4-weight Stable Diffusion, 512×512. Top: default PNDM 50 steps; bottom: DPM-Solver++ 20 steps applied directly to the same quantized model. Both rows are high quality; content differs in details (the solver changes the trajectory).
Guide

A model quantized with Q-Diffusion also works with a faster sampler. The top row uses the default 50-step PNDM sampler, and the bottom row applies the 20-step DPM-Solver plus plus directly to the same four-bit-weight Stable Diffusion model, with no re-calibration. Both rows look good, though details differ because the solver follows a different path. This is qualitative; Table 6 shows the numbers, where the quality drop is larger once activations are also quantized.

Q-Diff W4A32realistic bedroomsQ-Diff W4A8near-identical toLinear W4A32dark yellow castLinear W4A8pale, washed out5×3 grid
Fig. 17LSUN-Bedroom INT4: Q-Diffusion is stable from W4A32 to W4A8. Random samples with a fixed seed, 256×256. The two Q-Diffusion grids are almost the same image-for-image; linear quantization darkens (W4A32) or washes out (W4A8) the scenes.
Guide

With a fixed seed on LSUN-Bedroom at four-bit weights, Q-Diffusion's output barely changes when activations drop from 32 to eight bits: the two grids are almost identical image for image. Linear quantization, by contrast, gives a dark yellow cast at W4A32 and pale, washed-out scenes at W4A8. This appendix figure supports the claim that the method is stable across activation precisions.

Q-Diff W4A32natural churchesQ-Diff W4A8same images asLinear W4A32purple/white castLinear W4A8different content5×3 grid
Fig. 18LSUN-Church INT4: same picture. Fixed-seed samples, 256×256. Q-Diffusion keeps content and colours across W4A32/W4A8; linear quantization shifts colours at W4A32 and loses the seed's content at W4A8.
Guide

The LSUN-Church results tell the same story with a fixed seed. Q-Diffusion keeps the content and colours of each church from W4A32 to W4A8. Linear quantization shifts colours toward purple and white at W4A32, and at W4A8 it even produces different content than the seed should give, meaning the trajectory has drifted. It is further visual evidence alongside Table 3.

Full precision8 puppies in hats8 astronauts on horsesQ-Diff W4A32≈ FP, same layout≈ FP, same layoutQ-Diff W4A8≈ FP, hat colours vary≈ FP, small changesLinear W4A32grainy, fadednoisy, colour shift"puppy wearing a hat""astronaut riding horse"
Fig. 19Stable Diffusion INT4 with a fixed seed. 512×512, two prompts, 4×2 grids per method. Q-Diffusion at W4A32 and W4A8 reproduces the FP compositions; linear W4A32 is grainy and colour-shifted.
Guide

Fixed-seed Stable Diffusion samples for two prompts, a puppy wearing a hat and an astronaut riding a horse, at 512 by 512 pixels. Q-Diffusion at W4A32 and at W4A8 reproduces the full-precision compositions, with only small changes such as hat colours. Linear quantization at W4A32 is grainy and colour-shifted. Because the seed is fixed, each image can be compared directly with its full-precision counterpart, which makes this a fair side-by-side test.

§7Results

1101005004.22188.11456.214.93CIFAR-10 (DDIM)2.9824.8695.925.32LSUN-Bedroom (LDM-4)4.0614.9224.54.12LSUN-Church (LDM-8)FP32Linear W4A8SQuant W4A8Q-Diffusion W4A8FID (log)
Headline: W4A8 FID across all three unconditional benchmarks. From Tables 1–3. Q-Diffusion stays within 0.06–2.34 FID of FP while linear quantization and SQuant degrade by 10–450.
Guide

The headline result: at W4A8, Q-Diffusion stays close to full precision on all three unconditional benchmarks, while the baselines fall apart. Bars show FID on a log scale; lower is better. On CIFAR-10, full precision is 4.22 and Q-Diffusion 4.93, against 188 for linear quantization and 456 for SQuant. The bedroom and church datasets show the same pattern, with Q-Diffusion within about 0.06 to 2.34 FID of full precision. The numbers come from Tables 1 to 3.

Table 1: DDIM on CIFAR-10 (32×32). Best quantized per bit group in green.
MethodBits (W/A)Size (Mb)GBopsFID↓IS↑
Full Precision32/32143.265974.229.12
Linear Quant8/3235.822944.718.93
SQuant8/3235.822944.618.99
Q-Diffusion8/3235.822944.279.15
Linear Quant4/3217.91147141.474.20
SQuant4/3217.91147160.402.91
Q-Diffusion4/3217.911475.098.78
Linear Quant8/835.8798118.265.23
SQuant8/835.8798464.691.17
Q-Diffusion8/835.87983.759.48
Linear Quant4/817.9399188.112.45
SQuant4/817.9399456.211.16
Q-Diffusion4/817.93994.939.12
Guide

Table 1 is DDIM on CIFAR-10. Each row gives the method, weight and activation bits, model size, compute in giga bit-operations, FID where lower is better, and Inception Score where higher is better. At eight-bit weights all methods are fine. At four-bit weights linear quantization jumps to an FID of 141, but Q-Diffusion stays at 5.09. At W4A8 Q-Diffusion reaches 4.93 against 188 for linear and 456 for SQuant, with model size cut from 143 to 18 megabits.

Table 2: LDM-4 on LSUN-Bedrooms (256×256), latent downsampling 4.
MethodBits (W/A)Size (Mb)TBopsFID↓
Full Precision32/321096.2107.172.98
Linear Quant8/32274.137.283.02
SQuant8/32274.137.282.94
Q-Diffusion8/32274.137.282.97
Linear Quant4/32137.018.6482.69
SQuant4/32137.018.64149.97
Q-Diffusion4/32137.018.644.86
Linear Quant8/8274.112.976.69
SQuant8/8274.112.974.92
Q-Diffusion8/8274.112.974.40
Linear Quant4/8137.06.4824.86
SQuant4/8137.06.4895.92
Q-Diffusion4/8137.06.485.32
Guide

Table 2 repeats the test on a latent diffusion model for LSUN bedrooms, at 256 by 256 pixels. Full precision has an FID of 2.98. With eight-bit weights every method is near that value. At four-bit weights, linear quantization gives 82.69 and SQuant about 150, while Q-Diffusion gives 4.86. At W4A8, Q-Diffusion reaches 5.32 against 24.86 and 95.92. The pattern from CIFAR-10 carries over to a larger, latent model.

Table 3: LDM-8 on LSUN-Churches (256×256), latent downsampling 8.
MethodBits (W/A)Size (Mb)TBopsFID↓
Full Precision32/321179.922.174.06
Linear Quant8/32295.010.733.84
SQuant8/32295.010.734.01
Q-Diffusion8/32295.010.734.03
Linear Quant4/32147.55.3632.54
SQuant4/32147.55.3633.77
Q-Diffusion4/32147.55.364.45
Linear Quant8/8295.02.6814.62
SQuant8/8295.02.6854.15
Q-Diffusion8/8295.02.683.65
Linear Quant4/8147.51.3414.92
SQuant4/8147.51.3424.50
Q-Diffusion4/8147.51.344.12
Guide

Table 3 covers a latent diffusion model on LSUN churches, with full precision at an FID of 4.06. Q-Diffusion matches or even slightly beats full precision at W8A8 with 3.65 and stays at 4.12 at W4A8, while linear quantization and SQuant land between about 15 and 54 once activations are quantized. Recall from Figure 13 that this model has fairly uniform activation ranges, which may explain why linear quantization degrades less here than on CIFAR-10.

Table 4: Calibration hyperparameters: T steps, interval c, samples per step n, total N. SD: n in parentheses = prompts, each giving a (cond, uncond) pair.
ExperimentTcnN
DDIM CIFAR-1010052565120
LDM-4 LSUN-Bedroom200102565120
LDM-8 LSUN-Church500252565120
Stable Diffusion (weights only)502256 (128)6400
Stable Diffusion (weights & activations)501256 (128)12800
Guide

Table 4 lists the calibration settings for each experiment: T, the number of sampling steps; c, the interval between sampled steps; n, samples per step; and N, the total. The unconditional models all use 5,120 samples, with the interval chosen so about 20 steps are covered. Stable Diffusion uses a denser interval and counts each prompt twice, for the conditional and unconditional branch, giving 6,400 samples for weights only and 12,800 when activations are quantized too.

Table 5: Q-Diffusion vs PTQ4DM (10k samples). PTQ4DM numbers in parentheses use INT8 attention act-to-act matmuls (Q-Diffusion always does).
TaskMethodIS↑FID↓sFID↓
CIFAR-10 DDIM 100 stepsFP9.1810.0519.71
PTQ4DM (W8A8)9.31 (9.02)14.18 (19.59)22.59 (20.89)
Q-Diffusion (W8A8)9.477.8217.96
Q-Diffusion (W4A8)9.198.8519.64
CIFAR-10 DDIM 250 stepsFP9.198.8318.31
PTQ4DM (W8A8)9.70 (9.30)11.66 (16.54)19.71 (20.08)
Q-Diffusion (W8A8)9.608.0018.13
Q-Diffusion (W4A8)9.188.5418.58
Guide

Table 5 compares Q-Diffusion with PTQ4DM, the only earlier diffusion quantization method, on CIFAR-10 at 100 and 250 DDIM steps, using Inception Score, FID and sFID. PTQ4DM's numbers in parentheses are for the fair comparison where attention matrix products are also eight-bit, as they always are in Q-Diffusion. Q-Diffusion at W8A8 beats PTQ4DM in FID, for example 7.82 against 19.59 at 100 steps, and even Q-Diffusion at W4A8 is better than PTQ4DM at W8A8.

Table 6: Q-Diffusion with 3rd-order DPM-Solver++ (50 steps) applied directly, no re-calibration.
TaskBits (W/A)FID↓
DDIM CIFAR-1032/323.57
DDIM CIFAR-104/325.38
DDIM CIFAR-104/810.27
LDM-4 LSUN-Bedrooms32/324.27
LDM-4 LSUN-Bedrooms4/324.88
LDM-4 LSUN-Bedrooms4/810.77
LDM-8 LSUN-Churches32/325.40
LDM-8 LSUN-Churches4/325.74
LDM-8 LSUN-Churches4/88.19
Guide

Table 6 tests whether the quantized model survives a sampler change, here a third-order DPM-Solver plus plus with 50 steps, applied without re-calibration. With four-bit weights only, FID stays near full precision, for example 5.38 against 3.57 on CIFAR-10. Adding eight-bit activations roughly doubles or triples FID, to 10.27 on CIFAR-10 and 10.77 on bedrooms. So activation scales are tied to the trajectory used for calibration, and changing the sampler calls for fresh calibration data.

Table 7: Non-uniform calibration sampling vs uniform (DDIM CIFAR-10, W4A32, N=5120).
MethodStdNorm StdUSLUniform (ours)
FID↓5.665.585.545.09
Guide

Table 7 checks whether smarter, non-uniform sampling of calibration steps helps. Std draws more samples from steps with higher pixel standard deviation, as in the appendix equation; Norm Std uses the spread of the image norm; USL is another published strategy. All three give FIDs between 5.54 and 5.66 for four-bit weights on CIFAR-10, while plain uniform sampling gives 5.09. Simple uniform coverage wins, so there is no need for elaborate schemes.

  • 8-bit weights are almost free for everyone; the gap opens at 4-bit weights and when activations are also quantized.
  • Size column: 4-bit weights shrink DDIM from 143.2 Mb to 17.9 Mb (8×); Bops drop from 6597 G to 399 G per step at W4A8 (theoretical).
  • Stable Diffusion W4A8 is run with INT16 attention scores (App. A.1); Q-Diffusion quantizes q·k and attn·v matmuls to INT8 elsewhere, unlike PTQ4DM's FP16/32.
  • Changing the sampler after calibration (DPM-Solver++, Table 6) keeps W4A32 good but roughly doubles W4A8 FID: activation calibration is trajectory-specific.

§8Why it matters for this thesis

  • Calibration data recipe transfers directly. For LTX-2.3 in NNCF, build the nncf.Dataset by hooking the transformer's inputs (latent tokens, timestep/sigma embedding, text and audio conditioning, both cond and uncond branches if CFG is used) during full FP pipeline runs, keeping samples from every c-th step, not from a single step or random tensors. This is exactly Algorithm 2, and it is what Optimum-Intel's diffusion hybrid quantization does.
  • Weight-only int8/int4 is the easy half. Weight-only compression (nncf.compress_weights, INT4 group-wise or INT8) does not depend on activation ranges, so the timestep drift mainly bites when moving to W8A8 (nncf.quantize) on CPU/Arc. For A8, static per-tensor activation scales must cover all timesteps. Consider keeping sensitive layers (e.g. timestep/AdaLN modulation, final projection) in FP16 via the ignored_scope.
  • Shortcut splitting is U-Net specific. LTX-2.3 is a DiT with residual adds, not channel concatenation, so Eq. 6–8 rarely applies directly. The underlying lesson still applies: find tensors that mix sub-populations with different ranges (e.g. concatenated text/video/audio tokens in joint attention, AdaLN-modulated activations) and give them separate quantizers or leave them in higher precision.
  • No custom kernels needed. Split quantization is just two FakeQuantize nodes before a Concat, and BRECQ/AdaRound change only the stored integer weights, so the result runs on stock OpenVINO INT8 ops. NNCF has no AdaRound/BRECQ; its closest tools are SmoothQuant, bias correction, and for weights AWQ / scale estimation / GPTQ, all of which reuse the same multi-timestep calibration set.
  • Re-calibrate if the sampler or step count changes (Table 6): if the thesis also cuts steps or uses caching, generate calibration data with the final sampler schedule.
Guide

Act on this box when building the NNCF calibration set: hook the LTX-2.3 transformer's inputs during full pipeline runs and keep samples from many steps across the trajectory, including both guidance branches, exactly as in Algorithm 2. Weight-only int8 or int4 hardly depends on this, but W8A8 does. Shortcut splitting does not apply directly to a DiT, yet the lesson does: give mixed-range tensors separate quantizers or higher precision. And regenerate calibration data if the sampler or step count changes.

Quantizing diffusion models

PTQ4DiT: Post-training Quantization for Diffusion Transformers

Junyi Wu, Haoxuan Wang, Yuzhang Shang, Mubarak Shah, Yan Yan · NeurIPS 2024 · arXiv 2405.16005 · code: github.com/adreamwu/PTQ4DiT

Inside a Diffusion Transformer, a few input channels of each linear layer carry huge values (“salient channels”), and the activation ones grow and shift as denoising proceeds. PTQ4DiT notices that activation and weight outliers almost never sit in the same channel, so it rescales each channel to meet in the middle (geometric mean), picks the activation statistics by weighting timesteps with a Spearman-correlation score, and folds all scales into existing layers offline so inference costs nothing extra.

Model
DiT-XL/2, ImageNet 256 & 512
Bits
W8A8 and W4A8
W8A8, 256, 250 steps
FID 4.63 (FP 4.53)
W4A8, 256, 250 steps
FID 7.09 vs 15.31 (Q-Diffusion)
Size
2575 → 646 / 324 MB
Inference overhead
0 (scales folded offline)
Reading guide

PTQ4DiT asks why standard post-training quantization breaks on Diffusion Transformers and how to fix it without retraining. Its answer: a few input channels carry huge values, activation outliers and weight outliers rarely share a channel, so each channel is rescaled to meet in the middle and choose the calibration timesteps carefully. On DiT-XL/2 for ImageNet, W eight A eight nearly matches full precision, and W four A eight reaches an FID of 7.09 where Q-Diffusion gets 15.31. The tab runs from the big picture and the problem, through the method, every equation and every figure, to the result tables and a thesis box on LTX-2.3 with NNCF. Among the sixteen papers it is the second diffusion-specific quantization paper, after Q-Diffusion and before ViDiT-Q. It borrows the SmoothQuant idea from the language-model group and adapts it to transformers with timesteps.

§0Before reading

To follow PTQ4DiT, three ideas are needed: what sits inside a Diffusion Transformer block (adaLN and its linear layers), why one very large channel ruins a low-bit quantization grid, and what a rank correlation measures. The paper is in the atlas because it is the first quantization method written for diffusion transformers, the family LTX-2.3 belongs to, and its balancing trick is the SmoothQuant idea that can be switched on in NNCF.

timestep t + class small MLP γ, β per channel tokens Z LayerNorm ×(1+γ) + β X Linear X·W attn / FFN adaLN: scale, shift quantized here
PrimerInside a DiT block, the timestep sets a per-channel scale. A Diffusion Transformer turns the image latent into tokens. Before each attention or feed-forward part, adaptive LayerNorm (adaLN) normalises the tokens, then multiplies every channel by \(1+\gamma\) and adds \(\beta\), where \(\gamma,\beta\) come from a small MLP fed with the timestep and class. Its output \(X\) is what the quantized linear layer (QKV, first FFN layer) sees. PTQ4DiT hides its activation scale inside that MLP, so the trick costs nothing at run time.
Guide

Inside a Diffusion Transformer block, the timestep and the class go through a small network that outputs a scale and a shift for every channel. Adaptive layer norm applies them to the normalised tokens, and the result, called X, is exactly what the quantized linear layer receives. Remember this path: PTQ4DiT later hides its own activation scaling inside that small network, which is why its method adds no cost at inference.

no outlier: range ±1 values use many levels one outlier (12): same 16 levels outlier bulk lands on ~2 levels W4: 16 levels A8: 256 levels
PrimerOne loud channel wastes the quantization grid. A \(b\)-bit quantizer has \(2^b\) evenly spaced levels (16 at 4 bits) stretched over the largest value it must hold. Add one value of 12 among values near ±1 and the step grows twelve-fold, so the bulk rounds onto about two levels. In a DiT a few input channels (“salient channels”) are loud like this. “W4A8” means weights at 4 bits and activations at 8 bits; here weights get one grid per output channel and activations one grid per tensor.
Guide

A four bit quantizer has only sixteen evenly spaced levels, and they must stretch to cover the largest value. With values near plus or minus one, many levels are used. Add a single value of twelve and the step grows twelve times, so the ordinary values fall on about two levels. W four A eight means four bit weights and eight bit activations, and this loud channel problem is what the whole paper attacks.

outliers coincide: ρ high outliers apart: ρ low act. wt. cannot cancel: low weight act. wt. can cancel: high weight step weight ηt = softmax(−ρ)
PrimerSpearman’s ρ asks: do two lists rank the same things high? Replace each channel’s maximum by its rank (1 = largest), then correlate the ranks: \(\rho\approx+1\) when the loud activation channels are also the loud weight channels, near 0 or negative when they differ. Balancing only helps when the outliers sit in different channels, so PTQ4DiT computes \(\rho\) at each timestep and gives low-\(\rho\) timesteps more say, through a softmax of \(-\rho\), when it averages activation statistics.
Guide

Spearman's rho compares two lists by their rankings, not their raw values. On the left, the loudest activation channel is also the loudest weight channel, so rho is high and balancing cannot help. On the right, the outliers sit in different channels, so rho is low and one tensor can absorb the other's extreme. PTQ4DiT turns minus rho into a softmax weight for each timestep when it averages activation statistics.

SmoothQuant (LLMs) α = ½ smoothing previous next Q-Diffusion U-Net diffusion PTQ4DiT image DiT ViDiT-Q video DiT calibrate across steps balance channels + weight timesteps per-token scales + mixed bits
PrimerWhere this paper sits. Q-Diffusion showed that diffusion models need calibration data from many timesteps, but it targeted U-Nets. PTQ4DiT moves to Diffusion Transformers: it borrows SmoothQuant’s per-channel scaling at \(\alpha=\tfrac12\) (the geometric mean) and adds a Spearman-weighted choice of timesteps, reaching W4A8 on image DiTs. ViDiT-Q, next, finds that for video DiTs static scales are not enough and switches to per-token dynamic scales and mixed precision.
Guide

PTQ4DiT sits between Q-Diffusion and ViDiT-Q. Q-Diffusion taught us to calibrate diffusion models across many timesteps, but on U-Nets. PTQ4DiT brings quantization to Diffusion Transformers, borrowing SmoothQuant's per-channel scaling with alpha of one half and adding timestep weighting. ViDiT-Q then moves to video transformers, where it replaces static scales with per-token dynamic ones and mixed precision.

Terms used in this paper

Diffusion Transformer (DiT)
A diffusion model whose denoising network is a transformer working on patches of the latent image, instead of a convolutional U-Net. LTX-2.3 is a (video and audio) DiT.
DiT-XL/2
The largest model of the original DiT paper (Peebles and Xie), using 2×2 latent patches. It is the only model quantized in PTQ4DiT.
adaLN
Adaptive LayerNorm: LayerNorm followed by a per-channel scale \(\gamma\) and shift \(\beta\) computed from the timestep and class. It is how a DiT is told which step and which class it is on.
Timestep / sampling steps
Generation removes noise over many steps (250, 100 or 50 here). Activations change from step to step, so statistics from one step may not fit the others.
Post-training quantization (PTQ)
Converting a trained model to low-bit numbers without retraining, using only a small calibration set to choose ranges and scales.
Calibration set
A few inputs run through the full-precision model to record value ranges. Here: 32 generated samples at each of 25 (256 px) or 10 (512 px) timesteps.
W8A8 / W4A8
Weights at 8 or 4 bits, activations at 8 bits. Integer activations need a scale chosen in advance, which is why activation outliers matter so much.
Salient channel / salience
An input channel whose maximum absolute value is far above the rest. The paper calls that maximum the channel’s salience.
Geometric mean
\(\sqrt{a\cdot b}\). Balancing moves an activation channel with maximum 12 and its weight row with maximum 1 both to about 3.5; the product is unchanged.
Spearman’s ρ
A correlation computed on ranks rather than raw values; +1 means two lists are ordered the same, −1 means reversed.
ImageNet 256 / 512
Class-conditional generation: the model draws one of 1000 ImageNet classes (eagle, balloon…) at 256×256 or 512×512 pixels.
FID, sFID, IS, Precision
Image-quality scores from an Inception network. FID and sFID compare generated and real image statistics (lower is better); Inception Score and Precision reward sharp, recognisable, realistic images (higher is better).
PTQ4DM, Q-Diffusion, PTQD, RepQ*
The baselines: three PTQ methods for diffusion U-Nets and a ViT quantizer (RepQ-ViT) that the authors re-implemented for DiTs.
NVIDIA RTX A6000
The workstation GPU used for all experiments. The paper reports quality and model size, not measured speed-ups on it.
Guide

These are the words the paper uses without explaining. The most important are adaptive layer norm, the timestep-driven scale and shift; salience, the largest value in a channel; W four A eight, the bit setting; and Spearman's rho, a correlation on ranks. For results, FID and sFID are lower is better, while Inception Score and Precision are higher is better. All experiments use DiT-XL/2 on ImageNet with an NVIDIA RTX A6000 GPU.

§2Big picture

Before: FP layer f(X;W) = X·Wactivation channels s(X_j)weight channels s(W_j)outliersin differentchannelsCSB + SSCX̃ = X·BˣW̃ = Bʷ·WBˣ·Bʷ = Iper channel: meet atgeometric mean √(s(X_j)·s(W_j))After: balanced, then quantizeX̃ channels (max 6 → 2.4)W̃ channels (max 5.5 → 2.3)old maxINT8 / INT4 GEMMQ(X̃) · Q(W̃)narrower range per tensor→ smaller rounding stepBˣ folded into adaLN MLPBʷ folded into W (offline)
OverviewMove the extremes to where the other tensor is calm. Activation outliers (magenta) and weight outliers sit in different channels. A per-channel diagonal scale shrinks the big activation channel and grows the matching weight row (and vice-versa), so both tensors end with the same per-channel range √(s(Xj)·s(Wj)). The product X·W is unchanged; the scales are fused into existing layers before quantization. Toy numbers.
Guide

The core trick is to move each extreme to where the other tensor is calm. Magenta marks activation outliers, and weight outliers sit in different channels. A per-channel scale shrinks the loud activation channel and grows the matching weight row, so both end at the geometric mean of their two ranges, here dropping the maxima from about 6 to 2.4 and 5.5 to 2.3. The product stays identical, and the scales are folded into existing layers before quantization. The numbers are a toy example.

Two DiT-specific problems: extreme salient channels, and activation salience that drifts over the ~250 denoising steps. CSB fixes the first by channel-wise balancing (SmoothQuant-style, fixed exponent ½); SSC fixes the second by choosing which timesteps to trust when estimating activation salience. Re-parameterization makes both free at inference.

§3The problem

(a) One outlier stretches the gridsalientbulk of values−150154-bit levels (dashed): only ~2 levels cover the bulk(b) Salient activations drift with timestep2501901307010010203040timestep (denoising →)max |act|range fixed at one tclippedwastedresolution
ProblemWhy vanilla PTQ breaks on DiTs. (a) Uniform quantization (Eq. 2) spends its fixed number of levels over the full range, so a single salient channel forces a coarse step for everyone, or must be clipped. (b) The salient activation magnitude rises strongly toward the end of sampling (shape from Fig. 4), so a range calibrated at one timestep clips late steps and wastes resolution early.
Guide

Two things break plain quantization on DiTs. In panel a, a uniform grid must stretch to cover one salient channel, so at four bits only about two levels are left for the bulk of the values, unless the outlier is clipped. In panel b, the salient activation magnitude climbs toward the end of sampling, so a range calibrated at one timestep clips late steps and wastes resolution early. These are exactly the two problems that channel balancing and timestep-aware calibration address.

  • Challenge 1 – salient channels. In both X and W of the attention/FFN linear layers, a handful of channels have max |value| an order of magnitude above the rest, and these channels carry most of the quantization MSE (Fig. 3).
  • Challenge 2 – temporal variation. s(X(t)) changes across the denoising trajectory (Fig. 4); W is fixed. Balancing scales tuned for one timestep are biased for others.
  • Lucky observation – complementarity. Extreme activation channels and extreme weight channels do not coincide, so they can trade magnitude without creating a new outlier.
  • Setup constraint: per-channel weight quantizers but per-tensor activation quantizers, so activation outliers hurt the whole tensor.

§4Method

Step 1–3: CSB on three channelsXWX̃W̃j=1: 12·1 → 3.5Bˣ=0.3, Bʷ=3.5XWX̃W̃j=2: 1·9 → 3Bˣ=3, Bʷ=0.3XWX̃W̃j=3: 2·2 → 2Bˣ=1, Bʷ=1max over channels: 12 → 3.5 (act), 9 → 3.5 (wt)Step 4–6: SSC picks which timesteps to trusts(X(t))t=250ρ(s(X⁽ᵗ⁾), s(W))= +0.8exp(−ρ)=0.45s(X(t))t=130ρ(s(X⁽ᵗ⁾), s(W))= +0.1exp(−ρ)=0.90s(X(t))t=10ρ(s(X⁽ᵗ⁾), s(W))= -0.4exp(−ρ)=1.49η=0.16η=0.32η=0.52softmax (Eq. 11)sρ = Σₜ ηₜ · s(X⁽ᵗ⁾) (Eq. 10)low correlation with W = better complementarity = more weight
MethodCSB then SSC, numerically. Left: per channel the balanced salience is the geometric mean, BXj=s̃/s(Xj), BWj=s̃/s(Wj), so both tensors end with max s̃ in that channel. Right: SSC replaces the single-timestep activation salience by a weighted average; weights are a softmax of −ρ (Spearman rank correlation of activation vs weight channel salience). Since ρ∈[−1,1], weights differ by at most e²≈7.4×. Toy numbers.
Guide

Here the two method steps are worked with toy numbers. On the left, channel-wise salience balancing takes each channel's activation and weight maxima, for example 12 and 1, and moves both to their geometric mean of about 3.5, so the worst channel falls from 12 to 3.5. On the right, the calibration step weights each timestep by the exponential of minus rho, the rank correlation between activation and weight salience. Because rho lies between minus one and one, weights differ by at most about 7.4 times.

Step 7–8: re-parameterize (offline) and quantizecondition cadaLN MLPWγBˣ, WβBˣ, bγBˣ, bβBˣLN(Z)⊙(Bˣ+γ̃)+β̃= X̃ (Eq. 13)Q(·)INT GEMMQ(X̃)·Q(BʷW)W̃ = BʷW storedProjection2 (attn out): Bˣ goes into the precedingattention matmul / de-quantization scale instead of adaLNno new ops at inference
MethodZero runtime cost. BWρ is multiplied into the linear weight once. BXρ is multiplied into the columns and bias of the MLP that regresses the adaLN scale/shift (for Projection1 = QKV and FC1), or into the preceding matmul/de-quant scale (for Projection2). FC2 (after GELU) is not balanced.
Guide

The balancing costs nothing at inference because both scales are folded in offline. The weight scale is multiplied into the linear layer's weight once and stored. The activation scale is pushed into the small MLP that produces the adaLN scale and shift, for the QKV projection and the first feedforward layer, or into the preceding attention matmul for the output projection. The second feedforward layer, after GELU, is left unbalanced. After this step, ordinary integer matmuls run with no new operations.

  1. Build a calibration set: uniformly pick 25 timesteps (256×256) or 10 (512×512), 32 samples each, from the FP model’s own sampling trajectories.
  2. For every linear layer in MHSA/PF: per input channel j, record activation salience s(Xj(t)) = max|Xj(t)| at each timestep, and weight salience s(Wj) = max|Wj| (row j of W).
  3. Spearman’s ρ between the vectors s(X(t)) and s(W) for each t; ηt = softmax(−ρ) over t (Eq. 11).
  4. Temporal salience sρ = Σt ηt s(X(t)) (Eq. 10).
  5. Balanced salience s̃ρ,j = √(sρ,j·s(Wj)) (Eq. 14); BXρ = diag(s̃/sρ), BWρ = diag(s̃/s(W)) — exact inverses (Eq. 15).
  6. Fold BWρ into W, BXρ into adaLN MLP (Eqs. 13, 20–21) or the preceding matmul.
  7. Run standard PTQ (Q-Diffusion-style quantizer-parameter optimization): channel-wise uniform weights, tensor-wise uniform activations.
Guide

The recipe has three phases. First, collect statistics: sample 25 or 10 timesteps from the full-precision model's own trajectories, 32 samples each, and record per-channel maxima of activations at every timestep and of weights once. Second, compute the scales: rank-correlate the two, turn the negative correlations into softmax weights over timesteps, average the activation maxima with those weights, then take the geometric mean with the weight maxima. Third, fold the scales in and run a standard Q-Diffusion-style quantizer calibration.

Algorithm 1 Post-Training Quantization for Diffusion Transformers (PTQ4DiT) 1: Input: Pre-trained DiT model, Activation sequence X^(1:T) from calibration dataset 2: Output: Quantized DiT model with low-bit activations and weights 3: (1) Preparation: 4: Estimate activation salience s(X^(t)) at each timestep t ▷ Using Eq. (9) 5: Estimate weight salience s(W) ▷ Using Eq. (9) 6: (2) Spearman's rho-guided Salience Calibration: 7: Compute correlation coefficients {rho(s(X^(t)), s(W))}_{t=1..T} 8: Compute weighting factors {eta_t}_{t=1..T} ▷ Using Eq. (11) 9: Compute temporal salience s_rho(X^(1:T)) ▷ Using Eq. (10) 10: (3) Channel-wise Salience Balancing: 11: Compute balanced salience s~_rho(X_j^(1:T), W_j) for each channel j ▷ Using Eqs. (5), (14) 12: Construct refined Salience Balancing Matrices B^X_rho and B^W_rho ▷ Using Eqs. (6), (7) 13: (4) Re-Parameterization: 14: Integrate B^W_rho into the weight matrix of linear layers offline ▷ By W~ = B^W_rho W 15: Integrate B^X_rho into the MLPs before adaLN modules offline ▷ Using Eqs. (13), (20) 16: (5) Quantization: 17: Obtain X~ = X B^X_rho and W~ = B^W_rho W without extra computational demand during inference 18: Perform quantization on balanced activation X~ and weight W~
Guide

The algorithm is the same pipeline written as five stages. Preparation measures salience per channel, per timestep for activations and once for weights. The Spearman calibration stage decides how much each timestep counts and produces one blended activation salience per channel. Balancing turns that into the two diagonal matrices. Re-parameterization folds them into the weights and the adaLN MLP offline. Quantization then runs on the already balanced tensors, so the deployed model has the same structure and cost as a plain quantized DiT.

§5Every equation

(1)\[ (\boldsymbol{\gamma},\boldsymbol{\beta}) = \operatorname{MLPs}(\mathbf{c}),\qquad \operatorname{adaLN}(\mathbf{Z}) = \operatorname{LN}(\mathbf{Z})\odot(\mathbf{1}+\boldsymbol{\gamma})+\boldsymbol{\beta} \]

DiT conditioning: an MLP maps condition \(\mathbf c\) (timestep + class) to per-channel scale \(\boldsymbol\gamma\) and shift \(\boldsymbol\beta\) applied after LayerNorm.

Guide

This is how a DiT injects the timestep and class. An MLP maps the condition c to two vectors, gamma, a per-channel scale, and beta, a per-channel shift. The adaptive layer norm then normalizes the tokens Z, multiplies each channel by one plus gamma, and adds beta. This matters later because the output of adaLN is the input X to the QKV and feedforward layers, which gives the method a free place to hide its activation scale.

(2)\[ Q(\mathbf{x}) = \operatorname{clamp}\!\left(\left\lfloor \frac{\mathbf{x}}{\boldsymbol{\delta}} \right\rceil + \boldsymbol{\lambda},\ 0,\ 2^{b}-1\right) \]

Uniform asymmetric \(b\)-bit quantizer: step \(\boldsymbol\delta\), zero-point \(\boldsymbol\lambda\), round-to-nearest, clamp.

Guide

This is the standard uniform b-bit quantizer. Divide x by the step size delta, round to the nearest integer, add the zero point lambda, and clamp the result between zero and two to the power b minus one. The step size is set by the range being covered, so one huge value makes delta coarse for every other value. That is the failure shown in the problem figure, and every later equation is about shrinking the range before this quantizer is applied.

(3)\[ \widetilde{\mathbf{X}} = \mathbf{X}\mathbf{B}^{\mathbf{X}},\qquad \widetilde{\mathbf{W}} = \mathbf{B}^{\mathbf{W}}\mathbf{W} \]

CSB: diagonal balancing matrices rescale activation columns and weight rows (input channels).

Guide

Channel-wise salience balancing in one line. X tilde is the activation matrix multiplied on the right by a diagonal matrix B X, which rescales each input channel column. W tilde is the weight multiplied on the left by a diagonal matrix B W, which rescales the matching weight row. Choosing the two so they cancel keeps the layer output unchanged, as equation twelve shows, while reshaping what the quantizer sees.

(4)\[ s(\mathbf{X}_j) = \max(|\mathbf{X}_j|),\quad s(\mathbf{W}_j) = \max(|\mathbf{W}_j|),\quad \text{where}\ j = 1,2,\dots,d_{in} \]

Salience of channel \(j\) = its maximum absolute value (range drives quantization error).

Guide

Salience is simply the largest absolute value in a channel. For activation channel j, s of X j is the max of the absolute values in that column; for weights, s of W j is the max over row j. The index j runs over the d in input channels. The paper uses the maximum because the range is what sets the quantization step, and the problem figures show the channels with the biggest maxima also carry the biggest error.

(5)\[ \widetilde{s}(\mathbf{X}_j,\mathbf{W}_j) = \big(s(\mathbf{X}_j)\cdot s(\mathbf{W}_j)\big)^{\frac{1}{2}} \]

Balanced salience = geometric mean of activation and weight salience (SmoothQuant with \(\alpha=0.5\)).

Guide

The balanced salience of channel j is the geometric mean of its activation salience and its weight salience, the square root of their product. If activations peak at 12 and weights at 1 in that channel, both end up at about 3.5. This is exactly SmoothQuant with alpha equal to one half. It is the target value that the balancing matrices in equations six and seven are built to reach.

(6)\[ \mathbf{B}^{\mathbf{X}} = \operatorname{diag}\!\left(\frac{\widetilde{s}(\mathbf{X}_1,\mathbf{W}_1)}{s(\mathbf{X}_1)},\frac{\widetilde{s}(\mathbf{X}_2,\mathbf{W}_2)}{s(\mathbf{X}_2)},\dots,\frac{\widetilde{s}(\mathbf{X}_{d_{in}},\mathbf{W}_{d_{in}})}{s(\mathbf{X}_{d_{in}})}\right) \]

Activation balancing matrix: shrinks channels whose activation salience exceeds the balanced value.

Guide

The activation balancing matrix is diagonal, with entry j equal to the balanced salience divided by the activation salience of that channel. Where activations are loud, the ratio is below one and the channel is shrunk; where they are quiet, it is above one and the channel is enlarged. After multiplying, every activation channel has maximum equal to its balanced salience from equation five.

(7)\[ \mathbf{B}^{\mathbf{W}} = \operatorname{diag}\!\left(\frac{\widetilde{s}(\mathbf{X}_1,\mathbf{W}_1)}{s(\mathbf{W}_1)},\frac{\widetilde{s}(\mathbf{X}_2,\mathbf{W}_2)}{s(\mathbf{W}_2)},\dots,\frac{\widetilde{s}(\mathbf{X}_{d_{in}},\mathbf{W}_{d_{in}})}{s(\mathbf{W}_{d_{in}})}\right) \]

Weight balancing matrix; after (3), \(s(\widetilde{\mathbf X}_j)=s(\widetilde{\mathbf W}_j)=\widetilde s(\mathbf X_j,\mathbf W_j)\).

Guide

The weight balancing matrix mirrors equation six: entry j is the balanced salience divided by the weight salience of channel j. Multiplying the two entries gives s of X j times s of W j over the product of the same, which is exactly one, so the two matrices are inverses. After balancing, activation and weight channel j share the same maximum, the geometric mean. The exact inverse property is proven in equations fifteen and sixteen.

(8)\[ \max\big(s_o(\widetilde{\mathbf{X}}),\,s_o(\widetilde{\mathbf{W}})\big) \le \max\big(s_o(\mathbf{X}),\,s_o(\mathbf{W})\big) \]

Overall salience (the larger of the two tensor ranges) never grows; it shrinks when outliers are complementary.

Guide

This inequality is the payoff of balancing. The overall salience of a tensor, s sub o, is its largest channel maximum. The larger of the two overall saliences after balancing is never bigger than before. When activation and weight outliers sit in different channels, it is much smaller, because each outlier is paired with a small partner. Since the quantization step follows the overall range, this means finer steps for both tensors at the same bit width.

—\[ s_o(\mathbf{X}) = \max\big(s(\mathbf{X}_1), s(\mathbf{X}_2),\dots,s(\mathbf{X}_{d_{in}})\big) \]

Unnumbered: overall salience of a tensor = max channel salience = range quantized together at the given granularity.

Guide

An unnumbered helper definition. The overall salience of a tensor is the maximum of all its channel saliences, so for X it is the largest value among s of X one up to s of X d in. With per-tensor activation quantization, this single number sets the step size for the whole tensor, which is why one loud channel hurts everyone. Equation eight is stated in terms of it.

(9)\[ \mathbf{s}(\mathbf{X}^{(t)}) = \big(s(\mathbf{X}^{(t)}_1), s(\mathbf{X}^{(t)}_2),\dots,s(\mathbf{X}^{(t)}_{d_{in}})\big),\qquad \mathbf{s}(\mathbf{W}) = \big(s(\mathbf{W}_1), s(\mathbf{W}_2),\dots,s(\mathbf{W}_{d_{in}})\big) \]

Salience vectors per timestep \(t\) of the activation sequence \(\mathbf X^{(1:T)}\); \(\mathbf s(\mathbf W)\) is timestep-independent.

Guide

Now time enters. For each timestep t, the activation salience vector collects the per-channel maxima s of X j at that step, one entry per input channel. The weight salience vector s of W does the same for weights and does not depend on t, since weights are fixed. These two vectors, compared step by step, are the inputs to the Spearman calibration in equations ten and eleven.

(10)\[ \mathbf{s}_{\rho}(\mathbf{X}^{(1:T)}) = (\eta_1,\eta_2,\dots,\eta_T)\cdot\big(\mathbf{s}(\mathbf{X}^{(1)}),\mathbf{s}(\mathbf{X}^{(2)}),\dots,\mathbf{s}(\mathbf{X}^{(T)})\big)^{\mathrm{T}} \in \mathbb{R}^{d_{in}} \]

Spearman’s \(\rho\)-calibrated temporal salience: weighted sum of per-timestep activation salience vectors.

Guide

The temporal salience s rho is a weighted average of the per-timestep activation salience vectors. Each timestep t contributes its vector times a weight eta t, and the result is one salience value per input channel. It replaces the single-timestep activation salience in the balancing formula, so the scales work across the whole denoising process rather than being tuned to one step. The weights come from equation eleven.

(11)\[ \eta_t = \frac{\exp\!\big[-\rho\big(\mathbf{s}(\mathbf{X}^{(t)}),\mathbf{s}(\mathbf{W})\big)\big]}{\sum_{\tau=1}^{T}\exp\!\big[-\rho\big(\mathbf{s}(\mathbf{X}^{(\tau)}),\mathbf{s}(\mathbf{W})\big)\big]} \]

Softmax of negative Spearman rank correlation: timesteps where activation and weight outliers are least aligned (most complementary) get more weight.

Guide

The timestep weights are a softmax of minus rho. Rho is Spearman's rank correlation between the activation salience vector at step t and the weight salience vector. Low or negative correlation means outliers sit in different channels, so balancing works well, and that timestep gets a larger weight. High correlation means outliers coincide and cannot be cancelled, so that step gets less say. The sum in the denominator just makes the weights add to one.

(12)\[ \widetilde{\mathbf{X}}\cdot\widetilde{\mathbf{W}} = (\mathbf{X}\mathbf{B}^{\mathbf{X}}_{\rho})\cdot(\mathbf{B}^{\mathbf{W}}_{\rho}\mathbf{W}) = \mathbf{X}\cdot\mathbf{W} \]

Balancing is exact: the layer output is unchanged in full precision.

Guide

Balancing is exact in full precision. X tilde times W tilde equals X times B X rho times B W rho times W, and since the two diagonal matrices multiply to the identity, this is just X times W. So the model is mathematically unchanged; only the ranges that the quantizers see are different. Equations fifteen and sixteen spell out the proof.

(13)\[ \widetilde{\mathbf{X}} = \widetilde{\operatorname{adaLN}}(\mathbf{Z}) = \operatorname{LN}(\mathbf{Z})\odot(\mathbf{B}^{\mathbf{X}}_{\rho}+\widetilde{\boldsymbol{\gamma}})+\widetilde{\boldsymbol{\beta}},\quad \text{where}\ \widetilde{\boldsymbol{\gamma}} = \boldsymbol{\gamma}\mathbf{B}^{\mathbf{X}}_{\rho},\ \ \widetilde{\boldsymbol{\beta}} = \boldsymbol{\beta}\mathbf{B}^{\mathbf{X}}_{\rho} \]

Post-adaLN folding: \(\mathbf B^{\mathbf X}_\rho\) is absorbed into the scale/shift of adaLN (i.e. into the MLP that produces them).

Guide

This shows where the activation scale hides. Instead of an extra multiply, the adaLN output is rewritten: layer norm of Z times B X rho plus gamma tilde, plus beta tilde, where gamma tilde and beta tilde are gamma and beta already multiplied by B X rho. The constant one from equation one simply becomes B X rho. Because gamma and beta come from an MLP, the scaling can be baked into that MLP, as equations eighteen to twenty-one show.

(14)\[ \widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{j},\mathbf{W}_{j}) = \big(s_{\rho}(\mathbf{X}^{(1:T)}_{j})\cdot s(\mathbf{W}_j)\big)^{\frac{1}{2}} \]

Appendix B: refined balanced salience using the SSC temporal salience \(s_\rho\) instead of a single-timestep \(s(\mathbf X_j)\).

Guide

From the appendix, this is the refined balanced salience actually used. It is the same geometric mean as equation five, but the activation salience is now the Spearman-weighted temporal salience s rho from equation ten rather than a value from one timestep. The square root of s rho of channel j times s of W j gives the target range for that channel across all denoising steps.

(15)\[ \begin{aligned} &\mathbf{B}^{\mathbf{X}}_{\rho}\cdot\mathbf{B}^{\mathbf{W}}_{\rho}\\ &= \operatorname{diag}\!\left(\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{1},\mathbf{W}_{1})}{s_{\rho}(\mathbf{X}^{(1:T)}_{1})},\dots,\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}},\mathbf{W}_{d_{in}})}{s_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}})}\right)\cdot\operatorname{diag}\!\left(\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{1},\mathbf{W}_{1})}{s(\mathbf{W}_1)},\dots,\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}},\mathbf{W}_{d_{in}})}{s(\mathbf{W}_{d_{in}})}\right)\\ &= \operatorname{diag}\!\left(\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{1},\mathbf{W}_{1})}{s_{\rho}(\mathbf{X}^{(1:T)}_{1})}\cdot\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{1},\mathbf{W}_{1})}{s(\mathbf{W}_1)},\dots,\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}},\mathbf{W}_{d_{in}})}{s_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}})}\cdot\frac{\widetilde{s}_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}},\mathbf{W}_{d_{in}})}{s(\mathbf{W}_{d_{in}})}\right)\\ &= \operatorname{diag}\!\left(\frac{\big(s_{\rho}(\mathbf{X}^{(1:T)}_{1})\cdot s(\mathbf{W}_1)\big)^{\frac{1}{2}\cdot 2}}{s_{\rho}(\mathbf{X}^{(1:T)}_{1})\cdot s(\mathbf{W}_1)},\dots,\frac{\big(s_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}})\cdot s(\mathbf{W}_{d_{in}})\big)^{\frac{1}{2}\cdot 2}}{s_{\rho}(\mathbf{X}^{(1:T)}_{d_{in}})\cdot s(\mathbf{W}_{d_{in}})}\right) = \mathbf{I} \end{aligned} \]

Appendix C proof: the two balancing matrices are exact inverses (product = identity).

Guide

This is the proof that the refined balancing matrices are exact inverses. Multiplying B X rho and B W rho entry by entry gives, for each channel, the balanced salience squared divided by s rho times s of W. Since the balanced salience is the square root of that same product, each entry equals one and the product is the identity matrix. This makes the equivalence in equation sixteen hold.

(16)\[ \widetilde{\mathbf{X}}\cdot\widetilde{\mathbf{W}} = (\mathbf{X}\mathbf{B}^{\mathbf{X}}_{\rho})\cdot(\mathbf{B}^{\mathbf{W}}_{\rho}\mathbf{W}) = \mathbf{X}\cdot(\mathbf{B}^{\mathbf{X}}_{\rho}\mathbf{B}^{\mathbf{W}}_{\rho})\cdot\mathbf{W} = \mathbf{X}\cdot\mathbf{W} \]

Hence mathematical equivalence of the balanced layer (Appendix C).

Guide

The equivalence stated fully. X tilde times W tilde is regrouped as X times the product of the two balancing matrices times W. Equation fifteen showed that product is the identity, so the result is X times W. In words, balancing changes nothing in full precision, and any quality change after quantization comes only from how well the new ranges quantize.

(17)\[ \mathbf{X} = \operatorname{adaLN}(\mathbf{Z}) = \operatorname{LN}(\mathbf{Z})\odot(\mathbf{1}+\boldsymbol{\gamma})+\boldsymbol{\beta} \]

Appendix D: adaLN on latent \(\mathbf Z\in\mathbb R^{n\times d_{in}}\) produces the linear layer’s input.

Guide

The appendix restates adaLN. The linear layer's input X is the layer norm of the latent tokens Z, multiplied channel-wise by one plus gamma and shifted by beta. Z has n tokens and d in channels. This is the starting point for showing that an activation-side scale can be absorbed upstream instead of being applied as an extra operation.

(18)\[ (\boldsymbol{\gamma},\boldsymbol{\beta}) = \operatorname{MLPs}(\mathbf{c}) = \mathbf{c}\cdot(\mathbf{W}_{\boldsymbol{\gamma}},\mathbf{W}_{\boldsymbol{\beta}}) + (\mathbf{b}_{\boldsymbol{\gamma}},\mathbf{b}_{\boldsymbol{\beta}}) \]

The scale/shift regressor is affine in \(\mathbf c\) (last layer), so right-multiplying by a diagonal matrix can be folded into it.

Guide

The scale and shift come from the last layer of the conditioning MLP, which is affine: c times weight matrices W gamma and W beta, plus biases b gamma and b beta. Because it is a linear map plus bias, multiplying its output by a diagonal matrix is the same as multiplying its weights and biases. That is what makes the offline fold in equations twenty and twenty-one possible.

(19)\[ \widetilde{\mathbf{X}} = \mathbf{X}\mathbf{B}^{\mathbf{X}}_{\rho} = \operatorname{LN}(\mathbf{Z})\odot(\mathbf{B}^{\mathbf{X}}_{\rho}+\boldsymbol{\gamma}\mathbf{B}^{\mathbf{X}}_{\rho}) + \boldsymbol{\beta}\mathbf{B}^{\mathbf{X}}_{\rho} \]

Applying \(\mathbf B^{\mathbf X}_\rho\) to adaLN output distributes over the scale, the constant 1 and the shift (echoes Eq. 13).

Guide

Applying the activation scale to adaLN's output distributes over its three parts. X tilde, which is X times B X rho, equals layer norm of Z times the sum of B X rho and gamma times B X rho, plus beta times B X rho. The constant one becomes B X rho, and gamma and beta are each rescaled. This matches equation thirteen and sets up the weight edit that follows.

(20)\[ (\widetilde{\mathbf{W}}_{\boldsymbol{\gamma}},\widetilde{\mathbf{W}}_{\boldsymbol{\beta}}) = (\mathbf{W}_{\boldsymbol{\gamma}}\mathbf{B}^{\mathbf{X}}_{\rho},\,\mathbf{W}_{\boldsymbol{\beta}}\mathbf{B}^{\mathbf{X}}_{\rho}),\qquad (\widetilde{\mathbf{b}}_{\boldsymbol{\gamma}},\widetilde{\mathbf{b}}_{\boldsymbol{\beta}}) = (\mathbf{b}_{\boldsymbol{\gamma}}\mathbf{B}^{\mathbf{X}}_{\rho},\,\mathbf{b}_{\boldsymbol{\beta}}\mathbf{B}^{\mathbf{X}}_{\rho}) \]

Offline: scale the MLP weight columns and biases by \(\mathbf B^{\mathbf X}_\rho\).

Guide

The offline edit itself. Multiply the columns of the MLP weights W gamma and W beta, and the biases b gamma and b beta, by the diagonal activation scale B X rho. This is done once before deployment. The next equation checks that the edited MLP now outputs the already scaled gamma and beta.

(21)\[ \begin{aligned} \widetilde{\operatorname{MLPs}}(\mathbf{c}) &= \mathbf{c}\cdot(\widetilde{\mathbf{W}}_{\boldsymbol{\gamma}},\widetilde{\mathbf{W}}_{\boldsymbol{\beta}}) + (\widetilde{\mathbf{b}}_{\boldsymbol{\gamma}},\widetilde{\mathbf{b}}_{\boldsymbol{\beta}})\\ &= \mathbf{c}\cdot(\mathbf{W}_{\boldsymbol{\gamma}}\mathbf{B}^{\mathbf{X}}_{\rho},\mathbf{W}_{\boldsymbol{\beta}}\mathbf{B}^{\mathbf{X}}_{\rho}) + (\mathbf{b}_{\boldsymbol{\gamma}}\mathbf{B}^{\mathbf{X}}_{\rho},\mathbf{b}_{\boldsymbol{\beta}}\mathbf{B}^{\mathbf{X}}_{\rho})\\ &= \big(\mathbf{c}\cdot(\mathbf{W}_{\boldsymbol{\gamma}},\mathbf{W}_{\boldsymbol{\beta}}) + (\mathbf{b}_{\boldsymbol{\gamma}},\mathbf{b}_{\boldsymbol{\beta}})\big)\cdot\mathbf{B}^{\mathbf{X}}_{\rho}\\ &= (\boldsymbol{\gamma},\boldsymbol{\beta})\cdot\mathbf{B}^{\mathbf{X}}_{\rho}\\ &= (\boldsymbol{\gamma}\mathbf{B}^{\mathbf{X}}_{\rho},\,\boldsymbol{\beta}\mathbf{B}^{\mathbf{X}}_{\rho}) \end{aligned} \]

The re-parameterized MLP directly outputs \(\widetilde{\boldsymbol\gamma},\widetilde{\boldsymbol\beta}\): no extra runtime multiply.

Guide

This verifies the fold. Running the condition c through the edited MLP gives c times the scaled weights plus the scaled biases, which factors into the original MLP output times B X rho, which is gamma and beta each times B X rho. So the modified adaLN produces the balanced activation directly, with no extra multiply at inference. This closes the argument that the method has zero runtime overhead.

§6Every figure

Activation magnitudet = t1t = t2t = t3ComplementarityWeight magnitude · salient weight channelssalient act. channelschannel →
Fig. 1 (left)Salient channels are complementary. Activation peaks (magenta dashes) move in height over timesteps t1–t3; weight peaks (indigo) sit in other channels. PTQ4DiT exploits this to trade magnitude between them.
Guide

The key observation of the paper is that activation and weight outliers are complementary. The top rows plot activation magnitude per channel at three timesteps; the magenta peaks change height over time. The bottom row plots weight magnitude, whose indigo peaks sit in other channels. Because the loud channels rarely coincide, magnitude can be traded between the two tensors, and the changing activation peaks are why the method also has to handle time.

W8A8140170200230260290481216IS → betterFID ↓ betterFPQ-DiffPTQDRepQ*Ours
Fig. 1 (right a)W8A8: PTQ4DiT sits on top of FP. ImageNet 256, 50 steps (values from Table 1). Circle area ∝ model size (FP 2575 MB, W8 646 MB).
Guide

At W eight A eight, PTQ4DiT lands next to full precision. The horizontal axis is Inception Score, higher is better, and the vertical axis is FID, lower is better, for ImageNet 256 at 50 steps. Circle area is model size, 2575 megabytes for full precision and 646 for eight-bit weights. PTQ4DiT has an FID of 5.45 against 6.02 for full precision, while Q-Diffusion and PTQD sit near 15.

W4A8601101602102600102030IS → betterFID ↓ betterFPQ-DiffPTQDRepQ*Ours
Fig. 1 (right b)W4A8: baselines collapse, PTQ4DiT stays close. Same setting; W4 models are 324 MB. Ours FID 9.17 vs ≥22.9 for all baselines.
Guide

At W four A eight the baselines fall apart and PTQ4DiT stays close to full precision. Same axes as before, Inception Score across and FID up, with four-bit models of 324 megabytes. PTQ4DiT reaches an FID of 9.17, while every baseline is at 22.9 or worse. This is the headline result: the gain grows as the bit width shrinks.

DiT Block ×nBInput TokensadaLNMHSAscale+adaLNPointwise FFscale+ConditioningMLPsγ₁,β₁α₁γ₂,β₂α₂Linear Layer fInteger MatMulQuantizerQuantizerX̃W̃CSB & SSCXWactivations from various timestepsX(t1)X(t2)high corr. with Wlow corr. with WWCSBCSBX̃&W̃ (t1)X̃&W̃ (t2)SSChigh error → less focuslow error → more focus(weights ηₜ)
Fig. 2Where PTQ4DiT acts. Left: DiT block – adaLN (scale/shift γ,β from the conditioning MLP) → MHSA → gate α → residual, then the same for the Pointwise Feedforward. Middle: every attention/FFN linear layer gets CSB & SSC on X and W before the two quantizers and the integer matmul. Right: if at timestep t1 activation salience correlates with weight salience, balancing cannot cancel the outliers (high error), so SSC gives t1 less weight; low-correlation t2 balances well and gets more weight.
Guide

This places the method in the DiT block. On the left, each block applies adaLN with scale and shift from the conditioning MLP, then attention, a gate alpha and a residual, then the same for the feedforward part. In the middle, each linear layer gets balancing and calibration on X and W before the two quantizers and the integer matmul. On the right, a timestep whose activation salience correlates with weight salience balances poorly, so it gets less weight.

020040060080010000481216channel indexmax |value|activationerror (MSE)salient channel
Fig. 3 (left)Activation: big channels = big error. Max |value| per input channel of one DiT linear layer (teal) and its quantization MSE (rust). Salient channels near 620 and 985 reach ~14–15 vs a typical ~1. Shape redrawn; peak positions read from the paper.
Guide

Big activation channels produce big quantization error. The horizontal axis is the input channel index of one DiT linear layer; teal is each channel's maximum absolute value, rust is its quantization mean squared error. A few salient channels, near 620 and 985, reach about 14 to 15 where a typical channel is about 1, and the error spikes at the same places. The curve shapes are redrawn, and only the peak positions come from the paper.

02004006008001000061218channel indexmax |value|weighterror (MSE)salient channel
Fig. 3 (right)Weight: same pattern, different channels. Weight salient channels (~25, 55, 190, 290, 900, 1080) do not coincide with activation ones – the complementarity CSB exploits. Shape redrawn.
Guide

Weights show the same pattern, but in different channels. Salient weight channels sit near 25, 55, 190, 290, 900 and 1080, and again the error follows the magnitude. None of these line up with the activation peaks in the previous figure. That mismatch is the complementarity that channel balancing exploits. The shape is redrawn from the paper.

010203040timestep (sampling order →)max |activation|250240230220210200190180170160150140130120110100908070605040302010
Fig. 4Activation salience grows over sampling. Distribution (box = IQR, dots = outlier channels) of per-channel max |activation| in one DiT linear layer for timesteps 250→10. Early steps: all channels <~5; last steps: median ~6, outlier channels up to ~42. A single-timestep calibration cannot fit all steps. Shape redrawn.
Guide

Activation salience grows as sampling proceeds. Each box summarizes per-channel maxima of activations in one DiT layer at a timestep, from 250 on the left down to 10; the box is the middle half of channels and dots are outlier channels. Early on all channels stay under about 5; by the last steps the median is about 6 and outliers reach about 42. No single calibration timestep fits all of this, which motivates the Spearman-weighted calibration.

eaglered pandaclock towerold cargoldfishballoonRepQ* W4A8dark, soft~blurry~washed~wrecked✗blotchy~red blobs✗Q-Diffusion W4A8flat colour~blurry~ruin-like✗faded~smeared~noise✗PTQ4DiT W4A8sharp✓sharp✓detailed✓clean✓clean✓balloon✓
Fig. 5W4A8 samples: only PTQ4DiT keeps detail. ImageNet 512 (large eagle) and 256 (others). RepQ* and Q-Diffusion produce darker/flat colours, blur, and broken objects (the hot-air balloon becomes red blobs/noise); PTQ4DiT gives crisp feathers, fur and architecture. Schematic of the photo grid.
Guide

At W four A eight, only PTQ4DiT keeps images intact. The grid shows six classes, a large eagle at 512 and the rest at 256, generated by RepQ-star, Q-Diffusion and PTQ4DiT. The baselines give dark or flat colours, blur, and broken objects; the hot-air balloon turns into red blobs or noise. PTQ4DiT keeps sharp feathers, fur and architecture. The tab draws a schematic of the photo grid, not the photos.

ImageNet 256×256, W8A81720232629481216sFID ↓FID ↓○△☆○△☆○△☆FPOursQ-Diffusion○ 250 △ 100 ☆ 50 steps
Fig. 6 (left)Ours tracks FP at every step count. Values from Table 1. Circle size ∝ compute (Gflops, i.e. number of steps). Q-Diffusion degrades sharply at 50 steps (FID 14.61).
Guide

PTQ4DiT tracks full precision at every step count on ImageNet 256 at W eight A eight. The axes are sFID across and FID up, both lower is better, and markers show 250, 100 and 50 steps. PTQ4DiT stays close to full precision throughout, while Q-Diffusion degrades sharply at 50 steps to an FID of 14.61. Robustness to fewer steps matters because fast samplers use few steps.

ImageNet 512×512, W8A835404550010203040sFID ↓FID ↓○△☆○△☆○△☆FPOursQ-Diffusion○ 250 △ 100 ☆ 50 steps
Fig. 6 (right)At 512 the gap is huge. FP from Table 2; Ours and Q-Diffusion W8A8 points read off the plot (no table in paper): Ours FID ~10.6–13.9, Q-Diffusion ~37.5–40.
Guide

At 512 resolution the gap is large. Same axes, sFID across and FID up, at W eight A eight. The full-precision points come from Table 2, but the PTQ4DiT and Q-Diffusion points are read off the paper's plot, since there is no table: PTQ4DiT at an FID of roughly 11 to 14, Q-Diffusion at roughly 38 to 40. Treat these as approximate. Higher resolution means more tokens and harder activations.

DiT Block ×nBInputadaLNMHSAscale α₁adaLNPointwise FFscale α₂MLPsConditioningγ₂,β₂γ₁,β₁Pointwise FeedforwardFC2GELUFC1 ●Multi-Head Self-AttentionProjection2 ●×Softmax×QKVProjection1 ●Linear Layer fInteger MatMulQuantizerQuantizerX̃W̃CSB & SSCXWBʷ → WBʷᵨ folded into WBˣᵨ folded upstream● = layer with CSB & SSC
Fig. 7Which layers are balanced, and where each matrix goes. CSB & SSC are applied to Projection1 (QKV), Projection2 (attention output) and FC1. BWρ is absorbed into each layer’s weight. BXρ is absorbed into the adaLN-regressing MLP for Projection1 and FC1, and into the preceding attention matmul (softmax·V) for Projection2. FC2 (after GELU) is not balanced.
Guide

This shows exactly which layers are balanced and where each matrix goes. Dots mark the three balanced layers: the QKV projection, the attention output projection, and the first feedforward layer. Each weight scale goes into that layer's weight. The activation scale goes into the adaLN MLP for QKV and the first feedforward layer, and into the preceding softmax times V matmul for the output projection. The second feedforward layer, after GELU, has no clean place to fold a scale, so it is skipped.

bald eagleterrier dogairshipcar mirrorRepQ* W8A8other pose~white fluffy✗near FP✓other scene✗Q-Diffusion W8A8blue bg, pose✗puppy~distorted✗blurred✗PTQD W8A8noisy bg✗puppy~streaky sky✗other scene✗PTQ4DiT W8A8≈ FP✓≈ FP✓≈ FP✓≈ FP✓Full precisionreferencerefreferencerefreferencerefreferenceref
Fig. 8W8A8, ImageNet 512: PTQ4DiT reproduces the FP image. Same seeds per column. Baselines change composition, colours and background (Q-Diffusion/PTQD distort the airship and blur the mirror); PTQ4DiT is visually almost identical to full precision. Schematic of the photo grid.
Guide

At W eight A eight on ImageNet 512, PTQ4DiT reproduces the full-precision image. Each column uses the same random seed, so a faithful quantizer should give the same picture. Baselines change pose, colours and background, and Q-Diffusion and PTQD distort the airship and blur the car mirror. PTQ4DiT is visually almost identical to full precision. The tab shows a schematic of the photo grid.

sharkvulturebottlesviolincandlecatbarndogfrogstorkballoonwheelfuel pumptrainfoxlighthouseRepQ* W8A8✓✓✓~~✓~✗~~~✓~~✗✗Q-Diffusion W8A8✓✓✓~~~~~~~~✓~~~✗PTQD W8A8✓✓✗✗✗~~~~~~✗✗✗~✗PTQ4DiT W8A8✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓Full precisionrefrefrefrefrefrefrefrefrefrefrefrefrefrefrefref
Fig. 9W8A8, ImageNet 256: 16 classes. ✓ ≈ FP, ~ same class but altered/degraded, ✗ different content. PTQD often changes semantics (bottles→shelves, violin/candle→people, pump→station); RepQ* and Q-Diffusion alter details (dog, fox, lighthouse). PTQ4DiT matches FP in all 16. Verdicts are our reading of the photo grid.
Guide

Across sixteen classes at W eight A eight on ImageNet 256, PTQ4DiT matches full precision every time. A tick means close to full precision, a tilde means the same class but altered, a cross means different content. PTQD often changes the meaning, turning bottles into shelves or a violin into people, while RepQ-star and Q-Diffusion alter details. The verdicts are the tab author's reading of the photo grid, not the paper's labels.

§7Results

W4A8, ImageNet 2560255075100sampling stepsFID ↓7.092507.751009.1750PTQ4DMQ-DiffPTQDRepQ*OursFP
ChartW4A8 at 256: PTQ4DiT is the only method near FP (dashed). Table 1.
Guide

At W four A eight on ImageNet 256, PTQ4DiT is the only method near full precision, shown dashed. The horizontal axis is sampling steps and the vertical axis is FID, lower is better. PTQ4DiT scores 7.09, 7.75 and 9.17 at 250, 100 and 50 steps, while baselines range from about 15 up to over 100. The values come from Table 1.

W4A8, ImageNet 5120255075100sampling stepsFID ↓17.552501910019.7150PTQ4DMQ-DiffPTQDRepQ*OursFP
ChartW4A8 at 512: ~3× lower FID than any baseline. Table 2.
Guide

At W four A eight on ImageNet 512, PTQ4DiT has about three times lower FID than any baseline. Its FID is 17.55, 19 and 19.71 at 250, 100 and 50 steps, against 8 to 11 for full precision and more than 53 for every baseline. There is still a clear gap to full precision, so four-bit weights at high resolution remain hard. Values are from Table 2.

FP4.53Q-Diffusion15.31Baseline22.54+ CSB8.17+ CSB + SSC7.09FID ↓ (W4A8, 256, 250 steps)
ChartCSB does most of the work (FID 22.54→8.17); SSC adds the last step (→7.09). Table 3.
Guide

The ablation shows that channel balancing does most of the work. At W four A eight, 256 resolution and 250 steps, the plain baseline has an FID of 22.54. Adding balancing, with statistics from only the middle timestep, drops it to 8.17. Adding the Spearman timestep calibration brings it to 7.09, against 4.53 for full precision. For the thesis, this suggests smoothing matters most and calibration-set design adds a smaller gain.

Table 1 – ImageNet 256×256, DiT-XL/2, DDPM. (W/A) = weight/activation bits. Bold = best quantized (paper’s bolding).
StepsW/AMethodSize (MB)FID ↓sFID ↓IS ↑Precision ↑
25032/32FP2575.424.5317.93278.500.8231
2508/8PTQ4DM645.7221.65100.14134.220.6342
2508/8Q-Diffusion645.725.5718.22227.500.7612
2508/8PTQD645.725.6918.42224.260.7594
2508/8RepQ*645.724.5118.01264.680.8076
2508/8Ours645.724.6317.72274.860.8299
2504/8PTQ4DM323.7972.5852.3935.790.2642
2504/8Q-Diffusion323.7915.3126.04134.710.6194
2504/8PTQD323.7916.4522.29130.450.6111
2504/8RepQ*323.7923.2128.58104.280.4640
2504/8Ours323.797.0923.23201.910.7217
10032/32FP2575.425.0019.02274.780.8149
1008/8PTQ4DM645.7215.3679.31172.370.6926
1008/8Q-Diffusion645.727.9319.46202.840.7299
1008/8PTQD645.728.1219.64199.000.7295
1008/8RepQ*645.725.2019.87254.700.7929
1008/8Ours645.724.7317.83277.270.8270
1004/8PTQ4DM323.7989.7857.2026.020.2146
1004/8Q-Diffusion323.7954.9536.1342.800.3846
1004/8PTQD323.7955.9637.2442.870.3948
1004/8RepQ*323.7926.6429.4291.390.4347
1004/8Ours323.797.7522.01190.380.7292
5032/32FP2575.426.0221.77246.240.7812
508/8PTQ4DM645.7217.5284.28154.080.6574
508/8Q-Diffusion645.7214.6127.57153.010.6601
508/8PTQD645.7215.2127.52151.600.6578
508/8RepQ*645.727.1723.67224.830.7496
508/8Ours645.725.4519.50250.680.7882
504/8PTQ4DM323.79102.5258.6619.290.1710
504/8Q-Diffusion323.7922.8929.49109.220.5752
504/8PTQD323.7925.6229.77104.280.5667
504/8RepQ*323.7931.3930.7780.640.4091
504/8Ours323.799.1724.29179.950.7052
Guide

The main results on ImageNet 256 with DiT-XL/2. Each block of rows is one step count, 250, 100 or 50, with full precision, then eight-bit weights, then four-bit weights, both with eight-bit activations. At W8A8, PTQ4DiT matches full precision, even scoring a slightly lower FID at 100 and 50 steps, and only RepQ-star edges it out, at 250 steps. At W4A8, PTQ4DiT wins every setting, for example 7.09 against Q-Diffusion's 15.31 at 250 steps, while models shrink from 2575 to 324 megabytes.

Table 2 – ImageNet 512×512, W4A8.
StepsMethodFID ↓sFID ↓IS ↑Precision ↑
250FP8.3936.25257.060.8426
250PTQ4DM68.4357.7635.160.4712
250Q-Diffusion58.8156.7531.290.4878
250PTQD87.5374.5534.400.5144
250RepQ*59.6573.7133.190.3676
250Ours17.5546.92123.490.7592
100FP9.0637.58239.030.8300
100PTQ4DM70.6357.7333.820.4574
100Q-Diffusion62.0557.0229.520.4786
100PTQD81.1766.5835.670.5166
100RepQ*62.7073.2931.440.3606
100Ours19.0050.71121.350.7514
50FP11.2841.70213.860.8100
50PTQ4DM71.6959.1033.770.4604
50Q-Diffusion53.4950.2738.990.5430
50PTQD73.4559.1439.630.5508
50RepQ*65.9274.1930.920.3542
50Ours19.7152.27118.320.7336
Guide

Results at 512 resolution with W four A eight. PTQ4DiT reaches FIDs of 17.55, 19.00 and 19.71 at 250, 100 and 50 steps, while every baseline stays between about 53 and 88. Precision tells the same story, about 0.75 against about 0.5 or lower. The gap to full precision, which scores 8.39 at 250 steps, is still large, so this is the setting where the method is most helpful and also most incomplete.

Table 3 – Ablation, ImageNet 256×256, W4A8, 250 steps. “+ CSB” estimates B from the midpoint timestep T/2 only.
MethodSize (MB)FID ↓sFID ↓IS ↑Precision ↑
FP2575.424.5317.93278.500.8231
Q-Diffusion323.7915.3126.04134.710.6194
Baseline323.7922.5427.31105.550.4791
+ CSB323.798.1724.96187.940.7183
+ CSB + SSC (Ours)323.797.0923.23201.910.7217
Guide

The ablation table separates the two ideas at W4A8, 256 resolution, 250 steps. The baseline quantizer scores an FID of 22.54, worse than Q-Diffusion's 15.31. Channel balancing alone, calibrated at the midpoint timestep, cuts it to 8.17 and raises Inception Score from about 106 to 188. The full method with Spearman calibration reaches 7.09. So most of the gain is balancing, and timestep weighting adds a consistent final improvement.

Setup: DiT-XL/2 class-conditional, DDPM sampler 250/100/50 steps; 10k samples (256) / 5k (512); FID, sFID, IS, Precision via ADM toolkit; quantizer optimization follows Q-Diffusion; RepQ* = RepQ-ViT extended with temporal calibration. Sizes are model storage; no wall-clock latency is reported (all experiments are simulated/fake quantization on RTX A6000).

§8Why it matters for this thesis

PTQ4DiT → LTX-2.3 on OpenVINO / NNCF

  • CSB is SmoothQuant with α=0.5 and max-abs statistics, and NNCF already implements SmoothQuant for OpenVINO models (nncf.quantize with ModelType.TRANSFORMER; AdvancedQuantizationParameters(smooth_quant_alphas=...)). For a W8A8 track on LTX-2.3, the CSB half of this paper comes almost free: set α≈0.5 for MatMul layers and check which layers NNCF actually smooths.
  • SSC is only about the calibration set. Its idea is to pick which timesteps’ activation statistics to trust. In NNCF this is controlled through the calibration dataset: dump inputs to the LTX transformer from several denoising steps (the paper uses 10–25 timesteps × 32 samples), and optionally over-sample the steps where activation/weight salience is poorly correlated. Computing Spearman ρ per layer needs a short PyTorch hook script. No custom kernels are required.
  • Re-parameterization matches LTX’s DiT design. LTX-Video/LTX-2 blocks use adaLN-style scale/shift modulation (timestep-conditioned, AdaLN-single). Folding BX into that modulation (Eqs. 13, 19–21, with the constant “1” becoming BX) and BW into the Linear weights can be done in PyTorch before OpenVINO conversion, so the exported IR has no extra ops. It must be done carefully where modulation parameters are shared across blocks.
  • For the weight-only int8/int4 track (nncf.compress_weights), activations stay FP16, so CSB’s benefit for activations does not apply. But the weight-side insight still matters. Moving salience between X and W before compression is what NNCF’s data-aware AWQ and scale estimation options do, and they also need multi-timestep calibration data. PTQ4DiT’s W4A8 result (FID 7.09 vs 4.53 FP) shows how hard it is to get 4-bit DiT weights right.
  • Caveats: the paper covers image generation with DiT-XL/2 (~675M params), not text-to-video+audio at LTX scale. It reports no real latency, and it uses per-tensor activation and per-channel weight quantization. Present it as the “DiT-specific outlier + timestep” baseline motivating the calibration and smoothing choices, and compare with ViDiT-Q / Q-DiT for video DiTs.
Guide

The practical reading for the thesis: the balancing half of PTQ4DiT is SmoothQuant with alpha one half, which NNCF already offers, so a W8A8 run on LTX-2.3 can use it by setting the smooth quant alpha to about 0.5 and checking which MatMuls are smoothed. The timestep half becomes a calibration-set decision: collect transformer inputs from 10 to 25 denoising steps. For weight-only int4, look at NNCF's AWQ and scale estimation instead, and remember the paper covers images, not video with audio.

Quantizing diffusion models

ViDiT-Q: Efficient and Accurate Quantization of Diffusion Transformers for Image and Video Generation

Tianchen Zhao, Tongcheng Fang, Haofeng Huang, Rui Wan, Widyadewi Soedarmadji, Enshu Liu, Shiyao Li, Zinan Lin, Guohao Dai, Shengen Yan, Huazhong Yang, Xuefei Ning, Yu Wang · Tsinghua / Infinigence AI / Microsoft / SJTU · ICLR 2025 (arXiv 2406.02540v3)

Earlier quantizers break on text-to-video DiTs because the data inside one quantization group varies along tokens, CFG halves, timesteps and channels. ViDiT-Q fixes this in three steps: dynamic per-token activation scales, channel balancing that scales first and then rotates, and a mixed-precision search that measures each layer group with the metric it actually affects. The result is W8A8 and W4A8 video/image generation at about FP16 quality, with real CUDA-kernel gains.

Bit-widths
W8A8 · W6A6 · W4A8 (MP)
Models
OpenSORA, Latte, PixArt-α/Σ, Inf-DiT
Memory (A100)
1.99× W8A8 · 2.42× W4A8
Latency (A100)
1.71× W8A8 · 1.38× W4A8
VBench overall, W4A8
25.94 vs FP16 26.21
Weight incoherence
40.75 → 5.02
Reading guide

ViDiT-Q asks why quantizers that work for language models and image U-Nets fall apart on text-to-video diffusion transformers, and how to fix that. Its answer is that the numbers sharing one scale vary along tokens, the two classifier-free guidance halves, timesteps and channels, so it adds per-token dynamic activation scales, a two-stage channel balancing, and a mixed-precision search judged by the right quality metric per layer group. That gets W eight A eight and W four A eight video and image generation close to FP16 quality, with measured GPU speed-ups. The tab runs from the big picture and the problem, through the method, every equation and every figure, to the result tables and a thesis box. Among the sixteen papers it is the third diffusion quantization paper, after Q-Diffusion and PTQ4DiT and before SVDQuant, and the first built for video transformers like LTX.

§0Before reading

To follow ViDiT-Q, three ideas are needed: what it means to quantize a number to 8 or 4 bits with a scale, what happens inside one denoising step of a video diffusion transformer, and which group of numbers shares one scale. The paper is in the atlas because it is the first quantization method built for text-to-video transformers like LTX, and its layer-sensitivity search is the part most directly reusable with NNCF.

Quantize = snap to a grid no outlier: all 16 levels used one outlier: range stretched outlier about 4 levels left FP16 full precision INT8 256 levels INT4 16 levels W4A8: weights INT4, activations INT8
PrimerQuantizing means rounding to a few levels, and the range decides how coarse they are. Each value \(x\) becomes an integer \(\operatorname{round}(x/s)+z\), where the scale \(s\) is set from the smallest and largest value in the group. One outlier (magenta) stretches that range, so the ordinary values share only a handful of levels and get rounded badly. INT8 has 256 levels, INT4 only 16, which is why 4-bit is so much harder. "W4A8" means 4-bit weights and 8-bit activations.
Guide

Quantizing means rounding every number to one of a few levels, and the range decides how fine those levels are. The scale is set from the smallest and largest value in a group, so one magenta outlier stretches the range and the ordinary teal values share only about four levels. Eight bits give two hundred fifty six levels, four bits only sixteen. W four A eight means four bit weights and eight bit activations.

static, per-tensor dynamic, per-token channels channels tokens one scale for all fixed at calibration s1s2s3s4s5s6 own scale per token computed live outlier channel remains
PrimerWhich numbers share one scale matters as much as the bit-width. An activation is a matrix of tokens by channels. A static per-tensor scale is fixed once from calibration data and must cover every token, timestep and guidance pass. ViDiT-Q instead gives each token (row) its own scale, measured on the fly. Weights get one scale per output channel. A per-token scale cannot fix an outlier column (magenta), which is why the paper also needs channel balancing.
Guide

Which numbers share one scale matters as much as the number of bits. On the left, a single static scale covers the whole activation matrix and is fixed in advance from calibration data. On the right, ViDiT-Q gives every token its own scale, measured live at each step, so it adapts to timesteps and guidance passes. Notice the magenta column: per token scales cannot fix an outlier channel, which is why the paper adds channel balancing.

noise t=20 t=19 . . . t=1 clean latent VAE → video 20 denoising steps video latent frames × patches = tokens one DiT block spatial attn temporal attn cross-attn FFN timestep t adaLN scale, shift text prompt CFG: run each step twice, with and without prompt
PrimerA video DiT runs the same blocks many times, and each run looks different to a quantizer. The model starts from noise and removes it over about 20 timesteps (gold); a VAE then decodes the clean latent into frames. The latent is cut into patches across all frames, and each patch is a token. Every block (the paper uses OpenSORA's STDiT) has spatial attention within a frame, temporal attention across frames, cross-attention to the text, and a feed-forward network. The timestep enters through adaLN as a per-channel scale and shift, and classifier-free guidance runs each step with and without the prompt. So activations change with token, guidance pass, timestep and channel: the four variations ViDiT-Q is built around.
Guide

A video diffusion transformer runs the same blocks about twenty times, once per denoising step, shown in gold. Frames are cut into patches, and every patch is a token. Each block has spatial attention, temporal attention, cross attention to the text, and a feed forward network. The timestep enters through adaptive layer norm, and classifier free guidance runs every step twice. These are the four sources of variation that ViDiT-Q is designed around.

SmoothQuant scaling + Hadamard rotation Q-Diffusion U-Net, timesteps PTQ4DiT image DiT ViDiT-Q video DiT SVDQuant low-rank branch DVD-Quant data-free video dynamic per-token static-dynamic balance metric-decoupled MP reuse: LTX-2.3 + NNCF
PrimerWhere this paper sits. Q-Diffusion handled timesteps in U-Net image models, and PTQ4DiT moved to image transformers. ViDiT-Q is the first to target text-to-video transformers, borrowing SmoothQuant-style scaling and Hadamard rotation (grey) and adding three pieces (indigo). The metric-decoupled mixed-precision search is the piece that carries most directly into LTX-2.3 with NNCF. Next, SVDQuant pushes to 4-bit activations with a small high-precision low-rank branch, and DVD-Quant quantizes video transformers without calibration data.
Guide

ViDiT-Q follows Q-Diffusion, which handled timesteps in U-Net models, and PTQ4DiT, which moved to image transformers. It is the first method built for text to video transformers. It borrows SmoothQuant style scaling and Hadamard rotation, and adds three pieces in indigo. The metric decoupled mixed precision search is the part to reuse for LTX-2.3 with NNCF. SVDQuant and DVD-Quant come next.

Terms used in this paper

Diffusion transformer (DiT)
A diffusion model whose denoiser is a transformer working on patch tokens instead of a convolutional U-Net. LTX-2.3 is one.
Timestep
One step of the denoising loop. The paper uses 20 steps, and activation statistics change from step to step.
Classifier-free guidance (CFG)
Each step runs the model with and without the text prompt and pushes the result towards the prompted one. The two halves have different activation ranges.
W8A8, W4A8, W4A8-MP
Weight bits and activation bits. MP means mixed precision: some layers use more bits than the headline number.
Scale and zero point
The step size \(s\) and offset \(z\) that map real numbers to integers. Everything in one group shares them.
Static vs dynamic quantization
Static fixes activation scales in advance from calibration data. Dynamic computes them at run time from the actual values, at a small cost.
Per-token, per-channel
Grouping choices: one scale per row of the activation (token) or per output channel of the weight. Both run along the matrix multiply's summation axis, so integer kernels can use them.
Outlier channel, incoherence
A channel with much larger values than the rest. The paper measures this as incoherence, roughly the largest value divided by the average.
Channel balancing
Moving outliers so all channels have similar ranges: SmoothQuant-style scaling (shift range from activations to weights) and Hadamard rotation (mix channels to spread outliers out).
adaLN
Adaptive layer norm. The timestep produces a scale and shift for each channel; in these models a learned constant table is added to it, which splits outliers into a static and a time-varying part.
OpenSORA, Latte, PixArt
Open models the paper tests. OpenSORA (STDiT blocks) and Latte generate video; PixArt-α and PixArt-Σ generate images.
CLIPSIM, VQA, FlowScore
Video metrics: CLIPSIM checks text match, DOVER VQA scores aesthetic and technical quality, and FlowScore uses optical flow to judge motion consistency.
FID, VBench
FID compares generated and real image statistics (lower is better). VBench scores videos on many separate dimensions such as consistency and motion.
A100 and INT8 GEMM kernels
The A100 is an NVIDIA data-centre GPU whose Tensor Cores run integer matrix multiplies fast. The paper's speed-ups come from custom CUDA kernels on it, which OpenVINO cannot use.
Guide

These are the terms the paper uses without explaining. The most important are static versus dynamic quantization, per token and per channel grouping, and channel balancing, because the whole method is built from them. The metric names matter too: CLIPSIM for text match, VQA for visual quality, and FlowScore for motion. Keep in mind that the speed-ups come from custom GPU kernels on an A100, which OpenVINO cannot use.

§2Big picture

Naive PTQ (static, tensor-wise)DiT linearFP16 W, Xone scale s forall tokens, steps,CFG halvesW4A8 videoblank / noiseViDiT-Q: three fixes, one per problemX [tokens × C]activation① dynamicper-token min/max② static scalediag(s)⁻¹ fused② rotationHadamard HINT GEMMW per-out-chdequant× s_w s_x③ metric-decoupledbit-width per layer: 4 or 8Per-group sensitivity with its own metric:CrossAttn→CLIPSIM · SelfAttn/FFN→VQA · TempAttn→FlowResult: W8A8 & W4A8 ≈ FP16, 1.99–2.42× memory, 1.38–1.71× latency (A100)
A naive quantizer uses one static scale for everything, and W4A8 then outputs noise. ViDiT-Q quantizes each token on the fly, balances channels (static scaling, then an online rotation), and gives the most sensitive layers 8 bits.
Guide

A single static scale is why naive W4A8 turns video into noise, and ViDiT-Q replaces it with three targeted fixes. Follow the lower path left to right: each token gets its own scale computed on the fly, channels are balanced by a fixed scaling and then a Hadamard rotation, and a metric-aware search puts the most sensitive layers at eight bits. The rest of the tab unpacks each numbered fix in turn.

Only linear layers are quantized. Attention matmuls, norms, t/y embedding and the final layer stay FP16 (App. A.1). No retraining is needed. Calibration is needed only for the SmoothQuant scaling α and for the mixed-precision sensitivity runs.

§3The problem

Min-max range set by one outlieroutlier16 INT4 levels spread over full range → step s largebulk of values share ~3 levelsSmaller / balanced groupsame 16 levels, small s → rounding error ≤ s/2 tiny
Error = rounding error from a range that is too wide. With min-max scaling nothing is clipped, so a single large value sets the step s and all the ordinary values get rounded coarsely.
Guide

Quantization error here is mostly rounding error, and one outlier makes it large. The top bar shows min-max scaling: the sixteen four-bit levels must stretch to reach the outlier, so the step s is big and most ordinary values share about three levels. The lower bar shows a smaller, balanced group where the same sixteen levels sit close together. Every fix in the paper is a way to shrink the spread inside a group.

Where the data varies inside a DiT linear inputuncond half (CFG)cond half (CFG)outlier ch.tokenschannels Ctimesteps stack behindToken-wisespatial + temporal tokens differCondition-wisecond vs uncond (batch of 2)Timestep-wisesame layer, other stepChannel-wiseoutlier ch., time-varying
A DiT varies along four axes at once. One static tensor-wise scale must cover every token, both CFG halves, every timestep and every channel, so it is effectively a huge group.
Guide

A static tensor-wise scale is really one enormous group, because DiT activations vary along four axes at once. The cube shows tokens and channels, with timesteps stacked behind and the conditional and unconditional guidance halves side by side. The four labels name the variations: between tokens, between guidance halves, across timesteps, and outlier channels whose strength changes with time. Each axis later gets its own remedy in the method section.

  • Token-wise: visual tokens differ in both space and time (video).
  • Condition-wise: the conditional and unconditional CFG passes (batch of 2) have different ranges.
  • Timestep-wise: the same layer's activations shift across denoising steps.
  • Channel-wise, time-varying: outlier channels exist, and how strong they are changes with t.
  • Metric problem: a layer with low MSE can still ruin alignment or temporal consistency, so MSE alone is not a good enough objective for generation.

§4Method

4.1 Fine-grained grouping + dynamic quantization

Which elements may share (s, z)?W [C_out × C_in]one row = one groupper-output-channel×X [N_tok × C_in]one token = one groupper-token, dynamicsummation runs along C_in→ groups must span C_in (hardware-friendly)Q-DiT: per-input-ch. groupsscales change inside Σaccurate but slow (FP casts)
Choose groups that the GEMM can use. Weights get one scale per output channel and activations one per token, and both groups span Cin, the summation axis. Activation scales are computed online from each token's min and max, so they follow every timestep and CFG half without calibration. The paper calls this the upper bound for handling timestep variation.
Guide

Groups must lie along the summation axis of the matrix multiply, otherwise the integer kernel cannot use them. Weights get one scale per output row and activations one scale per token, both spanning C in. Q-DiT's per-input-channel groups are accurate but force floating-point casts inside the sum, so they are slow. Because token scales come from each token's live min and max, they automatically track every timestep and guidance half.

4.2 Static-dynamic channel balancing

Why imbalance changes with t: adaLN feature modulationscale-shift tabletrained, constant→ STATIC partt_block(T)→ DYNAMIC part+s, b, g (MSA / MLP)x·(1+s)+b → Attn/MLP → ·g → + residualViDiT-Q remedy1. scaling (SmoothQuant, one α)calibrated on initial steps, fused2. rotation (Hadamard, online)spreads what changes per stepbalanced channels at every t
Imbalance = static table + dynamic timestep embedding. The adaLN "scale-shift table" is constant, so a SmoothQuant scale with one α (fused into the previous op) removes the static outliers. A Hadamard rotation then evens out the part that changes with t. Scaling alone would need a different α for each t, and rotation alone leaves a 12.8× outlier.
Guide

Channel imbalance has a fixed part and a part that changes with the timestep, so ViDiT-Q uses two tools. The adaLN scale-shift table is constant, which a SmoothQuant scale with one alpha, fused into the previous operation, can handle. The timestep embedding adds a moving part, which an online Hadamard rotation spreads evenly. This is the design behind fix number two; the next block shows why both halves are needed.

Incoherence (max / mean) of block1.mlp.fc1 W010203040Original40.75+ static scaling17.77Quarot (rotation)12.83Static-dynamic5.02
Combining the two works better than either alone (numbers from Fig. 8). Incoherence here is roughly max/mean. With 4-bit weights there are only 16 levels, so a 12.8× ratio is still too large.
Guide

Scaling and rotation together beat either one alone. The bars show incoherence, roughly the largest weight divided by the average, for one MLP layer: 40.75 originally, 17.77 with static scaling, 12.83 with QuaRot rotation, and 5.02 with ViDiT-Q's static-dynamic combination. With only sixteen levels at four bits, a ratio near thirteen still wastes most levels, so only the combined method is small enough.

4.3 Metric-decoupled mixed precision: the sensitivity analysis to replicate

Metric-decoupled sensitivity analysis (the part to replicate)steps 0–56–1011–1516–20repeat the whole analysis for each of 4 time rangesSelfAttn + FFNquantize one layer → VQA (DOVER)vs FP16 video (visual quality)budget 5.54 bit (from MSE)CrossAttnquantize one layer → CLIPSIMvs FP16 video (text alignment)budget 4.05 bit (from MSE)TempAttnquantize one layer → Δ FlowScorevs FP16 video (temporal consist.)budget 4.34 bit (from MSE)greedy: raise most sensitive layer 4→8 bit until group budget used · overall avg 5.00 bit
Measure each layer against the metric that layer actually affects. CrossAttn mostly changes content (CLIPSIM). Spatial self-attn and FFN change visual quality (DOVER VQA). Temporal attn changes motion (FlowScore). Comparing layers only inside their own group avoids setting metrics with different units against each other, and it also shrinks the search.
Guide

This is the part of ViDiT-Q most worth replicating: each layer is judged by the metric it actually damages. Cross-attention is scored by CLIPSIM for text alignment, spatial self-attention and feed-forward by DOVER VQA for visual quality, and temporal attention by FlowScore for motion. Layers compete only within their group, and the whole analysis repeats for four timestep ranges, with group budgets of 5.54, 4.05 and 4.34 bits averaging five bits.

  1. Pick the aspects and one metric each: video → VQA (quality), CLIPSIM (text alignment), FlowScore (temporal); image → FID and CLIPScore (App. E.3.2 step 1).
  2. Group layers by operator type and draw the layer-type × metric heatmap (Fig. 20): relative metric drop (FP−Q)/FP, then z-score, then softmax over metrics. Each group should have one clearly dominant metric.
  3. Split the denoising trajectory into 4 equal time ranges (steps 0–5, 6–10, 11–15, 16–20) and run steps 4–6 separately for each range.
  4. Budget per group: quantize each whole group, measure the MSE of the output against the FP16 generation, and split the overall bit budget between groups (example: 5.54 / 4.05 / 4.34, average 5.00).
  5. Sensitivity per layer: inside a group, quantize one layer or block at a time and record that group's metric error against the FP16 video. This is done at two levels: between blocks, then between layers inside a block.
  6. Greedy allocation: start every layer at 4 bit and move the most sensitive to 8 bit until the group budget is used up.
Guide

The procedure moves from coarse to fine. First, the method picks one metric per quality aspect and confirms with a heatmap that each layer type mainly hurts one of them. Then, for each timestep range, it splits the total bit budget between groups using a cheap MSE test, ranks layers inside each group with their own metric, and greedily promotes the most sensitive layers from four to eight bits until the group budget is spent.

Algorithm A (reconstructed from Sec. 4.3 + App. E.3.2; the paper has no algorithm box) Metric-decoupled mixed precision for W4A8 input : FP16 DiT f, prompts P, avg-bit budget B, groups G = {SelfAttn+FFN: VQA, CrossAttn: CLIPSIM, TempAttn: FlowScore} V_fp ← f(P) # reference videos for range r in {0-5, 6-10, 11-15, 16-20}: # timestep ranges for g in G: e_g ← MSE( f[g→W4, only in r](P), V_fp ) B_g ← split B across groups by e_g # e.g. 5.54 / 4.05 / 4.34 for g in G: for layer (block, then intra-block) ℓ in g: sens[ℓ] ← |metric_g( f[ℓ→W4, only in r](P) ) − metric_g(V_fp)| bits[ℓ] ← 4 for all ℓ in g while avgbits(g) < B_g: ℓ* ← argmax sens over {ℓ : bits[ℓ]=4}; bits[ℓ*] ← 8 return bits (per layer, per time range) Algorithm B (inference path of one quantized linear, Sec. 4.1, 4.2, 5.1) x ← x · diag(s)⁻¹ # static SmoothQuant scale (folded into previous LN/GeLU/residual) x ← x · H # online Hadamard rotation (fused with the quant op) s_x, z_x ← minmax(x) per token # dynamic, computed on the fly x_int ← clamp(round(x/s_x)+z_x, 0, 2^8−1) y ← dequant( INT-GEMM(x_int, W_int) ) # W' = Hᵀ·diag(s)·W, per-out-channel INT8 or INT4
Guide

Two pieces of pseudocode, both reconstructed by the tab because the paper has no algorithm box. Algorithm A is the offline search: reference videos, per-group budgets from MSE, per-layer sensitivity from the group metric, then greedy promotion to eight bits, repeated per time range. Algorithm B is what one quantized linear layer does at run time: fixed scaling, Hadamard rotation, per-token quantization, an integer matrix multiply, and one rescale back to floating point.

§5Every equation

(1)\[ \min \mathcal{L}_{\text{task}}(f_{FP}, f_q) \;\Rightarrow\; \min_{W_q, X_q} \sum_{l}^{L} \Big( \lVert W^{(l)} - Q(W^{(l)}) \rVert_2^2 + \lVert X^{(l)} - Q(X^{(l)}) \rVert_2^2 \Big) \]

The task loss between the FP and quantized network is replaced by a sum of layer-wise weight and activation quantization errors over L layers.

Guide

The usual quantization objective replaces the real task loss with a simpler proxy. On the left is the task loss between the full-precision network f FP and the quantized network f q. On the right is the sum over all L layers of the squared weight error, W minus Q of W, plus the squared activation error, X minus Q of X. The paper argues this layer-wise proxy is not enough for visual generation, which motivates its metric-decoupled search.

–\[ x \approx \hat{x} = s\,(x_{\text{int}} - z) \]

Dequantization: scale s and zero point z are shared by every element in a group \(\mathbf{x}\in\mathbb{R}^g\).

Guide

Dequantization maps an integer back to a real value. x hat, the approximation of x, equals the scale s times the integer x int minus the zero point z. The key point is that s and z are shared by every element in the group, so the whole design question is which elements should share them.

(2)\[ x_{\text{int}} = Q(x; s, z, b) = \operatorname{clamp}\!\Big( \Big\lfloor \frac{x}{s} \Big\rceil + z,\; 0,\; 2^b - 1 \Big) \]

b-bit uniform quantizer: round to nearest, then clamp to [0, 2b−1]. The error has two parts, clamping and rounding.

Guide

Equation two is the b-bit uniform quantizer. Divide x by the step s, round to the nearest integer, add the zero point z, then clamp to the range zero to two to the b minus one. Error comes from two places: clamping values that fall outside the range, and rounding the ones inside. The next equation shows that with min-max ranges only rounding is left.

–\[ s = \frac{\max(x) - \min(x)}{2^b - 1}, \qquad \text{rounding error} \in \Big[-\frac{s}{2}, \frac{s}{2}\Big] \]

Min-max scaling: nothing is clipped, so the error is set by s, which grows with the spread inside the group.

Guide

With min-max scaling the step s is the group's maximum minus its minimum, divided by two to the b minus one, so nothing is ever clipped. The rounding error then lies between minus half a step and plus half a step. The takeaway is that error grows directly with the spread inside a group, which is the central claim of the error analysis.

–\[ \max(x) \le \mu \frac{\lVert W \rVert_F}{\sqrt{g}} \]

μ-coherence (from QuIP): a group is harder to quantize when its largest element is far above the average magnitude. The paper writes ‖W‖F for the group's norm.

Guide

Mu-coherence, borrowed from QuIP, measures how spiky a group is. It says the largest element is at most mu times the group's Frobenius norm divided by the square root of the group size g, which is roughly mu times the average magnitude. A large mu means one value towers over the rest, making the group hard to quantize. The incoherence numbers in figures 3 and 8 are this idea in practice.

(3)\[ Y = \big(X \operatorname{diag}(s)^{-1}\big) \cdot \big(\operatorname{diag}(s) W\big) = \hat{X} \cdot \hat{W}; \qquad s_i = \frac{\max(|X_i|)^{\alpha}}{\max(|W_i|)^{1-\alpha}} \]

SmoothQuant channel scaling: the per-input-channel mask s moves difficulty between activation and weight, and α sets how much moves.

Guide

Equation three is SmoothQuant channel scaling. The output Y stays the same when the activations X are divided channel by channel by s and the weights W are multiplied by s. Each s i is the activation channel maximum to the power alpha, divided by the weight channel maximum to the power one minus alpha. Alpha decides how much difficulty moves from activations to weights. ViDiT-Q uses this as the static half of its balancing.

–\[ QQ^{T} = I,\; |Q| = 1, \qquad Y = XW^{T} = (XQ)(Q^{T}W) \]

Rotation (QuaRot/SpinQuant): an orthogonal Q leaves the output unchanged and spreads channel outliers. ViDiT-Q uses a Hadamard Q.

Guide

Rotation is the other balancing tool, used by QuaRot and SpinQuant. Q is an orthogonal matrix, so Q times Q transpose is the identity, and multiplying X by Q and the weights by Q transpose leaves the output unchanged. The rotation mixes channels, spreading an outlier's energy across many of them. ViDiT-Q uses a Hadamard matrix as Q, applied online as the dynamic half of its balancing.

–\[ \frac{f_Q - f_{FP}}{f_{FP}}, \qquad \text{score}_{\text{dyn}} = 1 - \frac{f_Q - f_{FP}}{f_{FP}} \]

App. C.1: VBench dynamic degree measured relative to FP16. Jitter raises the raw value, so the radar chart uses 1 − the relative change.

Guide

A small fix to how VBench's dynamic degree is read. The first term is the relative change of the quantized score f Q against the FP16 score f FP. Quantization jitter makes videos look more dynamic, so a higher raw value is not better. The radar chart in figure 10 therefore plots one minus this relative change, so that matching FP16 scores highest.

–\[ y = \sum_{i}^{C_{in}} w_i x_i \]

App. E.2 / Fig. 19: every output element sums over Cin, so the elements in that sum must share quantization parameters.

Guide

Each output element y is the sum, over the C in input channels, of weight w i times input x i. Because the integer kernel adds these products directly, all elements in the sum should share quantization parameters. This single line is the reason for the per-output-channel weight and per-token activation grouping in figure 19.

–\[ \begin{aligned} WX &= s_w (W_{\text{int}} - z_w)\, s_x (x_{\text{int}} - z_x) \\ &= s_w s_x W_{\text{int}} x_{\text{int}} - s_w z_w s_x x_{\text{int}} - s_w s_x z_x W_{\text{int}} + s_w z_w s_x z_x \end{aligned} \]

Quantized GEMM expansion: an integer GEMM Wintxint followed by one FP rescale swsx, plus zero-point correction terms.

Guide

Expanding the quantized product shows why the grouping is hardware friendly. Substitute the dequantized weight and activation, and the main term becomes s w times s x times an integer matrix multiply of W int and x int, followed by one floating-point rescale. The remaining three terms are zero-point corrections that can be precomputed or cheaply added. The integer multiply is where the speed-up comes from.

–\[ \Delta_{\ell,m} = \frac{\text{Metric}_{FP} - \text{Metric}_{Q}}{\text{Metric}_{FP}} \;\xrightarrow{\text{z-score}}\; \tilde{\Delta}_{\ell,m} \;\xrightarrow{\text{softmax over } m}\; \text{heat}_{\ell,m} \]

App. E.3.1 (stated in words in the paper): relative metric drop for layer type ℓ and metric m, standardized, then normalized so each layer type's column sums to 1 (Fig. 20).

Guide

This turns sensitivity runs into the heatmap of figure 20. For layer type l and metric m, delta is the relative drop, full-precision metric minus quantized metric, divided by the full-precision value. The drops are standardized with a z-score, then a softmax over metrics makes each layer type's column sum to one. The paper describes this in words, so the formula is the tab's reconstruction.

§6Every figure

ViDiT-Q: Video & Image Diffusion Transformer QuantizationFP16snowy forest≈≈≈BaselineViDiT-QW8A8colour shift,blurred trees≈ FP16W4A8saturated tealnoise, unreadable≈ FP16FP16fries basketBaselineViDiT-QW8A8altered≈ FP16W4A8degraded≈ FP16“Accurate” & “Efficient”2.5x2-2.5xMemory Opt.1.7x1.4-1.7xLatency Opt.FP16ViDiT-QOpenSORA text-to-video (left) · PixArt-α text-to-image (middle) · A100 savings (right)
Fig. 1Baselines break at W8A8/W4A8; ViDiT-Q does not. Left: OpenSORA frames. The baseline at W8A8 shifts colour and blurs, and at W4A8 turns into saturated noise, while ViDiT-Q stays at FP16 quality. Middle: PixArt-α fries image. Right: 2–2.5× memory and 1.4–1.7× latency savings.
Guide

Figure 1 is the paper's headline: existing quantizers break at W8A8 and W4A8, and ViDiT-Q does not. On the left, OpenSORA video frames shift colour and blur at W8A8 and become saturated noise at W4A8 under the baseline, while ViDiT-Q matches FP16. The middle repeats this for a PixArt-alpha image. The right bars claim two to two and a half times less memory and 1.4 to 1.7 times lower latency.

QuantizationError Analysis(Sec. 3.1)UniqueChallenges(Sec. 3.2)ViDiT-Q’sMethodology(Sec. 4)min-max: main error = rounding errorfrom large data variation within groupx_int = clamp(⌊x/s⌉ + z, 0, 2^b − 1)min L_task(f_FP, f_q) → Σ‖W−Q(W)‖+‖X−Q(X)‖may not be adequate forvisual generation taskToken-wiseVariationUnCondCondCFG-wiseVariationTimestep-wiseVariationTime-varying Channel-wiseVariationText AlignmentVisual Quality (Fidelity)Time ConsistencyQuantization’s effect onmultiple aspectsFine-grained grouping andDynamic Quantization (Sec 4.1)Static-Dynamic ChannelBalance (Sec 4.2)Metric-Decoupled MixedPrecision (Sec 4.3)Resolve
Fig. 2Framework: analysis → four variation types → three techniques. Error analysis (Sec. 3.1) says rounding error comes from variation inside a group. The challenges (Sec. 3.2) are token, CFG, timestep and time-varying channel variation, plus effects on several quality aspects. Each one maps to a technique in Sec. 4.
Guide

Figure 2 is the paper's roadmap, read left to right. The error analysis says rounding error comes from variation inside a group. The challenges column lists four kinds of variation, token, guidance, timestep and time-varying channel, plus the fact that quantization hurts several quality aspects differently. Each challenge points to one technique in section four, which is how the method blocks above are organised.

Existing Channel Balance’s ChallengesVery significant imbalanceRelatively smaller imbalance-2.00.0-2.00.0fc1 activation, t=999fc1 activation, t=0Scaling-based: single α cannot fita time-varying distributionMax/Mean = 40.75Max/Mean = 12.83-202-202rotateRotation-based: outlier still exists; 12.8×is hard for 4-bit (16 levels)Static-Dynamic Channel Balance (Sec. 4.2)Scale Shift Table(trainable parameter)constant during inferenceTimestep Tt_block+x *s+bAttnGs+bAttnG“Static initial channel imbalance”“Dynamic timestep-wise variation”Scale-based method+ combineRotation-based method
Fig. 3Why scaling or rotation alone fails, and where time-varying imbalance comes from. Left top: fc1 activations at t=999 are very imbalanced and at t=0 much less so, so no single α fits. Left bottom: rotation takes the weight max/mean from 40.75 to 12.83, still too much for 16 levels. Right: the adaLN scale-shift table (constant) plus t_block(T) (dynamic) modulate x, which splits into a static and a dynamic part → scale-based + rotation-based. Channel plots: shape redrawn.
Guide

Figure 3 explains why ViDiT-Q needs both scaling and rotation. Top left, fc1 activations are far more imbalanced at t equals 999 than at t equals 0, so one SmoothQuant alpha cannot fit every step. Bottom left, rotation cuts weight max over mean from 40.75 to 12.83, still too spiky for four bits. On the right, the constant scale-shift table and the timestep block split the imbalance into static and dynamic parts. Channel plots are redrawn in shape only.

Quantize Block10.mlp:no notable changeQuantize Block26.mlp:notable degradationLayers have diverse quantization sensitivityQuantize CrossAttns:content changeQuantize MLPs:quality degradationEffects are highly correlated with layer type(coastal cliff video, OpenSORA)Metric-Decoupled Mixed Precision (Sec. 4.3)noise0 - 56 - 1011 - 1516 - 2020 steps denoisingiterate for each time rangevideoStep1: assign budgetfor each groupSelfAttn&FFN5.54CrossAttn4.05TempAttn4.34(MSE vs FP16, each group quantized)Step2: metric-decoupled sensitivityInter-Block×Intra-Blockmetric error vs FP16, per layer/blockiterate for each groupStep3: bit-widthallocation4 → 8raise most sensitiveuntil budget metOverallavg. bitwidth:5.00Parameter budget
Fig. 4Layer sensitivity depends on layer type; allocate bits per group with a matching metric. Left: quantizing Block10.mlp changes nothing, Block26.mlp degrades quality, CrossAttns change content and MLPs lower quality. Right: 20-step trajectory in 4 ranges → Step 1 group budget from MSE (5.54 / 4.05 / 4.34 bit) → Step 2 inter- and intra-block metric sensitivity → Step 3 greedy 4→8 bit until the 5.00-bit average budget is met.
Guide

Figure 4 motivates metric-decoupled mixed precision. On the left, quantizing Block 10's MLP changes nothing while Block 26's MLP visibly degrades the video, and cross-attention changes content while MLPs lower quality. So sensitivity depends on layer type. The right half is the three-step recipe per time range: group budgets from MSE, then block and layer sensitivity by metric, then greedy four-to-eight-bit promotion to a five-bit average.

0.020.040.060.0VQA-Aesthetic61.011.00.0Q-DiT54.660.02.2PTQ4DiT59.856.532.0SmoothQ58.761.547.4Quarot60.764.560.6ViDiT-QW8A8W6A6W4A8FP16 63.40FP16snowy forestViDiT-Q≈ FP16Q-DiTorange-redblob, no scenePTQ4DiTnoisy colourtexture
Fig. 5OpenSORA prompt set: only ViDiT-Q keeps quality at W4A8. Left (chart of the table in §7): VQA-Aesthetic by method and bit-width. Q-DiT and PTQ4DiT drop to ≈0 at W4A8, and Q-Diffusion is omitted because it produces nothing readable. Right: W4A8 frames. Q-DiT gives an orange-red blob and PTQ4DiT a noisy texture, while ViDiT-Q ≈ FP16.
Guide

Figure 5: on the OpenSORA prompt set, only ViDiT-Q keeps quality at W4A8. The chart plots VQA aesthetic score for each method at W8A8, W6A6 and W4A8, against an FP16 line at 63.4. Q-DiT and PTQ4DiT fall to nearly zero at W4A8, while ViDiT-Q holds 60.6. The frames on the right show what those numbers look like: a blob, a noisy texture, and a near-FP16 forest.

0100200300400500FID (lower better)96.5491.95Q-Diffusion73.6475.8Q-DiT127.9171.9PTQ4DiT75.6174.33ViDiT-QW8A8W4A8FP16 73.34cat + laptop,bokeh lightsFP16≈ FP16ViDiT-Qpure colournoiseQ-DiTblurred, blackcat silhouettePTQ4DiT
Fig. 6PixArt-α on COCO: W4A8 FID 74.33 vs FP16 73.34. Left: FID chart (full table in §7). Q-DiT goes to FID 475.8 at W4A8 and PTQ4DiT is already poor at W8A8 (127.9). Right: W4A8 samples. Q-DiT gives pure noise and PTQ4DiT a blurred silhouette, while ViDiT-Q matches FP16.
Guide

Figure 6 shows the same story for images with PixArt-alpha on COCO. Lower FID is better. ViDiT-Q reaches an FID of 74.33 at W4A8 against 73.34 for FP16, while Q-DiT explodes to 475.8 and PTQ4DiT is already poor at W8A8 with 127.9. The W4A8 samples confirm it: pure noise, a blurred silhouette, and a clean match to FP16.

0.00.51.01.52.02.5GPU memory (GB)FP16W8A81.99×W4A82.42×0246810Latency (s)FP16W8A8naive1.74×W8A8ours1.71×W4A8ours1.38×(a) memory(b) end-to-end latency
Fig. 7Real savings on A100: 1.99×/2.42× memory, 1.71×/1.38× latency. Bars rebuilt from the paper's table (FP16 ≈ 2.4 GB, ≈ 8.9 s). Dynamic quantization plus channel balancing cost only 1.74× → 1.71× compared with naive W8A8. W4A8 is slower than W8A8 because of mixed precision, and because weights are upcast to INT8 for compute in a compute-bound regime.
Guide

Figure 7 shows the speed-ups are real, measured with CUDA kernels on an A100. W8A8 cuts memory 1.99 times and latency 1.71 times, and the extra cost of dynamic quantization and channel balancing is small, since naive W8A8 gets 1.74 times. W4A8 saves more memory, 2.42 times, but is slower than W8A8 at 1.38 times, because weights are upcast to eight bits in a compute-bound workload. Bars are rebuilt from the paper's table.

Original weightincoherence 40.75-4.0-3.0-2.0-1.00.01.02.0020004000+ static scaling onlyincoherence 17.77-2.0-1.00.01.02.0020004000Quarotincoherence 12.83-1.0-0.50.00.51.0020004000Static-dynamicincoherence 5.02-1.0-0.50.00.51.0020004000input channel index
Fig. 8Static-dynamic balancing brings weight incoherence down to 5.02. block1.mlp.fc1 weight values over ~4600 channels: original 40.75, static scaling only 17.77, Quarot 12.83, static-dynamic 5.02. The last plot is a dense, even band with no isolated spikes. Shape redrawn, axis ranges as in the paper.
Guide

Figure 8 is the evidence for static-dynamic balancing. Each panel plots the weights of one MLP layer across about 4600 input channels, with incoherence in the title. The original has spikes and scores 40.75, static scaling gives 17.77, QuaRot 12.83, and ViDiT-Q's combination 5.02, leaving an even band with no isolated spikes. Shapes are redrawn, but axis ranges and numbers follow the paper.

One STDiT block on A100 (Nsight trace, NVTX ranges)spatial_attn3.888 mstemporal_attn4.382 mscross_attn2.554 msmlp6.298 msmagenta = FlashAttention kernels (attention matmuls); everything else is linear / elementwiseKernel time share (99.9 % kernels, 0.1 % memory)elementwise35.6%fp16 GEMM16.5%flash_fwd14.3%other kernel13.8%fp16 GEMM12.7%hidden7.0%attention computation = 14.3 % → quantize linear layers only
Fig. 9Attention is only 14.3 % of block latency with FlashAttention. Nsight trace of one STDiT block: spatial_attn 3.888 ms, temporal_attn 4.382 ms, cross_attn 2.554 ms, mlp 6.298 ms. The flash_fwd kernels take 14.3 % of kernel time, which is why only linear layers are quantized. Flash-kernel positions approximate.
Guide

Figure 9 justifies quantizing only linear layers. The Nsight trace breaks one OpenSORA transformer block on an A100 into spatial, temporal and cross-attention plus the MLP. The FlashAttention kernels take only 14.3 percent of kernel time, while elementwise work and floating-point matrix multiplies take most of the rest. So quantizing the attention matmuls would buy little. Kernel positions are approximate.

0.20.40.60.81.0Motion Smooth.Aesthetic QualityImaging QualityOverall Consist.Scene Consist.Subject Consist.BG. Consist.1-ΔDynamic DegreeFP16Naive PTQ W8A8ViDiT-Q W8A8ViDiT-Q W6A6ViDiT-Q W4A8
Fig. 10VBench radar: every ViDiT-Q setting overlaps FP16; naive W8A8 does not. Values normalized by the maximum in each dimension. Naive PTQ W8A8 falls below 0.8 on scene consistency and 1−ΔDynamic degree (jitter). Shape redrawn, values approximate.
Guide

Figure 10 is a VBench radar chart over eight quality dimensions, each normalised by its maximum, so a larger shape is better. All ViDiT-Q settings, W8A8, W6A6 and W4A8, overlap the FP16 outline. Naive W8A8 caves in on scene consistency and on one minus the dynamic-degree change, the jitter measure from the earlier equation. The shape is redrawn and values are approximate.

teal sky, skylinesame buildingssame buildingssame buildings(a) FP16≈ FP16≈ FP16≈ FP16≈ FP16(b) ViDiT-Q W8A8blue shifttowers changeglitchestowers jitter(c) Naive PTQ W8A8
Fig. 11Dynamic degree: naive W8A8 makes buildings jitter. Four frames of a city skyline. FP16 and ViDiT-Q W8A8 are stable. Naive PTQ W8A8 shifts blue and the towers change from frame to frame, which inflates dynamic degree and lowers scene consistency.
Guide

Figure 11 shows what a jitter score looks like. Four frames of a city skyline: FP16 and ViDiT-Q W8A8 keep the same buildings, while naive W8A8 turns blue and the towers change from frame to frame. That flicker inflates VBench's dynamic degree and lowers scene consistency, which is why the paper measures dynamic degree relative to FP16.

bear, ear visibleear visibleear visibleear visible(a) FP16≈ FP16, earearearear(b) ViDiT-Q W8A8no earno earear pops inear, colour shift(c) Naive PTQ W8A8
Fig. 12Subject consistency: the bear's ear appears out of nowhere. In naive PTQ W8A8 the ear (red box) is missing in the early frames and then appears, and the colour shifts. ViDiT-Q keeps it in every frame.
Guide

Figure 12 is a subject-consistency failure. In naive W8A8 the bear's ear, boxed in red, is missing in early frames and then pops in, with a colour shift too. ViDiT-Q keeps the ear in every frame like FP16. It shows that quantization can break temporal coherence even when single frames look fine, so video needs temporal metrics.

snowy valleysharp rocksharp rocksharp rock(a) FP16≈ FP16≈ FP16≈ FP16≈ FP16(b) ViDiT-Q W8A8blue tintleft mount blurredblurredblue, blurred(c) Naive PTQ W8A8
Fig. 13Image quality: naive W8A8 turns blue and blurs. Mountain valley. Naive PTQ W8A8 has a blue tint and the left mountain is blurred. ViDiT-Q ≈ FP16.
Guide

Figure 13 covers single-frame image quality. In a snowy mountain valley, naive W8A8 adds a blue tint and blurs the left mountain, while ViDiT-Q W8A8 looks like FP16. Colour shift and blur are the typical signs of badly scaled activations, and they match the drop in imaging and aesthetic scores in Table 1.

FP16door withflower archgrey babyelephantapples &orangesViDiT-Q W4A8≈ FP16≈ FP16≈ FP16Q-DiT W4A8pure noisepure noisepure noisePTQ4DiT W4A8brown blursmooth toybloborange blurbuilding wall,open doors, flowersbaby elephant,white canvasapple foreground,3 oranges behindCOCO prompts (PixArt-α)
Fig. 14Text-to-image at W4A8: ViDiT-Q ≈ FP16; Q-DiT = noise; PTQ4DiT = blur. Three COCO prompts. The takeaway is that visual quality and text alignment both survive with ViDiT-Q.
Guide

Figure 14 gives text-to-image examples at W4A8 on three COCO prompts with PixArt-alpha. ViDiT-Q matches FP16 in both content and detail, Q-DiT gives pure noise, and PTQ4DiT gives blurry blobs. The takeaway is that both visual quality and text alignment survive four-bit weights with ViDiT-Q, matching the FID and CLIP numbers of figure 6.

prompt: sea turtle swimming through a coral reef (STDiT W4A8)blankdark blueBaselineocean bg,no turtle+ Dynamicgreen-blue,object unclear+ Scaling CBturtle,still degraded+ Static-Dynamic≈ FP16+ Mixed Precisionturtle overcoral reefFP16
Fig. 15Ablation, visually: each technique adds something back. STDiT W4A8 turtle prompt. Baseline: blank. + dynamic quant: background appears. + scaling CB: less colour deviation. + static-dynamic: turtle appears but is degraded. + mixed precision: ≈ FP16.
Guide

Figure 15 is the ablation shown as pictures, one technique added per column on a sea turtle prompt at W4A8. The baseline is blank, dynamic quantization brings back the ocean, scaling-based balancing reduces colour errors, static-dynamic balancing makes the turtle appear, and mixed precision finally matches FP16. Every one of the three fixes contributes something visible. Table 2 gives the numbers.

penguins, sharp crestzoomFP16PSNR 25.80≈ FP16zoomViDiT-Q W8A8PSNR 25.86≈ FP16zoomViDiT-Q W4A8PSNR 26.01
Fig. 16Inf-DiT super-resolution survives W8A8 and W4A8. Penguin crop at 4× bicubic SR on DIV2K. All three look the same. PSNR 25.80 / 25.86 / 26.01 (Table 4).
Guide

Figure 16 extends the method to Inf-DiT super-resolution, upscaling a DIV2K penguin crop four times. FP16, W8A8 and W4A8 look the same, with PSNR of 25.80, 25.86 and 26.01. The tiny rise at W4A8 is noise, not a real gain. The point is that ViDiT-Q generalises beyond text-to-video to another DiT task.

Normalized latency of ViDiT-Q INT80.00.20.40.60.81.01.2Jetson Orin Nano1.82xRTX30901.60xA1001.71xViDiT-Q INT8FP16photo:Jetson Orin Nanodev kit drivinga monitor withgenerated image
Fig. 17INT8 speed-up carries over to other GPUs, including a 7–10 W Jetson. Normalized latency vs FP16: Orin Nano 1.82×, RTX3090 1.60×, A100 1.71×. Memory is ~2× lower on every device. The right half of the original is a photo of the Jetson setup.
Guide

Figure 17 shows the INT8 speed-up carries over to other NVIDIA GPUs. Latency normalised to FP16 falls by 1.82 times on a Jetson Orin Nano, 1.60 times on an RTX 3090 and 1.71 times on an A100, with memory about halved everywhere. The lesson for other hardware is that gains need native eight-bit compute kernels, which is why Intel CPU and Arc results must be measured separately.

lemur, top hat,playing cards≈ FP16≈ FP16person undermilky way≈ FP16≈, fewer starsFP16ViDiT-Q W4A4-MPViDiT-Q W2A8-MP
Fig. 18Aggressive W4A4-MP and W2A8-MP still look like FP16. PixArt-Σ. W4A4-MP puts 66.7 % of layers at W4A4 (≈W5A5 average) and W2A8-MP about 50 % at W2A8 (≈W5A8). Detail loss is slight (e.g. fewer stars).
Guide

Figure 18 pushes PixArt-sigma to very low bits with mixed precision. W4A4-MP keeps two thirds of layers at W4A4, about a five-bit average, and W2A8-MP keeps about half at two-bit weights. Both images still look like FP16, with slight detail loss such as fewer stars. This shows the headroom that mixed precision creates, with the numbers in Table 5.

Weightsame (s, z) along a rowC_outC_in(s, z)OutputN_tokenActivationC_inN_tokeny = Σ_i w_i x_i (sum over C_in)WX = s_w(W_int − z_w) · s_x(x_int − z_x)= s_w s_x W_int x_int− s_w z_w s_x x_int− s_w s_x z_x W_int + s_w z_w s_x z_xinteger GEMM, then oneFP rescale per (row, token)
Fig. 19Hardware-friendly grouping, derived from the GEMM. W [Cout×Cin] times X [Ntoken×Cin]. Each output sums along Cin, so weights need per-output-channel parameters and activations per-token parameters (yellow bars = s, z). Then swsx factors out of the integer GEMM.
Guide

Figure 19 derives the hardware-friendly grouping from the matrix multiply. The weight matrix is C out by C in and the activations are tokens by C in; the yellow bars mark which elements share a scale and zero point. Since each output sums along C in, weights get per-row parameters and activations per-token ones. Then s w times s x factors out, leaving a pure integer multiply followed by one rescale.

CLIPtext alignment0.81570.10080.23640.106VQAvisual quality0.010220.83930.62320.01107FlowScoretime consistency0.17410.059880.14040.883CrossAttnFFNSpatialAttnTempAttn0.80.1each column sums to 1 (softmax over metrics)
Fig. 20Each layer type mainly affects one metric, which is the evidence for decoupling. Rows are metrics, columns are layer types. CrossAttn→CLIP 0.8157, FFN→VQA 0.8393, SpatialAttn→VQA 0.6232, TempAttn→FlowScore 0.883. SpatialAttn is the most mixed but is still mostly VQA. Values from the paper.
Guide

Figure 20 is the evidence that each layer type mainly hurts one metric. Rows are metrics, columns are layer types, and each column sums to one. Cross-attention loads on CLIP at 0.82, feed-forward on VQA at 0.84, temporal attention on FlowScore at 0.88, and spatial attention is the most mixed but still mostly VQA at 0.62. This justifies scoring each group with a single metric.

§7Results

Table 1 — OpenSORA text-to-video on VBench (8 dimensions). ViDiT-Q W4A8 uses mixed precision.
MethodW/AImaging Q.Aesthetic Q.Motion Sm.Dynamic Deg.BG Cons.Subject Cons.Scene Cons.Overall Cons.
FP1616/1663.6857.1296.2856.9496.1390.2839.6126.21
Q-Diffusion8/860.3855.1594.4468.0594.1787.7436.6225.66
Q-DiT8/860.3555.8093.6468.0594.7086.9432.3426.09
PTQ4DiT8/856.8855.5395.8963.8896.0291.2634.5225.32
SmoothQuant8/862.2255.9095.9668.0594.1787.7136.6625.66
Quarot8/860.1453.2194.9866.2195.0385.3535.6525.43
ViDiT-Q8/863.4856.9596.1461.1195.8490.2438.2226.06
Q-DiT4/823.3029.6197.894.16697.0291.510.004.985
PTQ4DiT4/837.9731.1592.569.72298.1893.593.56111.46
SmoothQuant4/846.9844.3894.5921.6794.3682.7926.4118.25
Quarot4/844.2543.7892.5766.2194.2584.5528.4318.43
ViDiT-Q4/861.0755.3795.6958.3395.2388.7236.1925.94
Guide

Table 1 scores OpenSORA text-to-video on eight VBench dimensions. At W8A8 most methods are near FP16, and ViDiT-Q is closest on imaging quality at 63.48 against 63.68. At W4A8 the baselines collapse, Q-DiT for example drops to zero scene consistency, while ViDiT-Q with mixed precision keeps an overall consistency of 25.94 against 26.21 for FP16. Note that higher dynamic degree is not better here, because jitter inflates it.

0.020.040.060.0VBench Imaging Quality60.423.3Q-DiT56.938.0PTQ4DiT62.247.0SmoothQ60.144.2Quarot63.561.1ViDiT-QW8A8W4A8FP16 63.68
Chart T1At W4A8 only ViDiT-Q stays close to FP16 on imaging quality. From Table 1.
Guide

Chart T1 pulls imaging quality out of Table 1, with W8A8 and W4A8 bars for each method and FP16 at 63.68 as the line. Every baseline loses a lot at W4A8, falling to between 23 and 47, while ViDiT-Q drops only from 63.5 to 61.1. It is the quickest single view of the paper's main result.

Fig. 5 (left) — OpenSORA prompt set, multi-aspect metrics (Q-Diffusion omitted at W6A6/W4A8: nothing readable).
MethodW/ACLIPSIMCLIP-TempVQA-AestheticVQA-TechnicalΔ FlowScore ↓
FP1616/160.17970.998863.4050.46–
Q-Diffusion8/80.17810.998751.6838.270.328
Q-DiT8/80.17880.997761.0334.970.473
PTQ4DiT8/80.18360.999154.5653.330.440
SmoothQuant8/80.19510.998659.7851.530.331
Quarot8/80.19490.997658.7352.280.215
ViDiT-Q8/80.19500.999160.7054.640.089
Q-DiT6/60.17100.994311.041.86941.10
PTQ4DiT6/60.17990.997659.9743.890.997
SmoothQuant6/60.18070.998556.4548.2129.26
Quarot6/60.18200.997561.4753.060.146
ViDiT-Q6/60.17910.998464.4551.580.625
Q-DiT4/80.16870.98330.0070.0183.013
PTQ4DiT4/80.17350.99732.2100.3180.108
SmoothQuant4/80.18320.998331.9622.850.415
Quarot4/80.18170.996547.3633.130.326
ViDiT-Q4/80.18090.998960.6249.380.153
Guide

This table backs figure 5 with five metrics on the OpenSORA prompt set: CLIPSIM and CLIP-Temp for text and temporal alignment, VQA aesthetic and technical for visual quality, and delta FlowScore, where lower is better. At W8A8 ViDiT-Q has the lowest FlowScore change, 0.089. At W4A8 its VQA scores of 60.62 and 49.38 are far above every baseline, near FP16's 63.40 and 50.46.

Fig. 6 (left) — PixArt-α text-to-image, first 1024 COCO prompts (no mixed precision at W4A8).
MethodW/AFID ↓CLIP ↑ImageReward ↑
FP1616/1673.340.2580.901
Q-Diffusion8/896.540.2390.186
Q-Diffusion4/891.950.228-0.224
Q-DiT8/873.600.2560.854
Q-DiT4/8475.80.127-2.277
PTQ4DiT8/8127.90.217-1.216
PTQ4DiT4/8171.90.177-2.064
ViDiT-Q8/875.610.2590.917
ViDiT-Q4/874.330.2570.887
Guide

PixArt-alpha text-to-image on the first 1024 COCO prompts, with FID lower is better and CLIP and ImageReward higher is better. ViDiT-Q at W4A8, without mixed precision, gets FID 74.33, CLIP 0.257 and ImageReward 0.887, almost identical to FP16. Q-DiT at W4A8 and PTQ4DiT at both bit-widths break down badly, so ViDiT-Q's advantage holds for images too.

Fig. 7 (table) — hardware savings on A100 (batch 1, 20 steps).
Bit-width (W/A)Memory opt.Latency opt.
16/161.00×1.00×
8/8 (naive)1.99×1.74×
8/8 (ours)1.99×1.71×
4/8 (ours)2.42×1.38×
Guide

The table behind figure 7, measured on an A100 with batch one and twenty steps. ViDiT-Q W8A8 saves memory 1.99 times and latency 1.71 times, almost as fast as naive W8A8 at 1.74, so the accuracy fixes cost little speed. W4A8 saves 2.42 times memory but only 1.38 times latency. The lesson is to report memory and latency separately.

Table 2 — Ablation, OpenSORA W4A8, techniques added one at a time.
Quant paramsChannel balanceMixed precisionW/ACLIPSIMCLIP-TempVQA-AVQA-TΔ Flow
–––16/160.1800.99864.19851.904–
Static & Tensor-wise––4/80.2010.9970.1780.0860.603
Dynamic & Token-wise––4/80.1960.99832.21710.9940.109
Dynamic & Token-wiseScaling-based–4/80.1910.99931.96322.8470.415
Dynamic & Token-wiseRotation-based–4/80.1810.99947.35633.1280.326
Dynamic & Token-wiseStatic-Dynamic–4/80.1810.99960.21642.2570.151
Dynamic & Token-wiseStatic-DynamicMSE-based4/80.1790.99953.33538.7290.258
Dynamic & Token-wiseStatic-DynamicMetric Decoupled4/80.1990.99960.61649.3830.334
Guide

Table 2 is the ablation on OpenSORA at W4A8, adding one technique per row. Static tensor-wise quantization collapses to a VQA aesthetic score near zero. Dynamic per-token scales lift it to 32, rotation to 47, and static-dynamic balancing to 60. MSE-based mixed precision then makes things worse, 53, while metric-decoupled mixed precision gives the best visual quality, 60.6 aesthetic and 49.4 technical. Each claimed fix is tested here.

0.020.040.060.0VQA score0.20.1static,tensor32.211.0dynamic,token32.022.8+ scalingCB47.433.1+ rotationCB60.242.3+ static-dynamic53.338.7+ MSEMP60.649.4+ metric-decoupledVQA-AestheticVQA-TechnicalFP16 aesthetic 64.2
Chart T2The ablation ladder. Dynamic token-wise quantization rescues the model from collapse. Static-dynamic balancing gives the biggest single gain. MSE-based mixed precision hurts, while metric-decoupled mixed precision helps (Table 2).
Guide

Chart T2 turns the ablation into a ladder of VQA bars, aesthetic and technical, against FP16's 64.2. The big steps are the move to dynamic per-token quantization, which rescues the model from collapse, and static-dynamic balancing, the largest single gain. The dip at MSE-based mixed precision is the key lesson: choosing bits by MSE hurts, while choosing them by the right metric helps.

Table 3 — UCF-101 (101 prompts, 1 per class). FVD-FP16 uses FP16 videos as reference. Latte: class-conditional, 20-step DDIM, CFG 7.0.
ModelMethodW/AFVD ↓FVD-FP16 ↓CLIPSIMCLIP-TVQA-AVQA-TΔ Flow ↓Temp. Flick.
STDiT–16/16136.870.000.19960.997841.6356.642.2497.53
STDiTNaive PTQ8/8154.9250.720.19930.996827.5235.502.6197.02
STDiTQ-Diffusion8/8144.7774.970.19790.996432.8844.422.5096.71
STDiTSmoothQuant8/8109.2448.780.19930.997139.1952.642.5397.21
STDiTViDiT-Q8/8141.1315.520.19950.997843.5955.362.3297.45
STDiTNaive PTQ4/8544.34637.020.18680.99820.160.131.6199.90
STDiTSmoothQuant4/8122.5196.250.19600.997317.3924.221.9996.23
STDiTViDiT-Q4/8136.5477.430.19780.997620.7625.651.9496.51
STDiTViDiT-Q-MP4/8129.1060.130.19950.997733.9847.651.8997.57
Latte–16/1699.900.000.19700.996336.3391.233.3796.22
LatteNaive PTQ8/898.7573.820.19810.995027.6250.523.5395.35
LatteViDiT-Q8/8110.9620.830.19590.996230.2680.323.1495.95
LatteNaive PTQ4/8183.52239.080.17190.99295.620.4166.0665.14
LatteViDiT-Q4/895.0479.110.19430.997121.7632.172.8495.57
Guide

Table 3 tests UCF-101 with OpenSORA's STDiT and the class-conditional Latte model. FVD-FP16 compares against FP16 videos, so lower means closer to the original. For STDiT, naive W4A8 explodes to an FVD-FP16 of 637, while ViDiT-Q with mixed precision reaches 60.13 and recovers VQA scores. Latte shows the same pattern, so the method is not tied to one model.

Table 4 — Inf-DiT 4× super-resolution (DIV2K val).
MethodPSNRSSIM
InfDiT FP1625.80150.7307
InfDiT (ViDiT-Q W8A8)25.86280.7318
InfDiT (ViDiT-Q W4A8)26.01390.7249
Guide

Table 4 gives Inf-DiT four-times super-resolution on DIV2K validation images. PSNR goes from 25.80 at FP16 to 25.86 at W8A8 and 26.01 at W4A8, and SSIM stays around 0.73. These differences are too small to matter, which is the point: quantization leaves super-resolution quality intact.

Table 5 — PixArt-Σ, lower bit-widths (MP = mixed precision).
MethodFID ↓CLIP ↑ImageReward ↑
FP1673.340.2580.901
Q-DiT W8A873.600.2560.854
ViDiT-Q W8A875.610.2590.917
ViDiT-Q W4A874.330.2570.887
ViDiT-Q W4A4-MP74.560.2570.861
ViDiT-Q W2A8-MP75.320.2560.843
Guide

Table 5 pushes PixArt-sigma below W4A8 with mixed precision. Even W4A4-MP and W2A8-MP keep FID at 74.56 and 75.32, next to FP16's 73.34, with only small drops in ImageReward. It shows that once sensitive layers stay at higher precision, most of the network tolerates very low bit-widths.

Table 6 — vs general PTQ (AdaRound, BRECQ) on OpenSORA. Note: the Adaround 4/8 CLIPSIM and CLIP-Temp values appear swapped in the paper; transcribed as printed.
MethodW/ACLIPSIMCLIP-TempVQA-AVQA-TΔ Flow
FP16–0.17970.998863.4050.460
Adaround8/80.17960.998352.9029.840.2934
Brecq8/80.17910.998348.2731.980.3978
ViDiT-Q8/80.19500.999160.7054.640.0890
Adaround4/80.99710.16480.2720.1510.4210
Brecq4/80.16690.99630.0850.0770.4303
ViDiT-Q4/80.18090.998960.6249.380.1530
Guide

Table 6 compares ViDiT-Q with general post-training methods, AdaRound and BRECQ, that learn rounding by reconstruction. At W8A8 they lose visual quality, and at W4A8 they collapse to VQA scores near zero while ViDiT-Q keeps 60.62 and 49.38. The tab notes that AdaRound's W4A8 CLIP values appear swapped in the paper and are copied as printed. So costly layer reconstruction does not fix the variation problem.

Table 7 — combining with SageAttention (8-bit QK).
MethodW/AMemory opt.Latency opt.
–16/16––
ViDiT-Q8/81.99x1.71x
ViDiT-Q + SageAttn8/81.99x1.72x
Guide

Table 7 adds SageAttention, which quantizes the attention query and key products to eight bits, on top of ViDiT-Q W8A8. Latency improves only from 1.71 to 1.72 times, with memory unchanged. That matches figure 9: attention is a small share of runtime, so the real gains come from the linear layers.

Table 8 — mixed-precision search schemes, W4A8.
MethodCLIPSIMCLIP-TempVQA-AVQA-TΔ Flow
Without MP0.1810.99960.21642.2570.151
MSE-based search0.1790.99953.33538.7290.258
Multiple-metrics joint search0.1790.99951.25635.4120.279
Metric-decoupled search0.1990.99960.61649.3830.334
Guide

Table 8 compares ways to choose bit-widths at W4A8. MSE-based search and a joint multi-metric search both score worse than using no mixed precision at all. Only the metric-decoupled search improves visual quality, to 60.6 and 49.4, and text alignment. For the thesis, NNCF's built-in sensitivity metrics are MSE-like proxies, so this result is a reason to test a metric-based ranking against them.

0.020.040.060.0VQA score60.242.3No MP53.338.7MSE-based51.335.4Joint multi-metric60.649.4Metric-decoupledVQA-AVQA-T
Chart T8Only the decoupled search beats uniform W4A8. MSE-based and joint multi-metric searches are worse than using no mixed precision. Δ FlowScore gets slightly worse (0.151 → 0.334), a trade-off the paper does not discuss.
Guide

Chart T8 plots the VQA scores from Table 8 for the four search schemes. Only the metric-decoupled bars rise above the no-mixed-precision baseline; the MSE and joint searches fall below it. The chart also flags that delta FlowScore gets worse, from 0.151 to 0.334, a motion trade-off the paper does not discuss, so decoupling is not a free win.

§8Why it matters for this thesis

ViDiT-Q → LTX-2.3 on OpenVINO / NNCF

  • Copy the sensitivity method, not the kernels. For LTX-2.3, group the linear layers by role: video self-attn, text cross-attn, the audio branch, audio↔video cross-attn, and FFN. Give each group one metric (e.g. DOVER VQA, CLIPSIM, FlowScore/flicker, plus an audio metric), then quantize one layer at a time to int4 and rank the layers inside each group. This fits NNCF well: put the selected sensitive layers at int8 or in ignored_scope, and compress the rest with nncf.compress_weights (INT4 with ratio/group_size). NNCF's built-in sensitivity_metric options (weight error, Hessian/activation variance) are proxies for the MSE-style ranking that this paper shows hurts (Table 8), so it is worth comparing the two.
  • Cost of the analysis. It needs one generation per layer per timestep range, i.e. hundreds of runs. Use short, low-resolution clips and a small prompt set. LTX-2.3 runs few denoising steps, so the "4 time ranges" become coarse bins over those steps.
  • Weight-only vs W8A8. The thesis mainly targets weight-only int8/int4. The per-output-channel (or group-wise) weight scales and the mixed-precision finding carry over directly. The activation-side ideas (dynamic per-token quantization) matter only if A8 is also tried. NNCF's default nncf.quantize uses static per-tensor activation scales, which corresponds to Table 2's "Static & Tensor-wise" row, the one that collapsed at W4A8. The OpenVINO CPU/GPU plugins do have dynamic activation quantization for weight-compressed MatMuls (the DYNAMIC_QUANTIZATION_GROUP_SIZE hint); check support for the OpenVINO version in use.
  • Channel balancing on OpenVINO. The static scaling step is SmoothQuant, which NNCF offers (and AWQ/scale estimation for weight compression). The Hadamard rotation has no native NNCF pass. Using it would mean folding Hᵀ into the weights offline and inserting an explicit rotation MatMul on the activation, which costs latency, because LTX's adaLN modulation sits between the norm and the linear layer and the rotation cannot simply be absorbed there.
  • What speed to expect. ViDiT-Q's 1.71× comes from custom INT8 GEMM CUDA kernels. W4A8 saved memory but gave less speed-up (1.38×) because DiT inference is compute-bound. On Intel CPU/Arc, weight-only int4/int8 mostly reduces memory and bandwidth. Real compute speed-ups need int8 activations that run on AMX/VNNI or XMX. Report memory and latency separately, the way Fig. 7 does.
Guide

Copy ViDiT-Q's sensitivity method, not its CUDA kernels. Group LTX-2.3's linear layers by role, including the audio branch and audio-video cross-attention, give each group one metric, rank layers by quantizing them to int4 one at a time, then keep the sensitive ones at int8 or in NNCF's ignored scope while compressing the rest with compress weights. Keep the runs cheap with short low-resolution clips, and report memory and latency separately, since weight-only compression on Intel hardware mainly saves memory.

Quantizing diffusion models

SVDQuant: Absorbing Outliers by Low-Rank Components for 4-Bit Diffusion Models

Muyang Li, Yujun Lin, Zhekai Zhang, Tianle Cai, Xiuyu Li, Junxian Guo, Enze Xie, Chenlin Meng, Jun-Yan Zhu, Song Han — MIT, NVIDIA, CMU, Princeton, UC Berkeley, SJTU, Pika Labs · ICLR 2025 (arXiv 2411.05007)

To make big diffusion transformers like 12B FLUX.1 actually faster, both weights and activations must go to 4 bits (W4A4). SVDQuant first pushes activation outliers into the weights (smoothing), then lets a small 16-bit low-rank branch (from an SVD) soak up the weight outliers, so only a flat, easy residual is quantized. A co-designed engine, Nunchaku, fuses that extra branch into the 4-bit kernels so it costs almost nothing.

Precision
W4A4 · INT4 / NVFP4
Low-rank branch
16-bit, rank 32
FLUX.1 size
22.2 → 6.1 GiB (3.6×)
Speed vs NF4 W4A16
3.0× (4090), 3.1× (5090)
Laptop 4090 vs BF16
10.1× (no offload)
FLUX.1-dev LPIPS
0.223 vs 0.272 (NF4)
Reading guide

SVDQuant asks how to make a twelve billion parameter diffusion transformer like FLUX.1 genuinely faster, not just smaller. Its answer is W four A four, four-bit weights and activations, made possible by smoothing activation outliers into the weights and then letting a small sixteen-bit low-rank branch from an SVD absorb the weight outliers, so only a flat residual is quantized. A companion engine, Nunchaku, fuses that branch into the four-bit kernels. The model ends up 3.6 times smaller and about three times faster than weight-only NF4, with better images. The tab runs from big picture and problem through the method, every equation and proof, every figure and the results tables, to a thesis box on OpenVINO. Among the sixteen papers it follows Q-Diffusion, PTQ4DiT and ViDiT-Q, builds on SmoothQuant and GPTQ, and is extended to video by the SVDQuant-GPTQ note on Wan 2.2.

§0Before reading

SVDQuant rests on one piece of linear algebra: any weight matrix can be split into a few big "directions" plus a small leftover, and the singular value decomposition (SVD) finds the best such split. It also assumes knowing why four-bit weights and four-bit activations (W4A4) are needed for real speed, and why an extra side branch costs memory traffic rather than arithmetic. It is in the atlas because it gives outliers their own small high-precision path instead of rounding them, an idea that can be tried with NNCF on LTX-2.3.

Split one matrix into two parts W m × n = L₁ m × r · L₂ (r × n) 16-bit branch few big directions + R 4-bit flat leftover r is small (e.g. 32), so L₁ and L₂ are thin Singular values, largest first big 0 index i (direction number) keep top r tail = residual R
PrimerSVD finds the few directions that carry most of a matrix. The SVD rewrites any matrix \(W\) as a sum of simple "rank-one" layers, each with a size called its singular value \(\sigma_i\), sorted from largest to smallest. Keeping only the top \(r\) layers gives two thin matrices \(L_1 L_2\), the best possible rank-\(r\) approximation; what is left over is the residual \(R\). If the first few \(\sigma_i\) are huge and the rest are small (a spiky spectrum, drawn schematically here), the thin part holds almost everything and \(R\) is small and flat. The thin part stores \(mr + nr\) numbers instead of \(mn\): for a 3072 by 3072 layer at \(r=32\), about 2% extra. SVDQuant keeps \(L_1L_2\) in 16 bits and quantizes only \(R\) to 4 bits.
Guide

Any matrix can be split into a few big directions plus a small leftover, and the singular value decomposition finds the best split. On the left, W equals two thin sixteen bit matrices, L one and L two, plus a residual R. On the right, the singular values are sorted by size: keep the tall ones, and the flat tail becomes R. SVDQuant quantizes only R to four bits, so a spiky spectrum is exactly what it needs.

W4A16 · weight-only (e.g. NF4) X · 16-bit W · 4-bit unpack to 16 16-bit multiply Smaller file, same arithmetic W4A4 · both 4-bit (SVDQuant) X · 4-bit W · 4-bit 4-bit multiply rescale Less memory and faster math
Primer"W4A4" means both operands are 4-bit, and only that speeds up the math. "W\(x\)A\(y\)" gives the bits for weights and activations. Weight-only W4A16 (like NF4) stores small weights but unpacks them to 16 bits before multiplying, so the arithmetic is unchanged. That helps memory-bound language models, but diffusion models are compute-bound: each step does heavy matrix multiplies over thousands of image tokens. The paper's GPUs have 4-bit Tensor Core units, so W4A4 cuts the arithmetic too, provided activations survive 4-bit rounding.
Guide

W four A four means four bit weights and four bit activations, and only that combination speeds up the arithmetic. In the top row, weight-only quantization such as NF4 unpacks the weights to sixteen bits before multiplying, so the file shrinks but the math does not. In the bottom row, both inputs are four bit and the multiply runs on four bit hardware. Diffusion models are compute-bound, which is why the paper insists on quantizing activations too.

Separate kernels 4-bit main low-rank down low-rank up + add GPU memory: many reads and writes Fused (Nunchaku) main + low-rank branch, one pass read once, write once
PrimerA small branch can still be slow if it moves a lot of data. A kernel is one program the GPU launches, for example one matrix multiply. Each separate kernel reads its inputs from GPU memory and writes its output back, and that traffic, not the arithmetic, is what makes a naive low-rank branch cost about 18% extra per FLUX step in the paper. Kernel fusion merges the steps into one kernel so the data is touched once; the paper's engine Nunchaku does this. OpenVINO fuses some operations by itself, but do not assume this pattern is fused on Intel hardware: measure it.
Guide

An extra branch that is tiny in arithmetic can still cost time, because every separate GPU program reads its inputs from memory and writes its outputs back. The top row shows three kernels, each making its own trips to memory; in the paper that costs about eighteen percent per step. The bottom row fuses everything into one pass, which is what the Nunchaku engine does. On OpenVINO, check whether this pattern gets fused rather than assuming it.

#4 SmoothQuant gives: smoothing #3 GPTQ gives: residual quantizer #8 ViDiT-Q W8A8, W4A8 on DiTs #9 SVDQuant W4A4 via 16-bit low-rank branch #10 DVD-Quant back to video DiTs #12 SVDQuant-GPTQ reused on Wan2.2 New here: outliers kept in 16 bits, never rounded
PrimerWhere this paper sits. ViDiT-Q (#8) got diffusion transformers to 8-bit activations but broke at 4 bits. SVDQuant (#9) combines two tools met earlier, SmoothQuant's smoothing and GPTQ for the leftover weights, and adds the new piece: a 16-bit low-rank side branch that absorbs outliers, which makes full W4A4 work on image diffusion models like FLUX.1. DVD-Quant (#10) returns to video, and paper #12 applies SVDQuant with GPTQ to the Wan2.2 video model.
Guide

SVDQuant is paper nine in the atlas. It follows ViDiT-Q, which reached eight bit activations on diffusion transformers but broke at four. It borrows smoothing from SmoothQuant and uses GPTQ on the leftover weights, then adds its own idea: a sixteen bit low-rank branch that holds the outliers so they are never rounded. DVD-Quant comes next, and paper twelve later reuses SVDQuant with GPTQ on the Wan two point two video model.

Terms used in this paper

SVD (singular value decomposition)
Writes any matrix as a sum of rank-one pieces, each scaled by a singular value, sorted from largest to smallest. Truncating it after \(r\) pieces gives the best rank-\(r\) approximation.
Rank, low-rank
The rank is how many independent directions a matrix really uses. A low-rank matrix can be stored as the product of two thin matrices, which is cheap.
Smoothing
SmoothQuant's trick: divide each activation channel by a factor and multiply the matching weight row by it. The output is unchanged, but activation outliers move into the weights.
W4A4, W4A16, W8A8
Bits for weights (W) and activations (A). W4A16 is weight-only 4-bit; W4A4 quantizes both, which is what allows 4-bit arithmetic.
NF4
"NormalFloat 4", a 4-bit weight format from QLoRA whose 16 levels follow a bell curve. The paper's weight-only baseline; it saves memory but not compute.
NVFP4
NVIDIA's 4-bit floating-point format, where each small group of values shares a scale. Supported natively by Blackwell-generation GPUs such as the RTX 5090.
Compute-bound vs memory-bound
A task is compute-bound if the arithmetic is the bottleneck, and memory-bound if moving data is. Diffusion steps are mostly compute-bound, so weight-only quantization helps little.
Tensor Core
Specialised matrix-multiply units in NVIDIA GPUs. Lower-precision inputs run faster on them, but only for formats the hardware supports.
RTX 4090, RTX 5090
Consumer NVIDIA GPUs used for the speed tests; the laptop 4090 has 16 GB of memory, too little for the 16-bit FLUX.1 without offloading to the CPU.
Nunchaku
The authors' inference engine, which fuses the low-rank branch into the 4-bit kernels so it adds little time. It is CUDA-only.
LoRA
Low-Rank Adaptation: fine-tuning a model by adding a small low-rank update to its weights. Because SVDQuant already has a 16-bit low-rank branch, LoRAs can be attached directly.
FLUX.1, PixArt-Σ, SDXL
The text-to-image models tested: FLUX.1 is a 12-billion-parameter diffusion transformer, PixArt-Σ a smaller one, and SDXL a UNet-based model.
LPIPS, PSNR
How close a quantized image is to the 16-bit model's image. LPIPS is a learned perceptual distance (lower is better); PSNR is a pixel-level score (higher is better).
FID, ImageReward, MJHQ
FID compares the statistics of many generated images with a reference set (lower is better); ImageReward is a learned human-preference score (higher is better). MJHQ-30K is the Midjourney prompt set used for testing.
Guide

These are the terms the paper uses without explaining. The most important are the singular value decomposition, rank, and smoothing, because together they are the method. W four A four versus weight-only, and compute-bound versus memory-bound, explain why the authors want four bit activations. NF4 and NVFP4 are the four bit formats compared, Nunchaku is their fused engine, and LPIPS, ImageReward and FID are the quality scores in the results.

§2Big picture

Xoutlier channels× diag(λ)⁻¹smoothingX̂L₁ m×rdown, 16-bitL₂ r×nup, 16-bitQuantize→ 4-bit4-bit GEMMQ(X̂)·Q(R)+Y ≈ XWabsorbs weight outliers (rank 16–32)flat residual R = Ŵ − L₁L₂Offline, per layerŴ = W·diag(λ)SVD: Ŵ = UΣVL₁ = UΣ[:, :r]L₂ = V[:r, :]R = Ŵ − L₁L₂Q(R): 4-bit (GPTQ)
Guide

The whole method fits in one picture. Smoothing first divides the activations by a per-channel factor lambda, which pushes their outliers into the weights. A small sixteen bit low-rank branch, L one times L two, then takes over those weight outliers. What is left, the residual R, is flat enough to quantize to four bits, and a four bit GEMM multiplies it with the four bit activations. Every later section explains one part of this diagram.

Every linear layer becomes two parallel paths on the same smoothed input X̂: a tiny 16-bit low-rank path (L₁ then L₂) that carries the weight outliers, and a 4-bit GEMM on the residual R. Their outputs are added. Everything is post-training; no fine-tuning.

§3The problem

One outlier eats the 4-bit gridmax → q_maxbulk: 1–2levelschannels (16 INT4 levels as grid lines)Why weight-only (W4A16) gives no speed-up hereW 4-bitupcastto 16-bit16-bit GEMMsame FLOPsonly memorysavedW 4-bitX 4-bitINT4/FP4 GEMM4-bit tensor corescompute-bound→ real speed-upW4A4 needed; but then BOTH operands must survive 4 bits
Guide

Two problems motivate the paper. On the left, a single outlier sets the quantization range, so most values fall into only one or two of the sixteen four bit levels. On the right, weight-only four bit saves memory but still runs a sixteen bit multiply, so it gives no speed-up. Real speed needs both weights and activations in four bits, which is why outliers must be handled first.

Prop. 4.1: what drives the W4A4 error‖X‖input size‖W − Q(W)‖weight q-error‖X − Q(X)‖input q-error‖W‖weight size×+×smoothing shrinks X̂SVD: ‖R‖ smallsmoothing: few outliersreplace W by R
Guide

Proposition 4.1 splits the W4A4 error into four factors: the size of the input, the size of the weight, and the quantization error of each. SVDQuant attacks them in pairs. Smoothing shrinks the input and its quantization error, and replacing W by the small residual R shrinks the weight term. Read this diagram as the reason for each of the method's steps.

  • Diffusion is compute-bound even at batch 1 (Fig. 2), so W4A16 only saves memory: NF4 FLUX runs 660 ms/step vs 657 ms BF16 (Fig. 8c). Real speed needs W4A4 on 4-bit tensor cores.
  • At 4 bits both sides break: X and W both have outlier channels. Smoothing only moves outliers from X to W (Fig. 3b, Fig. 4d).
  • Rotation (QuaRot-style) is ruled out: adaptive LayerNorm (adaLN) scales are computed at runtime from the timestep/text, so rotations cannot be folded into the weights offline, and online rotation is too slow. QAT is too expensive at 12B.
  • A separate low-rank branch is slow if run naïvely: it re-reads and re-writes full 16-bit activations, adding ~57% latency to the 4-bit path (Fig. 6a).

§4Method

  1. Smooth (SmoothQuant): X̂ = X·diag(λ)⁻¹, Ŵ = W·diag(λ), with λᵢ = max|X:,ᵢ|^α / max|Wᵢ,:|^(1−α); α searched per layer on calibration prompts. Activations become easy; weights get worse.
  2. Decompose: truncated SVD of Ŵ gives L₁ = UΣ:,:r and L₂ = V:r,: (optimal rank-r fit, Eckart–Young). Because smoothing makes Ŵ's spectrum spiky (Fig. 5), r = 16–32 removes most of its energy.
  3. Quantize only the residual R = Ŵ − L₁L₂ to 4 bits (per-group symmetric; INT4 group 64 with 16-bit scales, or NVFP4 group 16 with FP8 scales), using GPTQ; activations X̂ are quantized per group on the fly.
  4. Refine: re-decompose Ŵ − Q(R) a few times, keep the split with smallest error.
  5. Run with Nunchaku: kernel 1 = Quantize(X̂) + down-projection X̂L₁ (shared input); kernel 2 = 4-bit GEMM + up-projection (shared output). Overhead drops to 5–10%.
  6. Keep sensitive bits in 16-bit: for FLUX the adaLN linear inputs stay W4A16; for other models cross-attention K/V projections stay 16-bit (<5% of runtime). W8A8 variant: per-token dynamic A, per-channel W, rank 16.
Guide

Smoothing makes activations easy by pushing their outliers into the weights, and the SVD then pulls the few dominant directions of that harder weight into a small sixteen-bit branch; since smoothing made the spectrum spiky, rank sixteen to thirty-two suffices. Only the flat residual goes to four bits with GPTQ, after a short refinement loop re-balances the split. Nunchaku fuses the branch into the kernels, and a few sensitive layers stay in sixteen bits.

calibrationCOCO promptssearch αper layer, MSEsmoothŴ = W·diag(λ)SVD rank rL₁, L₂ (16-bit)refineSVD of Ŵ − Q(R)quantize RGPTQ, 4-bititerate, keep best
Guide

The offline recipe runs once per layer. A small set of COCO prompts serves as calibration data. The method searches the smoothing strength alpha by output error, smooths the weight, takes the top r singular vectors as the sixteen bit branch, and quantizes the residual with GPTQ. It can then repeat the decomposition on what quantization left behind and keep the best result.

Why it works (Sec. 4.1–4.2 in one line each)

  • Eq. (6): the layer's error is exactly the 4-bit error of X̂R, so only R and X̂ matter.
  • Eq. (8): the 4-bit error of R is bounded by ‖R‖F, and SVD is the optimal way to minimize ‖R‖F for a given r.
  • Contrast with LoRC / QLoRA-style methods: they quantize W first and fit a low-rank branch to the error, whose spectrum is flat, so low rank cannot fix it (Fig. 10: LoRC IR −0.965).
Offline SVDQuant for one linear layer (reconstructed from Sec. 4.2 + App. D; the paper has no Algorithm box) input : W (m x n), calibration activations X from COCO-caption prompts, rank r (32 for W4A4, 16 for W8A8) for alpha in search_grid: # per-layer migration strength lam[i] = max|X[:,i]|^alpha / max|W[i,:]|^(1-alpha) # smoothing factor, i = 1..m W_hat = diag(lam) @ W ; X_hat = X @ diag(lam)^-1 U,S,V = svd(W_hat) L1, L2 = U[:, :r] * S[:r], V[:r, :] # 16-bit low-rank branch R = W_hat - L1 @ L2 repeat k times: # refinement, keep best Rq = Q(R) # 4-bit, GPTQ, per-group (INT4 g=64 / NVFP4 g=16) L1, L2 = svd_r(W_hat - Rq) ; R = W_hat - L1 @ L2 track err = || X_hat W_hat - (X_hat L1 L2 + Q(X_hat) Q(R)) || keep (lam, L1, L2, Q(R)) with smallest output MSE runtime: Y = (X/lam) @ L1 @ L2 + deq( Q4(X/lam) @ Q(R) ) # fused by Nunchaku into 2 kernels
Guide

This pseudocode is reconstructed from Section 4.2 and Appendix D, since the paper prints no algorithm box. For each candidate migration strength alpha, it smooths the layer, takes a rank r SVD of the smoothed weight, and quantizes the residual. The inner loop re-fits the low-rank part to whatever the quantized residual missed, and the version with the smallest output error on calibration prompts wins. At runtime the layer is just a sixteen-bit path plus a four-bit path, added together.

§5Every equation

All 14 numbered equations (Eqs. 9–11 restate 4, 7, 8 in the appendix) plus the key unnumbered display math, in paper order.

(1)\[ \mathbf{Q}_{\mathbf{X}}=\operatorname{round}\left(\frac{\mathbf{X}}{s_{\mathbf{X}}}\right),\qquad s_{\mathbf{X}}=\frac{\max(|\mathbf{X}|)}{q_{\max}} \]

Symmetric max-scaled quantization: integer tensor \(\mathbf{Q}_\mathbf{X}\), scale \(s_\mathbf{X}\).

Guide

This is the basic quantizer used throughout the paper. Take a tensor X, divide it by a scale s X, and round to the nearest integer to get the integer tensor Q X. The scale is the largest absolute value in X divided by q max, the largest integer the format allows. One big outlier therefore stretches the scale and wastes levels for every other value, which is the whole problem SVDQuant attacks.

—\[ q_{\max}=2^{k-1}-1\ \text{(signed INT}k\text{)},\qquad q_{\max}=6\ \text{(FP4 E2M1)},\qquad Q(\mathbf{X})=s_{\mathbf{X}}\cdot\mathbf{Q}_{\mathbf{X}} \]

Range per data type (INT4 → 7) and the dequantized tensor.

Guide

q max is the largest representable magnitude: two to the power k minus one, minus one, for a signed k-bit integer, so seven for INT4, and six for the FP4 format E2M1 used by NVFP4. Multiplying the integers back by the scale gives Q of X, the dequantized tensor. With only seven positive levels at four bits, how the scale is set decides almost everything.

(2)\[ \mathbf{X}\mathbf{W}\approx Q(\mathbf{X})Q(\mathbf{W})=s_{\mathbf{X}}s_{\mathbf{W}}\cdot\mathbf{Q}_{\mathbf{X}}\mathbf{Q}_{\mathbf{W}} \]

A linear layer in low precision: integer GEMM, then one rescale. Needs both operands at the same bit-width for a speed-up.

Guide

A linear layer multiplies activations X by weights W. In low precision, both are quantized, the integer matrices are multiplied on fast integer hardware, and one final rescale by s X times s W restores the magnitude. The key point is that both operands must be at the same low bit-width to get the speed-up, which is why the paper insists on W4A4 rather than four-bit weights only.

(3)\[ E(\mathbf{X},\mathbf{W})=\left\lVert \mathbf{X}\mathbf{W}-Q(\mathbf{X})Q(\mathbf{W})\right\rVert_F \]

Quantization error of a linear layer, \(\mathbf{X}\in\mathbb{R}^{b\times m}\), \(\mathbf{W}\in\mathbb{R}^{m\times n}\), Frobenius norm.

Guide

This defines the error the paper tries to shrink: the Frobenius norm, meaning the square root of the sum of squared entries, of the gap between the true output X times W and the quantized output. X has b rows of tokens and m input channels, W maps m inputs to n outputs. Every later equation is a way to bound or reduce this number.

(4)\[ E(\mathbf{X},\mathbf{W})\le\lVert \mathbf{X}\rVert_F\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F+\lVert \mathbf{X}-Q(\mathbf{X})\rVert_F\left(\lVert \mathbf{W}\rVert_F+\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F\right) \]

Prop. 4.1 (error decomposition): error bounded by magnitudes of X, W and their own quantization errors.

Guide

Proposition 4.1 splits the layer error into pieces. The first term is the size of X times the weight quantization error; the second is the activation quantization error times the size of W plus its own error. So the output error stays small only if both X and W are small in magnitude and both quantize well. That is why outliers on either side hurt, and it motivates attacking both.

—\[ \hat{\mathbf{X}}=\mathbf{X}\cdot\operatorname{diag}(\boldsymbol{\lambda})^{-1},\qquad \hat{\mathbf{W}}=\mathbf{W}\cdot\operatorname{diag}(\boldsymbol{\lambda}),\qquad \boldsymbol{\lambda}\in\mathbb{R}^{m} \]

Smoothing (SmoothQuant): per-input-channel factor; \(\hat{\mathbf{X}}\hat{\mathbf{W}}=\mathbf{X}\mathbf{W}\) exactly (λ scales the m input rows of W, i.e. diag(λ)W in strict matrix order).

Guide

Smoothing, borrowed from SmoothQuant, divides each input channel of X by a factor lambda i and multiplies the matching row of W by the same factor. X hat times W hat equals X times W exactly, so nothing changes mathematically. What changes is where the outliers live: X hat becomes flat and easy to quantize, while W hat inherits the spikes, the problem seen in Figure 3b.

—\[ \hat{\mathbf{W}}=\mathbf{L}_1\mathbf{L}_2+\mathbf{R},\qquad \mathbf{L}_1\in\mathbb{R}^{m\times r},\ \mathbf{L}_2\in\mathbb{R}^{r\times n} \]

Split the smoothed weight into a rank-r part and a residual.

Guide

Here the smoothed weight W hat is split into two parts: L one times L two, a rank r product where L one is m by r and L two is r by n, plus a residual R. With r much smaller than m or n, the low-rank part is cheap to store and run in sixteen bits. The next equation shows why only R then needs quantizing.

(5)\[ \mathbf{X}\mathbf{W}=\hat{\mathbf{X}}\hat{\mathbf{W}}=\hat{\mathbf{X}}\mathbf{L}_1\mathbf{L}_2+\hat{\mathbf{X}}\mathbf{R}\approx\underbrace{\hat{\mathbf{X}}\mathbf{L}_1\mathbf{L}_2}_{\text{16-bit low-rank branch}}+\underbrace{Q(\hat{\mathbf{X}})Q(\mathbf{R})}_{\text{4-bit residual}} \]

The SVDQuant layer: only the residual branch is quantized.

Guide

Equation five is the SVDQuant layer itself. The output X times W equals X hat times the low-rank part plus X hat times the residual. The first term runs in sixteen bits and carries the outliers; only the second term is quantized, as four-bit X hat times four-bit R. This is the two-path picture from the big-picture diagram.

—\[ \text{overhead}=\frac{mr+nr}{mn},\qquad r\ll\min(m,n),\ r\in\{16,32\} \]

Extra parameters/compute of the low-rank branch (e.g. m = n = 3072, r = 32 → 2.1%).

Guide

The cost of the extra branch is m times r plus n times r values, divided by the m times n values of the full weight. For a 3072 by 3072 layer with rank thirty-two that is about 2.1 percent more parameters and compute. The branch is cheap in arithmetic; Figure 6 shows the real cost is memory traffic, which Nunchaku fixes.

(6)\[ \left\lVert \hat{\mathbf{X}}\hat{\mathbf{W}}-\left(\hat{\mathbf{X}}\mathbf{L}_1\mathbf{L}_2+Q(\hat{\mathbf{X}})Q(\mathbf{R})\right)\right\rVert_F=\left\lVert \hat{\mathbf{X}}\mathbf{R}-Q(\hat{\mathbf{X}})Q(\mathbf{R})\right\rVert_F=E(\hat{\mathbf{X}},\mathbf{R}) \]

The error of the whole layer equals the plain quantization error of the residual GEMM.

Guide

Equation six says the error of the whole SVDQuant layer is exactly the plain quantization error of the residual product, X hat times R. The sixteen-bit branch adds no error at all. So the question reduces to making X hat and R easy to quantize, and equation eight then says how to do that for R.

(7)\[ \mathbb{E}\left[\max(|\mathbf{R}|)\right]\le c\cdot\mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right] \]

Regularity condition of Prop. 4.2 (no extreme outliers relative to overall energy).

Guide

This is a mild regularity assumption for Proposition 4.2: the expected largest entry of R is at most a constant c times the expected Frobenius norm of R. In words, R has no extreme outliers compared with its total energy. The paper checks it for Gaussian entries two blocks down.

(8)\[ \mathbb{E}\left[\lVert \mathbf{R}-Q(\mathbf{R})\rVert_F\right]\le\frac{c\sqrt{\operatorname{size}(\mathbf{R})}}{q_{\max}}\cdot\mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right] \]

Prop. 4.2: residual quantization error is bounded by the residual's magnitude, so minimize ‖R‖F.

Guide

Proposition 4.2: under that assumption, the expected quantization error of R is at most c times the square root of the number of entries, divided by q max, times the expected size of R. The practical message is simple: a smaller residual means a smaller four-bit error. Minimising the norm of R is therefore the goal, and the SVD is the optimal tool for it.

—\[ c=\sqrt{\frac{\log(\operatorname{size}(\mathbf{R}))\,\pi}{\operatorname{size}(\mathbf{R})}}\quad\text{(Gaussian entries)} \]

Constant for which Eq. (7) holds when R is normally distributed.

Guide

For a residual with normally distributed entries, the constant c in equation seven is the square root of log of the number of entries times pi, divided by the number of entries. It shrinks as the matrix grows, so the regularity condition is easy to satisfy for large layers. The proof in Appendix A.2, equations twelve to fourteen, derives this value.

—\[ \hat{\mathbf{W}}=\mathbf{U}\boldsymbol{\Sigma}\mathbf{V},\qquad \mathbf{L}_1=\mathbf{U}\boldsymbol{\Sigma}_{:,:r},\qquad \mathbf{L}_2=\mathbf{V}_{:r,:} \]

Eckart–Young–Mirsky: truncated SVD is the optimal rank-r minimizer of ‖Ŵ − L₁L₂‖F.

Guide

The SVD writes W hat as U times Sigma times V. Keeping the first r columns of U times Sigma gives L one, and the first r rows of V give L two. The Eckart, Young, Mirsky theorem guarantees this truncated SVD is the best possible rank r approximation, so it leaves the smallest residual R, exactly what equation eight asks for.

—\[ \lVert \mathbf{R}\rVert_F=\sqrt{\sum_{i=r+1}^{\min(m,n)}\sigma_i^2}\qquad\text{vs.}\qquad \lVert \hat{\mathbf{W}}\rVert_F=\sqrt{\sum_{i=1}^{\min(m,n)}\sigma_i^2} \]

Removing the top-r singular values \(\sigma_i\) of Ŵ removes most of its energy (Fig. 5).

Guide

The size of the residual equals the square root of the sum of the squared singular values from index r plus one onward, while the full weight includes all of them. If the first few singular values sigma i are huge, removing them removes most of the energy. Figure 5 shows smoothing makes W hat exactly like that, which is why rank thirty-two is enough.

—\[ \lambda_i=\frac{\max(|\mathbf{X}_{:,i}|)^{\alpha}}{\max(|\mathbf{W}_{i,:}|)^{1-\alpha}} \]

App. D: smoothing factor per input channel; migration strength α searched per layer to minimize output MSE after SVD on calibration data.

Guide

This is the smoothing factor for input channel i: the largest activation magnitude in that channel raised to alpha, divided by the largest weight magnitude in that row raised to one minus alpha. Alpha, the migration strength, decides how much difficulty moves from activations to weights. Unlike SmoothQuant, SVDQuant searches alpha per layer to minimise output error measured after the SVD step, using calibration prompts.

(9)\[ E(\mathbf{X},\mathbf{W})\le\lVert \mathbf{X}\rVert_F\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F+\lVert \mathbf{X}-Q(\mathbf{X})\rVert_F\left(\lVert \mathbf{W}\rVert_F+\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F\right) \]

App. A.1 restatement of Prop. 4.1 (= Eq. 4).

Guide

This is the appendix restatement of Proposition 4.1, identical to equation four: the layer error is bounded by the size of X times the weight error, plus the activation error times the size of W plus its error. It is repeated here only to set up the proof that follows.

proof A.1\[ \begin{aligned} &\lVert \mathbf{X}\mathbf{W}-Q(\mathbf{X})Q(\mathbf{W})\rVert_F\\ &=\lVert \mathbf{X}\mathbf{W}-\mathbf{X}Q(\mathbf{W})+\mathbf{X}Q(\mathbf{W})-Q(\mathbf{X})Q(\mathbf{W})\rVert_F\\ &\le\lVert \mathbf{X}(\mathbf{W}-Q(\mathbf{W}))\rVert_F+\lVert(\mathbf{X}-Q(\mathbf{X}))Q(\mathbf{W})\rVert_F\\ &\le\lVert \mathbf{X}\rVert_F\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F+\lVert \mathbf{X}-Q(\mathbf{X})\rVert_F\lVert Q(\mathbf{W})\rVert_F\\ &\le\lVert \mathbf{X}\rVert_F\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F+\lVert \mathbf{X}-Q(\mathbf{X})\rVert_F\lVert \mathbf{W}-(\mathbf{W}-Q(\mathbf{W}))\rVert_F\\ &\le\lVert \mathbf{X}\rVert_F\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F+\lVert \mathbf{X}-Q(\mathbf{X})\rVert_F\left(\lVert \mathbf{W}\rVert_F+\lVert \mathbf{W}-Q(\mathbf{W})\rVert_F\right) \end{aligned} \]

Add-and-subtract X·Q(W), triangle inequality, sub-multiplicativity, then triangle inequality on Q(W) = W − (W − Q(W)).

Guide

The proof of Proposition 4.1 uses one trick and two standard inequalities. Add and subtract X times Q of W, split the norm with the triangle inequality, then use the fact that the norm of a product is at most the product of norms. Finally, Q of W is written as W minus its error, and the triangle inequality is applied once more. Nothing here is specific to diffusion models.

(10)\[ \mathbb{E}\left[\max(|\mathbf{R}|)\right]\le c\cdot\mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right] \]

App. A.2 restatement of Eq. (7).

Guide

This restates equation seven in Appendix A.2: the expected maximum entry of the residual R is at most a constant c times its expected Frobenius norm. It is the no-extreme-outliers assumption on which the residual error bound of Proposition 4.2 rests.

(11)\[ \mathbb{E}\left[\lVert \mathbf{R}-Q(\mathbf{R})\rVert_F\right]\le\frac{c\sqrt{\operatorname{size}(\mathbf{R})}}{q_{\max}}\cdot\mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right] \]

App. A.2 restatement of Eq. (8).

Guide

This restates equation eight in Appendix A.2: the expected quantization error of R is bounded by c times the square root of its size, over q max, times its expected norm. The proof block that follows derives it.

proof A.2\[ \begin{aligned} \lVert \mathbf{R}-Q(\mathbf{R})\rVert_F&=\lVert \mathbf{R}-s_{\mathbf{R}}\cdot\mathbf{Q}_{\mathbf{R}}\rVert_F=\left\lVert s_{\mathbf{R}}\cdot\frac{\mathbf{R}}{s_{\mathbf{R}}}-s_{\mathbf{R}}\cdot\operatorname{round}\left(\frac{\mathbf{R}}{s_{\mathbf{R}}}\right)\right\rVert_F=|s_{\mathbf{R}}|\left\lVert\frac{\mathbf{R}}{s_{\mathbf{R}}}-\operatorname{round}\left(\frac{\mathbf{R}}{s_{\mathbf{R}}}\right)\right\rVert_F\\ \mathbb{E}\left[\lVert \mathbf{R}-Q(\mathbf{R})\rVert_F\right]&\le\mathbb{E}\left[|s_{\mathbf{R}}|\right]\sqrt{\operatorname{size}(\mathbf{R})}=\frac{\sqrt{\operatorname{size}(\mathbf{R})}}{q_{\max}}\cdot\mathbb{E}\left[\max(|\mathbf{R}|)\right]\le\frac{c\sqrt{\operatorname{size}(\mathbf{R})}}{q_{\max}}\cdot\mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right] \end{aligned} \]

Each element's rounding error is ≤ 1 step (the paper bounds it by 1 per element), so the error ≤ |s_R|·√size(R); then s_R = max|R|/q_max and Eq. (10).

Guide

The proof of Proposition 4.2 factors the scale out of the error and bounds each element's rounding error by one step, giving the scale times the square root of the number of entries. The scale is the maximum of R over q max, and the regularity assumption turns that maximum into the norm of R. One step is a loose bound, since rounding error is at most half a step, but the conclusion holds.

(12)\[ \mathbb{E}\left[\max(|\mathbf{R}|)\right]\le\sigma\sqrt{2\log(\operatorname{size}(\mathbf{R}))} \]

Gaussian maximal inequality (Massart 2007, Lemma 2.3), σ = std of the entries.

Guide

For Gaussian entries with standard deviation sigma, the expected largest absolute entry grows only like sigma times the square root of two times log of the number of entries. This is a standard maximal inequality from Massart, and it is the first ingredient for computing the constant c.

(13)\[ \mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right]=\mathbb{E}\left[\sqrt{\sum_{x\in \mathbf{R}}x^2}\right]\ge\mathbb{E}\left[\frac{\sum_{x\in \mathbf{R}}|x|}{\sqrt{\operatorname{size}(\mathbf{R})}}\right] \]

Cauchy–Schwarz lower bound on the Frobenius norm.

Guide

The Cauchy, Schwarz inequality gives a lower bound on the Frobenius norm of R: it is at least the sum of absolute entries divided by the square root of the number of entries. This is the second ingredient for the Gaussian constant c.

(14)\[ \mathbb{E}\left[\frac{\sum_{x\in \mathbf{R}}|x|}{\sqrt{\operatorname{size}(\mathbf{R})}}\right]=\sigma\sqrt{\frac{2\,\operatorname{size}(\mathbf{R})}{\pi}} \]

Mean of the half-normal distribution, \(\mathbb{E}|x|=\sigma\sqrt{2/\pi}\).

Guide

For a normal entry, the expected absolute value is sigma times the square root of two over pi, the mean of a half-normal distribution. Summing over all entries turns the lower bound from equation thirteen into sigma times the square root of two times the size over pi.

—\[ \mathbb{E}\left[\max(|\mathbf{R}|)\right]\le\sigma\sqrt{2\log(\operatorname{size}(\mathbf{R}))}\le\sqrt{\frac{\log(\operatorname{size}(\mathbf{R}))\,\pi}{\operatorname{size}(\mathbf{R})}}\;\mathbb{E}\left[\lVert \mathbf{R}\rVert_F\right] \]

Combining (12)–(14): Eq. (10) holds with the Gaussian c given above.

Guide

Chaining equations twelve to fourteen shows that the expected maximum of R is at most the Gaussian constant c times the expected norm of R. So the regularity condition of Proposition 4.2 holds for Gaussian residuals, closing the proof that a smaller residual gives a smaller four-bit error.

§6Every figure

FLUX.1-dev, 25 steps (memory = DiT; latency = end-to-end, 16 GB laptop 4090)FLUX.1-dev BF1622.7 GiB · 111.7 sNF4 (W4A16)LPIPS 0.272 · 6.9 GiB · 38.6 sNaïve INT4 (W4A4)LPIPS 0.322 · 6.3 GiB · 12.5 sSVDQuant INT4 (W4A4)LPIPS 0.223 · 6.5 GiB · 12.9 scyberpunk catneon signreferencetext readabletext okdetails driftsign text garbledjacket recoloured≈ BF16text intactPixArt-ΣPixArt-Σ FP1620 stepsViDiT-Q (W4A8)LPIPS 0.573Naïve INT4 (W4A4)LPIPS 0.762SVDQuant INT4 (W4A4)LPIPS 0.323steaktenderloinreferencedark, glossyover-smoothedcolour noiseshattered≈ FP16clean
Fig. 14-bit W+A that still looks like the 16-bit model. Schematic of the teaser gallery. On 12B FLUX.1-dev, SVDQuant INT4 cuts DiT memory 3.5× (22.7→6.5 GiB) and, because it no longer needs CPU offloading on a 16 GB laptop 4090, runs 8.7× faster end-to-end than BF16 and 3× faster than NF4 weight-only. Naïve W4A4 is as fast but visibly breaks (garbled sign; PixArt image turns into noise).
Guide

Four-bit weights and activations can look like the sixteen-bit model. Each column is one precision on FLUX.1-dev, labelled with LPIPS, a perceptual distance to the BF16 image where lower is better, plus memory and latency. SVDQuant INT4 reaches 0.223 against NF4's 0.272 and runs 8.7 times faster than BF16 on a sixteen gigabyte laptop GPU. Naive W4A4 is equally fast but garbles the sign and turns the PixArt image to noise.

0102030405003691215Parameters (B)Computation (TMACs)SD1.4'22PixArt'23SD3-Medium'24SDXL'23AuraFlow v0.1'24FLUX.1'24Gemma2-2B'24Phi-3.5'24Llama3-8B'24Gemma2-9B'24Llama2-13B'23Diffusion model (per step)LLM (512 in / 256 out)
Fig. 2Diffusion models are far more compute-hungry than LLMs of equal size. Computation (TMACs; 1 MAC = 2 FLOPs) vs parameters. Diffusion cost is for one denoising step; LLM cost for 512 context + 256 output tokens. Dashed lines are the two trends: FLUX.1 (12B) needs ~38 TMACs per step, a 13B LLM ~10. Hence diffusion is compute-bound, and weight-only quantization does not speed it up. Point positions read from the plot (shape redrawn).
Guide

Diffusion models need far more compute per parameter than language models. The horizontal axis is size in billions of parameters, the vertical axis compute in tera multiply-accumulates, one denoising step for diffusion; FLUX.1 needs about thirty-eight per step, a thirteen billion parameter LLM about ten per request. So diffusion is compute-bound, and weight-only quantization saves memory but not time. Point positions are read off the plot, and LTX video with long token sequences is even more compute-bound.

|X|100channelVery hard|W|20input channelHard|X̂|20channelEasy|Ŵ|4.50channelHarder|X̂|20channelEasy|Ŵ − L₁L₂|0.050channelEasyLow-rank L₁L₂16-bit L₁16-bit L₂rank = 32+No need to quantize(a) Original(b) smoothing: shift outliers X → W(c) SVDQuant: absorb with SVDlevelsfew levels used
Fig. 3Smoothing moves the problem; the low-rank branch removes it. Grey lines = the 4-bit quantization levels spanning each tensor's max. (a) Both activation X and weight W have outlier channels (magenta), so the bulk uses only 1–2 levels. (b) Smoothing divides X by λ and multiplies W by λ: X̂ becomes easy, but Ŵ gets bigger outliers (max ≈4.5). (c) SVD pulls the dominant part of Ŵ into a 16-bit rank-32 branch L₁L₂; the residual Ŵ − L₁L₂ is flat and tiny (max ≈0.05), so both 4-bit operands are easy.
Guide

Smoothing moves the problem; the low-rank branch removes it. Grey lines mark the four-bit levels and magenta the outlier channels; in panel a both X and W have outliers, so most values use one or two levels. In panel b smoothing makes X hat easy, but W hat's maximum grows to about 4.5. Panel c moves the dominant part into a sixteen-bit rank thirty-two branch, leaving a residual with a maximum near 0.05, the intuition behind equations five to eight.

(a) |X|0510activation group(b) |W|012weight group(c) |X̂| = |X·diag(λ)⁻¹|00.51activation group(d) |Ŵ| = |W·diag(λ)|01020weight group(e) |R| = |Ŵ − L₁L₂|012weight groupOriginalAfter smoothingAfter SVDmax99th percentile50th percentile
Fig. 4Real PixArt-Σ layer: outliers move from X to Ŵ, then vanish in R. Per-group magnitude (max / 99th / 50th percentile) along the group index. Note the y-axis ranges: |X| up to 10 → |X̂| up to 1 after smoothing, but |W| up to 2 → |Ŵ| up to 20 with more outlier spikes. After subtracting the rank-r SVD part, the residual |R| is back to ≤2 with no spikes. Shape redrawn; axis ranges from the paper.
Guide

The same story on a real PixArt Sigma layer, plotting per-group magnitude as the max, ninety-ninth and fiftieth percentile. Watch the vertical scales: activations drop from up to ten to up to one after smoothing, while weights jump from up to two to up to twenty with more spikes. After subtracting the low-rank part, the residual R is back under two with no spikes. Shapes are redrawn; axis ranges come from the paper.

1030100400016324864singular value indexσᵢ (log)extremely high σgradual tailr = 32WŴR
Fig. 5Smoothing makes Ŵ even more low-rank: a few huge singular values, then a flat tail. First 64 singular values (log scale) of the original W, smoothed Ŵ and residual R. Ŵ's first ~32 values drop steeply from several hundred, so a rank-32 branch captures most of ‖Ŵ‖F; what is left (R) has a small, flat spectrum. W itself is already imbalanced but much smaller. Shape redrawn from the plot.
Guide

Smoothing makes the weight even more low-rank. The plot shows the first sixty-four singular values on a log scale for the original weight, the smoothed weight and the residual; the smoothed weight starts at several hundred and falls steeply over the first thirty-two, then flattens. A rank thirty-two branch therefore captures most of its energy, leaving a small, flat residual spectrum. This supports equation fifteen and the choice of rank thirty-two; the shape is redrawn.

0100200300400500Latency (µs)287150461 µsNaïve22300322 µsNunchaku7171.43×Down proj.Up proj.4-bit computeQuantize(a) Latency breakdown, QKV projectionFused kernel 1Fused kernel 2X̂Down proj.L₁ (16-bit)QuantizeUp proj.L₂ (16-bit)4-bit computeQ_R, s_RX̂L₁Q_X̂, s_X̂⊕X̂L₁L₂shared inputshared output(b) Nunchaku kernel fusion
Fig. 6A separate low-rank branch costs +43%; fusing it into the 4-bit kernels makes it almost free. (a) Rank-32 branch run naïvely on the QKV projection: down-projection (17 µs) and especially up-projection (150 µs) add ~57% over the 4-bit path (7 + 287 µs) because they re-read the 16-bit input and write a 16-bit output that exceeds L2 cache; total 461 vs 322 µs with Nunchaku (1.43×). (b) Nunchaku fuses Down-proj with Quantize (same input X̂) and Up-proj with the 4-bit GEMM (same output), halving kernel launches and removing the extra DRAM traffic. (Fig. 6 is printed before Fig. 5 in the paper.)
Guide

The low-rank branch is cheap in arithmetic but costly in memory traffic unless fused. Panel a breaks down one QKV projection: run naively, the two projections add about fifty-seven percent, four hundred sixty-one versus three hundred twenty-two microseconds, by re-reading the sixteen-bit input and writing a large output. Panel b shows Nunchaku fusing the down projection with quantization and the up projection with the four-bit GEMM. OpenVINO cannot fuse these, so the naive bar is realistic there.

(a) FLUX.1-devBF16IR 0.953NF4 W4A16IR 0.910Our INT W4A4IR 0.935Our NVFP W4A4IR 0.937AI TOKENneon coinreferencecoin okglow differs≈ BF16≈ BF16kelp-forestwomanreferencepose shifts≈ BF16≈ BF16(b) FLUX.1-schnellBF16IR 0.968NF4 W4A16IR 0.943Our INT W4A4IR 0.951Our NVFP W4A4IR 0.968boho patioswing chairreferenceswing chairmissingchair keptchair keptwoman plantingtomatoesreferenceclose≈ BF16≈ BF16(c) PixArt-ΣFP16IR 0.944ViDiT-Q INT W4A8IR 0.573Our INT W4A4IR 0.878Our NVFP W4A4IR 0.940orphan boywizardreferencescene changeddarkerclose≈ FP16hummingbird& flowerreferencerestyledartifactsclose≈ FP16(d) SDXL-TurboFP16IR 0.845MixDQ INT W4A8IR 0.708Our INT W4A4IR 0.816Our NVFP W4A4IR 0.832underwaterportraitreferencedetails alteredcloseclosecyberpunk citydrone shotreferenceblurred, shiftedcloseclose
Fig. 7Across four models, SVDQuant W4A4 beats W4A16 / W4A8 baselines visually. Schematic of the MJHQ gallery (IR = ImageReward over the whole set). On FLUX.1, 4-bit SVDQuant stays closer to the 16-bit image than NF4 weight-only; e.g. NF4 drops the swinging chair in the schnell patio prompt. On PixArt-Σ and SDXL-Turbo, W4A4 SVDQuant is clearly better than ViDiT-Q's and MixDQ's W4A8 results, which change the scene.
Guide

Across four models, four-bit SVDQuant stays closer to the sixteen-bit images than the baselines. Each row is a model and each column a method, labelled with ImageReward, a learned human-preference score where higher is better. On FLUX.1, NF4 weight-only drifts, for example dropping the swing chair, while on PixArt Sigma and SDXL-Turbo even the W4A8 baselines ViDiT-Q and MixDQ change the scene. SVDQuant W4A4 keeps the content, illustrating Table 1.

(a) Model size (GiB)06121824BF1622.2NF45.83.8×INT4/NVFP46.13.6×(b) DiT memory (GiB)07142128BF1624.4NF49.82.5×INT4/NVFP46.93.5×(c) Step, desktop 4090 (ms)0175350525700BF16657NF4660INT42183.0×(d) Step, laptop 4090 (ms)010002000300040005000BF164382NF413203.3×INT443310.1×(e) Step, desktop 5090 (ms)0150300450600BF16484NF4496NVFP41623.1×BF16NF4 (W4A16)SVDQuant INT4 / NVFP4 (W4A4)
Fig. 83.6× smaller, 3× faster than NF4, 10.1× faster than offloaded BF16 on a laptop. 12B FLUX.1: model size 22.2 → 6.1 GiB (incl. 0.3 GiB low-rank branch); DiT inference memory 24.4 → 6.9 GiB. Single-step latency: NF4 weight-only is no faster than BF16 on a desktop 4090 (660 vs 657 ms) because the layer is compute-bound; W4A4 INT4 is 218 ms. On the 16 GB laptop 4090, BF16 needs CPU offloading (4382 ms) while INT4 fits (433 ms, 10.1×). NVFP4 on RTX 5090: 162 ms (3.1×). Parenthesised factors are the paper's (vs BF16 for size/memory/laptop, vs NF4 otherwise).
Guide

The efficiency payoff on FLUX.1: model size falls from 22.2 to 6.1 gibibytes, including 0.3 for the low-rank branches. On a desktop 4090, NF4 weight-only is no faster than BF16, 660 versus 657 milliseconds per step, while W4A4 INT4 takes 218. On a sixteen gigabyte laptop BF16 must offload, so INT4 is 10.1 times faster, and NVFP4 on an RTX 5090 is 3.1 times faster than NF4. The thesis box explains why this speed-up does not transfer to OpenVINO.

RealismGhibsky IllustrationAnimeChildren SketchYarn ArtFLUX.1-devBF16armored beardedman, swordfishermanvillage lakegirl withsheep hornssquirrel readingunder oakpanda in snowOur INT4≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16
Fig. 9Off-the-shelf LoRAs plug into the 4-bit model without re-quantization. Five community style LoRAs applied to FLUX.1-dev BF16 (top) and SVDQuant INT4 (bottom): same style and content. The LoRA runs as an extra low-rank branch; in practice it is concatenated with SVDQuant's own low-rank branch by slightly increasing r. Prompts in App. F.
Guide

Community LoRAs work on the four-bit model without re-quantizing. The top row is FLUX.1-dev BF16 with five style LoRAs, the bottom row SVDQuant INT4 with the same LoRAs, and the images match in style and content. Because SVDQuant already runs a sixteen-bit low-rank branch, a LoRA can simply be concatenated into it by increasing the rank slightly. That keeps runtime LoRA adapters usable after quantization.

PixArt-Σ FP16IR 0.931SVD onlyIR −2.18Naïve quant.IR −1.12SmoothingIR 0.508LoRCIR −0.965Ours w/o smoothIR 0.690OursIR 0.878beach stockimagereferenceall blackcolour noisegrainy noisecolour noisesand/textureshift≈ FP16angry crabsaladreferenceall blackheavy noisenoisyheavy noisesalad changed≈ FP16-2-101ImageReward0.931FP16−2.18SVD only−1.12Naïve0.508Smoothing−0.965LoRC0.69w/o smooth0.878Ours
Fig. 10Ablation: every ingredient is needed; only full SVDQuant is close to FP16. PixArt-Σ W4A4, rank 64, IR over 1K MJHQ samples. SVD-only (drop the residual) gives black images; naïve 4-bit and LoRC (low-rank compensation of the quantization error) give noise, because the error has a spread-out spectrum. Smoothing alone helps a little (0.508); SVD without smoothing reaches 0.690; smoothing + SVD reaches 0.878 vs 0.931 for FP16.
Guide

Every ingredient is needed. Each column is one variant on PixArt Sigma at W4A4, rank sixty-four, scored by ImageReward: SVD alone gives black images, while naive quantization and LoRC, which fits a low-rank fix to the quantization error, give noise because that error has a flat spectrum. Smoothing alone reaches 0.508, SVD without smoothing 0.690, and the full method 0.878 against 0.931 for FP16. So decompose first and quantize the residual, not the other way round.

BF16IR 0.953Our INT W8A8IR 0.948NF4 W4A16IR 0.910Our INT W4A4IR 0.935Our NVFP W4A4IR 0.937END neon signreference≈ BF16layout shiftsclose≈ BF16Italian man's facereference≈ BF16closeclose≈ BF16RNN scientist labreference≈ BF16screens changeclose≈ BF16Eiffel tower on moonreference≈ BF16closeclose≈ BF16
Fig. 11FLUX.1-dev: W8A8 is indistinguishable; W4A4 stays closer than NF4. Appendix gallery (4 MJHQ prompts). INT W8A8 ≈ BF16 everywhere. NF4 W4A16 changes layouts (the neon building, the lab screens); INT/NVFP W4A4 keep composition with minor detail drift.
Guide

This appendix gallery for FLUX.1-dev backs up Table 1 with four more prompts. Columns are BF16, SVDQuant INT W8A8, NF4 W4A16, and SVDQuant INT and NVFP W4A4, each with its ImageReward. Eight-bit SVDQuant is indistinguishable from BF16. NF4 shifts layouts, for example the neon building and the lab screens, while both four-bit SVDQuant variants keep the composition with only small detail drift.

BF16IR 0.968Our INT W8A8IR 0.966NF4 W4A16IR 0.943Our INT W4A4IR 0.951Our NVFP W4A4IR 0.968cyberpunk lionreference≈ BF16closecloseclosecat on hammockreference≈ BF16cat reframedcloseroof addedBeethoven keyboardreference≈ BF16lighting shiftclosecloseFLORIDA lettersreference≈ BF16letters differcloseclose
Fig. 12FLUX.1-schnell (4 steps): same picture as dev. W8A8 ≈ BF16; NF4 reframes the hammock cat and alters the FLORIDA letters; SVDQuant 4-bit keeps content (NVFP4 adds a roof edge over the cat).
Guide

The same comparison for FLUX.1-schnell, the four-step distilled model, with the same pattern as the dev model. W8A8 matches BF16. NF4 reframes the hammock cat and alters the FLORIDA letters, while SVDQuant four-bit keeps the content; the NVFP4 image only adds a roof edge above the cat. So few-step models do not break the method.

FP16IR 0.944ViDiT-Q W8A8IR 0.944Our INT W8A8IR 0.955ViDiT-Q W4A8IR 0.573Our INT W4A4IR 0.878Our NVFP W4A4IR 0.9401950s burgerreferencerestyled≈ FP16broken layoutclose≈ FP16wildlife lionreferencedifferent lion≈ FP16dark, noisyclose≈ FP16Lake Powellsunrisereferenceshifted≈ FP16colour shiftclose≈ FP16Earth 350 Myragoreferenceshifted≈ FP16texture collapseclose≈ FP16
Fig. 13PixArt-Σ: ViDiT-Q W4A8 breaks; SVDQuant W4A4 holds. Even ViDiT-Q's W8A8 changes the scenes (different lion, burger), while our W8A8 ≈ FP16. ViDiT-Q W4A8 gives broken layouts, dark noisy textures and collapsed Earth; our INT4 is close and NVFP4 ≈ FP16.
Guide

On PixArt Sigma, the prior diffusion quantizer ViDiT-Q breaks at W4A8, while SVDQuant holds at W4A4. Even ViDiT-Q's eight-bit results restyle the scenes, while SVDQuant W8A8 matches FP16. At four-bit weights, ViDiT-Q gives broken layouts and collapsed textures with an ImageReward of 0.573, while SVDQuant INT4 scores 0.878 and NVFP4 0.940. SVDQuant quantizes activations harder yet ends up better.

SDXL FP16IR 0.729TensorRT W8A8IR 0.591Our W8A8IR 0.718Our INT W4A4IR 0.601Our NVFP W4A4IR 0.640pancakesreferencelayout changed≈ FP16minor changescloselady in rainreferenceblurred≈ FP16minor changesclosenegroni cocktailreferenceclose≈ FP16minor changescloseheadshot with hatreferenceclose≈ FP16minor changesclose
Fig. 14SDXL (UNet, 30 steps): our W8A8 beats TensorRT W8A8; 4-bit shows minor drift. TensorRT W8A8 changes the pancake layout and blurs; our W8A8 ≈ FP16; INT4/NVFP4 keep subjects with small changes.
Guide

SDXL is a UNet, not a transformer, so this checks that the method works beyond DiTs. NVIDIA's TensorRT W8A8 changes the pancake layout and blurs the rainy scene, with an ImageReward of 0.591, while SVDQuant W8A8 reaches 0.718 against 0.729 for FP16. The four-bit versions keep the subjects with small changes. Four-bit is visibly harder on this model than on FLUX.

FP16IR 0.845MixDQ W8A8IR 0.834Our INT W8A8IR 0.845MixDQ W4A8IR 0.708Our INT W4A4IR 0.816Our NVFP W4A4IR 0.832coal minerreferenceclose≈ FP16face changedclosecloseBarcelona summitreferenceclose≈ FP16text artifactscloseclosecat with popcornreferenceclose≈ FP16cat alteredcloseclosewhite tiger in snowreferenceclose≈ FP16closecloseclose
Fig. 15SDXL-Turbo (4 steps): MixDQ W4A8 alters content; SVDQuant W4A4 doesn't. MixDQ W8A8 is close; MixDQ W4A8 changes the miner's face, adds text artifacts to the Barcelona scene and alters the cat. Our INT/NVFP W4A4 stay close.
Guide

On SDXL-Turbo, a four-step model, MixDQ W4A8 alters content: the miner's face, text artifacts in the Barcelona scene, the cat. SVDQuant W4A4 stays close, with an ImageReward of 0.816 for INT4 and 0.832 for NVFP4 against 0.845 for FP16. Both methods are fine at eight bits; the gap opens at four.

(a) Realism LoRAprompt 1prompt 2prompt 3prompt 4prompt 5prompt 6BF16agent w/ gunman in suitknight, castleknight vs dragonwizard lightningwoman on peakOur INT4≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16(b) Ghibsky LoRABF16cat at windowtwilight gardenmountain lakeglowing forestbeach towncozy roomOur INT4≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16(c) Anime LoRABF16dog wizard hatgirl & starsfish in pondgiraffe scarfbird on branchflower crownOur INT4≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16(d) Children Sketch LoRABF16butterfly gardensandcastleshot-air balloonmeadow girlpirate boyboat on lakeOur INT4≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16(e) Yarn Art LoRABF16hot-air ballooncat & butterflysquirrel acornswizard spelljellyfishsea turtleOur INT4≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16≈ BF16
Fig. 1630 more LoRA samples: INT4 matches BF16 for every style. Six prompts per LoRA (listed in App. F); top row of each pair is FLUX.1-dev BF16 with the LoRA, bottom row SVDQuant INT4 with the same LoRA. No visible difference in style or content.
Guide

This extends Figure 9 to thirty samples: six prompts for each of five LoRAs, with BF16 on the top row of each pair and SVDQuant INT4 below. No visible difference appears in style or content. The point is robustness: LoRA compatibility is not a lucky pick of prompts.

FLUX.1-dev BF16INT4LPIPS 0.322INT4 + SVDQuantLPIPS 0.223NVFP4LPIPS 0.244NVFP4 + SVDQuantLPIPS 0.208fairy-taleflea stylistreferencedifferentcreatureclosecreaturechanged≈ BF16skin-oil bottle& nutsreferencewoman replacesbottleclosebottle altered≈ BF16PixArt-Σ BF16INT4LPIPS 0.762INT4 + SVDQuantLPIPS 0.323NVFP4LPIPS 0.517NVFP4 + SVDQuantLPIPS 0.271cyanobacteriaoceanreferencenoise collapseclosewashed out≈ BF16SANA-1.6B BF16INT4LPIPS 0.339INT4 + SVDQuantLPIPS 0.220NVFP4LPIPS 0.237NVFP4 + SVDQuantLPIPS 0.1772D game-artportraitreferenceminor driftcloseclose≈ BF16
Fig. 17Low-rank branch helps both INT4 and NVFP4; NVFP4 + SVDQuant is best. Plain INT4 (per-group RTN) can change the subject entirely (FLUX) or collapse into noise (PixArt-Σ); NVFP4's smaller groups (16, FP8 scales) help but still drift. Adding SVDQuant fixes both; NVFP4 + SVDQuant has the lowest LPIPS for every model.
Guide

The low-rank branch helps both four-bit formats. Columns compare plain INT4, INT4 with SVDQuant, plain NVFP4 and NVFP4 with SVDQuant, each with LPIPS against the sixteen-bit image. Plain INT4 can swap the subject on FLUX or collapse PixArt into noise, and NVFP4's smaller groups help but still drift. Adding SVDQuant fixes both, and NVFP4 plus SVDQuant has the lowest LPIPS on every model, for example 0.208 on FLUX.1-dev.

PixArt-Σ FP16Rank 16IR 0.787Rank 32IR 0.829Rank 64IR 0.859smiling medicreferenceclosedetails differcloserclosestModel size overhead0%3%6%9%12%r=162.8%r=325.6%r=6411.3%Latency overhead0%2.5%5%7.5%10%r=163.3%r=325.2%r=648.8%
Fig. 18Higher rank = better image, more overhead; r = 32 is the chosen compromise. PixArt-Σ: ImageReward rises 0.787 → 0.829 → 0.859 for r = 16/32/64, while the low-rank branch adds 2.8/5.6/11.3% model size and 3.3/5.2/8.8% latency.
Guide

Rank trades quality for overhead. On PixArt Sigma, ImageReward rises from 0.787 to 0.829 to 0.859 as the rank goes from sixteen to thirty-two to sixty-four, while the branch adds 2.8, 5.6 and 11.3 percent to model size and 3.3, 5.2 and 8.8 percent to latency. Rank thirty-two is the paper's compromise. On OpenVINO without fusion, latency overhead will likely be higher, so the rank is worth sweeping.

0.00.20.40.60.81.0345678bit-width (W = A)(a) PixArt-ΣLPIPS ↓0.00.20.40.60.8345678bit-width (W = A)(b) FLUX.1-schnellLPIPS ↓NaiveSmoothQuantSVDQuant
Fig. 19SVDQuant 4-bit ≈ naïve 7-bit (PixArt-Σ) / 6-bit (FLUX.1-schnell). LPIPS vs equal W/A bit-width (per-channel above 4 bits, per-group g = 64 at ≤4 bits). SVDQuant is lowest at every bit-width and still produces images at 3 bits; at 2 bits (ternary) nothing works without QAT. Points read from the plot (values approximate); note the non-monotone bump at 5 bits for the baselines, which switch from per-group to per-channel there.
Guide

SVDQuant at four bits matches naive quantization at seven bits on PixArt Sigma and six bits on FLUX.1-schnell. The horizontal axis is the shared weight and activation bit-width, the vertical axis LPIPS, lower is better, for naive, SmoothQuant and SVDQuant. SVDQuant is lowest everywhere and still makes images at three bits, though nothing works at two bits without training. Values are read from the plot; the baselines' bump at five bits comes from switching to per-channel scales.

§7Results

FLUX.1-dev LPIPS ↓ (MJHQ)00.30.60.9NF4W4A160.272Ours INTW4A40.223Ours NVFPW4A40.208PixArt-Σ LPIPS ↓ (MJHQ)00.30.60.9ViDiT-QW4A80.611ViDiT-QW4A40.854Ours INTW4A40.323Ours NVFPW4A40.271
Headline quality. On FLUX.1-dev both 4-bit variants beat NF4 weight-only (which is not even faster). On PixArt-Σ, prior W4A4 (ViDiT-Q) collapses (LPIPS 0.854, FID 412), while SVDQuant W4A4 beats ViDiT-Q's W4A8.
Guide

Lower LPIPS means closer to the full-precision image. On FLUX dev, both four bit SVDQuant variants beat NF4 weight-only quantization, which is not faster anyway. On PixArt Sigma the contrast is sharper: ViDiT-Q at W4A4 collapses to an LPIPS of 0.854, while SVDQuant at W4A4 reaches 0.323, better even than ViDiT-Q at W4A8.

FLUX.1-dev INT4 PSNR ↑ (Table 3)05101520plain18.5+GPTQ19.1+low-rank20.1+both21.0FLUX step latency, 4090 (ms, Table 4)0175350525700BF16657INT8282naïveINT4212SVDQunfused250SVDQ +Nunchaku218
Ablation and cost. Low-rank branch gives the biggest gain, GPTQ adds more (Table 3). Unfused, the branch costs +18% (250 vs 212 ms); Nunchaku brings it to 218 ms (Table 4).
Guide

The left chart is the ablation from Table 3: the low-rank branch gives the biggest gain in PSNR, and GPTQ adds a little more on top. The right chart is the cost from Table 4. Run naively, the extra branch adds about eighteen percent to step time, 250 against 212 milliseconds. The fused Nunchaku kernels cut that to 218. For the thesis, expect the unfused cost, since OpenVINO has no such fused kernel.

Table 1 — Quality vs 16-bit model (MJHQ and sDCI, 5K prompts). IR = ImageReward; similarity metrics are vs the 16-bit output. Best per model within the 8-bit and within the 4-bit group highlighted.
MJHQsDCI
Model (steps)PrecisionMethodFID ↓IR ↑LPIPS ↓PSNR ↑FID ↓IR ↑LPIPS ↓PSNR ↑
FLUX.1-dev (50)BF16–20.30.953––24.81.02––
FLUX.1-dev (50)INT W8A8Ours20.40.9480.08927.024.71.020.10624.9
FLUX.1-dev (50)W4A16NF420.60.9100.27219.524.90.9860.29218.2
FLUX.1-dev (50)INT W4A4Ours19.90.9350.22321.024.21.010.24019.7
FLUX.1-dev (50)NVFP W4A4Ours20.40.9370.20821.424.71.010.21820.2
FLUX.1-schnell (4)BF16–19.20.938––20.80.932––
FLUX.1-schnell (4)INT W8A8Ours19.20.9660.12022.920.70.9750.13321.3
FLUX.1-schnell (4)W4A16NF418.90.9430.25718.220.70.9530.26317.1
FLUX.1-schnell (4)INT W4A4Ours18.30.9510.25818.320.10.9790.26017.2
FLUX.1-schnell (4)NVFP W4A4Ours19.00.9680.22719.020.50.9790.22618.1
PixArt-Σ (20)FP16–16.60.944––24.80.966––
PixArt-Σ (20)INT W8A8ViDiT-Q15.70.9440.13722.523.50.9740.16320.4
PixArt-Σ (20)INT W8A8Ours16.30.9550.10923.724.20.9690.12921.8
PixArt-Σ (20)INT W4A8ViDiT-Q37.30.5730.61112.040.60.6000.62911.2
PixArt-Σ (20)INT W4A4ViDiT-Q412−2.270.8546.44425−2.280.8386.70
PixArt-Σ (20)INT W4A4Ours19.20.8780.32317.625.90.9180.35216.5
PixArt-Σ (20)NVFP W4A4Ours16.60.9400.27118.522.90.9710.29817.2
SANA-1.6B (20)BF16–20.60.952––29.90.847––
SANA-1.6B (20)INT W4A4RTN20.50.8940.33915.328.60.8070.37113.8
SANA-1.6B (20)INT W4A4Ours19.30.9350.22017.828.10.8460.24216.2
SANA-1.6B (20)NVFP W4A4RTN19.70.9320.23717.329.00.8290.26515.6
SANA-1.6B (20)NVFP W4A4Ours20.00.9550.17719.029.30.8460.19617.3
SDXL-Turbo (4)FP16–24.30.845––24.70.705––
SDXL-Turbo (4)INT W8A8MixDQ24.10.8340.14721.725.00.6900.15721.6
SDXL-Turbo (4)INT W8A8Ours24.30.8450.10024.024.80.7010.11023.7
SDXL-Turbo (4)INT W4A8MixDQ27.70.7080.40215.725.90.6100.41515.7
SDXL-Turbo (4)INT W4A4MixDQ353−2.260.68511.0373−2.280.68611.3
SDXL-Turbo (4)INT W4A4Ours24.60.8160.26218.126.00.6710.27218.0
SDXL-Turbo (4)NVFP W4A4Ours24.40.8320.23118.925.20.6880.23818.9
SDXL (30)FP16–16.60.729––22.50.573––
SDXL (30)INT W8A8TensorRT20.20.5910.24722.025.40.4530.26521.7
SDXL (30)INT W8A8Ours16.60.7180.11926.422.40.5740.12925.9
SDXL (30)INT W4A4Ours20.60.6010.28821.026.20.4770.30720.7
SDXL (30)NVFP W4A4Ours18.30.6400.25021.823.90.5020.26121.7
Guide

The main quality table: rows are models and precisions, columns are FID and ImageReward for image quality and LPIPS and PSNR for closeness to the sixteen-bit output, on the MJHQ and sDCI prompt sets. Eight-bit SVDQuant is essentially lossless, with a PSNR of 27.0 on FLUX.1-dev. At four bits it beats NF4 on FLUX, an LPIPS of 0.223 versus 0.272, while the W4A4 baselines ViDiT-Q and MixDQ collapse to FIDs above 350. NVFP4 is consistently a little better than INT4.

Table 2 (App. E.1) — Extra metrics: CLIP-IQA (C.IQA), CLIP Score (C.SCR), SSIM vs 16-bit output.
MJHQsDCI
ModelPrecisionMethodC.IQA ↑C.SCR ↑SSIM ↑C.IQA ↑C.SCR ↑SSIM ↑
FLUX.1-devBF16–0.95226.0–0.95525.4–
FLUX.1-devINT W8A8Ours0.95326.00.7480.95525.40.697
FLUX.1-devW4A16NF40.94725.80.7480.95125.40.697
FLUX.1-devINT W4A4Ours0.95025.80.7970.95125.30.751
FLUX.1-devNVFP W4A4Ours0.95225.80.8080.95525.40.768
FLUX.1-schnellBF16–0.93826.6–0.93226.2–
FLUX.1-schnellINT W8A8Ours0.93826.60.8440.93226.20.811
FLUX.1-schnellW4A16NF40.94126.60.7130.93326.20.674
FLUX.1-schnellINT W4A4Ours0.93726.50.7200.93226.20.681
FLUX.1-schnellNVFP W4A4Ours0.93926.60.7450.93226.10.712
PixArt-ΣFP16–0.94426.8–0.96626.1–
PixArt-ΣINT W8A8ViDiT-Q0.94826.70.8150.96626.10.756
PixArt-ΣINT W8A8Ours0.94726.80.8490.96726.00.800
PixArt-ΣINT W4A8ViDiT-Q0.91225.70.3560.91725.40.295
PixArt-ΣINT W4A4ViDiT-Q0.18513.30.0770.17613.30.080
PixArt-ΣINT W4A4Ours0.92626.60.6550.94826.10.577
PixArt-ΣNVFP W4A4Ours0.93826.70.6920.95626.10.618
SANA-1.6BBF16–0.93426.8–0.95826.4–
SANA-1.6BINT W4A4RTN0.91526.90.6040.94326.40.538
SANA-1.6BINT W4A4Ours0.92626.90.7100.95126.40.649
SANA-1.6BNVFP W4A4RTN0.92926.80.6940.95326.40.626
SANA-1.6BNVFP W4A4Ours0.93226.90.7550.95526.40.701
SDXL-TurboFP16–0.92626.5–0.91326.5–
SDXL-TurboINT W8A8MixDQ0.92226.50.7630.90726.50.750
SDXL-TurboINT W8A8Ours0.92526.50.8210.91226.50.808
SDXL-TurboINT W4A8MixDQ0.89325.90.5120.89526.10.493
SDXL-TurboINT W4A4MixDQ0.55613.10.2890.54811.90.296
SDXL-TurboINT W4A4Ours0.91526.50.6310.89426.80.614
SDXL-TurboFP W4A4Ours0.91926.50.6630.90226.60.649
SDXLFP16–0.90727.2–0.91126.5–
SDXLINT W8A8TensorRT0.90526.70.7330.90126.10.697
SDXLINT W8A8Ours0.91227.00.8430.91026.30.814
SDXLINT W4A4Ours0.87826.70.7170.86226.20.672
SDXLNVFP W4A4Ours0.89226.80.7390.87726.40.701
Guide

This appendix table adds three more metrics: CLIP-IQA for image quality, CLIP Score for text alignment, and SSIM for structural similarity to the sixteen-bit image. The quality and alignment scores barely move for SVDQuant, even at four bits, while the W4A4 baselines crash, for example CLIP Score falling to about thirteen. SSIM shows the same ranking as LPIPS, so the conclusions of Table 1 do not depend on the metric.

Table 3 (App. E.3) — Ablation on MJHQ: low-rank branch and GPTQ (for the residual), INT4 vs NVFP4. Best within each precision group highlighted.
ModelPrecisionLow-rank branchGPTQIR ↑LPIPS ↓PSNR ↑
FLUX.1-devBF16––0.953––
FLUX.1-devINT4✗✗0.9080.32218.5
FLUX.1-devINT4✗✓0.9330.29719.1
FLUX.1-devINT4✓✗0.9260.25620.1
FLUX.1-devINT4✓✓0.9350.22321.0
FLUX.1-devNVFP4✗✗0.9280.24420.3
FLUX.1-devNVFP4✗✓0.9360.20421.5
FLUX.1-devNVFP4✓✗0.9350.22320.9
FLUX.1-devNVFP4✓✓0.9370.20821.4
FLUX.1-schnellBF16––0.968––
FLUX.1-schnellINT4✗✗0.9620.34516.3
FLUX.1-schnellINT4✗✓0.9620.31716.8
FLUX.1-schnellINT4✓✗0.9570.28917.6
FLUX.1-schnellINT4✓✓0.9510.25818.3
FLUX.1-schnellNVFP4✗✗0.9570.28017.5
FLUX.1-schnellNVFP4✗✓0.9560.24718.5
FLUX.1-schnellNVFP4✓✗0.9680.24718.4
FLUX.1-schnellNVFP4✓✓0.9680.22719.0
PixArt-ΣBF16––0.944––
PixArt-ΣINT4✗✗−1.2260.7629.1
PixArt-ΣINT4✗✓−0.9020.7639.9
PixArt-ΣINT4✓✗0.8580.35617.0
PixArt-ΣINT4✓✓0.8780.32317.6
PixArt-ΣNVFP4✗✗0.6600.51714.8
PixArt-ΣNVFP4✗✓0.6960.48015.6
PixArt-ΣNVFP4✓✗0.9450.29018.0
PixArt-ΣNVFP4✓✓0.9400.27118.5
SANA-1.6BBF16––0.952––
SANA-1.6BINT4✗✗0.8940.33915.3
SANA-1.6BINT4✗✓0.8810.28816.4
SANA-1.6BINT4✓✗0.9220.23417.4
SANA-1.6BINT4✓✓0.9350.22017.8
SANA-1.6BNVFP4✗✗0.9320.23717.3
SANA-1.6BNVFP4✗✓0.9270.20218.3
SANA-1.6BNVFP4✓✗0.9570.18818.7
SANA-1.6BNVFP4✓✓0.9550.17719.0
Guide

The ablation isolates the two tools applied to the residual, the low-rank branch and GPTQ, with four on-off rows per model and format. The low-rank branch is the bigger win, especially on PixArt Sigma INT4, where ImageReward jumps from about minus 1.2 to 0.858. GPTQ adds a smaller gain, and the combination gives the best LPIPS in most groups, though NVFP4 with GPTQ alone edges it on FLUX.1-dev. NNCF offers GPTQ, while the low-rank split would be done by hand.

Table 4 (App. E.4) — Single-step FLUX latency on a desktop RTX 4090 (the text body says laptop; caption says desktop). Naïve INT4 is 1.3× faster than INT8; an unfused low-rank branch adds 18%; Nunchaku brings it back to ≈ naïve INT4.
MethodBF16INT8Naïve INT4SVDQuantSVDQuant + Nunchaku
Latency (ms)657282212250218
Guide

Per-step FLUX latency on a desktop RTX 4090 shows what fusion buys: BF16 takes 657 milliseconds, INT8 282 and naive INT4 212. Adding the low-rank branch unfused raises it to 250, about eighteen percent more, and Nunchaku brings it back to 218. The text body says laptop while the caption says desktop. For the thesis, the unfused figure is the relevant warning, since OpenVINO runs the branch as separate MatMuls.

  • 8-bit SVDQuant is essentially lossless everywhere (PSNR > 21; 27.0 on FLUX.1-dev MJHQ) and beats ViDiT-Q, MixDQ and TensorRT W8A8.
  • NVFP4 beats INT4 thanks to smaller groups (16 vs 64); the gap is largest on the small PixArt-Σ (600M).
  • Memory: 12B FLUX.1 22.2 → 6.1 GiB incl. 0.3 GiB for the low-rank branches.

§8Why it matters for this thesis

SVDQuant layer as a plain OpenVINO IR subgraph (no custom op)Xf16/f32Multiplyconst 1/λMatMulL₁ const f16MatMulL₂ const f16(FakeQuantize ordyn. int8 A)MatMulR: u4/i4 + scalesAddYExpressible: yes2 extra small MatMuls+ 1 Add per layerNot available:W4A4 GEMMNunchaku-style fusion→ extra read of X̂ andwrite of Y per layer4-bit branch: weight-compressed MatMul
Graph-level view. The SVDQuant forward pass needs only standard ops (Multiply, MatMul, Add), so it fits in an OpenVINO IR. What OpenVINO does not provide is the W4A4 GEMM or Nunchaku's fused kernels, so the low-rank branch runs as two separate small MatMuls.
Guide

This is how one SVDQuant layer would look inside an OpenVINO model. Every piece is a standard operation: a Multiply by one over lambda, two small MatMuls for the low-rank branch, a compressed four bit MatMul for the residual, and an Add. So the layer can be exported without custom ops. What is missing is a W4A4 matrix multiply and a fused kernel, so on Intel hardware the gain would be quality at four bit weights, not speed.

Takeaways for LTX-2.3 on OpenVINO / NNCF

  • Expressible, but unfused. The low-rank branch is just MatMul(X̂, L₁) → MatMul(·, L₂) in f16 plus an Add, next to an int4 weight-compressed MatMul on R. No custom op is needed, but each layer pays for an extra read of X̂ and write of Y. That is exactly the overhead the paper measured before fusion (+57% on one QKV layer, +18% end-to-end, Fig. 6a / Table 4). LTX video latents mean long token sequences, so benchmark this overhead on Arc/CPU instead of assuming 5–10%.
  • The W4A4 speed-up does not carry over. OpenVINO has no 4-bit activation GEMM. Int4 weights are weight-only (decompressed, or run with dynamic int8 activation quantization on CPU/GPU), and Arc XMX units accelerate int8, not int4. The realistic use of SVDQuant here is better quality for int4 weight-only or W8A8. The rank-32 branch soaks up weight outliers that plain int4 group-wise compression struggles with.
  • Close NNCF equivalents. nncf.compress_weights(..., lora_correction=True) adds a low-rank adapter that corrects the int4 error (LoRC-style: quantize first, then fix the error). The paper shows decomposing first works better (Fig. 10). NNCF's SmoothQuant (in nncf.quantize), AWQ, scale estimation and GPTQ cover the other ingredients. A clean thesis experiment: do the SVD split in PyTorch (smooth → SVD → keep L₁, L₂ in f16), compress only R with NNCF, export, and compare against NNCF int4 with and without lora_correction.
  • Calibration and adaLN. SVD itself needs no data, but the per-layer α search (and GPTQ) needs calibration prompts, i.e. a few LTX denoising trajectories. LTX-2.3 is a DiT with timestep-dependent adaLN, so the paper's argument against rotation applies directly. Also, 1/λ can only be folded offline when the producer op is a static Linear; after adaLN modulation it stays an explicit Multiply.
  • Overhead is small and LoRA-friendly. Rank 32 adds (m+n)·r f16 values per layer: for a 4096×4096 layer that is 1.6% of the parameters, or about 6% of its int4 bytes. Keeping the branch separate lets style/control LoRAs be concatenated into it without re-quantization (Fig. 9), which fits OpenVINO GenAI's runtime LoRA adapters.
Guide

Treat SVDQuant as a quality tool for int4 weight-only or W8A8 on OpenVINO, not a speed-up. The clean experiment is to smooth and split each layer in PyTorch, keep L one and L two in f16, compress only the residual with NNCF, and compare against NNCF int4 with and without lora correction. Calibrate on a few LTX denoising trajectories, and measure the unfused branch overhead on Arc and CPU instead of assuming five to ten percent.

Quantizing diffusion models

DVD-Quant: Data-free Video Diffusion Transformers Quantization

Zhiteng Li, Hanxuan Li, Junyi Wu, Kai Liu, Haotong Qin, Linghe Kong, Guihai Chen, Yulun Zhang, Xiaokang Yang (Shanghai Jiao Tong Univ., Zhejiang Univ., ETH Zürich) · ICLR 2026 · arXiv 2505.18663 (2025)

Post-training quantization of a video DiT with no calibration data at all. Weights get better INT4 grids from a closed-form search (BGR). Activations are rotated with a Hadamard matrix and scaled online at every step (ARQ). A cheap per-step signal then picks 4-bit or 8-bit activations for each denoising step (δ-GBS).

Calibration data
None
Bit-widths
W4A8 · W4A6 · W4A4
Model
HunyuanVideo, 50 steps
Speed-up (RTX 4090)
1.75× / 1.93× / 2.12×
Memory
3.68× smaller
W4A4 Imaging Q.
61.82 (BF16 64.78)
Reading guide

The question behind DVD-Quant is whether a video diffusion transformer can be quantized to four-bit weights and low-bit activations without any calibration data at all. The answer is yes, on HunyuanVideo with 50 steps: at W four A four, meaning four-bit weights and four-bit activations, it reaches an Imaging Quality of 61.82 against 64.78 for the full-precision model, runs 2.12 times faster on an RTX 4090, and uses 3.68 times less memory. It has three parts: a closed-form weight grid search called BGR, a rotation plus live scaling for activations called ARQ, and a per-step switch between four-bit and eight-bit activations called delta-GBS. The tab moves from the big picture to the two problems, then the method, every equation, every figure, the results tables, and a thesis box. It is the tenth of the sixteen papers, in the diffusion quantization group after SVDQuant and before QVGen.

§0Before reading

Following this paper takes three ideas: why most quantizers need calibration data, what a four-bit grid with a step size and zero-point is, and how a rotation can tame outliers. DVD-Quant is in the atlas because it quantizes a video diffusion transformer with no calibration data at all, and its weight method produces an ordinary INT4 grid that OpenVINO can already run.

Weights: fixed W same every step grid Δ, z offline, once no data needed Activations: move each step max calibrated scale, fixed live scale, per step clipped denoising step 1 … 50
PrimerWeights sit still; activations move. A quantizer needs a scale for every tensor. Weights are the same at every step, so their grid can be computed once from the weights themselves. Activations change with the prompt and the denoising step. The usual fix is calibration: run sample prompts, record ranges and freeze one scale (dashed line), which clips some steps and wastes levels at others. DVD-Quant instead measures the scale live at every step (indigo ticks). Bar heights are illustrative.
Guide

Every quantizer needs a scale for each tensor, and the two kinds of tensor behave very differently. Weights never change, so their grid can be computed once, offline, from the weights alone. On the right, the bars are activation ranges across the denoising steps. A single calibrated scale, the dashed line, clips the tall steps and wastes levels on the short ones. DVD-Quant measures a fresh scale at every step, which is why it needs no calibration data.

weights of one row rare rare clip clip MinMax: full range 0 15 Clipped: denser 0 15 Δ
PrimerA four-bit grid is 16 evenly spaced levels. Each weight is rounded to one of 16 levels, stored as the integers 0 to 15. The step size \(\Delta\) is the gap between levels and the zero-point \(z\) fixes where zero falls. Weights are bell-shaped, so stretching the grid to the rare extremes (MinMax) leaves the dense centre with few levels. Clipping the tails packs the same 16 levels where the weights are. BGR searches for the best clip, then refines \(\Delta\) and \(z\).
Guide

A four bit grid is just sixteen evenly spaced levels, stored as the integers zero to fifteen. The step size is the gap between levels and the zero-point says which level means zero. Weights are bell shaped, so the MinMax grid on top wastes levels on a few rare extremes. Clipping the tails, bottom row, packs the same sixteen levels where the weights really are. BGR, the paper's weight method, searches for the best clip and then refines the grid.

before after wide range narrow range 8 channels 8 channels × H H holds only +1 and −1 (XH)(HᵀW) = XWᵀ
PrimerA rotation spreads one spike over all channels. One huge activation forces a wide scale, so every small value is rounded coarsely. Multiplying the activations by a Hadamard matrix \(H\), and the weights by its transpose, leaves the layer output unchanged but shares the spike across all channels, so a narrow range suffices. ARQ uses this, then adds a live per-channel scale because rotation alone can raise whole bands of values. Numbers are illustrative.
Guide

One huge activation forces a wide range, and then every small value is rounded coarsely. Multiplying the activations by a Hadamard matrix, a grid of plus ones and minus ones, and the weights by its transpose, leaves the layer output exactly the same. But the spike is now shared across all eight channels, so a narrow range is enough. ARQ, the activation method, starts with this rotation and then adds a live scale per channel. The numbers here are illustrative.

before ViDiT-Q live per-token scales bits chosen by calibration SVDQuant 16-bit side branch W4A4 for images this paper DVD-Quant no calibration data BGR · ARQ · δ-GBS W4A4 for video next QVGen adds training to recover 4-bit video SmoothQuant baseline it beats TeaCache same change signal
PrimerWhere this paper sits. ViDiT-Q showed live per-token activation scales for video DiTs but still chose bit-widths with calibration; SVDQuant reached W4A4 on images with a 16-bit side branch. DVD-Quant drops calibration entirely and reaches W4A4 on video with plain low-bit kernels. SmoothQuant is one of the baselines it beats, and the step-change signal behind δ-GBS is the same kind TeaCache uses for caching. QVGen, next, asks what training can add.
Guide

This map places DVD-Quant in the atlas. ViDiT-Q already used live per-token scales for video but still chose bit-widths with calibration, and SVDQuant reached four bit weights and activations on images with a sixteen bit side branch. DVD-Quant removes calibration completely and reaches W four A four on video with plain low-bit kernels. SmoothQuant is one of its baselines, its bit switching uses the same kind of step-change signal as TeaCache, and QVGen, next, adds training.

Terms used in this paper

Post-training quantization (PTQ)
Shrinking a model that is already trained, by storing its numbers with fewer bits, without retraining it. DVD-Quant is a PTQ method.
Calibration data
A small set of example inputs run through the full-precision model to measure typical activation ranges. DVD-Quant uses none: it works from the weights and from the live activations only.
W4A4, W4A8, W4A6
W is the bit-width of the weights, A of the activations. W4A6 in this paper is not a fixed format: each step uses A4 or A8, averaging about six bits.
BF16
A 16-bit floating-point format used for the full-precision reference model. It is the quality every quantized result is compared against.
Step size and zero-point
The two numbers that define a grid: the step size \(\Delta\) is the gap between levels, and the integer zero-point \(z\) says which level stands for zero.
MinMax
The simplest way to set a grid: stretch it from the smallest to the largest value. It is the starting point that BGR improves.
Frobenius norm
The square root of the sum of all squared entries of a matrix. Here it measures the total gap between the original and the quantized weights.
Hadamard matrix
A square matrix of +1 and −1 entries (scaled) whose rows are all perpendicular. Multiplying by it is a rotation, and a fast transform makes it cheap to apply.
Online (dynamic) scaling
Measuring the scale from the tensor that is actually being quantized, at run time, instead of reading a number fixed in advance.
Massive vs channel-wise outliers
Massive outliers are a few single values far larger than all others. Channel-wise outliers are whole channels that run larger than the rest. ARQ rotates away the first and rescales the second.
HunyuanVideo
A large open text-to-video diffusion transformer from Tencent, and the main model tested here. The paper also reports Wan2.1 in its supplement.
RTX 4090
An NVIDIA consumer (gaming) GPU. All speed and memory numbers in the paper are measured on one of them, with custom low-bit kernels.
Tensor Core
The matrix-multiply units inside NVIDIA GPUs that give the speed-up for low-bit integer math. Intel Arc GPUs have a counterpart called XMX, but the paper's kernels do not run there.
VBench
A benchmark suite that scores generated videos on many dimensions. This paper reports eight, such as Imaging Quality, Aesthetic Quality and Motion Smoothness.
Guide

These are the terms the paper uses without explaining. The most important are calibration data, which DVD-Quant avoids, and the step size and zero-point, which define every grid it builds. Hadamard matrix and online scaling are the two halves of ARQ. The hardware and benchmark entries matter for reading the results: all speed numbers come from an NVIDIA RTX 4090 with custom Tensor Core kernels, and quality is measured with VBench.

§2Big picture

Usual video PTQ Calibration prompts ×50 timesteps Run FP16 model collect activation stats Static scales fixed for all steps W4A4 breaks scales wrong at other steps DVD-Quant (no data) FP weights W only input BGR (offline) INT4 grid search ARQ (runtime) Hadamard + online scale Activations X_t each step t W4 × A4/A8 GEMM per step δ-GBS picks A4/A8 ≈ BF16 video 2.12× faster (W4A4)
Replace the calibration pass by maths done on the weights and on the live activations. Top: static scales from a calibration set fail when activation ranges drift across the 50 steps. Bottom: every quantization parameter is computed from the weights (offline) or from the current activation (online).
Guide

The key move is to throw away the calibration pass. In the top row, usual video post-training quantization runs the model on calibration prompts over all 50 timesteps and freezes one set of scales, which breaks at W4A4 because activation ranges shift from step to step. In the bottom row, DVD-Quant derives weight grids offline from the weights alone and activation scales online from each step's live tensor, with delta-GBS choosing four or eight bits per step. The rest of the tab unpacks these three boxes.

Three parts: BGR for weights, ARQ for activations, δ-GBS for choosing activation bits per timestep. None needs a single calibration prompt.

§3The problem

min(W) max(W) 0.3% of weights wasted levels 16 INT4 levels, equal spacing too coarse at the dense centre
Weights are Gaussian-like. MinMax stretches the 16 levels to the extreme values, so few levels cover the dense centre where almost all weights live.
Guide

The first problem is on the weight side. Weights follow a bell-shaped distribution, but MinMax spreads its sixteen four-bit levels evenly from the smallest to the largest value. A tiny fraction of extreme weights, about 0.3 percent, pulls the range wide, so outer levels sit nearly empty while the dense centre gets too few levels. BGR, the first part of the method, fixes exactly this by clipping the tails and refining the grid.

denoising step t (0 → 49) max |activation| calibrated static scale clipped clipped levels unused levels unused
Activation scales drift with the timestep. Any single scale fixed from calibration data clips some steps and wastes resolution on others (shape illustrative).
Guide

The second problem is on the activation side. The curve is the largest activation magnitude across the 50 denoising steps, and the flat line is a single scale fixed from calibration. Wherever the curve rises above the line, values are clipped; wherever it falls below, quantization levels go unused. The shape is illustrative, but the point motivates ARQ, which recomputes scales at every step instead of trusting one static number.

  • Calibration for video DiTs is slow (50 steps × long token sequences) and still misses part of the range.
  • With 4-bit activations, existing PTQ collapses: VBench metrics fall 27.5%–61.3% (Tab. 1, Fig. 1).
  • Rotation alone (QuaRot-style) removes big spikes but can push many other values up (Fig. 4).
  • Denoising steps are not equally important, so one fixed bit-width for all steps wastes bits.

§4Method

A. Bounded-init Grid Refinement (weights, offline)

Outer: shrink bounds i = 1 … n clip W by i·δ each side MinMax init Δ⁽⁰⁾, z⁽⁰⁾ keep best error E* Inner: alternate, closed form Δ ← least sq. Eq. 4 z ← relax+clamp Eq. 5 W_q ← round Eq. 6 repeat until error gain < ε Δ*, z* per output row standard INT4
BGR = bound search × alternating least squares. For each clipping level, fix two of (Δ, z, Wq) and solve the third in closed form; keep the grid with the lowest Frobenius error. No gradients, no data, no runtime cost.
Guide

BGR is two nested loops. The outer loop tries progressively tighter clipping bounds on the weights, starting each try from a MinMax grid of the clipped values. The inner loop alternates three closed-form updates: the step size by least squares from equation 4, the zero-point from equation 5, and re-rounding the weights from equation 6, until the error stops improving. The grid with the lowest reconstruction error wins. It needs no gradients and no data, and the output is an ordinary INT4 grid with one scale and zero-point per output row.

Algorithm 1 Bounded-init Grid Refinement Input: W ∈ R^{n×m}, n ∈ N, ϵ ∈ R Output: Δ* ∈ R^n, z* ∈ Z^n 1: δ_l = δ_u = (max(W) − min(W)) / n 2: E* = ∞, Δ* = z* = 0 3: for i = 1, 2, ..., n do 4: W_c = clamp(W, min(W) + i·δ_l, max(W) − i·δ_u) 5: Δ^(0) = (max(W_c) − min(W_c)) / (2^b − 1), z^(0) = −⌊min(W_c) ⊘ Δ^(0)⌉ 6: W_q^(0) = clamp(⌊W ⊘ Δ^(0)⌉ + z^(0), 0, 2^b − 1) 7: E^(0) = ‖W − Δ^(0) ⊙ (W_q^(0) − z^(0))‖_F, j = 0 8: repeat 9: Δ^(j) = ⟨W_q^(j−1) − z^(j−1), W⟩_row ⊘ ⟨W_q^(j−1) − z^(j−1), W_q^(j−1) − z^(j−1)⟩_row 10: z^(j) = clamp(W̄_q^(j−1) − W̄ ⊘ Δ^(j), 0, 2^b − 1) 11: W_q^(j) = clamp(⌊W ⊘ Δ^(j)⌉ + z^(j), 0, 2^b − 1) 12: E^(j) = ‖W − Δ^(j) ⊙ (W_q^(j) − z^(j))‖_F, j = j + 1 13: until E^(j−1) − E^(j−2) < ϵ 14: if E^(j−1) < E* then 15: E* ← E^(j−1), Δ* ← Δ^(j−1), z* ← z^(j−1) 16: end if 17: end for 18: return Δ*, z*
Guide

Algorithm 1 is BGR written out. It first sets a shrink step equal to the weight range divided by n, then for each i from one to n clips i shrink steps off both tails and builds a MinMax grid on the clipped weights as a starting point. From there it repeats the least-squares step size, the zero-point update and re-rounding, measuring the Frobenius reconstruction error each time, and stops when the improvement falls below epsilon. Across all clipping levels it keeps the step size and zero-point with the smallest error. Everything runs offline on the weights only.

Note: the paper reuses n both as row count of W and as the number of bound-search steps; b is the weight bit-width (4).

B. Auto-scaling Rotated Quantization (activations, online)

X_t BF16 × H fast Hadamard s_j = max |x̃| online, per step Q(X̃Λ⁻¹) INT4 / INT8 low-bit GEMM Tensor Core kernel block-wise scales × Λ → Y dequantize Ŵ = BGR(WH) offline, INT4 spreads massive outliers evens channel outliers no calibration set
Rotate, then scale on the fly. Hadamard (applied to both X and W so XW⊤ is unchanged) spreads massive outliers; per-channel scales sj computed from the current activation fix the channels rotation made worse. The paper's kernels use a block-wise variant of Λ matched to Tensor Core GEMM tiles; all reported results use it.
Guide

ARQ handles activations in two moves. First, the activation X and the weight W are both multiplied by a Hadamard matrix H, which leaves the layer output unchanged but spreads a few massive outliers across all channels. Second, per-channel scales s j are taken from the current step's rotated activation, so channels that rotation made larger are evened out. The rotated weights are quantized offline with BGR. The paper's real kernels use block-wise scales that match Tensor Core tiles, and all reported results use that variant.

C. δ-Guided Bit Switching (per timestep)

Σ L1 δ 8 4 02549 denoising step · avg 6.0 bits
Spend 8 bits only when the output is changing. Accumulate the relative L1 change of the model output since the last reset; when it crosses δ, run that step at A8 and reset, otherwise use A4. Early steps change fast (mostly A8), later steps drift slowly (mostly A4). Schematic replay of Eq. 11 with δ = 0.1.
Guide

Delta-GBS spends eight bits only when the output is changing fast. The bars track the accumulated relative L1 change of the model output since the last reset. When it crosses the threshold delta, that step runs with eight-bit activations and the counter resets; otherwise it runs at four bits. Early steps change quickly and get mostly A8, later steps drift slowly and get mostly A4, averaging about six bits. The picture is a schematic replay of equation 11 with delta at 0.1.

  1. Offline: rotate each linear weight by H and quantize to INT4 with BGR (Alg. 1). Weights stay INT4 for every step.
  2. At each step t: rotate activations with a fast Hadamard transform and compute block-wise max scales from the live tensor.
  3. Check δ-GBS: if the accumulated relative output change Σ L1 since the last reset is below δ, quantize activations to 4 bits; otherwise to 8 bits and reset the counter.
  4. Run the W4A4 or W4A8 GEMM kernel (both are standard kernels; no mixed-precision kernel), rescale by Λ.
Guide

The pipeline splits into one offline stage and one per-step loop. Offline, every linear weight is rotated by the Hadamard matrix and quantized to INT4 with BGR, and these weights never change again. At each denoising step, the activations are rotated, their block-wise scales are read from the live tensor, and delta-GBS decides whether this step uses four or eight bits. The chosen standard W4A4 or W4A8 kernel then runs and the result is rescaled. No mixed-precision kernel is needed, only a switch between two existing ones.

§5Every equation

(1)\[ \text{Quant:}\quad \mathbf{W}_q=\operatorname{clamp}\!\left(\lfloor \mathbf{W}\oslash\Delta\rceil+\mathbf{z},\,0,\,2^b-1\right) \]

MinMax per-channel asymmetric quantization; ⊘ element-wise divide, ⌊·⌉ round, b bits.

Guide

Equation 1 is ordinary asymmetric quantization, the baseline everything else builds on. Each weight in W is divided element-wise by the step size delta, rounded to the nearest integer, shifted by the zero-point z, and clamped into the range from zero to two to the b minus one, where b is the bit-width. For four bits that range is zero to fifteen. W q is the resulting integer matrix.

(2)\[ \text{DeQuant:}\quad \widehat{\mathbf{W}}=\Delta\odot(\mathbf{W}_q-\mathbf{z}) \]

Reconstruct weights from integers, step size Δ and zero-point z (⊙ element-wise product).

Guide

Equation 2 goes back from integers to real numbers. The dequantized weight, W hat, is the step size delta times the integer weights W q minus the zero-point z, element by element. The gap between W and W hat is the quantization error that BGR later tries to minimise in equation 3. This is also the form OpenVINO uses when it decompresses INT4 weights at run time.

—\[ \Delta=\frac{\max(\mathbf{W})-\min(\mathbf{W})}{2^b-1}\in\mathbb{R}^n,\qquad \mathbf{z}=-\lfloor \min(\mathbf{W})\oslash\Delta\rceil\in\mathbb{Z}^n \]

MinMax step size and zero-point, one per output channel (row) of W ∈ ℝn×m.

Guide

This is the MinMax recipe for the grid, computed separately for each output row of W. The step size delta is the row's range, max minus min, divided by two to the b minus one, so the levels span exactly the extreme values. The zero-point z is minus the rounded ratio of the minimum to delta, so the smallest weight maps to integer zero. Figure 2 shows why this is wasteful for bell-shaped weights, and BGR uses it only as a starting point.

(3)\[ \Delta^*,\mathbf{z}^*=\arg\min_{\Delta,\mathbf{z}}\lVert \mathbf{W}-\Delta\odot(\mathbf{W}_q-\mathbf{z})\rVert_F \]

The real objective: choose the grid that minimises weight reconstruction error; MinMax is only an initial guess.

Guide

Equation 3 states what BGR really optimises. Among all choices of step size delta and zero-point z, pick the pair that makes the Frobenius norm of W minus its dequantized version as small as possible, the Frobenius norm being the square root of the sum of squared errors. MinMax does not solve this; it is just a first guess. Equations 4 to 6 give the alternating closed-form updates that approximately solve it.

(4)\[ \Delta'=\langle \mathbf{W}_q-\mathbf{z},\mathbf{W}\rangle_{\text{row}}\oslash\langle \mathbf{W}_q-\mathbf{z},\mathbf{W}_q-\mathbf{z}\rangle_{\text{row}} \]

Closed-form least-squares step size with z and Wq fixed; ⟨·,·⟩row is the row-wise inner product.

Guide

Equation 4 updates the step size when the integers and zero-point are held fixed. For each row it divides the inner product of W q minus z with the real weights W by the inner product of W q minus z with itself. That is the textbook least-squares fit of a single scale factor, so it has an exact answer with no iteration or gradients. It is the first update in the inner loop of BGR.

(5)\[ \mathbf{z}'=\operatorname{clamp}\!\left(\overline{\mathbf{W}}_q-\overline{\mathbf{W}}\oslash\Delta',\,0,\,2^b-1\right) \]

Zero-point update with Δ′ fixed: relax z to real values, solve, clamp (then round). The overlines are printed in the paper but not defined there.

Guide

Equation 5 updates the zero-point with the new step size delta prime held fixed. The zero-point is temporarily treated as a real number, solved as the average integer value minus the average weight divided by delta prime, then clamped into the valid integer range and rounded. The overlines are printed in the paper without a definition; reading them as row averages is the natural interpretation, not a stated fact. This is the second update in BGR's inner loop.

(6)\[ \mathbf{W}_q'=\operatorname{clamp}\!\left(\lfloor \mathbf{W}\oslash\Delta'\rceil+\mathbf{z}',\,0,\,2^b-1\right) \]

Re-round the weights on the new grid (same form as Eq. 1).

Guide

Equation 6 re-rounds the weights on the updated grid. It is the same formula as equation 1, only with the new step size delta prime and zero-point z prime: divide, round, add the zero-point, clamp to the four-bit range. With new integers in hand, BGR goes back to equation 4 and repeats until the reconstruction error stops falling.

(7)\[ \mathbf{W}_c=\operatorname{clamp}\!\left(\mathbf{W},\,\min(\mathbf{W})+\delta_l,\,\max(\mathbf{W})-\delta_u\right) \]

Search-bound initialisation: clip the tails by shrink steps δl, δu.

Guide

Equation 7 is the clipping step of BGR's outer loop. W c is W with every value below the minimum plus delta l raised to that bound, and every value above the maximum minus delta u lowered to that bound. Delta l and delta u are the lower and upper shrink amounts. Cutting off the rare extreme weights lets the sixteen levels concentrate on the dense centre shown in figure 2.

(8)\[ \Delta_c=\frac{\max(\mathbf{W}_c)-\min(\mathbf{W}_c)}{2^b-1},\qquad \mathbf{z}_c=-\lfloor \min(\mathbf{W}_c)\oslash\Delta_c\rceil \]

Grid of the clipped weights; this is the start point BGR refines (Alg. 1).

Guide

Equation 8 is simply MinMax applied to the clipped weights W c. Delta c is the clipped range divided by two to the b minus one, and z c is the matching zero-point. This grid is the starting point that the inner loop of Algorithm 1 refines with equations 4 to 6, one start per clipping level.

(9)\[ \mathbf{Y}=\left(\mathbf{X}\operatorname{diag}(\mathbf{s})^{-1}\right)\cdot\left(\operatorname{diag}(\mathbf{s})\mathbf{W}\right)=\tilde{\mathbf{X}}\cdot\tilde{\mathbf{W}},\qquad s_i=\frac{\max(|\mathbf{X}_i|)^{\alpha}}{\max(|\mathbf{W}_i|)^{1-\alpha}} \]

SmoothQuant-style pre-scaling (what prior video PTQ does): s ∈ ℝC from a calibration set, α migration strength.

Guide

Equation 9 shows what earlier video quantization methods do, borrowed from SmoothQuant. Each input channel of X is divided by a scale s i and the matching weight row is multiplied by it, so the product is unchanged but activation outliers move into the weights. The scale mixes the largest activation and the largest weight with a migration strength alpha. The catch is that the activation maximum comes from a calibration set and stays fixed, which is exactly what figure 3 shows failing across timesteps.

—\[ \mathbf{Q}\mathbf{Q}^{\top}=\mathbf{I},\quad |\mathbf{Q}|=\mathbf{I};\qquad \mathbf{Y}=\mathbf{X}\mathbf{W}^{\top}=(\mathbf{X}\mathbf{H})(\mathbf{H}^{\top}\mathbf{W}) \]

Orthogonal rotation (as printed) and Hadamard computational invariance used by ARQ.

Guide

This block states the rotation trick ARQ relies on. An orthogonal matrix Q times its transpose gives the identity, so inserting a Hadamard matrix H and its transpose between the activation X and the weights leaves the output Y unchanged: X times W transpose equals X H times H transpose W. The paper also prints a determinant-style condition that looks garbled, so treat that part loosely. The useful fact is that rotation is free in exact arithmetic and spreads outliers before quantization.

(10)\[ \widehat{\mathbf{X}}=\mathcal{Q}(\mathbf{X}\mathbf{H}\boldsymbol{\Lambda}^{-1}),\quad \widehat{\mathbf{W}}=\mathcal{BGR}(\mathbf{W}\mathbf{H}),\quad \mathbf{Y}=\widehat{\mathbf{X}}\boldsymbol{\Lambda}\widehat{\mathbf{W}}^{\top} \] \[ \tilde{\mathbf{X}}=\mathbf{X}\mathbf{H},\quad s_j=\lVert\tilde{\mathbf{X}}_j\rVert_\infty=\max_i|\tilde{x}_{i,j}|,\quad \boldsymbol{\Lambda}=\operatorname{diag}(s_1,\dots,s_c) \]

ARQ: rotate, scale each channel by its live max (no calibration), quantize; weights are rotated then BGR-quantized.

Guide

Equation 10 is ARQ in full. The activation is rotated, X tilde equals X H, and each channel's scale s j is its largest absolute value in the current tensor; lambda is the diagonal matrix of those scales. The quantized activation X hat is the rotated activation divided by lambda and then quantized, while the weights are rotated and quantized with BGR. The output multiplies X hat, lambda and W hat transpose. Because the scales come from the live tensor, no calibration set is needed.

—\[ \mathbf{Y}_{t_0}=\mathbf{X}_{t_0}\boldsymbol{\Lambda}_{t_0}\mathbf{W},\quad \mathbf{Y}_{t_{49}}=\mathbf{X}_{t_{49}}\boldsymbol{\Lambda}_{t_{49}}\mathbf{W},\quad \boldsymbol{\Lambda}_t=\operatorname{diag}(s_{t_1},\dots,s_{t_c}) \]

From Fig. 2: the channel scales are time-dependent, recomputed at every step.

Guide

This line comes from the middle panel of figure 2 and makes one point: the scale matrix lambda depends on the timestep. The output at the first step uses lambda at t zero, the output at the last step uses lambda at t forty-nine, and each lambda t is a diagonal of per-channel scales computed at that step. It is the equation form of the drifting curve in figure 3, and the reason ARQ recomputes scales online.

(11)\[ B_{t_i}=\begin{cases} b_{\text{low}} & \sum_{t=t_p}^{t_i-1}\mathcal{L}_1(\mathcal{F},t)\lt\delta\\ b_{\text{high}} & \sum_{t=t_p}^{t_i-1}\mathcal{L}_1(\mathcal{F},t)\ge\delta\end{cases},\qquad \mathcal{L}_1(\mathcal{F},t)=\frac{\lVert\mathcal{F}_t-\mathcal{F}_{t-1}\rVert_1}{\lVert\mathcal{F}_{t-1}\rVert_1} \]

δ-GBS: activation bits for step ti; tp = last reset, 𝓕t = model output at step t; blow = 4, bhigh = 8.

Guide

Equation 11 is the delta-GBS rule. For each step t i, add up the relative L1 change of the model output, the size of the output difference between consecutive steps divided by the size of the previous output, over all steps since the last reset t p. If that sum is below the threshold delta, use b low, four bits; if it reaches delta, use b high, eight bits, and reset. F t is the model output at step t. Figure 6 and figure 2 show it in action.

§6Every figure

BF16 snowy mountain valley, reference W4A* *=8 / 8 / 6 W4A4 MinMax ViDiT-Q DVD-Quant darker, detail loss IQ 60.62 (A8) washed-out, grey IQ 59.72 (A8) ≈ BF16 IQ 64.22 (A6) pure colour noise IQ 24.78 heavy distortion IQ 40.10 clean, slight tint IQ 61.82
Fig. 1Only DVD-Quant survives 4-bit activations. Frames from HunyuanVideo; numbers are average VBench Imaging Quality. At W4A4, MinMax becomes noise and ViDiT-Q distorts, while DVD-Quant stays close to BF16. The top row compares baselines at A8 with DVD-Quant at A6 (mixed).
Guide

Only DVD-Quant survives four-bit activations. Each cell is a frame from HunyuanVideo with its VBench Imaging Quality. At W4A4, MinMax collapses into colour noise with a score of 24.78 and ViDiT-Q distorts heavily at 40.10, while DVD-Quant stays close to the reference at 61.82. In the top row the baselines use eight-bit activations but DVD-Quant uses its six-bit mixed setting, so that row is not a like-for-like bit budget.

Bounded-init Grid Refinement min Wmax W δ_l δ_u Bounded-init, Gaussian dist. quant error MinMax Bounded-init grid refinement optimization step refinement threshold Auto-scaling Rotated Quant. T = 0T = 49 time-varying activations Λ_t0Λ_t49 Y=X Λ_t0 WY=X Λ_t49 W Λ_t = diag(s_t1…s_tc) time-dependent scales Delta-Guided Bit Switching ε_t+2 ε_t+1 ε_t ε_t−1 ε_t−2 L1 > δB = b_high L1 < δB = b_low 84 bits across 50 steps allocate bits by indicator
Fig. 2Overview: two data-free error reducers plus a per-step bit switch. Left: clip Gaussian weights by δl, δu, then refine the grid; error drops below MinMax and bounded-init until a threshold. Middle: activation outliers move between channels from T = 0 to T = 49, so channel scales Λt are recomputed per step. Right: accumulated change ε decides bhigh vs blow for each timestep (bit strip is schematic).
Guide

The overview puts the three components side by side. On the left, BGR clips the Gaussian-like weights and refines the grid, so error falls below both MinMax and the plain clipped start until it hits the refinement threshold. In the middle, activation outliers move between channels from step zero to step forty-nine, so the scales lambda t are recomputed each step. On the right, the accumulated change epsilon decides high or low bits per step; the bit strip is schematic.

single_blocks.modulation ×1e-5 0 1 2 3 4 5 200 240 280 320 Layer index BGR 2.72e-6 MinMax 24.40e-6 −88.85% error single_blocks.linear1 ×1e-5 0 1 2 3 4 5 6 7 200 240 280 320 Layer index BGR 3.54e-6 MinMax 32.20e-6 −89.02% error single_blocks.linear2 ×1e-5 0 0.5 1 1.5 2 2.5 3 3.5 200 240 280 320 Layer index BGR 1.61e-6 MinMax 19.10e-6 −91.54% error double_blocks.img_mlp_fc2 ×1e-4 0 0.2 0.4 0.6 0.8 1 1.2 0 50 100 150 200 Layer index BGR 0.75e-6 MinMax 8.80e-6 −91.49% error double_blocks.txt_mlp_fc1 ×1e-5 0 1 2 3 4 5 0 50 100 150 200 Layer index BGR 5.44e-6 MinMax 39.90e-6 −86.37% error double_blocks.txt_attn_qkv ×1e-5 0 1 2 3 4 0 50 100 150 200 Layer index BGR 5.13e-6 MinMax 39.30e-6 −86.94% error
Fig. 3BGR cuts weight quantization error by 86–92% in every layer type. Per-layer error on HunyuanVideo (INT4 weights) for three single-stream and three double-stream layer families. Averages and reductions are the paper's; the per-layer line shapes are redrawn approximately (MinMax teal, noisy and high; BGR indigo, flat and low).
Guide

BGR cuts weight quantization error by about 86 to 92 percent in every layer family tested. Each panel is one family of HunyuanVideo layers, with layer index along the bottom and INT4 weight error up the side; teal is MinMax, indigo is BGR. In single_blocks linear2, for example, the average error drops from about 19 millionths to 1.6 millionths. The averages and reductions are the paper's, but the line shapes are redrawn approximately. This is the evidence for the first component.

double_blocks.0.txt_mlp.fc1 single_blocks.27.linear2 100 massive outlier ≈10 H 30 peak 3, but dense band raised beforeafter rotation 250 H 250 new large values beforeafter rotation
Fig. 4Rotation helps with one huge spike but can amplify many values. 3-D activation plots (tokens × channels) redrawn as channel profiles. Left: a single outlier of ≈10 drops to a peak of ≈3, but a whole band of channels is lifted. Right: after rotation new large values appear in the transformed space. This is why ARQ adds online per-channel scaling after the Hadamard.
Guide

Rotation alone is not enough. Each panel shows activation size across channels before and after the Hadamard rotation. On the left, a single outlier of about ten is flattened to a peak of about three, but a whole band of channels is raised. On the right, rotation creates new large values that were not there before. That second case is why ARQ adds live per-channel scaling after the rotation instead of relying on rotation the way Quarot does.

rocket launch prompt, 3 frames per cell BF16 shuttle, launch tower, smoke: reference W4A* (A8; ours A6) W4A4 MinMax dark, fine detail lost purple noise, no content SmoothQuant coarse outline kept green blotch artefacts Quarot coarse outline kept flat, over-saturated colours ViDiT-Q washed-out tower textures distorted, incoherent scene DVD-Quant ≈ BF16, details kept coherent, marginal loss reference usable, degraded failed DVD-Quant
Fig. 5At W4A4 every baseline fails visibly; DVD-Quant stays coherent. HunyuanVideo, rocket-launch prompt. * = 8 for baselines (W4A8) and 6 for DVD-Quant (W4A6 mixed precision).
Guide

At W4A4 every baseline fails visibly and DVD-Quant stays coherent. Rows are methods, and columns show the rocket-launch prompt at the higher bit setting and at W4A4. MinMax turns to purple noise, SmoothQuant gets green blotches, Quarot over-saturates, and ViDiT-Q loses the scene, while DVD-Quant keeps the shuttle and tower with marginal loss. As in figure 1, the higher-bit column compares baselines at A8 with DVD-Quant at A6.

60.8 61.2 61.6 62.0 62.4 0.06 0.09 0.12 0.15 0.18 threshold δ Avg. Imaging Quality 62.11 61.93 61.43 61.19 61.00 δ→0: all W4A8 δ→∞: all W4A4 δ = 0.06IQ 62.11 δ = 0.09IQ 61.93 δ = 0.12IQ 61.43 δ = 0.15IQ 61.19 δ = 0.18IQ 61.00 coast frames, all ≈ BF16
Fig. 6δ trades quality for bits smoothly. Larger δ means fewer A8 steps and slightly lower Imaging Quality (62.11 → 61.00); frames of a coastal cliff stay visually close. δ = 0.09 is the default (IQ 61.93).
Guide

The threshold delta trades quality for bits smoothly. The horizontal axis is delta from 0.06 to 0.18, the vertical axis is average Imaging Quality. A larger delta means fewer eight-bit steps, and quality slides gently from 62.11 to 61.00, with no cliff; frames of the coastal scene stay visually close throughout. At the extremes, delta near zero means every step is W4A8 and a very large delta means every step is W4A4. The default is 0.09.

§7Results

Table 1. VBench on HunyuanVideo (50-step flow matching, CFG 6.0, shift 7.0). Best quantized in each block in bold.
MethodW/AAestheticImagingOverall C.Scene C.BG C.Subject C.DynamicMotion S.
HunyuanVideo (BF16)16/1662.5364.7825.8642.8197.0196.0551.3999.30
MinMax4/859.4460.6225.7836.4197.6195.8352.7898.89
SmoothQuant4/860.5064.4725.5628.8597.7296.2951.3999.05
Quarot4/858.8056.8625.3334.3098.1095.7255.5699.03
ViDiT-Q4/857.0159.7424.7727.1197.3795.1648.6199.06
DVD-Quant4/662.2764.2225.8333.0797.8996.5758.3399.05
MinMax4/424.2024.784.270.0098.0596.270.0099.03
SmoothQuant4/448.4159.4621.097.8496.7294.971.3998.79
Quarot4/444.8554.3017.330.9497.6992.6487.592.22
ViDiT-Q4/445.3640.1019.667.8597.1997.290.0099.43
DVD-Quant4/461.9661.8225.6829.9497.8296.6156.9499.15
Guide

Table 1 is the main result, VBench scores on HunyuanVideo with higher better. Read it in two blocks. At four-bit weights and higher-bit activations, DVD-Quant at W4A6 nearly matches the full-precision model on Aesthetic and Imaging Quality despite using fewer bits than the W4A8 baselines. At W4A4, the baselines break, MinMax scoring zero on Scene and Dynamic, while DVD-Quant keeps Imaging Quality at 61.82 and Aesthetic at 61.96. Consistency and smoothness columns barely separate methods, since static or noisy videos can still score high there.

Consistency/smoothness metrics saturate even for broken videos (a static noise video is "smooth"); Aesthetic and Imaging Quality are the informative columns. Quarot's 87.5 Dynamic Degree at W4A4 reflects flicker, not quality.

0 10 20 30 40 50 60 70 BF16 16/16 64.78 MinMax 4/4 24.78 SmoothQuant 4/4 59.46 Quarot 4/4 54.30 ViDiT-Q 4/4 40.10 DVD-Quant 4/4 61.82 DVD-Quant 4/6 64.22 Imaging Quality (VBench), HunyuanVideo
Imaging Quality at W4A4. DVD-Quant loses ~3 points vs BF16; the best baseline (SmoothQuant) loses ~5, MinMax collapses.
Guide

At W4A4, DVD-Quant loses about three Imaging Quality points against full precision, while the best baseline, SmoothQuant, loses about five and MinMax collapses to 24.78. The bars are taken straight from Table 1, with DVD-Quant's six-bit mixed setting added at 64.22, almost on top of the full-precision 64.78. The chart turns the table's W4A4 block into a single visible gap.

0 10 20 30 40 50 60 70 BF16 16/16 62.53 MinMax 4/4 24.20 SmoothQuant 4/4 48.41 Quarot 4/4 44.85 ViDiT-Q 4/4 45.36 DVD-Quant 4/4 61.96 DVD-Quant 4/6 62.27 Aesthetic Quality (VBench), HunyuanVideo
Aesthetic Quality at W4A4. Gap to the best baseline is +13.5 points in Table 1 (61.96 vs 48.41). The text instead quotes 58.94 / 60.38 and "+10.53", which does not match the table.
Guide

On Aesthetic Quality at W4A4 the gap is even wider: DVD-Quant scores 61.96 against 48.41 for SmoothQuant, the best baseline, a lead of about 13.5 points according to Table 1. The paper's text quotes different numbers and a gain of about 10.5, which do not match its own table, so trust the table values when citing. Full precision sits at 62.53, so DVD-Quant is within about half a point.

Table 2. Mixed-precision strategies (blow=4, bhigh=8, average 6 bits over 50 steps).
MethodImaging Quality
δ-GBS (ours)61.93
STP: 4-bit first 25, 8-bit last 2561.33
ITP: 8-bit first, 4-bit later61.40
ABS: alternate every step61.03
SBA: random, avg 6 bits61.26
Guide

Table 2 tests whether the per-step switch actually matters, with every strategy averaging six bits over 50 steps. Delta-GBS scores 61.93. The fixed schedules score lower: four bits first then eight bits, 61.33; eight bits first then four bits, 61.40; alternating every step, 61.03; and random allocation, 61.26. Content-adaptive switching wins, which supports the idea behind equation 11.

60.8 61.0 61.2 61.4 61.6 61.8 62.0 δ-GBS 61.93 STP (4→8) 61.33 ITP (8→4) 61.40 ABS (alternate) 61.03 SBA (random) 61.26 Imaging Quality, avg 6 bits (axis starts at 60.8)
Content-adaptive switching beats fixed schedules, but only by 0.5–0.9 IQ (note the zoomed axis).
Guide

Content-adaptive switching beats fixed schedules, but only by half a point to about 0.9 of a point in Imaging Quality. The axis starts at 60.8, which makes the bars look far apart. The honest reading is that delta-GBS helps a little over simple schedules; most of DVD-Quant's gain comes from BGR and ARQ, not from the bit schedule.

Table 3. Ablation of BGR and ARQ (HunyuanVideo).
BGRARQW/AAestheticImagingSubject C.Motion S.BG C.
✓W4A658.1558.6898.0498.4998.21
✓W4A657.8557.7298.2397.8698.10
✓✓W4A660.4661.9398.9198.9598.40
✓W4A453.9552.6797.9298.7197.89
✓W4A443.2658.3195.3696.0897.35
✓✓W4A459.5758.9398.6799.0098.47
Guide

Table 3 removes one component at a time to show both are needed. Each row ticks whether BGR, ARQ, or both are used, at W4A6 and at W4A4. With both, Imaging Quality is 61.93 at W4A6 and 58.93 at W4A4, the best in every column. Dropping ARQ hurts most at W4A4, where Aesthetic Quality falls to 43.26. Note that the W4A4 full-method score here is lower than the 61.82 in Table 1, so the ablation setup seems to differ slightly.

Table 4. DVD-Quant + TeaCache (caching).
W/AAesth.ImagingBG C.Subj. C.Motion S.Speed-up
W4A861.3962.9698.2498.7398.754.01×
W4A458.7858.2098.4398.6898.924.85×
Guide

Quantization and caching stack. Here DVD-Quant is combined with TeaCache, which skips denoising steps whose output barely changes. The total speed-up reaches 4.01 times at W4A8 and 4.85 times at W4A4, with Imaging Quality of 62.96 and 58.20. For the thesis this is a useful precedent: weight compression and step caching are complementary on a video transformer.

Table 5. Memory and latency on HunyuanVideo (single RTX 4090).
W/AMemory opt.Latency opt.
16/161.00×1.00×
4/8 (ours)3.68×1.75×
4/6 (ours)3.68×1.93×
4/4 (ours)3.68×2.12×
Guide

Table 5 gives the hardware payoff on a single RTX 4090. Memory drops 3.68 times at every setting, because weights are four-bit in all three. Latency improves by 1.75 times at W4A8, 1.93 times at W4A6 and 2.12 times at W4A4, since lower-bit activations let faster integer matrix kernels run. These speed-ups depend on the authors' custom GPU kernels.

0 1 2 3 4 5 BF16 16/16 1.00× W4A8 1.75× W4A6 (δ-GBS) 1.93× W4A4 2.12× W4A8 + TeaCache 4.01× W4A4 + TeaCache 4.85× Latency speed-up vs BF16 (RTX 4090)
Speed comes from low-bit GEMM kernels; caching stacks on top. W4A6 ≈ half the steps on the W4A8 kernel, half on W4A4. TeaCache (step skipping) multiplies the gain to 4.01–4.85×.
Guide

Speed comes from low-bit matrix kernels, and caching multiplies it. The bars show latency speed-up against full precision. W4A6 lands between W4A8 and W4A4 because roughly half the steps use each kernel, and adding TeaCache pushes the total to 4.01 and 4.85 times. The chart combines Tables 4 and 5 into one view of where the time savings come from.

The paper also reports Wan2.1 results and block-wise ARQ kernel details in a supplementary file that is not part of this PDF.

§8Why it matters for this thesis

DVD-Quant vs LTX-2.3 on OpenVINO / NNCF

  • What is data-free here: all three parts. BGR uses only W. ARQ scales come from the live activation. δ-GBS uses a statistic of the model's own output. So no calibration set is needed, which avoids the thesis cost of hours of CPU time per calibration sample.
  • BGR: directly usable, no custom kernel. The result is a standard asymmetric INT4 grid (u4 values + zero-point + scale per output row), the same format OpenVINO decompresses natively for weight-only INT4. It is a data-free replacement for NNCF's data-aware refinements (scale estimation, AWQ, GPTQ): compute Δ*, z* in PyTorch with Alg. 1 (easy to extend from per-row to NNCF-style group size 64/128) and write them into the compressed constants with a small custom script. Cost: offline CPU time only.
  • ARQ needs custom kernels as published. Reported speed-ups use the authors' block-wise W4A4/W4A8 Tensor Core GEMM kernels plus a fast Hadamard transform on an RTX 4090. OpenVINO has no INT4×INT4 GEMM path on Intel CPU or Arc and no fast Walsh-Hadamard op (a dense MatMul by H costs O(d²) per token). The closest built-in feature is OpenVINO's dynamic INT8 activation quantization for compressed-weight MatMuls: online, group-wise scales, i.e. the A8 half of ARQ without the rotation.
  • δ-GBS is cheap but needs two execution variants. It only swaps between two existing kernels (no mixed-precision kernel). In OpenVINO this means two compiled variants of the transformer chosen per step, with extra weight memory unless weights are shared. Its signal (relative L1 change of outputs) is the same kind used by TeaCache-style caching, so one signal could drive both bit switching and step skipping.
  • Scope caveat: tested on HunyuanVideo (plus Wan2.1 in the supplement) at W4A4–W4A8 on an NVIDIA GPU; no audio, no weight-only W4A16 result, no CPU numbers. For the thesis, BGR is the transferable piece; ARQ and δ-GBS are ideas to check against what OpenVINO can run.
Guide

Take BGR into the thesis and treat the rest as ideas to test. BGR produces an ordinary INT4 grid, one scale and zero-point per row, which OpenVINO already decompresses, so it can be computed in PyTorch with Algorithm 1, extend it to NNCF-style groups of 64 or 128, write it into the compressed weights, and compare it with NNCF's data-aware options without spending CPU hours on calibration. ARQ needs INT4 activation kernels and a fast Hadamard op that OpenVINO lacks; its closest built-in match is dynamic INT8 activation quantization. Delta-GBS would need two compiled model variants, but its signal could also drive TeaCache-style step skipping.

Quantizing diffusion models

QVGen: Pushing the Limit of Quantized Video Generative Models

Yushi Huang, Ruihao Gong, Jing Liu, Yifu Ding, Chengtao Lv, Haotong Qin, Jun Zhang · HKUST, Beihang, SenseTime, Monash, NTU, ETH Zürich · ICLR 2026 (arXiv 2505.11497, 2025)

Quantization-aware training (QAT) for video diffusion transformers at 4 and 3 bits for both weights and activations. A theory result says QAT converges better when the gradient norm is small, so each quantized layer gets a temporary low-rank helper Φ that absorbs quantization error; a rank-decay schedule (SVD + fading the smallest components) then shrinks Φ to nothing, leaving a plain W4A4 model.

Precision
W4A4 · W3A3
Models
CogVideoX 2B/5B, Wan 1.3B/14B
W4A4 quality
≈ BF16 (VBench)
Size / speed
~4× smaller · 1.21–1.44×
Training cost
9–11 (small) to ~182 (14B) H100 GPU-days
Inference overhead
none (Φ removed)
Reading guide

QVGen asks whether a video diffusion transformer can be squeezed to four bits, or even three, for both weights and activations without the videos falling apart. Its answer is yes at four bits, through quantization-aware training plus a temporary low-rank helper that absorbs quantization error during training and is then faded out completely, so the shipped model is a plain W four A four network that scores close to BF16 on VBench. The tab moves from a big-picture diagram to the problem, the method and algorithm, every equation including the proofs, every figure, the results tables, and a thesis box. Among the sixteen papers it is the training-based member of the diffusion quantization group, after Q-Diffusion, PTQ4DiT, ViDiT-Q, SVDQuant and DVD-Quant, and just before the SVDQuant with GPTQ study on Wan 2.2. For the thesis it marks the floor: even with expensive training, four bits is the limit.

§0Before reading

Every quantization paper so far in the atlas was post-training quantization: take a finished model and round it, without changing its weights. QVGen instead retrains the quantized model, so three ideas come first: how training differs from post-training quantization, how backpropagation can pass through rounding at all, and what a low-rank matrix is. It is in the atlas as the upper limit: with a lot of GPU training, how low can a video diffusion transformer go?

PTQ: post-training trained model calibrate scales few samples low-bit model weights frozen · hours QAT: quantization-aware training trained model fake-quant forward backprop, update W low-bit model weights retrained · GPU-days
PrimerPTQ rounds a finished model; QAT keeps training it while it is rounded. In post-training quantization (GPTQ, SmoothQuant, ViDiT-Q, SVDQuant) the weights stay fixed and only scales are chosen from a small calibration set. In quantization-aware training the forward pass uses fake quantization (round, then turn back into floats), so the loss sees the rounding error and gradient descent adjusts the weights to live with it. Better quality at very low bits, but it costs real training: QVGen uses 8 to 32 H100 GPUs.
Guide

Two ways to get a low-bit model. The top row is post-training quantization: the weights stay frozen and only the scales are chosen from a few samples, which takes hours. The bottom row is quantization-aware training: the rounding is simulated in every forward pass and the weights are updated to cope with it, which takes GPU-days. Every earlier quantization paper in the atlas used the top row. QVGen uses the bottom one.

Forward: round x Q(x) ideal y = x slope 0 almost everywhere Backward: pass through 1 0 gradient = 1 inside clip range 0 0 clipped values: gradient 0
PrimerThe straight-through estimator lets gradients flow through rounding. Rounding is a staircase: its true slope is zero almost everywhere, so ordinary backpropagation would give no learning signal. The STE simply pretends rounding was the identity: in the backward pass the gradient is passed through unchanged (slope 1) for values inside the clipping range and set to zero for clipped values. This is Eq. (5) of the paper. It is a useful lie, and its noise is one reason low-bit training has large, spiky gradients.
Guide

Rounding has no useful slope, so how can training pass through it? The left plot is the forward pass: a staircase, flat almost everywhere, next to the dashed ideal line. The right plot is what the straight-through estimator uses in the backward pass instead: a slope of one inside the clipping range and zero outside. This is equation five of the paper, and its noise helps explain the spiky gradients QVGen sets out to calm.

W ≈ L · R W n × m ≈ L n × r · R r × m r small: few parameters Singular values, sorted keep top r small: drop σ₁ ≥ σ₂ ≥ … ≥ σd
PrimerA low-rank matrix is a big matrix built from two thin ones. Singular value decomposition (SVD) writes any matrix as a sum of rank-one pieces, each weighted by a singular value \(\sigma\), sorted from largest to smallest. Keeping only the top \(r\) pieces gives \(W \approx L\,R\) with far fewer numbers; the dropped pieces had little effect. QVGen's helper \(\Phi\) starts as the rounding error \(W - Q(W)\) squeezed to rank 32, and its rank decay repeatedly uses SVD to find and fade the weakest pieces: 32, 16, 8, 4, 2, then zero.
Guide

A big matrix can often be rebuilt from two thin ones. On the left, W is approximated by a tall matrix L times a short matrix R, with a small inner size called the rank. On the right, singular value decomposition sorts the pieces by importance: keep the tall bars, drop the tiny ones. QVGen's helper starts as the rounding error at rank thirty-two and is shrunk by halving the rank until nothing is left.

Where this paper sits SVDQuant PTQ, branch kept DVD-Quant PTQ, video QVGen QAT, W4A4 SVDQuant+GPTQ PTQ on Wan 2.2 What it adds retrains 4- and 3-bit weights helper Φ decays to zero plain W4A4, no overhead earlier atlas papers: all post-training
PrimerWhere this paper sits. SVDQuant kept a small high-precision low-rank branch at inference to absorb outliers; DVD-Quant pushed post-training quantization on video models. QVGen borrows the low-rank branch but uses it only during training, then removes it, so the shipped model is plain W4A4. Next, the SVDQuant plus GPTQ study returns to post-training quantization on Wan 2.2, a model close in size and design to LTX-2.3.
Guide

The map shows QVGen's neighbours in the atlas. SVDQuant kept a low-rank high-precision branch at inference, and DVD-Quant pushed post-training quantization on video. QVGen is the first training-based method here: it retrains the weights at four and three bits and uses a helper branch only during training, so the final model is plain W four A four. Next, the SVDQuant with GPTQ study returns to post-training quantization on Wan 2.2.

Terms used in this paper

QAT vs PTQ
Quantization-aware training retrains the weights while rounding is simulated. Post-training quantization only picks scales for a finished model, with a small calibration set.
W4A4, W3A3
Weights and activations both in 4 bits (or 3). QVGen uses per-channel scales for weights and per-token scales for activations, computed on the fly.
Fake quantization
Round a value to the low-bit grid and immediately convert it back to a float. Training sees the rounding error without needing integer kernels.
Straight-through estimator (STE)
A trick for backpropagating through rounding: treat it as the identity inside the clipping range, and give zero gradient to clipped values.
Knowledge distillation
The quantized "student" is trained to copy the full-precision "teacher" model's noise predictions, instead of learning from the raw training target.
Gradient norm
The overall size of the gradient vector at a training step, \(\lVert g_t\rVert\). QVGen argues that keeping it small makes low-bit training converge better.
Regret
A measure from optimisation theory: the total extra loss accumulated during training compared with the best fixed parameters. Lower average regret means closer to the optimum.
SVD, rank
Singular value decomposition splits a matrix into pieces sorted by importance (singular values). The rank is how many pieces are kept.
LoRA
Low-rank adaptation: training only a small low-rank add-on next to frozen weights. EfficientDM, a baseline here, uses it for quantized diffusion models.
LSQ, Q-DM, EfficientDM
Earlier QAT methods (the first for CNNs, the others for image diffusion models) that the paper adapts to video as baselines.
CogVideoX, Wan
Open-source text-to-video diffusion transformers. The paper tests CogVideoX 2B and 1.5-5B, and Wan 1.3B and 14B.
VBench
A video-generation benchmark that scores separate dimensions such as aesthetic quality, motion smoothness, dynamic degree and scene consistency. It has its own tab at the end of the atlas.
H100, A800
NVIDIA data-centre GPUs. Training ran on H100s; speed was measured on an A800, a variant of the A100 made for the Chinese market with reduced interconnect bandwidth.
Guide

These are the words the paper takes for granted. The most important are quantization-aware training versus post-training quantization, the straight-through estimator, knowledge distillation from a full-precision teacher, and the gradient norm, which the paper's theory links to convergence. SVD and rank describe the helper branch. The rest names the baselines, the CogVideoX and Wan models, the VBench benchmark, and the H100 and A800 GPUs used for training and timing.

§2Big picture

Naive W4A4 QAT Q(W)·Q(X) big quantization error ‖g_t‖ spiky → poor convergence video breaks at ≤ 4 bit QVGen training Q(W)·Q(X)main path (trained) + Φ: (γ⊙L)·R·Q(X) low-rank helper soaks up error → calm ‖g_t‖ 32 16 8 4 2 0 rank of Φ over training (λ = ½) Deployed model Q(W)·Q(X) only standard uniform W4A4 / W3A3 Φ = ∅ → zero overhead W4A4 ≈ BF16 on VBench ~4× smaller, 1.21–1.44× faster (A800)
Guide

Read left to right as three stages. On the left, naive four-bit training suffers large quantization error and spiky gradient norms, and the video breaks. In the middle, QVGen adds a low-rank helper called phi next to each layer, which calms the gradients, while its rank is halved from 32 down to nothing. On the right, the deployed model is ordinary W four A four with zero overhead, about four times smaller and 1.21 to 1.44 times faster.

Train the low-bit model with a helper branch that keeps gradients calm, then gradually remove the helper so the shipped model is standard uniform W4A4. The helper is low-rank and disappears one half of its rank at a time.

§3The problem

avg ‖g_t‖ (W4A4 Q-DM, 2B) 0 0.1 0.2 0.3 0.4 0.2047 SD3-medium image 0.3283 CogVideoX-2B video avg ‖g_t‖ by training clips 0 0.1 0.2 0.1972 high-motion 0.1768 low-motion 0.1821 mixed
Video QAT has larger gradient norms. Same 2B size and recipe: video 0.328 vs image 0.205 (Tab. C); high-motion clips are harder still (Tab. D).
Guide

Video is harder to train in low bits than images. The left bars compare the average gradient norm during four-bit Q-DM training on two models of the same two-billion size: about 0.33 for the CogVideoX video model against about 0.20 for the SD3 image model. The right bars show high-motion training clips give the largest norm. Because the theory later says large gradient norms slow convergence, this is the problem QVGen sets out to fix.

Q_b(X) int4 INT4 GEMM · Q_b(W) FP16 GEMM · W_Φ + Ŷ ✗ second kernel, not low-bit ✗ full-rank FP16 W_Φ ≫ INT4 W in memory → must be removed before deployment
Why the helper cannot stay. Φ needs a second full-precision matmul and full-precision weights, which breaks low-bit kernels and costs several times the memory of the INT4 model.
Guide

The helper phi cannot stay in the final model. At inference it would need a second matrix multiply in FP16 beside the fast INT4 one, and its full-rank FP16 weight would take far more memory than the four-bit weight itself. That would defeat the point of quantizing. This is why the method needs the rank-decay schedule: phi must help during training and then disappear before deployment.

  • PTQ (ViDiT-Q, SVDQuant) produces no usable video at per-channel W4A4; even at W4A6 it lags far behind.
  • Image-DM QAT methods (LSQ, Q-DM, EfficientDM) degrade at W4A4 and break at W3A3 (Dynamic Degree 0.56 for LSQ on CogX-2B).
  • Activations are the bottleneck: W4A16 is fine, W16A4 is pure noise (Fig. B).
  • Just clipping gradients helps only a little (0.5) and hurts when aggressive (0.1), as Tab. E shows. A more principled fix is needed.

§4Method

  1. Quantize: per-channel asymmetric weights and per-token dynamic activations, Eq. (4); STE for gradients, Eq. (5); LSQ-learned weight scales.
  2. Add Φ to every linear layer: Ŷ = Q(W)Q(X) + WΦQ(X), with WΦ = W − Q(W) at start (Eq. 9).
  3. Factorise: SVD of WΦ truncated to rank r=32 → L (n×r), R (r×m) (Eqs. 10–11).
  4. Train with KD against the BF16 teacher (Eq. 6), updating W, s, z, L, R, while γ fades the lowest λr = r/2 components with a cosine u: 1→0 (Eqs. 12–13).
  5. Truncate to rank (1−λ)r, re-SVD, repeat: 32→16→8→4→2 (Eq. 14).
  6. Final phase: once r ≤ 1/λ, fade everything left (γ=[u]); drop Φ. Ship a plain W4A4/W3A3 model.
Guide

The recipe has two halves. First, set up four-bit fake quantization and attach a helper to every linear layer that starts out equal to the weight's rounding error, compressed by SVD into two thin rank-32 matrices. Second, train by distillation from the BF16 teacher while repeatedly fading the weakest half of the helper's components, cutting them off, and re-factorising: rank 32, 16, 8, 4, 2, then zero. What remains is a plain low-bit model.

Algorithm 1 Procedure of QVGen framework FUNC QVGEN(D, eps_theta, it_per_decay_phase, r, lambda, b) Require: D - training dataset eps_theta(.) - full-precision DiT model it_per_decay_phase - training iterations per decay phase r - initial rank of the auxiliary module lambda - shrinking ratio b - quantization bit-width // Preprocess 1: standard uniform b-bit quantization of eps_theta -> eps_hat (Eq. 4) 2: generate all W_Phi for eps_hat (Eq. 9) // Start QAT 3: while r > 1/lambda do 4: decompose all W_Phi to {L, R} with rank r (Eq. 11) 5: generate gamma (Eq. 13) (u in gamma decays 1 -> 0 over the next it_per_decay_phase iterations) 6: for it in 0 .. it_per_decay_phase do 7: get batch (x0, C) from D 8: eps ~ N(0, I) 9: tau ~ Uniform([1, ..., N]) 10: generate x_tau (Eq. 1) 11: compute loss L (Eq. 6; Eq. 12 used in eps_hat) 12: update all W, s, z and {L, R} by back-prop (STE, Eq. 5) 13: end for 14: truncate {L, R} -> {L', R'}, regenerate W_Phi (Eq. 14) 15: r = (1 - lambda) r 16: end while 17: gamma = [u]_(n x r) (u decays 1 -> 0 over it_per_decay_phase iterations) 18: train eps_hat for it_per_decay_phase iterations (lines 6-13) 19: shrink all W_Phi to empty set (gamma = [0] at the end, so W_Phi can be removed) 20: return eps_hat
Guide

The algorithm is one outer loop wrapped around ordinary training. First, the model is quantized and each helper starts as the quantization error. Each pass of the outer loop factorises the helpers at the current rank, builds the mask gamma, runs a fixed number of distillation steps while the weakest half fades out, then truncates and halves the rank. When the rank is tiny, a last phase fades everything, so the returned model has no helper left.

Setup: 16K captioned OpenVidHQ clips, AdamW (wd 1e-4), cosine LR (3e-5 for ≤2B), 8 epochs on 8×H100 (16 epochs on 16–32×H100 for 5B/14B), equal iterations per decay phase. Attention stays in full-precision flash-attention; only linear layers are quantized.

§5Every equation

(1)\[ \mathbf{x}_\tau = \alpha_\tau \mathbf{x}_0 + \sigma_\tau \boldsymbol{\epsilon} \]

Forward diffusion: clean latent video \(\mathbf{x}_0\in\mathbb{R}^{f\times h\times w\times c}\) mixed with Gaussian noise; \(\alpha_\tau,\sigma_\tau\) set the SNR at timestep \(\tau\in[1,\dots,N]\).

Guide

This is the forward noising step of diffusion. x tau, the noisy latent video at timestep tau, equals alpha tau times the clean latent x zero plus sigma tau times Gaussian noise epsilon. Alpha and sigma set how much signal versus noise remains at that step. QVGen uses it in the training loop to create noisy inputs that both the teacher and the quantized student must denoise.

(2)\[ \mathcal{L}(\theta) = \mathbb{E}_{\mathbf{x}_0,\boldsymbol{\epsilon},\mathcal{C},\tau}\big[\lVert \boldsymbol{\epsilon} - \boldsymbol{\epsilon}_\theta(\mathbf{x}_\tau,\mathcal{C},\tau)\rVert_F^2\big] \]

Standard noise-prediction training loss; \(\mathcal{C}\) = text/image condition. (v-prediction is the common alternative.)

Guide

This is the standard training loss for a diffusion model. The network epsilon theta sees the noisy video, the text condition C and the timestep tau, and tries to predict the noise that was added; the loss is the expected squared difference. QVGen does not train with this directly. It replaces the true noise with the teacher's prediction in equation 6, a distillation version of the same idea.

(3)\[ \mathbf{Y} = \mathbf{W}\mathbf{X},\qquad \hat{\mathbf{Y}} = \mathcal{Q}_b(\mathbf{W})\,\mathcal{Q}_b(\mathbf{X}) \]

Full-precision vs. quantized linear layer; \(\mathbf{W}\in\mathbb{R}^{n\times m}\), \(\mathbf{X}\in\mathbb{R}^{m\times k}\) (n out-channels, m token dim, k tokens).

Guide

Here is the basic object being compressed: one linear layer. In full precision the output Y is the weight matrix W times the input X. In the quantized version, Y hat is the quantized weight times the quantized input, both at b bits. The gap between Y and Y hat is the quantization error, and every later equation is about keeping that gap from spoiling training and the final video.

(4)\[ \mathcal{Q}_b(\mathbf{X}) = \Big(\operatorname{clip}\big(\big\lfloor \tfrac{\mathbf{X}}{s}\big\rceil + z,\,0,\,2^b-1\big) - z\Big)\times s,\quad s=\frac{\max(\mathbf{X})-\min(\mathbf{X})}{2^b-1},\quad z=-\Big\lfloor \frac{\min(\mathbf{X})}{s}\Big\rceil \]

Asymmetric uniform (min–max) fake-quantizer with scale \(s\) and zero-point \(z\) — exactly the INT-asym format OpenVINO/NNCF use.

Guide

This is the quantizer itself: asymmetric uniform min-max quantization. The step size s is the value range divided by two to the b minus one levels, and the zero-point z shifts the grid so the minimum maps to zero. Each value is divided by s, rounded, shifted by z, clipped to the allowed integer range, then mapped back. It is exactly the INT asymmetric format OpenVINO and NNCF use, so nothing exotic is needed on the thesis side.

(5)\[ \frac{\partial \mathcal{Q}_b(\mathbf{X})}{\partial \mathbf{X}} = \mathbb{I}_{\,0\le \lfloor \mathbf{X}/s\rceil + z \le 2^b-1} \]

Straight-through estimator: gradient passes through rounding as 1 inside the clipping range, 0 outside.

Guide

Rounding has zero gradient almost everywhere, so training through it needs a trick: the straight-through estimator. The derivative of the quantizer is simply taken as one when the scaled value falls inside the clipping range and zero when it is clipped. This lets gradients reach the weights and the learned scales during quantization-aware training, and the gradient norms the paper worries about are measured through this path.

(6)\[ \mathcal{L} = \mathbb{E}_{\mathbf{x}_0,\mathcal{C},\tau}\big[\lVert \hat{\boldsymbol{\epsilon}}_\theta(\mathbf{x}_\tau,\mathcal{C},\tau) - \boldsymbol{\epsilon}_\theta(\mathbf{x}_\tau,\mathcal{C},\tau)\rVert_F^2\big] \]

Knowledge-distillation QAT loss: quantized student \(\hat{\boldsymbol{\epsilon}}_\theta\) matches the BF16 teacher's output.

Guide

This is the loss QVGen actually trains with, a knowledge distillation loss. The quantized student, epsilon hat, and the full-precision teacher, epsilon theta, see the same noisy video, condition and timestep, and the loss is the squared difference of their outputs. The student therefore learns to copy the BF16 model rather than fit raw data, which is the usual choice in diffusion quantization-aware training such as Q-DM and EfficientDM.

(7)\[ R(T) = \sum_{t=1}^{T} f_t(\theta_t) - f_t(\theta^*) \]

Regret over \(T\) iterations; \(\theta^*=\arg\min_{\theta\in\mathbb{S}^d}\sum_t f_t(\theta)\) in a convex compact set.

Guide

Regret is the yardstick for the convergence theory. R of T sums, over T training iterations, how much worse the loss at the current parameters theta t is than the loss at the best fixed parameters theta star. If average regret, R of T divided by T, goes to zero, training is converging. Theorem 3.1 bounds exactly this quantity.

(8)\[ \theta_{t+1} = \theta_t - \eta_t\, \mathbf{g}_t \]

Gradient-descent update with learning rate \(\eta_t\) and gradient \(\mathbf{g}_t\).

Guide

This is plain gradient descent. The next parameters theta t plus one equal the current parameters minus the learning rate eta t times the gradient g t. It is the update rule assumed in the convergence analysis, and it is why the size of g t appears in the bound that follows.

(Thm 3.1)\[ \frac{R(T)}{T} \le \frac{d D_\infty^2}{2T\eta_T^m} + \frac{1}{T}\sum_{t=1}^{T}\frac{\eta_t^M}{2}\lVert \mathbf{g}_t\rVert_2^2 \]

If \(f_t\) convex and \(\lVert\theta_i-\theta_j\rVert_\infty\le D_\infty\): for large \(T\) the first term vanishes, so the average squared gradient norm controls convergence → reduce \(\lVert\mathbf{g}_t\rVert_2\). (\(\eta^M_t,\eta^m_t\) = max/min learning rates.)

Guide

Theorem 3.1 is the paper's key theoretical motivation. Average regret is at most two terms: the first shrinks as training length T grows, and the second is the average over iterations of the learning rate times the squared gradient norm. So after long training, convergence is governed by how large the gradients are. The takeaway is simple: shrink the gradient norm and quantization-aware training converges better, which the helper phi is designed to do.

(9)\[ \hat{\mathbf{Y}} = \mathcal{Q}_b(\mathbf{W})\mathcal{Q}_b(\mathbf{X}) + \Phi(\mathcal{Q}_b(\mathbf{X})),\qquad \Phi(\mathcal{Q}_b(\mathbf{X}))=\mathbf{W}_\Phi\,\mathcal{Q}_b(\mathbf{X}) \]

Auxiliary module: an extra FP branch; \(\mathbf{W}_\Phi\) initialised to the weight quantization error \(\mathbf{W}-\mathcal{Q}_b(\mathbf{W})\).

Guide

This introduces the helper. The quantized layer's output becomes the usual quantized weight times quantized input, plus phi applied to the quantized input, where phi is just an extra full-precision weight W phi times that input. W phi starts as the weight's rounding error, W minus its quantized version, so at the start the layer behaves almost like full precision. That softer start is what lowers the gradient norm.

(10)\[ \mathbf{W}_\Phi = \sum_{s=1}^{d} \sigma_s\, \mathbf{u}_s \mathbf{v}_s^{\top} \]

SVD of the helper weight; \(d=\min\{n,m\}\), \(\sigma_1\ge\dots\ge\sigma_d\). Most \(\sigma_s\) are tiny and get tinier during QAT (Fig. 4).

Guide

This is the singular value decomposition of the helper weight. W phi is written as a sum of d rank-one pieces, each a singular value sigma s times an outer product of vectors u s and v s, sorted from largest to smallest sigma. Figure 4 shows most sigmas are tiny and get tinier during training. That observation is what makes it safe to keep only the top few and later discard them.

(11)\[ \Phi(\mathcal{Q}_b(\mathbf{X})) = \mathbf{L}\mathbf{R}\,\mathcal{Q}_b(\mathbf{X}),\quad \mathbf{L}=[\sqrt{\sigma_1}\mathbf{u}_1,\dots,\sqrt{\sigma_r}\mathbf{u}_r]\in\mathbb{R}^{n\times r},\ \mathbf{R}=[\sqrt{\sigma_1}\mathbf{v}_1,\dots,\sqrt{\sigma_r}\mathbf{v}_r]^{\top}\in\mathbb{R}^{r\times m} \]

Rank-\(r\) factorisation (\(r\ll d\), \(r=32\) used); column/row \(s\) carries the \(s\)-th largest contribution.

Guide

The helper is stored in factorised form: phi equals L times R times the quantized input. L collects the top r left singular vectors and R the top r right ones, each scaled by the square root of its singular value. With r equal to 32, far below the full dimension, the helper is cheap. Column s of L carries the s-th strongest direction, which lets the next equations fade the weakest columns first.

(12)\[ \hat{\mathbf{Y}} = \mathcal{Q}_b(\mathbf{W})\mathcal{Q}_b(\mathbf{X}) + (\boldsymbol{\gamma}\odot\mathbf{L})\,\mathbf{R}\,\mathcal{Q}_b(\mathbf{X}) \]

Training-time forward with the rank-based regularizer \(\boldsymbol{\gamma}\) masking columns of \(\mathbf{L}\).

Guide

This is the training-time forward pass with the rank regularizer. It is the same layer as before, except L is multiplied element by element by the mask gamma before being combined with R. Gamma lets training gradually switch off selected columns of L, so the helper's contribution shrinks smoothly instead of vanishing abruptly. Equation 13 defines what gamma looks like.

(13)\[ \boldsymbol{\gamma} = \operatorname{concat}\big([1]_{n\times(1-\lambda)r},\ [u]_{n\times\lambda r}\big)\in\mathbb{R}^{n\times r} \]

Keep the top \((1-\lambda)r\) components; the lowest \(\lambda r\) are multiplied by \(u\), cosine-annealed 1 → 0. \(\lambda=\tfrac12\).

Guide

Gamma is built from two blocks. The first one minus lambda times r columns are all ones, keeping the strongest components untouched. The last lambda times r columns are set to u, a number annealed from one to zero with a cosine schedule. With lambda equal to one half, the weakest half of the helper fades out during each phase while the model learns to compensate.

(14)\[ \begin{cases}\mathbf{L}'=\mathbf{L}[:,\,:(1-\lambda)r]\\ \mathbf{R}'=\mathbf{R}[:(1-\lambda)r,\,:]\end{cases}\ \Rightarrow\ \mathbf{W}_\Phi=\mathbf{L}'\mathbf{R}' \]

When \(u\) hits 0, truncate: rank drops \(r\to(1-\lambda)r\). Repeat (re-SVD, decay, truncate) until \(r=0\), i.e. \(\Phi=\varnothing\).

Guide

Once u reaches zero, the faded columns are removed for real. L prime keeps only the first one minus lambda times r columns of L, and R prime the matching rows of R, and their product becomes the new, smaller helper weight. The rank halves, from 32 to 16 and so on. The loop then re-factorises and repeats until the rank is zero and phi no longer exists.

(A)\[ \theta_{t+1,p} = \theta_{t,p} - \eta_{t,p}\, g_{t,p} \]

Proof of Thm 3.1 — per-entry update of parameter \(p\).

Guide

The appendix proof of Theorem 3.1 starts here. This is gradient descent written for one single entry p of the parameter vector, with its own learning rate eta t p and gradient g t p. Working entry by entry lets the proof handle adaptive, per-parameter learning rates like those in AdamW.

(B)\[ (\theta_{t+1,p}-\theta_p^*)^2 = (\theta_{t,p}-\eta_{t,p}g_{t,p}-\theta_p^*)^2 = (\theta_{t,p}-\theta_p^*)^2 - 2(\theta_{t,p}-\theta_p^*)\eta_{t,p}g_{t,p} + \eta_{t,p}^2 g_{t,p}^2 \]

Expand the squared distance to the optimum.

Guide

The proof now measures how far one parameter entry is from its optimum. Squaring the distance after one update and expanding gives three parts: the old squared distance, minus a cross term of two times distance times learning rate times gradient, plus the learning rate squared times the gradient squared. That last term is where the gradient norm enters the bound.

(C)\[ g_{t,p}(\theta_{t,p}-\theta_p^*) = \frac{1}{2\eta_{t,p}}\big[(\theta_{t,p}-\theta_p^*)^2-(\theta_{t+1,p}-\theta_p^*)^2\big] + \frac{\eta_{t,p}}{2}g_{t,p}^2 \]

Rearranged and divided by \(2\eta_{t,p}\).

Guide

Rearranging the previous expansion isolates the gradient times the distance to the optimum. It equals the drop in squared distance over one step, divided by two times the learning rate, plus half the learning rate times the gradient squared. The first part will telescope across iterations; the second is the gradient-norm penalty that survives into Theorem 3.1.

(D)\[ f_t(\theta_t) - f_t(\theta^*) \le \mathbf{g}_t^{\top}(\theta_t-\theta^*) \]

Convexity (Assumption B.1).

Guide

This is where convexity is used. For a convex loss, the gap between the current loss and the optimal loss is at most the gradient dotted with the distance to the optimum. It links regret to the expression rearranged in the previous step. It is an idealising assumption: real diffusion training is not convex, which is why Appendix C repeats the argument without it.

(E)\[ \begin{aligned}R(T) &\le \sum_{t=1}^{T}\sum_{p=1}^{d}\frac{1}{2\eta_{t,p}}\big[(\theta_{t,p}-\theta_p^*)^2-(\theta_{t+1,p}-\theta_p^*)^2\big] + \sum_{t=1}^{T}\sum_{p=1}^{d}\frac{\eta_{t,p}}{2}g_{t,p}^2\\ &= \sum_{p=1}^{d}\Big[\frac{1}{2\eta_{1,p}}(\theta_{1,p}-\theta_p^*)^2-\frac{1}{2\eta_{T,p}}(\theta_{T+1,p}-\theta_p^*)^2\Big] + \sum_{t=2}^{T}\sum_{p=1}^{d}\Big(\frac{1}{2\eta_{t,p}}-\frac{1}{2\eta_{t-1,p}}\Big)(\theta_{t,p}-\theta_p^*)^2 + \sum_{t=1}^{T}\sum_{p=1}^{d}\frac{\eta_{t,p}}{2}g_{t,p}^2\end{aligned} \]

Sum over dimensions and iterations; telescope.

Guide

Summing over all parameter entries and all iterations bounds the total regret. The distance terms telescope, meaning consecutive terms cancel, leaving the starting distance, a correction for changing learning rates, and the accumulated sum of learning rate times gradient squared. The gradient sum is untouched by the telescoping, which is why it ends up dominating.

(F)\[ R(T) \le \sum_{p=1}^{d}\frac{D_\infty^2}{2\eta_{1,p}} + \sum_{t=2}^{T}\sum_{p=1}^{d}\Big(\frac{1}{2\eta_{t,p}}-\frac{1}{2\eta_{t-1,p}}\Big)D_\infty^2 + \sum_{t=1}^{T}\sum_{p=1}^{d}\frac{\eta_{t,p}}{2}g_{t,p}^2 \]

Bounded domain (Assumption B.2).

Guide

Assuming parameters stay in a bounded region, every distance to the optimum is replaced by the largest possible distance, D infinity. Now the first two terms depend only on the learning rates and the problem size, while the last term is still the sum of learning rate times squared gradient. That split is exactly the shape of Theorem 3.1.

(G)\[ R(T) \le \frac{dD_\infty^2}{2\eta_T^m} + \sum_{t=1}^{T}\frac{\eta_t^M}{2}\lVert\mathbf{g}_t\rVert_2^2 \]

Replace per-entry rates by their min/max.

Guide

To tidy up, every per-entry learning rate is replaced by the smallest rate at the end, eta T m, in the first term, and by the largest rate at each step, eta t M, in the gradient term. The result is a compact bound: a constant depending on dimension d and distance D, plus the sum of the maximum learning rate times the squared gradient norm.

(H)\[ \frac{R(T)}{T} \le \frac{dD_\infty^2}{2T\eta_T^m} + \frac{1}{T}\sum_{t=1}^{T}\frac{\eta_t^M}{2}\lVert\mathbf{g}_t\rVert_2^2 \]

Average regret = Theorem 3.1 / B.3.

Guide

Dividing by T gives average regret and completes the proof; this line is Theorem 3.1 itself. The first term fades like one over T, so for long training the average squared gradient norm is what limits convergence. This is the formal reason QVGen adds the helper phi: it lowers the gradient norm, as Figure 3 then confirms empirically.

(I)\[ \theta_{t+1} = \theta_t - \eta_t\mathbf{g}_t,\qquad \mathbf{g}_t := \nabla F(\theta_t) \]

Non-convex analysis (App. C): fixed objective \(F\).

Guide

Appendix C redoes the analysis without assuming convexity. Here the objective is a single fixed function F, and the update is ordinary gradient descent, with g t defined as the gradient of F at the current parameters. This setting is closer to real deep-network training and checks that the gradient-norm argument does not depend on the convexity idealisation.

(J)\[ \lVert\nabla F(\theta)-\nabla F(\theta')\rVert_2 \le L\lVert\theta-\theta'\rVert_2 \]

Assumption C.1: \(L\)-smoothness (here \(L\) is a constant, not the low-rank matrix).

Guide

This is the L-smoothness assumption. The gradient cannot change faster than a constant L times the distance between two parameter points. Careful with the letter: this L is a smoothness constant, not the low-rank matrix L from the method. Smoothness is the standard condition that makes a small gradient step reliably reduce the loss.

(K)\[ F(\theta') \le F(\theta) + \nabla F(\theta)^{\top}(\theta'-\theta) + \frac{L}{2}\lVert\theta'-\theta\rVert_2^2 \]

Equivalent descent inequality.

Guide

This descent inequality is an equivalent form of smoothness. The loss at a new point is at most the loss at the old point, plus the gradient dotted with the step, plus L over two times the squared step length. It upper-bounds the loss with a simple bowl-shaped curve, which the proof uses to show every gradient step makes progress.

(L)\[ 0 \lt \eta^m \le \eta_t \le \eta^M \le \frac{1}{L}\quad\forall t \]

Assumption C.2: bounded learning rates.

Guide

This assumption keeps learning rates in a safe range. Every learning rate eta t lies between a positive minimum eta m and a maximum eta M, and the maximum is at most one over the smoothness constant L. Rates that are too large could overshoot, so this cap guarantees each gradient step actually lowers the loss.

(M)\[ \frac{1}{T}\sum_{t=1}^{T}\lVert\mathbf{g}_t\rVert_2^2 \le \frac{2\big(F(\theta_1)-F^\star\big)}{T\eta^m} \]

Theorem C.4 (with \(F\ge F^\star\), Assumption C.3): average squared gradient norm is \(O(1/T)\).

Guide

Theorem C.4 is the non-convex counterpart of Theorem 3.1. The average squared gradient norm over T steps is at most two times the gap between the starting loss and the best possible loss, divided by T times the minimum learning rate. So it falls like one over T. The paper reads it the same way: smaller gradient norms mean a tighter bound after a finite number of steps.

(N)\[ \min_{1\le t\le T}\lVert\mathbf{g}_t\rVert_2^2 \le \frac{1}{T}\sum_{t=1}^{T}\lVert\mathbf{g}_t\rVert_2^2 \xrightarrow{T\to\infty} 0 \]

Convergence to a first-order stationary point.

Guide

The smallest squared gradient norm seen during training is no larger than the average, and the average goes to zero as training gets longer. So training reaches a first-order stationary point, a place where the gradient vanishes. This is the standard convergence guarantee for non-convex optimisation, restated here to support the paper's gradient-norm focus.

(O)\[ F(\theta_{t+1}) \le F(\theta_t) + \nabla F(\theta_t)^{\top}(\theta_{t+1}-\theta_t) + \frac{L}{2}\lVert\theta_{t+1}-\theta_t\rVert_2^2 = F(\theta_t) - \eta_t\lVert\mathbf{g}_t\rVert_2^2 + \frac{L}{2}\eta_t^2\lVert\mathbf{g}_t\rVert_2^2 = F(\theta_t) - \eta_t\Big(1-\frac{L\eta_t}{2}\Big)\lVert\mathbf{g}_t\rVert_2^2 \]

Plug the update into the descent inequality.

Guide

The proof of Theorem C.4 begins by plugging the gradient descent step into the descent inequality. After simplifying, the new loss is at most the old loss minus eta t times one minus L eta t over two, times the squared gradient norm. In words, each step lowers the loss by an amount proportional to the squared gradient, as long as the learning rate is not too large.

(P)\[ F(\theta_{t+1}) \le F(\theta_t) - \frac{\eta_t}{2}\lVert\mathbf{g}_t\rVert_2^2 \]

Since \(\eta_t\le 1/L\Rightarrow 1-L\eta_t/2\ge 1/2\).

Guide

Because the learning rate is capped at one over L, the factor one minus L eta over two is at least one half. So each step lowers the loss by at least half the learning rate times the squared gradient norm. It is a clean per-step guarantee of progress that the next line adds up over all of training.

(Q)\[ \sum_{t=1}^{T}\frac{\eta_t}{2}\lVert\mathbf{g}_t\rVert_2^2 \le F(\theta_1) - F^\star \]

Telescoping sum with \(F(\theta_{T+1})\ge F^\star\).

Guide

Summing the per-step decrease over all T steps makes the intermediate losses cancel, a telescoping sum. The total of half the learning rate times squared gradient norm is at most the starting loss minus the lowest achievable loss, F star. The loss cannot drop forever, so the gradients cannot stay large forever.

(R)\[ \frac{1}{T}\sum_{t=1}^{T}\lVert\mathbf{g}_t\rVert_2^2 \le \frac{2\big(F(\theta_1)-F^\star\big)}{T\eta^m} \]

Using \(\eta_t\ge\eta^m\) — proves (M).

Guide

Replacing each learning rate by its minimum and dividing by T turns the previous sum into an average. The average squared gradient norm is at most two times the loss gap divided by T times the minimum learning rate. This line proves Theorem C.4, the statement shown earlier as equation M.

(S)\[ \min_{1\le t\le T}\lVert\mathbf{g}_t\rVert_2^2 \le \frac{1}{T}\sum_{t=1}^{T}\lVert\mathbf{g}_t\rVert_2^2 \le \frac{2\big(F(\theta_1)-F^\star\big)}{T\eta^m} \xrightarrow{T\to\infty} 0 \]

Proves (N). Remark C.5: lowering \(\lVert\mathbf{g}_t\rVert\) tightens the finite-\(T\) bound in both settings.

Guide

This closes the non-convex proof. The minimum squared gradient norm is bounded by the average, which is bounded by a quantity that shrinks like one over T, so it tends to zero. Remark C.5 draws the practical link: in both the convex and non-convex settings, lowering the gradient norm tightens the finite-time bound, which justifies the helper phi.

(T)\[ \mathbf{W}_\Phi = \mathcal{Q}_4(\mathbf{W}_\Phi) + \mathcal{Q}_4(\mathbf{E}_1) + \mathcal{Q}_4(\mathbf{E}_2) + \mathcal{Q}_4(\mathbf{E}_3) \]

“Res. Q.” baseline decay (App. F): \(\mathbf{E}_1=\mathbf{W}_\Phi-\mathcal{Q}_4(\mathbf{W}_\Phi)\), \(\mathbf{E}_{i+1}=\mathbf{E}_i-\mathcal{Q}_4(\mathbf{E}_i)\); terms removed one per phase.

Guide

This is one of the alternative ways to remove the helper that the paper compares against, called residual quantization. W phi is written as a four-bit copy of itself plus four-bit copies of successive leftover errors E one, E two and E three, and one term is dropped per phase. Table N shows it scores below rank decay and costs about 2.6 times the GPU time.

(U)\[ \text{TOPS} = \frac{2MNK}{t_{\text{INT4GEMM}}} \div 10^{12} \]

Effective INT4 GEMM throughput for an \([M,K]\times[K,N]\) product (App. N).

Guide

This defines the throughput figure in Table R. For a matrix product of sizes M by K and K by N, the number of operations is two times M times N times K; dividing by the measured INT4 GEMM time and by ten to the twelfth gives tera-operations per second. It shows how close the kernel gets to hardware peak, separate from quantize and dequantize overhead.

(V)\[ \rho \approx \frac{1}{G + (1-G)(1-r)} \]

Amdahl-style projected speed-up if fusion removes a fraction \(r\) of non-GEMM (quant/dequant) time; \(G\) = GEMM time fraction. \(r=0.6\Rightarrow 1.18\text{–}1.38\times\); \(r\approx0.8\Rightarrow 1.25\text{–}1.57\times\).

Guide

This Amdahl-style formula projects speed-up if the quantize and dequantize steps were fused into the matrix multiply. G is the fraction of time spent in the GEMM, and r is the fraction of the remaining non-GEMM time that fusion removes. With r at 0.6 the paper projects about 1.18 to 1.38 times, and with r near 0.8 about 1.25 to 1.57 times. Kernel engineering, not only bit width, sets the real speed-up.

§6Every figure

frame 1 frame 2 frame 3 (a) BF16 girl, ash on face ruined city bg sharp, sorrowful (b) W4A4 QVGen same girl & ruins ≈ BF16 detail ✓ faithful (c) W4A4 EfficientDM washed-out teal face smeared ✗ low detail (d) W4A4 Q-DM different girl clean face ✗ semantics drift (e) W4A4 LSQ warm orange cast odd texture ✗ colour shift (f) W4A6 SVDQuant dark, murky subject barely visible ✗ broken
Fig. 1Prior 4-bit methods fail on video; QVGen W4A4 ≈ BF16. CogVideoX-2B, fixed seed, war-torn-city girl prompt. WxAy = x-bit per-channel weights, y-bit per-token activations. Schematic of the photo grid: EfficientDM / Q-DM / LSQ (QAT) and SVDQuant (PTQ, even at A6) all lose detail, colour or semantics.
Guide

Each row is three frames of one prompt and seed on CogVideoX two B, a girl in a war-torn city. The top row is BF16 and the second is QVGen at four-bit weights and activations, which keeps the same girl, ruins and detail. The four rows below are earlier methods, including SVDQuant even with six-bit activations, and they wash out colour, change the girl or turn murky. It is the paper's opening claim in one picture, drawn here as a schematic.

(a) Improving convergence with Φ x₀ (video) ε ~ N(0,I) x_τ θ_FP teacher θ_t student KD loss (6) loss landscape naiveours each linear layer of the student: W Q_b(W) s, z (LSQ) Q_b(X) Q_b(W)Q_b(X) W_Φ init W − Q_b(W) + Φ(Q_b(X)) Ŷ Thm 3.1: avg regret ≤ const/T + mean ‖g_t‖² → shrink ‖g_t‖ (b) Progressively shrinking Φ via rank-decay W_Φ SVD Σ σᵢ uᵢ vᵢᵀ → L ⊗ R · Q_b(X) γ ∈ ℝ^(n×r): keep first (1−λ)r cols, fade last λr phase 1, r=32 [1] [u] 1→0 truncate → r=16 phase 2, r=16 [1] [u] 1→0 truncate → r=8 phase 3, r=8 [1] [u] 1→0 truncate → r=4 phase 4, r=4 [1] [u] 1→0 truncate → r=2 phase 5, r=2 [u] 1→0 Φ = ∅ training time
Fig. 2QVGen overview. (a) KD-based QAT where every quantized linear layer gets an auxiliary branch Φ (WΦ initialised to W−Qb(W)); the smoother loss landscape gives smaller ‖gt‖. (b) Rank-decay: SVD → L, R; γ keeps the top (1−λ)r components and fades the lowest λr with u: 1→0; truncate; repeat until Φ=∅. Phases drawn for r=32, λ=½.
Guide

Panel a is training: the BF16 teacher and the quantized student denoise the same video, and a distillation loss compares them. Inside every student layer, the helper phi, started at W minus its quantized version, is added to the quantized path, giving a smoother loss landscape and smaller gradients. Panel b is removal: the helper is factorised by SVD, the weakest half of its columns fades out, is cut, and the cycle repeats from rank 32 down to nothing.

(a) CogVideoX-2B 0 2 4 0 500 1000 1500 2000 #training steps ‖g_t‖₂ W4A4 Q-DM W4A4 Φ 0 0.2 0.4 0 500 1000 1500 2000 #training steps ‖ε̂θ − εθ‖²_F tail (1.6K–2K): Q-DM ≈ 0.018 vs Φ ≈ 0.008 (b) Wan 1.3B 0 2 4 6 0 500 1000 1500 2000 #training steps ‖g_t‖₂ W4A4 Q-DM W4A4 Φ 0 0.2 0.4 0 500 1000 1500 2000 #training steps ‖ε̂θ − εθ‖²_F tail (1.6K–2K): Q-DM ≈ 0.035 vs Φ ≈ 0.025
Fig. 3Φ lowers the gradient norm and the loss. Upper: ‖gt‖2; lower: KD loss (Eq. 6) over 2K steps, W4A4 Q-DM vs W4A4 Φ. Φ is consistently lower (paper insets zoom steps 1.6K–2K). Shape redrawn; tail values approximate.
Guide

This is the empirical check of the theory. Upper plots show the gradient norm, lower plots the distillation loss, over two thousand training steps for plain four-bit Q-DM training versus the same training with the helper phi. On both CogVideoX two B and Wan 1.3B, phi keeps both curves lower; at the tail the CogVideoX loss is roughly 0.008 versus 0.018. The curves are redrawn and the tail values approximate, but the gap is the evidence Theorem 3.1 predicts.

CogX-2B · Attention 0 0.5 1 1 16 256 d s (log scale) σ_s ~14× smaller 99% ← 73% CogX-2B · FFN 0 0.5 1 1.5 2 1 16 256 d s (log scale) σ_s ~5× smaller 98% ← 47% Wan 1.3B · Attention 0 0.2 0.4 0.6 1 16 256 d s (log scale) σ_s ~7× smaller 98% ← 33% Wan 1.3B · FFN 0 0.25 0.5 0.75 1 16 256 d s (log scale) σ_s ~4× smaller 99% ← 33% 0 step (init) 1K steps 2K steps
Fig. 4WΦ collapses to low rank during QAT. Average singular values σs (s=1…210 and σd) over Attention / FFN layers at 0, 1K, 2K steps. E.g. CogX Attention: 73% of σs are ~14× below σ1 at init, rising to 99% at 2K steps → low-σ directions can be dropped. Points read off the plot (approx.).
Guide

Each panel plots the average singular values of the helper weight, largest on the left and smallest on the right on a log scale, for attention and feed-forward layers of two models, at zero, one thousand and two thousand steps. Most values sit far below the top one, and the share keeps growing: in CogVideoX attention it rises from 73 percent at the start to 99 percent after two thousand steps. This justifies keeping rank 32 and then removing it.

(a) CogVideoX1.5-5B Dyn. Spatial Rel. 22 Composition 52 Diversity 62 Human Clothes 89 Human Identity 85 Human Anatomy 91 Multi-View Cons. 26 Material 81 Thermotics 66 Mechanics 79 Instance Pres. 70 Motion Rationality 38 Camera Motion 38 Complex Plot 13 Complex Landscape 23 Human Interaction 66 Motion Order 19 Dyn. Attribute 26 (b) Wan 14B Dyn. Spatial Rel. 38 Composition 54 Diversity 60 Human Clothes 95 Human Identity 81 Human Anatomy 99 Multi-View Cons. 39 Material 77 Thermotics 68 Mechanics 74 Instance Pres. 71 Motion Rationality 43 Camera Motion 40 Complex Plot 15 Complex Landscape 21 Human Interaction 81 Motion Order 41 Dyn. Attribute 49 BF16W4A4 QVGenW3A3 QVGen
Fig. 5VBench-2.0 on huge models: W4A4 ≈ BF16 (~1% drop in total score), W3A3 collapses on many axes. 18 dimensions; grey numbers are the per-axis scale maxima printed in the figure. Polygon shapes redrawn from the plot (W3A3 keeps human anatomy/clothes but loses landscape, interaction, motion order, multi-view).
Guide

These radar charts score the large models, CogVideoX 1.5 five B and Wan fourteen B, on eighteen VBench-2.0 dimensions; grey numbers mark each axis's maximum. The four-bit QVGen polygon nearly overlaps BF16, with about a one percent drop in total score. The three-bit polygon keeps human anatomy and clothing but shrinks on landscape, interaction, motion order and multi-view consistency. The shapes are redrawn, so read the pattern rather than exact values. Three bits is too far at this scale.

(a) model size (GB) ↓ 0 1 2 3 2.64 BF16 1.3B 0.67 W4A4 1.3B 26.61 BF16 14B 6.67 W4A4 14B 3.94× 3.99× (b) latency / step (s) ↓ 0 2 4 4.02 BF16 1.3B 3.32 W4A4 1.3B 80.25 BF16 14B 55.89 W4A4 14B 1.21× 1.44× (c) latency w/ sparse attn (s) ↓ 0 2 4 3.08 SVG 1.3B 2.53 SVG+W4A4 1.3B 47.68 SVG 14B 30.51 SVG+W4A4 14B 1.31× 1.70× 1.68× 2.63× 14B bars drawn at 1/10 (a) and 1/20 (b, c) scale; labels are real values. Ratios vs BF16.
Fig. 6~4× smaller, modest speed-up. (a) Model size, (b) per-step DiT latency on one A800 with a QuaRot-derived W4A4 CUDA kernel: 1.21× (Wan 1.3B), 1.44× (Wan 14B). (c) Combined with SVG sparse attention: 1.70× / 2.63× vs 1.31× / 1.68× for SVG alone. Note: the printed 1.70× does not equal 4.02/2.53 (=1.59×); values transcribed as printed.
Guide

For Wan 1.3B and fourteen B, panel a shows four-bit weights make the models about four times smaller, 26.6 down to 6.7 gigabytes for fourteen B. Panel b: per-step latency on an A800 improves only 1.21 and 1.44 times with a real W four A four kernel. Panel c: stacking sparse attention on top gives larger gains, printed as 1.70 and 2.63 times. Memory savings are dramatic; speed gains are modest without attention tricks.

(a) CogVideoX-2B 0 0.2 0.4 0.6 0 500 1000 1500 2000 #training steps training loss W4A4 Q-DM W4A4 Φ W4A4 EfficientDM W4A4 LSQ W4A4 QVGen (b) Wan 1.3B 0 0.2 0.4 0 500 1000 1500 2000 #training steps training loss W4A4 Q-DM W4A4 Φ W4A4 EfficientDM W4A4 LSQ W4A4 QVGen
Fig. ATraining loss for five 4-bit QAT methods. QVGen and Φ (Sec. 3.1) converge faster and lower (CogX inset 0.01–0.02, Wan inset 0.02–0.04). LSQ uses the plain noise-prediction objective, not Eq. (6). Shape and tail ordering redrawn schematically.
Guide

This plots training loss over two thousand steps for five four-bit training methods on CogVideoX two B and Wan 1.3B. QVGen and the helper-only variant drop fastest and settle lowest, while LSQ, Q-DM and EfficientDM stay higher. LSQ trains on the raw noise-prediction loss, so its curve is not strictly comparable. The plot is a schematic redraw, and it supports the same convergence story as Figure 3 with more baselines.

CogVideoX-2B Wan 1.3B (a,b) BF16 willow trees, lake dog runs, sunglasses (c,d) W4A16 slight blur, same scene same dog, minor drift (e,f) W16A4 pure noise noise, blob of dog
Fig. BActivations are the hard part. Min-max per-channel W4A16 stays close to BF16; per-token W16A4 turns the video into noise on both CogVideoX-2B and Wan 1.3B — strong support for weight-only low-bit on the thesis side.
Guide

Activations, not weights, are the hard part. Each column is one model and each row one setting: BF16, four-bit weights with sixteen-bit activations, and sixteen-bit weights with four-bit activations. W four A sixteen stays close to the original with slight blur, while W sixteen A four turns both videos into noise. For the thesis this is the strongest single argument in the paper for weight-only INT4 or INT8 compression in NNCF, keeping activations in higher precision.

frame 1 frame 2 frame 3 (a) BF16 wooden toy ship blue carpet waves clear masts (b) W3A3 QVGen ship intact carpet ok ✓ close to BF16 (c) W3A3 EfficientDM ship warped saturated blue ✗ shape lost (d) W3A3 Q-DM flat, melted hull blue wash ✗ distorted (e) W3A3 LSQ grey blurry blob ✗ unusable
Fig. C3-bit CogVideoX-2B (toy ship). Only QVGen keeps the ship recognisable; baselines melt or blur it.
Guide

Three frames of a wooden toy ship on a blue carpet, generated by CogVideoX two B at three-bit weights and activations. BF16 is on top, QVGen second, then EfficientDM, Q-DM and LSQ. Only QVGen keeps a recognisable ship; the others warp, melt or blur it into a grey blob. It shows the method's advantage grows at more aggressive bit widths on small models, matching the three-bit rows of Table 1.

frame 1 frame 2 frame 3 (a) BF16 white SUV, dirt road pines, dust curving road (b) W3A3 QVGen SUV on road scene kept ✓ plausible (c) W3A3 EfficientDM hazy SUV washed colours △ degraded (d) W3A3 Q-DM SUV fades out foggy ✗ object lost (e) W3A3 LSQ wrong view, sky ✗ off-prompt
Fig. D3-bit Wan 1.3B (SUV on dirt road). QVGen keeps object and scene; Q-DM/LSQ lose the car or view.
Guide

Same layout on Wan 1.3B at three bits, with a white SUV driving along a dirt road. QVGen keeps both the car and the scene. EfficientDM gets hazy and washed out, Q-DM loses the car into fog, and LSQ drifts to a wrong view of the sky. Together with the ship example, it shows QVGen is the only method still usable at W three A three on the one-to-two-billion models.

early mid late (a) BF16 sandcastle, beach castle grows moat + flags (b) W3A3 QVGen castle shape kept neon cyan/red noise ✗ colours broken
Fig. E3-bit CogVideoX1.5-5B (growing sandcastle). Structure survives but colours become neon noise — 3 bits is too far for huge models.
Guide

A growing sandcastle from CogVideoX 1.5 five B, shown early, middle and late, with BF16 above and three-bit QVGen below. The castle's shape survives, but colours break into neon cyan and red noise. This is the failure behind the collapsed three-bit polygon in Figure 5 and the weak W3A3 rows in Table 2: at three bits, even trained quantization breaks on large models.

early mid late (a) BF16 retriever left of apple runs to apple stops, close-up (b) W3A3 QVGen dog on flat green apple missing ✗ low detail
Fig. F3-bit Wan 14B (retriever and apple). Dog remains but detail and the apple vanish — W3A3 degrades clearly on 14B.
Guide

A golden retriever running to an apple, from Wan fourteen B, BF16 above and three-bit QVGen below. The dog remains, but the background flattens to green and the apple disappears. Like the sandcastle, this shows three bits is past the limit for large models even with full training, which is why the thesis box treats four-bit weights as the floor.

prompt 1: husky prompt 2: medieval hall (a/f) BF16 husky on snow mound candle-lit hall (b/g) W4A4 QVGen ≈ BF16 husky ≈ BF16 hall, candle (c/h) W4A4 EffDM darker, softer extra candles (d/i) W4A4 Q-DM different pose dim, altered layout (e/j) W4A4 LSQ blue tint flat, blurry flame
Fig. G4-bit CogVideoX-2B. QVGen tracks BF16; prior QAT changes tone, pose or layout.
Guide

Two prompts on CogVideoX two B at four bits: a husky on snow and a candle-lit medieval hall. Columns go BF16, QVGen, EfficientDM, Q-DM and LSQ. QVGen tracks BF16 closely. The older training methods change tone, pose or layout: darker images, extra candles, a different dog pose, a blue tint. These supplement Figure 1 with more examples of the same four-bit claim.

prompt 1: man prompt 2: painter (a/f) BF16 angry man, mountains old painter by sea (b/g) W4A4 QVGen same man & scene painter + canvas ✓ (c/h) W4A4 EffDM darker, blue cast blue night tone (d/i) W4A4 Q-DM other face, grey different layout (e/j) W4A4 LSQ tight close-up face close-up, no sea
Fig. H4-bit Wan 1.3B. Same pattern: QVGen faithful, baselines drift in colour or composition.
Guide

Same layout on Wan 1.3B at four bits, with an angry man in the mountains and an old painter by the sea. QVGen stays faithful to both, painter and canvas included. EfficientDM shifts to blue night tones, Q-DM changes the face or layout, and LSQ zooms into close-ups that lose the sea. The pattern repeats across models, so the four-bit result is not a single lucky prompt.

prompt 1 prompt 2 (a) BF16 squirrel behind rock tabby cat in meadow (b) W4A4 QVGen squirrel darts out ✓ cat runs ✓ ≈ BF16
Fig. I4-bit CogVideoX1.5-5B. QVGen ≈ BF16 on motion-heavy prompts (squirrel, running cat).
Guide

Four-bit QVGen on the larger CogVideoX 1.5 five B, with motion-heavy prompts: a squirrel darting from behind a rock and a tabby cat running through a meadow. The quantized frames match BF16 in both subject and motion. Since video quantization struggles most with motion, as Table D hints, this is the visual counterpart of the near-BF16 four-bit scores in Table 2.

prompt 1 prompt 2 (a/c) BF16 person eating ice cream garden orbit shot (b/d) W4A4 QVGen ≈ BF16, smile kept ≈ BF16 garden
Fig. J4-bit Wan 14B. QVGen ≈ BF16 (ice-cream person, garden camera orbit).
Guide

Four-bit QVGen on Wan fourteen B for two prompts: a person eating ice cream and a camera orbiting a garden. Both look close to BF16, keeping the smile and the orbit. It confirms that W four A four holds on the largest model tested, in contrast to the three-bit failures in Figures E and F.

§7Results

Table 1 — VBench, 1–2B models. † PTQ, * QAT, ♣ per-group (g=64) with some layers kept FP (SVDQuant official setting). Bold teal = best quantized result within each bit-width block (W4A6/W4A4 block, W3A3 block).
MethodW/AImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
CogVideoX-2B (CFG 6.0, 480p, 8 fps)
Full Prec.16/1659.1554.4997.4367.7894.7992.8236.2425.06
Full Fine-tuning16/1661.3456.5398.5965.3993.8493.4334.9925.50
ViDiT-Q †4/654.7243.0192.1843.2290.7681.0226.2520.41
SVDQuant †4/658.2747.0695.2840.8392.4187.4527.6921.34
SVDQuant †♣4/451.6049.4097.6942.2294.0391.7825.6722.89
LSQ *4/458.7354.2097.5745.0092.9792.4124.0623.17
Q-DM *4/454.9652.7198.0048.6193.8291.8628.0223.87
EfficientDM *4/455.9651.9798.0346.6794.1091.7027.7624.28
QVGen (Ours) *4/460.1654.6198.0667.2294.3893.0131.4224.61
LSQ *3/356.4640.3597.980.5694.0889.184.8013.80
Q-DM *3/350.8840.4198.035.5693.9387.757.3315.98
EfficientDM *3/352.8644.5897.1328.6193.1588.2615.4220.42
QVGen (Ours) *3/358.3650.5498.3753.8994.5590.5023.8522.92
Wan 1.3B (CFG 5.0, 480p, 16 fps)
Full Prec.16/1664.3058.2197.3770.2895.9493.8428.0524.67
Full Fine-tuning16/1664.5958.8597.4683.6194.3093.6827.5524.86
ViDiT-Q †4/656.2450.1894.8152.4389.6782.5313.4519.58
SVDQuant †4/658.1651.2797.0549.4493.7491.7114.1823.26
SVDQuant †♣4/457.5746.3094.2172.2293.1677.9612.7321.91
LSQ *4/459.1149.0998.3571.1192.6691.6710.3818.83
Q-DM *4/460.4052.5097.2276.6793.3789.2613.2821.63
EfficientDM *4/460.7053.5796.1856.3993.7491.7011.7721.19
QVGen (Ours) *4/463.0854.6798.2577.7894.0892.5715.3223.01
LSQ *3/358.8046.8698.2223.6191.8689.420.8915.51
Q-DM *3/356.1944.9595.1376.9492.0983.821.7916.89
EfficientDM *3/342.3233.5296.5070.2892.1074.790.0411.38
QVGen (Ours) *3/367.3549.7198.9384.1493.6292.255.7120.11
Guide

This is the main results table for the one-to-two-billion models, with eight VBench scores per method; higher is better. Daggers mark post-training methods and asterisks training-based ones. At W four A four, QVGen is the best quantized method on most columns and, on Wan 1.3B, even beats BF16 on dynamic degree. At W three A three the baselines collapse, for example LSQ reaching a dynamic degree of 0.56 on CogVideoX, while QVGen stays usable. This is the paper's central evidence.

CogVideoX-2B · Overall Consistency 0 10 20 BF16 25.06 LSQ Q-DM EffDM QVGen Wan 1.3B · Overall Consistency 0 10 20 BF16 24.67 LSQ Q-DM EffDM QVGen W4A4W3A3
Chart Overall Consistency from Tab. 1. QVGen is the best QAT method at both W4A4 and W3A3 on both models; the dashed line is BF16.
Guide

Bars show the overall consistency score from Table 1 for LSQ, Q-DM, EfficientDM and QVGen, at four bits and three bits, on CogVideoX two B and Wan 1.3B; the dashed line is BF16. QVGen is the tallest bar in every group, close to the line at four bits, and the gap to the baselines widens at three bits.

Table 2 — VBench for huge models (QVGen only).
MethodW/AImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
CogVideoX1.5-5B (CFG 6.0, 720p, 16 fps)
Full Prec.16/1666.2559.4998.4259.7296.5795.2839.1426.18
QVGen (Ours)4/466.7659.5298.3864.4495.8394.8828.4724.45
QVGen (Ours)3/354.4435.8597.2358.8996.4890.1713.2717.15
Wan 14B (CFG 5.0, 720p, 16 fps)
Full Prec.16/1667.8961.5497.3270.5696.3194.0833.9126.17
QVGen (Ours)4/466.8759.4197.7176.1196.5094.4519.8425.70
QVGen (Ours)3/348.7029.7399.0593.3397.3494.712.8113.97
Guide

This table covers the large models, CogVideoX 1.5 five B and Wan fourteen B, and only QVGen is run. At four bits most scores sit near BF16, for example an overall consistency of 25.70 against 26.17 on Wan fourteen B, although scene consistency drops noticeably. At three bits aesthetic quality and scene consistency collapse, down to 2.81 for scene consistency on Wan fourteen B. Four bits is the practical limit at scale.

Table 3 — Components (W4A4 Wan 1.3B). Naive = KD-based QAT.
MethodImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
Naive60.4052.5076.6713.2821.63
+Φ63.4154.7577.8915.5122.98
+Rank63.0854.6777.7815.3223.01
Guide

The component ablation on Wan 1.3B at four bits. Naive is plain distillation training; plus phi adds the helper and keeps it; plus rank adds the rank-decay that removes it. Adding phi lifts every score, with overall consistency going from 21.63 to 22.98. Removing phi through rank decay costs almost nothing, 23.01 overall. So the benefit survives even after the helper is gone, which is the whole point of the design.

Table 4 — Shrinking ratio λ (λ=1: decay all of WΦ at once; ½ used).
λImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
1/463.0254.2376.8415.1822.85
1/263.0854.6777.7815.3223.01
3/462.8954.6277.9115.0422.89
161.0552.4876.4813.8221.81
Guide

This ablation varies the shrinking ratio lambda, the fraction of the helper's rank removed in each phase. One quarter, one half and three quarters all perform similarly, with one half slightly best at 23.01 overall consistency. Lambda equal to one, removing everything in a single phase, drops to 21.81, almost back to the naive baseline. Gradual removal matters.

Table 5 — Initial rank r (0 = Naive; 32 used).
rImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
060.4052.5076.6713.2821.63
862.7154.4774.6214.4222.81
1662.9954.6276.5814.8423.00
3263.0854.6777.7815.3223.01
6463.0654.3076.7415.4022.92
Guide

This ablation varies the helper's starting rank r, where zero means no helper. Any helper helps: rank 8 already lifts overall consistency from 21.63 to 22.81. Gains flatten around rank 16 to 32, and rank 64 brings nothing more. Rank 32 is chosen, consistent with Figure 4's finding that only a few singular directions matter.

Table 6 — Decay strategies (Sparse/Wanda need 1.8×, MaskLLM 2.1× training time).
DecayImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
Linear60.8252.8173.1913.3421.87
Sparse61.1554.0674.2413.8622.52
Sparse w/ Wanda61.4354.0874.3613.9422.48
Sparse w/ MaskLLM61.3654.1274.8214.1522.57
Res. Q.61.7254.0172.4114.1722.31
Rank63.0854.6777.7815.3223.01
Guide

This table compares ways of removing the helper. Linear simply scales all of it down, sparse variants prune entries, with Wanda and MaskLLM as smarter pruning criteria, and residual quantization peels off quantized layers of it. Rank decay wins on every column, 23.01 overall versus at most 22.57 for the others, while the pruning methods also need 1.8 to 2.1 times the training time. Removing whole weak singular directions is both better and cheaper.

Overall Cons. vs λ (Tab. 4) 21.5 22 22.5 23 22.85 23.01 22.89 21.81 1/4 1/2 3/4 1 shrinking ratio λOverall Cons. vs initial rank r (Tab. 5) 21.5 22 22.5 23 21.63 22.81 23.00 23.01 22.92 0 8 16 32 64 initial rank r (0 = naive)
Chart Ablation sweet spots. λ=½ and r=32 maximise Overall Consistency; λ=1 (remove Φ in one shot) loses almost all the gain.
Guide

Two line charts summarise Tables 4 and 5. On the left, overall consistency against the shrinking ratio lambda peaks at one half and falls sharply at one, where the helper is removed in one shot. On the right, against starting rank, the score climbs from 21.63 with no helper and plateaus from rank 16 to 32. Both defaults sit at the sweet spot.

Table 7 — Training cost (H100). Lower is better; QVGen ≈ Q-DM +2% time, +1% memory.
ModelLSQ daysQ-DM daysEffDM daysQVGen daysLSQ GB/GPUQ-DM GB/GPUEffDM GB/GPUQVGen GB/GPU
CogVideoX-2B8.649.308.979.4462.7867.2644.2767.93
Wan 1.3B9.9210.9210.6811.1163.0466.1542.7466.67
Guide

Training cost on H100 GPUs for the four training methods on the two small models: GPU-days and memory per GPU. QVGen costs about 9.4 and 11.1 GPU-days, only about two percent more time and one percent more memory than Q-DM. The helper is cheap to train with. Still, around ten GPU-days per small model is far beyond a bachelor thesis project, which the thesis box stresses.

Appendix tables

Table A — H100 GPU-days of QVGen (+ extra vs naive KD-QAT).
ModelGPU-days
CogVideoX-2B9.44 (+0.14)
Wan 1.3B11.11 (+0.18)
CogVideoX1.5-5B~51
Wan 14B~182
Guide

Total GPU-days of QVGen per model, with the extra cost over plain distillation training in brackets. The small models need about 9 to 11 GPU-days, only 0.14 to 0.18 more than naive training. The large models need about 51 days for CogVideoX five B and about 182 for Wan fourteen B. For a model the size of LTX-2.3, full quantization-aware training is out of reach, which is why the thesis leans on post-training quantization.

Table B — W6A6 Wan 1.3B (Imaging, Aesthetic, Dynamic, Scene, Overall).
MethodImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
Full Prec.64.3058.2170.2828.0524.67
SVDQuant62.0554.3771.0823.2524.56
LSQ63.2057.8376.3324.8624.07
Q-DM62.8956.2474.6425.3825.12
EfficientDM63.3856.4268.6821.4723.57
QVGen64.2757.6978.0226.8425.53
Guide

A milder setting: six-bit weights and activations on Wan 1.3B. Here every method is close to BF16, and QVGen scores highest on most columns, even slightly above full precision on overall consistency, 25.53 versus 24.67. The point is that QVGen does not only rescue extreme bit widths; it also holds up where the others already work. At six bits the choice of method matters much less.

Table C — Avg. gradient norm, W4A4 Q-DM, same recipe, 2K steps.
ModelAvg ‖g_t‖₂#Params (B)
SD3-medium (image)0.20472.0
CogVideoX-2B (video)0.32832.0
Guide

This is the numeric source of the left bars in the problem figure. Both models have two billion parameters and use the same four-bit Q-DM training recipe for two thousand steps. The video model's average gradient norm, 0.3283, is about 1.6 times the image model's 0.2047. That is the paper's evidence that video quantization-aware training is intrinsically harder to converge.

Table D — Motion content of 8K training clips (W4A4 QVGen, CogVideoX-2B).
Training videosAvg ‖g_t‖₂Imaging Q.Dynamic Deg.
high-motion0.197257.4768.21
low-motion0.176860.6362.54
half + half0.182160.1267.08
Guide

This table trains four-bit QVGen on CogVideoX two B with eight thousand clips of high motion, low motion, or half of each. High-motion data gives the largest gradient norm, 0.1972, and the lowest imaging quality, but the highest dynamic degree. The mixed set balances both. Motion makes training harder, which is why the paper uses mixed data.

Table E — Gradient clipping threshold (W4A4 Wan 1.3B; 1.0 = Q-DM baseline).
ClipImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
1.060.4052.5076.6713.2821.63
0.560.5852.9576.5013.2821.71
0.156.6851.0671.0012.7821.42
Guide

An obvious alternative to the helper is simply clipping gradients to keep them small. This table tests it on Wan 1.3B at four bits, where a threshold of 1.0 is the Q-DM baseline. Clipping at 0.5 changes almost nothing, and 0.1 makes things worse. So artificially capping gradients is no substitute; the gradient norm has to come down because the model is easier to fit, which is what phi achieves.

Table F — Combining with SVDQuant (W4A4 Wan 1.3B). ♡ = DM weights frozen.
MethodImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
Full Prec.64.3058.2170.2828.0524.67
SVDQuant♣57.5746.3072.2212.7321.91
QVGen63.0854.6777.7815.3223.01
QVGen w/ SVDQuant63.6456.2377.4217.6523.89
QVGen♡ w/ SVDQuant61.3852.7675.8514.1222.47
Guide

This table combines QVGen with SVDQuant, the post-training method that keeps a permanent low-rank branch in high precision. SVDQuant alone at four bits reaches 21.91 overall consistency, QVGen alone 23.01, and the two together 23.89, the best. Freezing the diffusion weights and training only the other parts, marked by a heart, loses most of that gain. The two ideas are complementary, though keeping a branch means some inference overhead.

Table G — Fidelity to BF16 videos, W4A4 (CogX-2B | Wan 1.3B).
MethodPSNR↑SSIM↑LPIPS↓PSNR↑SSIM↑LPIPS↓
SVDQuant11.060.38290.630510.140.35950.6907
LSQ11.750.41580.618711.650.47430.6235
Q-DM12.070.42700.624011.220.46570.5942
EfficientDM11.910.43870.622011.290.39260.6232
QVGen16.740.60850.412715.940.57820.4887
Guide

Instead of VBench quality, this table measures how closely the four-bit videos match the BF16 videos from the same seed, using PSNR and SSIM, where higher is better, and LPIPS, where lower is better. QVGen is far ahead on both models, for example a PSNR of 16.74 against about 12 for the baselines on CogVideoX. This fidelity check is cheap and easy to reuse when comparing int8, int4 and mixed-precision LTX variants.

Table H — W4A4 CogVideoX1.5-5B vs baselines (transcribed as printed; the rows duplicate Tab. 6 Sparse/Res. Q./Rank values, likely a typesetting error in the paper).
MethodImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
Full Prec.61.1554.0674.2413.8622.52
Q-DM61.7254.0172.4114.1722.31
EfficientDM61.7254.0172.4114.1722.31
QVGen63.0854.6777.7815.3223.01
Guide

Handle this table with caution. It is meant to compare methods at four bits on CogVideoX 1.5 five B, but its rows repeat numbers from the decay-strategy ablation, and two baselines are identical. The tab transcribes it as printed and flags it as a likely typesetting error in the paper, so do not draw conclusions from it.

Table I — Annealing function for u (all 1→0; cosine used). All comparable → robust.
uImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
Cosine63.0854.6798.2577.7894.0892.5715.3223.01
Logarithmic63.1554.4698.0277.5293.9892.5914.9922.87
Exponential63.0454.4897.8877.8193.9692.5615.3222.66
Square63.0254.5998.4177.2494.1292.5715.1822.94
Linear63.1054.6398.3177.4494.0692.5815.2422.91
Guide

This ablation swaps the curve that fades u from one to zero: cosine, logarithmic, exponential, square or linear. All five land within a fraction of a point of each other, with cosine slightly best on overall consistency at 23.01. The method is robust to this detail; what matters is that the fade is gradual, not its exact shape.

Table J — Initialisation of WΦ (W4A4). Error-based and layer-wise-trained init are equal; zero init slightly worse; random init hurts badly.
InitImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
CogVideoX-2B
W − Q_b(W)60.1654.6167.2231.4224.61
Layer-wise train59.9754.8466.7131.1425.02
059.8654.4765.5931.3224.59
Random49.4237.6826.576.2411.68
Wan 1.3B
W − Q_b(W)63.0854.6777.7815.3223.01
Layer-wise train63.2354.6777.5615.3823.00
062.8054.5977.6915.2822.98
Random54.4144.1434.443.1310.17
Guide

This table tests how the helper weight is initialised on both small models. Starting from the rounding error W minus its quantized version, or from a layer-wise pre-trained helper, gives the same results. Zero initialisation is only slightly worse. Random initialisation is disastrous, with overall consistency falling to about 11 or 10. A sensible starting point is essential, and the error-based one is free.

Table K — Complete component ablation (8 dims). −Decay ≈ +Φ → rank 32 suffices; +Rank ≈ −Decay → decay is almost free.
MethodImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
Naive60.4052.5097.2276.6793.3789.2613.2821.63
+Φ63.4154.7598.4077.8994.3693.2915.5122.98
+Rank63.0854.6798.2577.7894.0892.5715.3223.01
−Decay (r=32, never removed)63.3254.6498.3477.7994.1592.6115.4023.03
Guide

This is the full eight-column version of the component ablation, with one extra row: minus decay, where the rank-32 helper is kept and never removed. Minus decay scores almost the same as plus phi, so rank 32 captures what a full helper does. Plus rank, which removes it, matches minus decay, 23.01 versus 23.03. Removing the helper is essentially free, so the deployed model loses nothing by shipping without it.

Table L — Complete shrinking-ratio results.
λImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
1/463.0254.2397.8976.8494.0292.1315.1822.85
1/263.0854.6798.2577.7894.0892.5715.3223.01
3/462.8954.6298.1577.9193.8991.6315.0422.89
161.0552.4897.3176.4893.4290.0413.8221.81
Guide

The complete shrinking-ratio results across all eight VBench columns. They confirm the short Table 4: lambda of one half is best or tied on most columns, and lambda of one, removing the helper at once, is worst almost everywhere, with subject consistency dropping to 90.04. Gradual halving is the safe choice.

Table M — Complete initial-rank results.
rImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
060.4052.5097.2276.6793.3789.2613.2821.63
862.7154.4797.9574.6293.7691.0514.4222.81
1662.9954.6298.3176.5893.9291.8214.8423.00
3263.0854.6798.2577.7894.0892.5715.3223.01
6463.0654.3098.1876.7494.0191.4915.4022.92
Guide

The complete initial-rank results across all eight columns. Rank 32 is best or near best everywhere; rank 64 matches on scene consistency but slips elsewhere, and the no-helper row, rank zero, is clearly worst. It backs the short Table 5: a modest rank is enough because the helper's useful information is concentrated in a few directions.

Table N — Complete decay-strategy results (Sparse 1.81×, Res. Q. 2.60× the GPU-days of Rank).
DecayImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
Sparse61.1554.0697.4574.2493.3290.6313.8622.52
Res. Q.61.7254.0197.6272.4193.4691.2414.1722.31
Rank63.0854.6798.2577.7894.0892.5715.3223.01
Guide

The complete decay-strategy comparison across all eight columns, for sparse pruning, residual quantization and rank decay. Rank decay leads on every column. The caption adds the cost side: sparse needs 1.81 times and residual quantization 2.60 times the GPU-days of rank decay. It is both better and cheaper.

Table O — Which components γ decays. Removing small-σ directions is clearly best.
γImaging Q.Aesthetic Q.Motion Smooth.Dynamic Deg.Backgr. Cons.Subject Cons.Scene Cons.Overall Cons.
concat([1], [u]) — fade smallest σ (ours)63.0854.6798.2577.7894.0892.5715.3223.01
Random ×360.96±0.4153.13±0.6797.40±0.2476.45±0.0893.40±0.0390.76±0.3013.77±0.2221.92±0.51
concat([u], [1]) — fade largest σ60.5652.6197.2875.3693.3589.4713.4622.24
Guide

This ablation asks which helper components should be faded. Fading the smallest singular directions, the paper's choice, gives 23.01 overall consistency. Fading random directions, averaged over three runs, gives about 21.9, and fading the largest directions gives 22.24. The ordering from the SVD matters: dropping the weakest directions first lets the model absorb their loss gently.

Table P — Duration of each decay phase (epochs), W4A4 Wan 1.3B.
EpochsImaging Q.Aesthetic Q.Dynamic Deg.Scene Cons.Overall Cons.
3/463.0854.6777.7815.3223.01
163.0755.0977.5415.2923.03
3/263.1154.5878.1515.3623.01
Guide

This table varies how long each decay phase lasts, from three quarters of an epoch to one and a half epochs, on Wan 1.3B at four bits. All three settings score within a few hundredths of each other. The schedule is not sensitive to phase length, so the shortest option, three quarters of an epoch, is kept as the cheapest.

Table Q — W4A4 SD3-medium (image). FID/CLIP on MJHQ-30K, GenEval.
MethodFID↓CLIP↑GenEval↑
Full Prec.11.9227.830.62
LSQ14.8727.720.56
EfficientDM15.2327.110.61
Q-DM13.8227.680.59
QVGen12.2427.850.61
Guide

QVGen applied to an image model, SD3-medium, at four bits, scored with FID, where lower is better, CLIP score and GenEval. QVGen reaches an FID of 12.24 against 11.92 for full precision, clearly better than the baselines at 13.8 to 15.2, while matching on CLIP and GenEval. The method is not video-specific; it generalises to image diffusion transformers.

Table R — Per-op latency (ms) and INT4 GEMM throughput on A800, Wan 1.3B shapes. Quant+DeQuant = 25–45% of op time (no fused epilogues).
Op(M, N, K)QuantINT4GEMMDeQuantTotalQuant %GEMM %DeQ %TOPS
q1/k1/v1/o1/q2/o2(32760, 1536, 1536)0.0410.1860.1140.34112.054.533.5831.08
k2/v2(512, 1536, 1536)0.0010.0070.0020.01011.272.316.5345.13
up proj(32760, 8960, 1536)0.0411.2460.6611.9482.1064.033.9721.76
down proj(32760, 1536, 8960)0.2321.0310.1171.38016.874.78.48872.27
Guide

This profiles each quantized linear layer shape of Wan 1.3B on an A800: time for quantizing activations, the INT4 matrix multiply, and dequantizing, plus the achieved throughput. Quantize and dequantize together take roughly a quarter to nearly half of each operation's time because they are not fused into the multiply. This overhead explains why the end-to-end speed-up in Figure 6 is modest, and equation V projects what fusion could gain.

Table S — One DiT block (torch, A800, Wan 1.3B).
Componentms%
Attention32.0851.8
Linear projections15.1424.5
Other14.6423.7
Guide

The time breakdown of one Wan 1.3B transformer block in PyTorch on an A800. Attention takes 51.8 percent, linear projections 24.5 percent, and everything else 23.7 percent. Since QVGen only quantizes the linear layers, at most about a quarter of the block's time can speed up. For LTX-2.3 on Intel hardware, it is a reminder that attention, not the linears, often dominates, so caching or sparse attention may matter more.

Table T — Linear projections (ms).
Linearms
q1/k1/v1/o1/q2/o20.977
k2/v20.038
up proj5.283
down proj3.913
Guide

The linear-projection share from Table S, split by layer type in milliseconds. The feed-forward up and down projections dominate, at about 5.3 and 3.9 milliseconds, while the attention projections are under one millisecond and the cross-attention key and value projections almost free. If only some layers get the most aggressive compression, the feed-forward layers are where it pays off.

Table U — Attention (ms).
Attentionms
Self-Attention31.48
Cross-Attention0.597
Guide

The attention share from Table S, split in milliseconds. Self-attention over the long video token sequence takes about 31.5 milliseconds, while cross-attention to the text is about 0.6. Self-attention is the single biggest cost in the block, and quantizing linear layers does nothing for it. That is why the paper pairs quantization with sparse attention.

App. O: with SVG sparse attention (self-attn 31.48 → 18.23 ms, 1.73×) and fused “other” ops (14.64 → 2.62 ms, 5.59×), linear layers become 41.38% of block time; W4A4 speeds them up 2.52× (15.14 → 5.991 ms).

§8Why it matters for this thesis

LTX-2.3 on OpenVINO / NNCF

  • Out of scope, but a lower bound. QVGen is full QAT (≈11 H100 GPU-days for 1.3B, ~182 for Wan 14B, with 16K training videos). A bachelor thesis cannot do this for LTX-2.3. What it does give is a reference point: even with training, W4A4 is the limit, and W3A3 fails on large models (Tab. 2, Figs. E–F). PTQ on CPU/Arc should not aim below 4-bit weights.
  • Weight-only is the safe route. Fig. B shows W4A16 stays close to BF16 while W16A4 destroys the video. This supports NNCF compress_weights (INT8 / INT4_ASYM, group-wise) with activations kept in FP16/BF16, or at most INT8.
  • Same number format as OpenVINO. Eq. (4) is plain asymmetric uniform min-max quantization with scale and zero-point, so no custom ops are needed. The low-rank error-compensation idea (WΦ = W − Q(W), rank 32) is close to NNCF’s data-aware INT4 options (e.g. lora_correction, AWQ/scale estimation). These need a small calibration set of LTX prompts or latents.
  • Keep speed-up expectations realistic. Linear layers are only 24.5% of Wan-block time and attention is 51.8% (Tab. S). Even a real W4A4 kernel gives only 1.21–1.44× end-to-end. On Intel, weight-only INT4 mainly cuts memory and bandwidth. Wall-clock gains will need caching or sparse attention as well (Fig. 6c).
  • Reusable evaluation protocol. The paper uses 8 VBench dimensions plus PSNR/SSIM/LPIPS against BF16 outputs from the same seed (Tab. G). This is cheap to replicate on a small prompt set to compare int8, int4 and mixed-precision LTX variants.
Guide

Treat QVGen as a boundary, not a recipe. Full training costs 11 to 182 GPU-days, so for LTX-2.3 use post-training compression and do not aim below four-bit weights. Use NNCF weight-only compression, INT8 or group-wise INT4 asymmetric, with activations in FP16 or at most INT8, since Figure B shows four-bit activations destroy video. Try data-aware options like LoRA correction or AWQ with a small calibration set, expect memory savings more than speed, and reuse its VBench plus PSNR, SSIM and LPIPS protocol.

Quantizing diffusion models

Timestep-Aware SVDQuant-GPTQ for W4A4 Quantization of Wan2.2-I2V

Junhao Wu, Dezhong Yao, Hai Jin · Huazhong University of Science and Technology · arXiv:2605.27003, May 2026

This paper quantizes a 14B-per-expert video diffusion transformer (Wan2.2 image-to-video) to 4-bit weights and 4-bit activations. It combines three known tools: an SVDQuant low-rank branch that soaks up outliers, GPTQ rounding for the 4-bit residual weights, and a per-layer activation clipping ratio that is looked up by timestep bin, searched separately for each of the two MoE experts. The result is 59% less memory for a 0.9% drop in VBench score, but no speed-up, because the H100 had no native FP4 kernel for it.

Model
Wan2.2-I2V-A14B
Precision
W4A4 (MXFP4)
Peak memory
64.4 → 26.2 GB
VBench avg.
0.806 → 0.799
Latency (H100)
520.7 → 955.1 s
Benchmark
OpenS2V-Eval, 180 clips
Reading guide

Can a fourteen billion parameter per expert video diffusion transformer, Wan 2.2 image to video, run with four bit weights and four bit activations, called W four A four, without retraining? The answer is yes for quality and memory: combining an SVDQuant low-rank branch, GPTQ rounding and a clip ratio looked up per timestep bin cuts peak memory by 59 percent for a VBench drop of under one percent, but it runs 1.8 times slower because the H100 had no fused FP4 kernel. The tab moves from the big picture, to the three problems of outliers, timestep drift and two experts, then the method, every equation, every figure, the results tables and a thesis box. Among the sixteen papers it is the last of the diffusion quantization group, after QVGen, stitching GPTQ, SVDQuant and timestep-aware calibration together on a large video model, which makes it the closest analogue to the LTX-2.3 project.

§0Before reading

This paper takes a very large image-to-video model whose denoiser is split into two experts, and squeezes both weights and activations to four bits in the MXFP4 format. Following it takes three ideas: how the two experts share the denoising steps, what a four-bit block format looks like, and why saving memory does not automatically save time. It is in the atlas because it is the closest published analogue to the LTX-2.3 project: a big video transformer, compressed after training, with timestep-aware calibration.

input image text prompt high-noise expert, ~14B layout, motion low-noise expert, ~14B texture, detail one expert active per step pure noise switch clean video
PrimerImage-to-video with two expert denoisers. The model animates a given first image, guided by a prompt. Wan2.2 is a mixture-of-experts: the high-noise expert runs the early steps (layout, motion), then hands over to the low-noise expert for the late steps (texture, detail). Only one expert of about 14B parameters is active per step, but their activation statistics differ, so the paper calibrates each one separately.
Guide

Wan two point two does not use one denoiser but two. The high-noise expert runs the early, very noisy steps, where layout and motion are decided, and then hands over to the low-noise expert, which refines texture and detail. The gold line is the denoising timeline, and the dashed line marks the switch. Only one expert of about fourteen billion parameters runs at a time, but the two behave differently, so the paper calibrates each expert on its own.

one block: 32 values, 4 bits each shared scale 2^k one per block outlier FP4 magnitudes (plus a sign bit) 0.511.52346 dense near zero, sparse far out
PrimerWhat W4A4 in MXFP4 means. Both weights (W) and activations (A) are stored in 4 bits. In MXFP4 each group of 32 numbers shares one power-of-two scale, and each number is a tiny float with only 16 possible codes. One outlier in a block forces a large scale, and its 31 neighbours then fall onto the few codes near zero. That is why the paper needs an outlier branch and clipping.
Guide

W four A four means both weights and activations are stored in four bits. In the MXFP4 format, every block of thirty two numbers shares one power of two scale, and each number has only sixteen possible codes, dense near zero and sparse far out. The magenta outlier forces a large shared scale, so its neighbours collapse onto a few small codes. The paper's outlier branch and clipping exist to limit exactly this damage.

this paper on an H100 4-bit in memory dequantize BF16 matmul memory down, time up fused low-bit kernel 4-bit in memory unpack + multiply in one kernel memory down, time down
PrimerSmaller is not automatically faster. A kernel is the GPU routine that does one operation, such as a matrix multiply. The H100 has no native FP4 math, so the paper "pseudo-quantizes": it stores 4-bit numbers, converts them back to BF16, then multiplies. Memory drops, but the extra conversion makes each step slower. Speed needs a fused kernel that works on the low-bit data directly, as OpenVINO provides for INT4/INT8 weights.
Guide

Saving memory is not the same as saving time. A kernel is the routine that performs one operation, such as a matrix multiply. The top row is this paper on the H100, which has no native four bit math: it stores four bit numbers, converts them back to BF16, then multiplies, so each step gets slower. The bottom row is a fused kernel working on low bit data directly, as OpenVINO offers for INT4 and INT8 weights.

GPTQ SVDQuant SVDQuant-GPTQ Wan2.2 W4A4, no retraining + timestep bins, per expert before: QVGen 4-bit video, with training next: FlashAttention-2 speed from kernels
PrimerWhere this paper sits. It closes the diffusion-quantization group. QVGen reached 4-bit video by retraining; this paper gets there without training by stacking two tools already covered in the atlas, GPTQ for rounding and SVDQuant for outliers, and adds clip ratios per timestep bin and per expert. Its missing speed-up leads straight into the acceleration group, starting with FlashAttention-2.
Guide

This paper closes the diffusion quantization group of the atlas. QVGen, just before it, reached four bit video models by retraining. This paper gets to four bits with no training at all, by stacking GPTQ for careful rounding and SVDQuant for outliers, and it adds clipping ratios chosen per timestep bin and per expert. Its missing speed-up is exactly why the next group, starting with FlashAttention-2, is about fast kernels.

Terms used in this paper

Image-to-video (I2V)
Generating a video that starts from a given image, usually together with a text prompt, instead of from text alone.
Wan2.2-I2V-A14B
An open-source image-to-video model from Alibaba. "A14B" means about 14 billion parameters are active at each step.
Mixture-of-Experts (MoE)
A model with several sub-networks ("experts") where only one or a few run for a given input. In Wan2.2 the expert is chosen by the denoising step.
High-noise / low-noise expert
Wan2.2's two denoisers: the first handles the early, very noisy steps, the second the late steps. The paper finds the low-noise expert more fragile under quantization.
Timestep bin
A small group of consecutive denoising steps treated alike. The paper stores one activation scale per layer and bin, instead of one for all 40 steps.
W4A4
Weights and activations both in 4 bits. Much harder than weight-only W4A16, because activations change with every input and step.
MXFP4
A "microscaling" 4-bit floating-point format: blocks of 32 values share one power-of-two scale, and each value has only 16 possible codes.
BF16
16-bit "brain float", the usual full-precision format for large models and the reference every quantized result is compared against.
Clipping ratio \(\rho\)
A factor below 1 that shrinks the activation range before quantizing. Rare large values get cut off, and the common values get finer steps.
Low-rank branch (SVDQuant)
A thin 16-bit matrix pair, found with the SVD, that keeps the hardest part of each weight in high precision while the rest goes to 4 bits.
GPTQ
A weight-rounding method that uses a little calibration data to round weights so the layer's output error stays small, instead of simple round-to-nearest (RTN).
Pseudo-quantization
Storing low-bit numbers but converting them back to 16-bit before the math. It saves memory and shows the quality effect, but gives no speed-up.
NVIDIA H100
A data-centre GPU (Hopper generation) whose Tensor Cores support FP16, BF16, FP8 and INT8 but not FP4, so the paper could not run 4-bit math natively.
OpenS2V-Eval and VBench
OpenS2V-Eval is the test set here: 180 image-to-video cases. VBench is the scoring protocol, with scores such as Imaging Quality, Subject Consistency and Motion Smoothness.
Guide

These fourteen terms are the vocabulary the paper takes for granted. The most important are the mixture of experts, meaning Wan two point two's two denoisers; the timestep bin, a group of steps that shares one activation scale; MXFP4, the four bit block format; and pseudo-quantization, which saves memory but not time. Keep this list open while reading the method and results sections of the tab.

§1Big picture

OFFLINE · once per layer WBF16 weight smooth DŴ = D·W L₁L₂ low-rank16-bit, absorbs outliers R → GPTQ4-bit residual R̂ Clip-ratio search per expert × layer × timestep bin ρ* = argmin ‖Y − Ŷ(ρ)‖² writes a lookup table ONLINE · every denoising step t step t bin k LUTs[l,k] X̂ₗ × L₁L₂ (16-bit) Q_A(· ; s) × R̂ (4-bit) + Ŷₗ(t)
Three tools stacked on each linear layer. Offline, each weight is smoothed and split into a 16-bit low-rank part plus a 4-bit residual rounded with GPTQ. A clip ratio is then searched for every (expert, layer, timestep bin). At inference the only extra cost is a table lookup keyed by the current step.
Guide

Three known tools are stacked on every linear layer, and only one of them touches inference. Read the top lane as offline work done once: smooth the weight, split it into a sixteen bit low-rank part and a four bit GPTQ residual, then search a clip ratio rho for every expert, layer and timestep bin. The bottom lane is each denoising step, where the step number picks a bin and a lookup table supplies the activation scale. Everything later in the tab zooms into one of these boxes.

SVDQuant deals with outliers, GPTQ deals with the rounding of the residual weights, and the timestep lookup table deals with activation ranges that drift over time. Because Wan2.2 swaps from a high-noise expert to a low-noise expert partway through sampling, the search runs once per expert.

§2The problem

(a) Outliers stretch the grid outlier bulk ≈ 2–3 levels 16 levels spread over ±α
A few channels set the range. With only 16 levels, one large channel stretches the step size so the normal values share a handful of codes.
Guide

Four bits give only sixteen levels, so one extreme channel decides the step size for everyone. The grid spans plus or minus alpha to cover the outlier, and the bulk of normal values ends up sharing just two or three codes. This is the first problem the paper names, and it is the reason for the smoothing and low-rank branch in equations five and six.

(b) Range drifts with timestep one global α over-clipped wasted levels denoising step → (high-noise … low-noise) abs-max
One α cannot fit every step. Early steps have a wide range and late steps a narrow one. A per-bin staircase α (indigo) follows the drift.
Guide

The activation range shrinks as denoising proceeds, so no single clipping threshold fits every step. The flat line is one global alpha: it over-clips the wide early steps and wastes levels on the narrow late ones. The indigo staircase is a separate alpha per timestep bin, which tracks the drift. This is the second problem, and it motivates the per-bin clip search in equations eight to ten.

(c) Two experts, two sensitivities high-noise: layout low-noise: texture peak cosine err, self_attn.o ≈0.0065 ≈0.011 high-noise low-noise
The low-noise expert is more fragile. Peak errors here are read off Fig. 4 (approximate). One calibration policy for both experts ignores this.
Guide

Wan 2.2 has two experts, and the low-noise one that paints texture is more fragile than the high-noise one that sets layout. The bars compare peak cosine error in the attention output projection, roughly 0.0065 against 0.011, read approximately from Figure 4. The third problem follows: one calibration policy for both experts ignores this gap, so the paper searches clip ratios separately per expert.

  • At 4-bit, activations are the weak link. They depend on the input, so their outliers cannot be fixed offline the way weight outliers can.
  • Wan2.2 activations are non-stationary across the 40 steps (Fig. 1), so a single scale either over-clips early steps or blurs late ones.
  • The MoE split of Wan2.2 (a high-noise expert, then a low-noise expert) makes the two experts' statistics differ.
  • Plain RTN W4A4 drops Imaging Quality from 0.705 to 0.389 (Table I).

§3Method

  1. Smooth each linear layer: divide activation channels by \(D_l\) and multiply the weight by it (Eq. 5). This moves outlier magnitude onto the static weight.
  2. SVD split the smoothed weight into a low-rank part \(L_1^lL_2^l\), kept in high precision, plus a residual \(R_l\) (Eq. 6).
  3. GPTQ the residual to 4-bit, using second-order (Hessian) information and calibration activations instead of round-to-nearest. This gives \(\hat R_l^{\text{GPTQ}}\) (Eq. 7).
  4. Bin the trajectory: split the denoising steps into a few timestep bins \(B_k\), separately for each expert (e.g. high_early, high_mid, boundary_pre / low_mid, low_late, boundary_post in Fig. 3).
  5. Search ρ for every (layer, bin): threshold \(\alpha=\rho\,m_{l,k}\) (Eq. 8), scale \(s=\alpha/q_{\max}\) (Eq. 9). Keep the ρ with the smallest output MSE against BF16 on calibration samples (Eq. 10).
  6. Infer: map the current \(t\) to its bin, fetch \(s^A_{l,k}\) and run Eq. 11. No online search is needed.
Guide

The method runs in two phases. Offline, each layer is first smoothed so activation outliers move into the weight, then the weight is split into a high precision low-rank part and a residual, and that residual is rounded to four bits with GPTQ instead of plain rounding. Next the denoising trajectory is cut into a few bins per expert, and for every layer and bin a clip ratio is chosen by comparing outputs against BF16. At inference the current step simply picks its bin and fetches the stored scale.

calib. samplest ∈ Bₖ, one expert BF16 layer → Yₗ(t) m_{l,k} = ref. magnitudefrom calibration for ρ ∈ 𝓡α=ρ·m, s=α/q_max SVDQ-GPTQ layerŶₗ(t; ρ) ‖Y−Ŷ‖² next ρ, keep argmin LUTρ*[l,k]
A grid search, not training. For each (layer, bin), try every candidate ρ, run the fully quantized layer and keep the ratio with the smallest MSE against BF16. In the reported model the selected ratios are almost always 0.8 or 0.9 (Fig. 3). The paper has no Algorithm box; this loop is drawn from §III-C.
Guide

The clip ratio is found by brute-force grid search, not by training. For one layer and one bin, calibration samples go through the BF16 layer as a reference, then through the fully quantized layer once per candidate rho, and the rho with the smallest squared output error is written to the table. In the reported model almost every choice lands on 0.8 or 0.9. The paper has no algorithm box, so this loop is drawn from its section three C.

Procedure (transcribed from §III; the paper has no Algorithm box) for expert in {high_noise, low_noise}: for each quantized linear layer l in expert: X̂l, Ŵl = smooth(Xl, Wl, Dl) # Eq. 5 L1, L2, Rl = SVD_lowrank(Ŵl) # Eq. 6, low-rank kept 16-bit R̂l = GPTQ_4bit(Rl, calib activations X̂l) # Eq. 7 for each timestep bin Bk of this expert: m[l,k] = reference |activation| on calib t ∈ Bk ρ*[l,k] = argmin_{ρ∈R} E_t ||Yl(t) − Ŷl(t;ρ)||² # Eq. 8–10 s[l,k] = ρ*[l,k]·m[l,k] / q_max inference step t: k = bin(t); Ŷl = X̂l·L1·L2 + Q_A(X̂l; s[l,k])·R̂l # Eq. 11
Guide

The procedure is a loop over the two experts, then over their layers. For each layer the weight work happens once: smooth, split by SVD, and round the residual with GPTQ. Only then does the inner loop over timestep bins run, measuring a reference activation magnitude and picking the best clip ratio, which becomes a stored scale. The final line is inference, where the bin lookup and equation eleven are all that remain. This listing is transcribed from the text, since the paper gives no algorithm box.

§4Every equation

(1)\[ Y = XW,\qquad X\in\mathbb{R}^{N\times C_{\text{in}}},\; W\in\mathbb{R}^{C_{\text{in}}\times C_{\text{out}}} \]

Full-precision linear layer: \(N\) tokens, \(C_{\text{in}}\)/\(C_{\text{out}}\) channels (q, k, v, o, gate, FFN …).

Guide

The starting point is an ordinary linear layer. Y equals X times W, where X holds N tokens with C in input channels, and W maps those to C out output channels. Every projection in the transformer, the query, key, value and output projections and the feed-forward layers, has this form, so it is the object all later equations quantize.

(2)\[ \hat{Y} = Q_A(X)\,Q_W(W) \]

W4A4: both activation quantizer \(Q_A\) and weight quantizer \(Q_W\) are 4-bit; PTQ must keep \(\hat Y\approx Y\) on calibration data without retraining.

Guide

Quantized inference replaces both factors with four bit versions. Y hat is Q A of X times Q W of W, where Q A is the activation quantizer and Q W the weight quantizer. The goal of post-training quantization is to keep Y hat close to Y on calibration data without any retraining. The rest of the method is about making these two quantizers lose as little as possible.

(3)\[ Q(z;s,z_0) = s\cdot\left(\operatorname{clip}\left(\left\lfloor \frac{z}{s}\right\rceil + z_0,\; q_{\min},\; q_{\max}\right) - z_0\right) \]

Uniform quantize-dequantize: scale \(s\), zero-point \(z_0\), integer range \([q_{\min},q_{\max}]\), \(\lfloor\cdot\rceil\) = round to nearest. (Experiments actually use MXFP4, a block-scaled FP4 format.)

Guide

This is the basic quantize then dequantize step. Divide the value z by the scale s, round to the nearest integer, add the zero point z zero, clip to the integer range from q min to q max, then subtract the zero point and multiply back by s. Rounding and clipping are the two sources of error. The experiments actually use MXFP4, a block-scaled four bit float format, but the idea is the same.

(4)\[ s = \frac{\alpha}{q_{\max}} \]

Symmetric case (\(z_0=0\)): the clipping threshold \(\alpha\) fixes the step size. Too small over-clips, too large wastes resolution.

Guide

With a symmetric grid and zero point zero, the step size is set by one number. The scale s equals the clipping threshold alpha divided by q max. Choosing alpha is the whole trade-off: too small and large values get clipped, too large and the sixteen levels are spread thin. Equations eight and nine turn this choice into something searched per layer and per timestep bin.

(5)\[ X_lW_l = (X_lD_l^{-1})(D_lW_l) = \hat{X}_l\hat{W}_l \]

Channel-wise smoothing with diagonal \(D_l\): shrinks activation outlier channels and moves their magnitude into the weight. The output is mathematically unchanged.

Guide

Smoothing is a free rearrangement. X l times W l equals X l times D l inverse, times D l times W l, where D l is a diagonal matrix of per-channel factors. Dividing the activations by D l shrinks outlier channels, and multiplying the weight by it moves that magnitude into the static weight. The output is mathematically unchanged; only where the difficulty lives has moved, and that fix is the SmoothQuant idea.

(6)\[ \hat{W}_l = L_1^lL_2^l + R_l \]

SVDQuant split: low-rank branch \(L_1^lL_2^l\) (high precision, holds outlier directions) + residual \(R_l\) (to be 4-bit).

Guide

The smoothed weight is then split in two. W hat l equals L one times L two, a low-rank product, plus a residual R l. The low-rank branch is kept in sixteen bits and captures the dominant outlier directions, so the residual that must go to four bits is much tamer. This is the SVDQuant decomposition, and it answers the outlier problem shown in the first problem figure.

(7)\[ \hat{Y}_l = \hat{X}_lL_1^lL_2^l + Q_A(\hat{X}_l)\,\hat{R}_l^{\text{GPTQ}} \]

Final layer: the 16-bit low-rank path sees unquantized \(\hat X_l\); the residual path uses a 4-bit activation and GPTQ-rounded 4-bit weights.

Guide

This is the finished quantized layer. Y hat l is X hat l times the low-rank branch, plus the four bit quantized X hat l times R hat l GPTQ. The low-rank path sees unquantized activations and sixteen bit weights, while the residual path runs on four bit activations and four bit weights rounded with GPTQ, which uses second order information to compensate rounding error. The timestep-aware part will only change the activation quantizer in the second term.

(8)\[ \alpha_{l,k}(\rho) = \rho\cdot m_{l,k} \]

Clip threshold for layer \(l\), timestep bin \(k\): candidate ratio \(\rho\) times the reference activation magnitude \(m_{l,k}\) from calibration.

Guide

The clip threshold is expressed as a fraction of a measured size. Alpha for layer l and bin k equals rho times m l k, where m l k is a reference activation magnitude recorded on calibration data in that bin, and rho is a candidate ratio such as 0.8 or 0.9. Searching over rho rather than alpha makes one small candidate set work for every layer.

(9)\[ s^A_{l,k}(\rho) = \frac{\alpha_{l,k}(\rho)}{q_{\max}} \]

The corresponding activation scale (Eq. 4 applied per layer and bin).

Guide

Each candidate threshold becomes an activation scale. The scale s A for layer l and bin k is alpha divided by q max, which is just equation four applied separately to every layer and timestep bin. These are the numbers that end up in the lookup table used at inference.

(10)\[ \rho^{*}_{l,k} = \arg\min_{\rho\in\mathcal{R}}\; \mathbb{E}_{t\in B_k}\left[\left\lVert Y_l(t) - \hat{Y}_l(t;\rho)\right\rVert_2^2\right] \]

Search objective: over candidate set \(\mathcal R\), minimise the expected output MSE of the SVDQuant-GPTQ layer vs. BF16 across steps in bin \(B_k\).

Guide

The search objective picks the best ratio. Rho star for layer l and bin k is the rho from the candidate set that minimises the expected squared difference between the BF16 output Y l of t and the quantized output Y hat l of t, averaged over the steps t in bin B k. Because the full SVDQuant-GPTQ layer is inside the loss, the chosen clip accounts for the weight error too.

(11)\[ \hat{Y}_l(t) = \hat{X}_lL_1^lL_2^l + Q_A\!\left(\hat{X}_l;\, s^A_{l,k}\right)\hat{R}_l^{\text{GPTQ}},\qquad t\in B_k \]

Inference: the current step selects bin \(k\), and its precomputed scale is fetched from a lookup table, so runtime overhead is negligible.

Guide

At inference the layer is equation seven with one change. The activation quantizer now uses the stored scale s A for the bin k that contains the current step t. Finding k and fetching the scale is a table lookup, so the timestep awareness adds almost no runtime cost. This is the bottom lane of the big picture diagram.

—\[ H\times W\times T = 720\times1280\times61 \]

Unnumbered: the generation setting used for all methods (height × width × frames).

Guide

All methods generate videos of the same size: 720 by 1280 pixels and 61 frames. This fixes the workload behind every quality and efficiency number in the results tables, so memory and latency comparisons are like for like.

—\[ \frac{64.4-26.2}{64.4} = 59.3\%\ \text{(peak memory)},\qquad \frac{64.0-25.9}{64.0}=59.5\%\ \text{(model size)} \]

Headline savings, computed from Table II.

Guide

The headline savings come straight from Table II. Peak memory drops from 64.4 to 26.2 gigabytes, a 59.3 percent cut, and model size from 64.0 to 25.9 gigabytes, a 59.5 percent cut. Notice this is well short of the four times one might expect from sixteen to four bits. The paper does not break this down, but the likely reasons are the sixteen bit low-rank branches, the block scales and any layers left unquantized.

§5Every figure

0 5 10 15 20 25 30 35 40 denoising step 0 1000 2000 3000 4000 5000 channel index log2 absmax 4 3 2 1 0 spike ≈4+ early: wide range late: smaller, sparse spikes
Fig. 1Activations of blocks.20.ffn.2 drift across the 40 steps. The original is a 3-D surface of per-channel log2 abs-max (channels 0–5120 × denoising step 0–40), recorded in BF16. Early steps (yellow-green in the paper) are larger; later steps are smaller (blue), with a few sparse channels spiking to about 4. Shape redrawn as a heatmap; the individual cell values are illustrative.
Guide

Activation ranges drift across denoising, which is the evidence for the timestep problem. The heatmap shows the log two absolute maximum of each of about 5120 channels in one feed-forward layer, across 40 steps. Early steps are brighter and wider; later steps are smaller, with a few sparse channels still spiking to about four. The shape is redrawn from the paper's 3D surface and the cell values are illustrative.

Calibration 1 SVDQuant decomposition full-precision weight W W_main (4-bit) + W_SVD (16-bit) × Low rank Low-rank branch absorbs outliers 2 Time-step bin activation clipping search Denoising time-step 0 t−1 Early(0–T/3) Middle(T/3–2T/3) Late(2T/3–T) Time-step bin Per-layer, per-bin optimal clip ratio EarlyMidLate Layer 10.751.000.80 Layer 20.800.750.75 ⋮⋮⋮⋮ Layer L0.751.000.75 Inference Latent input + Time step t Block 0 Block 1 • • • Block 39 Video
Fig. 2Overview of the framework. Calibration: (1) each sensitive linear layer's weight is split into a 4-bit main part and a high-precision low-rank part; (2) the denoising trajectory is cut into timestep bins and a clip ratio is searched for every (layer, bin). The 0.75/0.80/1.00 values are illustrative. Inference: the latent and timestep go through quantized blocks 0–39 using the precomputed clip policy. The paper labels the second table row "Layer 1" again; it is drawn here as Layer 2.
Guide

The paper's overview has two halves. In calibration, each sensitive layer's weight is split into a four bit main part and a sixteen bit low-rank part, and the trajectory is cut into early, middle and late bins with a clip ratio searched for every layer and bin. In inference, the latent and timestep pass through blocks zero to thirty nine using that precomputed table. The ratios in the table are illustrative, not measured.

High-noise expert ρ = 0.8 ρ = 0.9 020406080100 Percentage (%) high_earlyhigh_midboundary_pre Timestep bin Low-noise expert ρ = 0.8 ρ = 0.9 020406080100 Percentage (%) low_midlow_lateboundary_post Timestep bin
Fig. 3Chosen clip ratios differ by bin and by expert. In every bin about 88–94% of modules pick ρ = 0.8 and the rest pick 0.9. The high-noise expert moves toward 0.9 near the expert boundary; the low-noise expert is most uniform in low_late. The percentages are read from the bars (±1–2%).
Guide

The chosen clip ratios barely vary, which tempers the timestep story. Each bar is one timestep bin, split by the share of modules choosing rho of 0.8 or 0.9. Around 88 to 94 percent pick 0.8 everywhere; the high-noise expert shifts slightly toward 0.9 near the expert boundary. So the per-bin search makes small adjustments, consistent with its modest gain in Table I. Percentages are read from bars and are approximate.

High-noise expert self_attn.q self_attn.k self_attn.v self_attn.o cross_attn.q cross_attn.k cross_attn.v cross_attn.o ffn.0 ffn.2 0–4 5–9 10–14 15–19 20–24 25–29 30–34 35–39 Block ID 0.002 0.004 0.006 0.008 0.010 cos err Low-noise expert self_attn.q self_attn.k self_attn.v self_attn.o cross_attn.q cross_attn.k cross_attn.v cross_attn.o ffn.0 ffn.2 0–4 5–9 10–14 15–19 20–24 25–29 30–34 35–39 Block ID 0.002 0.004 0.006 0.008 0.010 cos err
Fig. 4Error sits in specific module types, not in specific blocks. This is the cosine reconstruction error of each linear module across the 40 blocks, with blocks averaged in groups of 5 and a darker colour meaning more error. self_attn.o and ffn.2 (outlined) are the worst in both experts, while self_attn.q/k and cross_attn.o are robust. Errors concentrate in the middle and deep blocks. In the low-noise expert, self_attn.o peaks near 0.011 in blocks 5–20. Both panels share one colour scale here (0–0.011); the paper uses a separate colour bar for each. Values are read from the heatmap, shape redrawn.
Guide

Quantization error depends on the module type, not on which block it sits in. Rows are the ten linear module types, columns are groups of five blocks, and darker means higher cosine error. The attention output projection and the feed-forward down projection, outlined, are worst in both experts, while query, key and cross-attention output are robust. This sensitivity map is what motivates the Ours dagger run and the thesis box's mixed-precision advice.

Frame 1Frame 16Frame 31Frame 46Frame 61Imaging Q. content → face close-upface + bouquethalf bodyfull body, stagefull body, stage BF16 reference 0.769 W4A16 ≈ BF16 0.767 Ours W4A4 softer faceflower edgesidentity keptlayout keptno collapse 0.759
Fig. 5W4A4 keeps identity, pose and scene. Frames 1, 16, 31, 46 and 61 of one image-to-video sample: a man with a bouquet, zooming from a close-up to a full body on a stage. W4A16 is visually about the same as BF16. The W4A4 result has slightly stronger texture smoothing and less detail on the face and flower edges, but no artifacts or collapse. Imaging Quality: 0.769 / 0.767 / 0.759.
Guide

Four bit weights and activations keep the video recognisable. Five frames from one sample show a man with a bouquet as the camera pulls back to a stage. W4A16 looks like BF16, while W four A four smooths texture slightly on the face and flower edges but keeps identity, pose and layout with no collapse. Imaging quality reads 0.769, 0.767 and 0.759, matching the small losses in Table I.

§6Results

Table I: Main results on OpenS2V-Eval (VBench protocol). All 4-bit formats are MXFP4. TS-Clip = timestep-bin clip search. Ours† keeps self_attn.o and ffn.2 in higher precision (a diagnostic run).
MethodWATS-ClipVBench Avg.Imaging Q.Subject Cons.Motion Smooth.
BF16 baselineBF16BF16–0.8060.7050.7390.975
RTN4-bit4-bit✗0.7330.3890.861*0.949
SVDQuant + RTN4-bit4-bit✗0.7830.6710.7050.974
SVDQuant + GPTQ4-bit4-bit✗0.7930.6840.7220.974
Ours4-bit4-bit✓0.7990.6890.7330.975
Ours†4-bit4-bit–0.8030.6960.7380.975
Guide

The main quality table climbs row by row toward BF16. Plain round-to-nearest W4A4 falls to a VBench average of 0.733 and an imaging quality of 0.389. Adding SVDQuant, then GPTQ, then timestep clipping raises the average to 0.783, 0.793 and 0.799, against 0.806 for BF16. The last row keeps two sensitive module types in higher precision and reaches 0.803. The starred subject consistency for RTN beats BF16, probably because near-static or blurred output looks consistent, not a real gain.

*The paper bolds "Ours" as best. RTN's 0.861 Subject Consistency is above BF16, which is probably an artifact of near-static or blurred output that looks "consistent", not a real gain.

Table II: Efficiency on one NVIDIA H100 under the same settings (pseudo-quantized, with no fused FP4 kernel)
MethodModel size (GB)Peak memory (GB)Latency (s)Throughput (FPS)
BF1664.064.4520.70.117
W4A1626.426.8534.50.114
Ours (W4A4)25.926.2955.10.064
Guide

Efficiency tells a split story. Model size and peak memory drop from about 64 gigabytes to about 26 for both W4A16 and the full W4A4 method. Latency, however, rises from 520.7 seconds to 955.1 per video for W4A4, because the four bit values are dequantized in Python before a BF16 matrix multiply with no fused kernel. W4A16 gets nearly all the memory gain at almost BF16 speed.

VBench avg. (axis 0.70–0.82) 0.700.740.780.82 BF160.806 RTN0.733 SVDQ+RTN0.783 SVDQ+GPTQ0.793 Ours0.799 Ours†0.803
Each ingredient adds a step. VBench average: RTN 0.733 → +SVDQuant 0.783 → +GPTQ 0.793 → +TS-clip 0.799 (BF16 0.806). Note the truncated axis: the full gap between RTN and BF16 is only 0.073.
Guide

Each ingredient adds a visible step in VBench average: round-to-nearest 0.733, plus SVDQuant 0.783, plus GPTQ 0.793, plus timestep clipping 0.799, with BF16 at 0.806. The axis starts at 0.70, so the bars exaggerate the differences; the whole gap from worst to BF16 is only 0.073. SVDQuant contributes the largest jump, and timestep clipping the smallest.

Imaging Quality (axis 0–0.8) 00.20.40.60.8 BF160.705 RTN0.389 SVDQ+RTN0.671 SVDQ+GPTQ0.684 Ours0.689 Ours†0.696
SVDQuant does most of the rescue. Imaging Quality nearly halves under plain RTN W4A4 (0.389). The outlier branch brings back most of it (0.671); GPTQ and TS-clip add +0.013 and +0.005.
Guide

SVDQuant does most of the rescue on imaging quality. Plain round-to-nearest W4A4 nearly halves it, from 0.705 to 0.389. The low-rank outlier branch brings it back to 0.671, while GPTQ adds 0.013 and timestep clipping another 0.005. Here the axis starts at zero, so the RTN collapse is shown at true scale.

Memory (GB) model size peak memory 0204060 64.0 / 64.426.4 / 26.825.9 / 26.2 BF16W4A16Ours W4A4 Latency per video (s) 05001000 520.7534.5955.1 BF16W4A16Ours W4A4 0.117 / 0.114 / 0.064 FPS
Memory drops by 59%, but latency gets 1.8× worse. Weights and activations are stored in 4-bit and then de-quantized in Python right before a BF16 matmul, with no fused FP4 kernel on the H100. Memory falls, but time rises. W4A16 already gets almost all of the memory gain at BF16 speed.
Guide

Memory and speed move in opposite directions. The left panel shows model size and peak memory falling by about 59 percent for both four bit variants; the right panel shows latency per video rising from about 521 to 955 seconds for W4A4, roughly 1.8 times slower. The cause is simulated quantization without a fused FP4 kernel. The lesson is that fewer bits do not mean faster inference unless the hardware kernels exist.

Scale check: Wan2.2-I2V-A14B (this paper) vs. the thesis target LTX-2.3. The LTX-2 figures come from the thesis brief.
AspectWan2.2-I2V-A14BLTX-2.3
ArchitectureDiT, 2-expert MoE (high/low noise), 40 blockssingle DiT, video + audio streams
Transformer params2 × ~14B (only one active per step)~14B video + ~5B audio (~19B, all active)
Taskimage → video, 720×1280×61text/image → video + audio
BF16 footprint64.0 GB model, 64.4 GB peak (as reported)~38 GB for the transformer weights alone at BF16
Quantization hereW4A4 MXFP4, H100 pseudo-quantthesis: INT8/INT4 weight-only via NNCF on CPU / Arc
Reported quality lossVBench avg −0.9%, Imaging Q. −2.3%to be measured (e.g. VBench subset, CLIP / FVD, audio metrics)
Guide

Wan 2.2 and LTX-2.3 are similar in scale but differ in how much runs at once. Wan has two experts of about fourteen billion parameters with only one active per step, while LTX-2.3 runs roughly fourteen billion video and five billion audio parameters together. The paper does W4A4 on an H100; the thesis targets INT8 and INT4 weight-only compression through NNCF on CPU and Arc. The LTX figures come from the thesis brief, and its quality loss is still to be measured.

§7Why it matters for this thesis

Closest analogue to the LTX-2.3 project: a large video DiT, PTQ only, with timestep-aware calibration

  • Take the sensitivity map, not the W4A4 recipe. Here self_attn.o (attention output projection) and ffn.2 (FFN down projection) carry most of the 4-bit error, and keeping only those in higher precision (Ours†) recovers almost all quality (0.803 vs 0.806). For LTX-2.3 in NNCF, a natural first experiment is INT4 weights everywhere except the attn.to_out / FFN down-projection layers, which stay at INT8. Use ignored_scope or a mixed-precision ratio / sensitivity metric in nncf.compress_weights, then check whether LTX shows the same pattern.
  • GPTQ and low-rank correction exist in NNCF, but only for weights. nncf.compress_weights(..., dataset=..., gptq=True) and the data-aware options (AWQ, scale estimation, lora_correction) are the OpenVINO counterparts of "GPTQ residual + low-rank branch". They need calibration data, which means capturing transformer inputs from real LTX sampling runs across all timesteps. No custom kernels are needed.
  • Timestep bins only matter if activations are quantized. In the thesis's weight-only INT8/INT4 setting, activations stay FP16/FP32 (or use OpenVINO's CPU dynamic per-token quantization), so the clip-ratio lookup table is not needed. It becomes relevant only for a static W8A8 attempt. There the lesson is to calibrate with samples drawn from every step (LTX distilled uses few steps, so few bins), because one static scale per layer in an OpenVINO IR cannot switch with t unless the graph is split.
  • Memory ≠ speed. This paper saves 59% memory but runs 1.8× slower because it has no fused low-bit kernel. OpenVINO already ships fused INT4/INT8 weight-decompression matmuls for CPU and Arc GPU, so the thesis should report memory and wall-clock time per step on real hardware, and not claim speed-ups from model size alone.
  • Scale sanity check. Wan2.2 activates one ~14B expert per step. LTX-2.3 runs its ~14B video and ~5B audio streams together, so about 19B parameters are live. The W4A16 row (64 → 26.4 GB) shows that 4-bit weight-only compression alone gives roughly a 2.4× footprint cut for a whole pipeline. That is a realistic target for INT4 LTX-2.3, which should end up around 10–12 GB of transformer weights with some INT8 layers.
Guide

Borrow the sensitivity map, not the W4A4 recipe. A first NNCF experiment is INT4 weights everywhere except the attention output and feed-forward down projections, kept at INT8 through an ignored scope or a mixed-precision setting in compress weights, then check whether LTX shows the same pattern. GPTQ, AWQ and LoRA correction in NNCF are the weight-only counterparts and need calibration inputs captured from every timestep. Skip the clip lookup table unless static W8A8 is tried, and report real memory and time per step, since memory savings are not speed.

Acceleration beyond quantization

FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning

Tri Dao (Princeton & Stanford) · arXiv:2307.08691 technical report · July 2023 (ICLR 2024)

Attention is slow mostly because of memory traffic, not arithmetic: the N×N score matrix is written to and read back from slow GPU memory. FlashAttention computes the exact same result tile by tile in fast on-chip memory using an “online softmax”; FlashAttention-2 reorganises the loops and the GPU work split so that the chip spends most of its time in fast matrix multiplies, doubling speed again.

Output
Exact (no approx.)
Extra memory
O(N) instead of O(N²)
vs FlashAttention
≈2× (1.7–3.0×)
Forward, A100
up to 230 TFLOPs/s (73%)
Backward, A100
up to 63% of peak
GPT training
225 TFLOPs/s/GPU (72% MFU)
Reading guide

Why is attention so slow on a GPU, and how close can it get to the speed of a plain matrix multiply? Tri Dao's answer is that attention is limited by memory traffic and by poor work splitting, not by arithmetic, and that reorganising the loops of FlashAttention roughly doubles its speed again while giving exactly the same output. The tab opens with the big picture of data movement, then the hardware problem, then the method: the swapped loops, the online softmax, and the new split of work across thread blocks and warps. After that come every equation, every figure from the paper, the benchmark results, and a thesis box. Among the sixteen papers, this one sits in the acceleration group with DeepCache and TeaCache. It speeds up attention without touching any weights, so it complements the quantization papers from GPTQ to SVDQuant rather than competing with them.

§0Before reading

This paper is not about compression at all: it makes attention faster by changing how data moves inside a GPU, while the result stays exactly the same. Following it takes three things: what attention and softmax compute, why the N×N score matrix is the expensive part, and a rough picture of a GPU (threads, warps, thread blocks, SMs, fast SRAM versus slow HBM). It is in the atlas because in a video transformer like LTX-2.3 attention over thousands of tokens can dominate each step, and weight quantization cannot speed it up.

Attention = matmul, softmax, matmul Q N × d × Kᵀ d × N S scores N × N softmax P weights N × N × V N × d O N × d double N, four times bigger N = tokens, d = head dimension
PrimerAttention is two matrix multiplies with a softmax in between, and the middle matrices are huge. Every token (row of Q) is compared with every other token (row of K), giving an N×N score matrix S; softmax turns each row into weights P that average the rows of V. Q, K, V and O grow like \(N\), but S and P grow like \(N^2\). A video latent has many thousands of tokens, so storing S and P is what makes plain attention slow and memory-hungry.
Guide

Attention is two matrix multiplies with a softmax in between. Queries times keys gives a score matrix S with one number for every pair of tokens, softmax turns it into weights P, and P times V gives the output. The teal matrices grow with the number of tokens, but S and P grow with its square. For a video with thousands of tokens, storing S and P is the real cost that FlashAttention removes.

Softmax of one row, step by step scores minus max exp ÷ sum 1.50 2 1 0 0 −1 −2 1.00 0.37 0.14 0.67 0.24 0.09 sum = 1 Online: one block at a time block A: 2, 1 max 2 · sum 1.37 block B: 3, 0 → new max 3 1.37 × e⁻¹ + 1.05 = 1.55 all four at once sum 1.55 rescale old sum when the max grows
PrimerSoftmax turns scores into weights that add up to one; the "online" version can do it block by block. Subtract the row maximum (so exp never overflows), take \(e^{x}\), divide by the sum. The catch is that the whole row seems to be needed first. The online trick keeps a running max and running sum: when a new block brings a bigger max, the old sum is multiplied by \(e^{\text{old max} - \text{new max}}\). The final answer is exactly the same, which is why FlashAttention never needs the full N×N row in memory.
Guide

Softmax turns a row of scores into weights that add up to one. The largest score is subtracted, the exponential taken, and the result divided by the sum, as the top row works through for three numbers. The bottom row shows the online version: process one block, keep a running maximum and sum, and shrink the old sum when a bigger maximum arrives. The result is exactly the same, so the full row never has to sit in memory.

How a GPU is organised thread warp 32 threads, same instruction thread block e.g. 4 warps runs on one SM GPU chip SMSMSM SMSMSM SRAM: small, fast HBM: big, slow A100: 108 SMs Intel Arc: Xe-cores play the SM role
PrimerA GPU is many small processors (SMs), each with a little fast memory, all sharing one big slow memory. On NVIDIA GPUs the smallest worker is a thread; 32 threads form a warp that executes the same instruction together; a few warps form a thread block, which is placed on one streaming multiprocessor (SM) and can use that SM's on-chip SRAM. All SMs read and write the large off-chip HBM, which is much slower. FlashAttention keeps work in SRAM; FlashAttention-2 also decides how to split work across thread blocks and warps so every SM stays busy.
Guide

A GPU is organised in layers. Thirty two threads form a warp that runs the same instruction together, a few warps form a thread block, and each thread block runs on one streaming multiprocessor, or SM, with its own small, fast SRAM. All SMs share the big, slow HBM. FlashAttention keeps work in SRAM, and FlashAttention-2 splits the work across blocks and warps so every SM stays busy. On Intel Arc, Xe-cores play the SM role.

Where this paper sits models quantization (10 papers) acceleration eval before SVDQuant-GPTQ fewer bits, Wan2.2 this paper FlashAttention-2 same math, less traffic next DeepCache reuse across steps adds: faster exact attention no weights to quantize here
PrimerWhere this paper sits: the first acceleration paper after ten on quantization. The quantization papers, ending with SVDQuant-GPTQ for Wan2.2, make weights and activations smaller. FlashAttention-2 attacks a different cost: moving the attention matrices through memory. It changes no number in the output, so it needs no calibration and stacks with NNCF compression. Next, DeepCache and TeaCache save time a third way, by skipping work that repeats across denoising steps.
Guide

FlashAttention-2 is the first acceleration paper, right after ten quantization papers that ended with SVDQuant-GPTQ for Wan2.2. Quantization makes numbers smaller; this paper instead reduces how much data moves through memory during attention, and changes no output value at all. Attention has no weights, so NNCF weight compression cannot speed it up, which is exactly the gap this fills. Next come DeepCache and TeaCache, which skip work that repeats across denoising steps.

Terms used in this paper

Attention (Q, K, V)
Each token makes a query, a key and a value. Queries are compared with all keys, and the resulting weights average the values into the output O.
Sequence length N, head dimension d
N is the number of tokens attending to each other; d is the length of each query or key vector in one head (64 or 128 in this paper's benchmarks).
Softmax
Turns a row of scores into positive weights that sum to one: exponentiate each score and divide by the total. Subtracting the row maximum first keeps the numbers safe.
Online softmax
Computing softmax block by block with a running maximum and running sum, rescaling the old sum when a larger maximum appears. Gives exactly the same result.
Kernel
One program launched on the GPU, such as a matrix multiply. Standard attention uses several kernels; FlashAttention fuses everything into one.
HBM
High Bandwidth Memory: the GPU's large main memory (tens of gigabytes) that sits off the compute chip. Big, but slow compared with on-chip memory.
SRAM (shared memory)
Small, very fast memory inside each SM. FlashAttention loads tiles of Q, K and V here so the N×N scores never go to HBM.
Streaming multiprocessor (SM)
One of the many processor cores of an NVIDIA GPU; each runs thread blocks and has its own SRAM. The A100 has 108. Intel Arc's closest equivalent is the Xe-core.
Thread block and warp
A thread block is a group of threads placed on one SM; it is split into warps of 32 threads that execute the same instruction together. FlashAttention-2 re-plans the work at both levels.
Tensor Core
Special NVIDIA hardware units for fast matrix multiplies in low precision such as FP16/BF16. Other operations (exp, max, division) run much slower, so the paper minimises them.
FLOPs and TFLOPs/s
FLOPs count floating-point operations; TFLOPs/s is trillions per second, the speed measure in every chart. "Percent of peak" compares it with the hardware maximum.
A100 and H100
NVIDIA data-centre GPUs (A100 is the older generation, H100 the newer). The paper's main benchmarks are on an A100 80GB; a few are on an H100.
Forward and backward pass
Forward computes the output; backward computes gradients for training. Inference, as in this thesis, uses only the forward pass.
Causal mask
In text language models a token may only look at earlier tokens, so half the score matrix is skipped. Video DiTs like LTX-2.3 attend in all directions, without this mask.
Guide

These are the words the paper uses without explaining. The most important pairs are HBM and SRAM, the slow big memory and the fast small one, and thread block and warp, the two levels at which the paper splits work. Tensor Cores make matrix multiplies fast, so every exponential or division counts. Remember too that the thesis needs only the forward pass, and that video transformers use no causal mask.

§1Big picture

Standard attention: 3 kernels ① S = QKᵀ ② softmax ③ O = PV HBM (big, slow) Q K V SN×N PN×N O O(N²)memory write S → read S → write P → read P FlashAttention(-2): 1 fused kernel on-chip SRAM (small, fast) Qᵢ Kⱼ Vⱼ Sᵢⱼ P̃ᵢⱼ mᵢ, ℓᵢ, Õᵢrunning state loop over key blocks j HBM Q K V O L no N×N matrix O(N) extra memory read tiles write once
Same maths, different data movement. Left: every intermediate N×N matrix makes a round trip through slow HBM. Right: tiles of Q, K, V are streamed into SRAM, scores are softmaxed on the fly and only the final O (plus one log-sum-exp number per row) is written.
Guide

Both panels compute the same attention, but they move data very differently. On the left, standard attention runs three separate kernels, and each N by N matrix, first the scores S and then the probabilities P, is written to slow HBM memory and read back. On the right, one fused kernel streams small tiles of Q, K and V into fast on-chip SRAM, keeps a running state per row, and writes only the final output O plus one log-sum-exp number per row. That is why extra memory drops from N squared to N.

FlashAttention (v1) already did the right-hand picture. FlashAttention-2 keeps the idea and fixes how the GPU is used: (1) fewer non-matmul FLOPs, (2) parallelism over the sequence length, (3) no shared-memory reduction between warps.

§2The problem

A100 memory hierarchy SMSRAMTC SMSRAMTC SMSRAMTC … × 108 SMs 192 KB SRAM each≈19 TB/s HBM 40–80 GB1.5–2.0 TB/s slow link Bandwidth (TB/s) SRAM19 HBM≈2 A100 throughput (TFLOPs/s) matmul FP16312 non-matmul FP3219.5 1 non-matmul FLOP ≈ 16 matmul FLOPs
Two asymmetries drive the design. HBM is ~10× slower than SRAM (so avoid HBM round trips: FlashAttention), and non-matmul arithmetic (exp, max, rescale) is 16× slower than Tensor-Core matmul (so minimise it: FlashAttention-2). TC = Tensor Cores.
Guide

Two speed gaps on the A100 explain the whole design. The left panel shows the memory hierarchy: 108 streaming multiprocessors, each with 192 kilobytes of fast SRAM at about 19 terabytes per second, against HBM at only about 2. The right panel compares arithmetic: Tensor Core matrix multiplies run at 312 teraflops, while other operations like exp and max run at 19.5, so one non-matmul flop costs about sixteen matmul flops. FlashAttention attacked the first gap; FlashAttention-2 attacks the second.

Fraction of A100 peak FLOPs/s reached 0%20%40%60%80%100% Optimised GEMM80–90% FlashAttention fwd30–50% FlashAttention bwd25–35% FlashAttention-250–73% FlashAttention-2 bwdup to 63%
FlashAttention v1 left most of the GPU idle. Ranges quoted in the paper (Intro/Abstract). The gap to GEMM is caused by poor work partitioning between thread blocks and warps, not by the algorithm itself.
Guide

Each bar is the fraction of the A100's peak throughput that a kernel actually reaches. An optimised matrix multiply reaches 80 to 90 percent, but the original FlashAttention reached only 30 to 50 percent forward and 25 to 35 percent backward. FlashAttention-2 lifts this to 50 to 73 percent forward and up to 63 percent backward. The paper blames v1's gap on how work was divided among thread blocks and warps, which is exactly what the method section fixes.

  • Standard attention materialises S and P (N×N) in HBM: O(N²) memory and O(N²) slow memory traffic; for N ≫ d (N ≈ 1k–8k, d ≈ 64–128) this dominates run time. P must also be saved for backward.
  • FlashAttention v1 fixed memory, but (i) rescales the output by diag(ℓ)⁻¹ at every inner step (extra non-matmul FLOPs), (ii) only parallelises over batch × heads, so long sequences with small batch leave SMs idle, (iii) splits K, V across warps (“split-K”), forcing a shared-memory reduction.

§3Method

3.1 Tiling loop (Algorithm 1)

Q Qᵢ Kᵀ Kⱼᵀ Sᵢⱼ donedone next S = QKᵀ: never in HBM V Vⱼ O Oᵢ inner j = 1…T_c (sequential) outer i = 1…Tᵣ (parallel) SRAM of one thread block Qᵢ loaded once Kⱼ, Vⱼ streamed in Sᵢⱼ = QᵢKⱼᵀ mᵢ ← max(mᵢ, rowmax Sᵢⱼ) P̃ᵢⱼ = exp(Sᵢⱼ − mᵢ) ℓᵢ ← e^(Δm)·ℓᵢ + rowsum P̃ Õᵢ ← e^(Δm)·Õᵢ + P̃ᵢⱼVⱼ after j = T_c → HBM: Oᵢ = Õᵢ / ℓᵢ , Lᵢ = mᵢ + log ℓᵢ
Outer loop over query blocks, inner loop over key/value blocks. One thread block owns one Qᵢ (Bᵣ rows) and streams all Kⱼ, Vⱼ (B_c rows each) through SRAM. The running statistics mᵢ, ℓᵢ and the un-normalised output Õᵢ stay on chip; Oᵢ and Lᵢ go to HBM exactly once. Δm = m_old − m_new ≤ 0.
Guide

Here is the forward algorithm as a picture. The outer loop runs over blocks of query rows, and those blocks run in parallel; the inner loop walks through key and value blocks one after another. One thread block loads its query block Q i once, streams every K j and V j through SRAM, and updates three running quantities: the row maximum m, the row sum l, and an un-normalised output O tilde. Only after the last key block does it divide by l and write O i and the log-sum-exp L i to HBM, exactly once.

3.2 Online softmax as a running state

m=−∞, ℓ=0, Õ=0init (j = 0) m⁽¹⁾, ℓ⁽¹⁾, Õ⁽¹⁾after block 1 m⁽²⁾, ℓ⁽²⁾, Õ⁽²⁾after block 2 … O = diag(ℓ)⁻¹ÕL = m + log ℓ S⁽¹⁾, V₁ S⁽²⁾, V₂ Each step: m′ = max(m, rowmax S) ℓ′ = e^(m−m′)ℓ + rowsum e^(S−m′) Õ′ = e^(m−m′)Õ + e^(S−m′)V old contributions are shrunk by e^(m−m′) ≤ 1 whenever a larger max appears; no pass over the full row is ever needed
Softmax without seeing the whole row. The state (m, ℓ, Õ) is sufficient: after the last block it equals the exact softmax-weighted sum. FlashAttention-2 postpones the division by ℓ to the very end (one rescale instead of T_c).
Guide

The online softmax is the trick that makes tiling possible. Reading left to right, the state starts at m equal to minus infinity, l equal to zero and O tilde equal to zero, and each new block of scores updates it. Whenever a larger maximum appears, the old contributions are shrunk by e to the power of old max minus new max, a number at most one. After the last block the state equals the exact softmax-weighted sum. FlashAttention-2's change is to postpone the division by l to the very end.

3.3 What FlashAttention-2 changes

FlashAttention (v1) outer: for j (Kⱼ, Vⱼ block) inner: for i (Qᵢ block) read Oᵢ, ℓᵢ, mᵢ from HBM rescale by diag(ℓ)⁻¹ every step write Oᵢ, ℓᵢ, mᵢ to HBM parallel over batch × heads only FlashAttention-2 outer: for i (Qᵢ block), parallel inner: for j (Kⱼ, Vⱼ block) Õᵢ, mᵢ, ℓᵢ stay in registers rescale only by e^(m−m′) end: Oᵢ = Õᵢ/ℓᵢ; store Lᵢ only parallel over batch × heads × Tᵣ
Three tweaks, identical output. Swapping the loops (first done in the Triton implementation by Phil Tillet) makes the outer loop embarrassingly parallel and keeps the output accumulator on chip; the final normalisation and saving only L = m + log ℓ cut non-matmul FLOPs and stored statistics.
Guide

Version one and version two side by side, with identical output. In v1 the outer loop is over key and value blocks, so the output, l and m for every query block must be read from and written back to HBM at each step, and parallelism covers only batch times heads. In FlashAttention-2 the outer loop is over query blocks, the running state stays in registers, rescaling uses only the cheap exponential factor, and the grid also spans the row blocks. This loop swap is the heart of the paper.

  1. Fewer non-matmul FLOPs. Keep an un-scaled Õ and divide by ℓ once at the end; store only the log-sum-exp L (not m and ℓ separately) for the backward pass.
  2. Parallelise over sequence length. Forward: one thread block per (batch, head, row block i). Backward: one thread block per column block j; the only shared quantity, dQ, is updated with atomic adds.
  3. Better warp partitioning. Inside a thread block (4 or 8 warps), split Q across warps instead of K/V (Fig. 3), so no warp needs another warp’s partial sums.
  4. Causal masking by blocks. Skip blocks entirely above the diagonal; apply the mask only on the diagonal block of each row.
  5. Block sizes {64, 128} × {64, 128}, hand-tuned per head dimension d and shared-memory size (larger = fewer SRAM loads but more registers; too large = register spilling or launch failure).
Guide

These are the paper's four practical changes plus the tuning knob that ties them together. The first two cut expensive non-matmul work: divide by l once at the end, and store only the log-sum-exp. The next two fill the GPU better: give each row block its own thread block, and split queries rather than keys across warps so no warp waits for another's partial sums. With a causal mask, blocks above the diagonal are simply skipped. Block sizes of 64 or 128 are hand-tuned per head dimension, trading fewer memory loads against register pressure.

3.4 Parallelism, causal skipping, backward dataflow

Example: batch 1, 16 heads, N = 8k, Bᵣ = 128 on a 108-SM A100 FlashAttention grid = batch × heads = 16 thread blocks → 16 of 108 SMs busy FlashAttention-2 grid = batch × heads × Tᵣ = 16 × 64 = 1024 thread blocks → all SMs busy
Why sequence-length parallelism matters. Illustrative numbers (ours): with long sequences the batch is small, so batch × heads alone cannot fill 108 SMs (the paper’s rule of thumb: efficient when ≥ 80 thread blocks). Adding Tᵣ = N/Bᵣ row blocks to the grid fixes occupancy.
Guide

Long sequences usually mean a small batch, and that starves the GPU. In this illustrative example, whose numbers are the tab's own, batch one with sixteen heads gives v1 only sixteen thread blocks, so only sixteen of the A100's 108 multiprocessors are busy. FlashAttention-2 also splits each 8k-token sequence into 64 row blocks, giving 1024 thread blocks and a fully occupied chip. Batch-one video generation, as in the thesis, is exactly this situation.

Causal mask, block view key blocks j → query blocks i → skipped (j > i) mask applied no mask needed ≈ half the blocksskipped 1.7–1.8× vsno-mask attention
Causal mask costs almost nothing. Blocks with all column indices above the row indices are skipped (≈1.7–1.8× speed-up vs unmasked); only one diagonal block per row needs the elementwise mask (square blocks). Not needed for bidirectional DiT attention.
Guide

In the grid, rows are query blocks and columns are key blocks. With a causal mask, every block entirely above the diagonal is skipped, which is roughly half of them, and only the single diagonal block in each row needs the element-by-element mask. That gives about 1.7 to 1.8 times speed-up over unmasked attention. It matters for language-model training, but a video diffusion transformer like LTX-2.3 uses bidirectional attention, so this optimisation does not apply there.

Backward (Algorithm 2) Kⱼ, Vⱼ inner loop i over Qᵢ, dOᵢ, Lᵢ, Dᵢ SRAM (this block) recompute Sᵢⱼ, Pᵢⱼ dVⱼ += PᵀdOᵢ dKⱼ += dSᵀQᵢ HBM dQᵢ += dSᵢⱼKⱼ atomic add
Backward: one thread block per column block. dKⱼ, dVⱼ accumulate on chip and are written once; dQᵢ is shared by all column blocks and is updated in HBM with atomic adds. S and P are recomputed from Q, K and L instead of being stored (5 matmuls vs 2 in forward).
Guide

The backward pass flips the ownership. Each thread block now owns one column block, meaning one K j and V j, and loops over all query blocks. The gradients for K and V accumulate on chip and are written once, but the query gradient dQ is shared by every column block, so it is updated in HBM with atomic adds. Instead of storing S and P, the kernel recomputes them from Q, K and the saved log-sum-exp L. Inference never runs this part.

3.5 Algorithms (transcribed)

Algorithm 1 FlashAttention-2 forward pass Require: Matrices Q, K, V ∈ ℝ^(N×d) in HBM, block sizes B_c, B_r. 1: Divide Q into T_r = ⌈N/B_r⌉ blocks Q_1,…,Q_Tr of size B_r × d each, and divide K, V into T_c = ⌈N/B_c⌉ blocks K_1,…,K_Tc and V_1,…,V_Tc, of size B_c × d each. 2: Divide the output O ∈ ℝ^(N×d) into T_r blocks O_1,…,O_Tr of size B_r × d each, and divide the logsumexp L into T_r blocks L_1,…,L_Tr of size B_r each. 3: for 1 ≤ i ≤ T_r do 4: Load Q_i from HBM to on-chip SRAM. 5: On chip, initialize O_i^(0) = (0)_(B_r×d) ∈ ℝ^(B_r×d), ℓ_i^(0) = (0)_(B_r) ∈ ℝ^(B_r), m_i^(0) = (−∞)_(B_r) ∈ ℝ^(B_r). 6: for 1 ≤ j ≤ T_c do 7: Load K_j, V_j from HBM to on-chip SRAM. 8: On chip, compute S_i^(j) = Q_i K_jᵀ ∈ ℝ^(B_r×B_c). 9: On chip, compute m_i^(j) = max(m_i^(j−1), rowmax(S_i^(j))) ∈ ℝ^(B_r), P̃_i^(j) = exp(S_i^(j) − m_i^(j)) ∈ ℝ^(B_r×B_c) (pointwise), ℓ_i^(j) = e^(m_i^(j−1) − m_i^(j)) ℓ_i^(j−1) + rowsum(P̃_i^(j)) ∈ ℝ^(B_r). 10: On chip, compute O_i^(j) = diag(e^(m_i^(j−1) − m_i^(j)))⁻¹ O_i^(j−1) + P̃_i^(j) V_j. 11: end for 12: On chip, compute O_i = diag(ℓ_i^(T_c))⁻¹ O_i^(T_c). 13: On chip, compute L_i = m_i^(T_c) + log(ℓ_i^(T_c)). 14: Write O_i to HBM as the i-th block of O. 15: Write L_i to HBM as the i-th block of L. 16: end for 17: Return the output O and the logsumexp L. [note] line 10 as printed has diag(·)⁻¹; the factor that is actually applied is diag(e^(m_old − m_new)) ≤ 1 (no inverse), consistent with line 9.
Guide

Algorithm 1 is the whole forward pass in one place. It cuts Q into row blocks and K and V into column blocks. Then, for each query block, and these can run in parallel, it initialises the running maximum, sum and output, and walks through all key blocks. Each step computes a score tile, updates the maximum, exponentiates, rescales the old sum and output, and adds the new contribution. At the end it normalises the output once and writes the log-sum-exp. This is the only algorithm that matters for inference.

Algorithm 2 FlashAttention-2 Backward Pass Require: Matrices Q, K, V, O, dO ∈ ℝ^(N×d) in HBM, vector L ∈ ℝ^N in HBM, block sizes B_c, B_r. 1: Divide Q into T_r = ⌈N/B_r⌉ blocks Q_1,…,Q_Tr of size B_r × d each, and divide K, V into T_c = ⌈N/B_c⌉ blocks K_1,…,K_Tc and V_1,…,V_Tc, of size B_c × d each. 2: Divide O into T_r blocks O_1,…,O_Tr of size B_r × d each, divide dO into T_r blocks dO_1,…,dO_Tr of size B_r × d each, and divide L into T_r blocks L_1,…,L_Tr of size B_r each. 3: Initialize dQ = (0)_(N×d) in HBM and divide it into T_r blocks dQ_1,…,dQ_Tr of size B_r × d each. Divide dK, dV ∈ ℝ^(N×d) in to T_c blocks dK_1,…,dK_Tc and dV_1,…,dV_Tc, of size B_c × d each. 4: Compute D = rowsum(dO ∘ O) ∈ ℝ^d (pointwise multiply), write D to HBM and divide it into T_r blocks D_1,…,D_Tr of size B_r each. 5: for 1 ≤ j ≤ T_c do 6: Load K_j, V_j from HBM to on-chip SRAM. 7: Initialize dK_j = (0)_(B_c×d), dV_j = (0)_(B_c×d) on SRAM. 8: for 1 ≤ i ≤ T_r do 9: Load Q_i, O_i, dO_i, dQ_i, L_i, D_i from HBM to on-chip SRAM. 10: On chip, compute S_i^(j) = Q_i K_jᵀ ∈ ℝ^(B_r×B_c). 11: On chip, compute P_i^(j) = exp(S_ij − L_i) ∈ ℝ^(B_r×B_c). 12: On chip, compute dV_j ← dV_j + (P_i^(j))ᵀ dO_i ∈ ℝ^(B_c×d). 13: On chip, compute dP_i^(j) = dO_i V_jᵀ ∈ ℝ^(B_r×B_c). 14: On chip, compute dS_i^(j) = P_i^(j) ∘ (dP_i^(j) − D_i) ∈ ℝ^(B_r×B_c). 15: Load dQ_i from HBM to SRAM, then on chip, update dQ_i ← dQ_i + dS_i^(j) K_j ∈ ℝ^(B_r×d), and write back to HBM. 16: On chip, compute dK_j ← dK_j + dS_i^(j)ᵀ Q_i ∈ ℝ^(B_c×d). 17: end for 18: Write dK_j, dV_j to HBM. 19: end for 20: Return dQ, dK, dV. [note] as printed: D ∈ ℝ^d should read D ∈ ℝ^N (one value per row); S_ij in line 11 means S_i^(j). Line 15 is done with atomic adds when column blocks run in parallel (Sec. 3.2).
Guide

Algorithm 2 computes the gradients for training. It first computes D, the row-wise sum of the output gradient times the output, which makes the softmax derivative cheap. Then, for each key and value block, it loops over query blocks, recomputes the scores and probabilities from the stored log-sum-exp, accumulates the gradients for V and K on chip, and adds its share of the query gradient into HBM with atomic adds. Recomputation trades extra arithmetic for never storing an N by N matrix.

MQA / GQA are supported by index manipulation (no duplication of K/V heads); in backward, dK and dV are summed over the implicitly duplicated heads.

§4Every equation

The paper has no numbered equations; all display math is listed below in paper order, tagged by section. Following the paper, the 1/√d scaling of QKᵀ, masking and dropout are omitted for clarity.

§2.2a\[ \mathbf S=\mathbf Q\mathbf K^{\top}\in\mathbb R^{N\times N},\qquad \mathbf P=\operatorname{softmax}(\mathbf S)\in\mathbb R^{N\times N},\qquad \mathbf O=\mathbf P\mathbf V\in\mathbb R^{N\times d} \]

Standard attention; Q, K, V ∈ ℝ^(N×d), N = sequence length, d = head dimension, softmax row-wise.

Guide

Standard attention takes three steps. S equals Q times K transposed, where Q, K and V are N by d matrices, N is the sequence length and d the head dimension, so S is N by N. P is the row-wise softmax of S, and the output O is P times V. The problem the paper attacks is that S and P are N by N, so for long sequences they are huge and end up in slow memory.

§2.2b\[ \begin{aligned} \mathbf{dV}&=\mathbf P^{\top}\mathbf{dO}\in\mathbb R^{N\times d}\\ \mathbf{dP}&=\mathbf{dO}\,\mathbf V^{\top}\in\mathbb R^{N\times N}\\ \mathbf{dS}&=\operatorname{dsoftmax}(\mathbf{dP})\in\mathbb R^{N\times N}\\ \mathbf{dQ}&=\mathbf{dS}\,\mathbf K\in\mathbb R^{N\times d}\\ \mathbf{dK}&=\mathbf Q\,\mathbf{dS}^{\top}\in\mathbb R^{N\times d} \end{aligned} \]

Backward pass by the chain rule; dO is the loss gradient w.r.t. O. Five matmuls (vs. two in forward).

Guide

These five lines are the backward pass by the chain rule, where dO is the gradient of the loss with respect to the output. The gradient for V is P transposed times dO; dP is dO times V transposed; dS applies the softmax derivative to dP; and the gradients for Q and K are dS times K and Q times dS transposed. That is five matrix multiplies against two in the forward pass, which is why backward is harder to make fast.

§2.2c\[ p=\operatorname{softmax}(s)\;\Rightarrow\; ds=\big(\operatorname{diag}(p)-pp^{\top}\big)\,dp \]

Row-wise softmax Jacobian (“dsoftmax”). Row by row this equals p ∘ (dp − pᵀdp), which is where D in Alg. 2 comes from.

Guide

Here is the derivative of softmax for one row. If p is the softmax of the scores s, then a small change dp in the probabilities maps back to ds equal to the diagonal matrix of p minus p times p transposed, all times dp. Row by row this simplifies to p times the quantity dp minus one number per row, the dot product of p and dp. That number is exactly the D vector that Algorithm 2 precomputes.

§2.3.1a\[ \begin{bmatrix}\mathbf S^{(1)} & \mathbf S^{(2)}\end{bmatrix},\;\; \mathbf S^{(1)},\mathbf S^{(2)}\in\mathbb R^{B_r\times B_c};\qquad \begin{bmatrix}\mathbf V^{(1)}\\ \mathbf V^{(2)}\end{bmatrix},\;\; \mathbf V^{(1)},\mathbf V^{(2)}\in\mathbb R^{B_c\times d} \]

One row block of S split into two column blocks; V split accordingly. B_r, B_c = row / column block sizes.

Guide

This sets up the toy example for the online softmax. One row block of scores S is split into two column blocks, S one and S two, each B r rows by B c columns, and V is split to match into V one and V two. B r and B c are the row and column block sizes. The next two equations compute the same output, first the standard way, then block by block.

§2.3.1b\[ \begin{aligned} m&=\max\big(\operatorname{rowmax}(\mathbf S^{(1)}),\operatorname{rowmax}(\mathbf S^{(2)})\big)\in\mathbb R^{B_r}\\ \ell&=\operatorname{rowsum}\big(e^{\mathbf S^{(1)}-m}\big)+\operatorname{rowsum}\big(e^{\mathbf S^{(2)}-m}\big)\in\mathbb R^{B_r}\\ \mathbf P&=\begin{bmatrix}\mathbf P^{(1)} & \mathbf P^{(2)}\end{bmatrix}=\operatorname{diag}(\ell)^{-1}\begin{bmatrix}e^{\mathbf S^{(1)}-m} & e^{\mathbf S^{(2)}-m}\end{bmatrix}\in\mathbb R^{B_r\times 2B_c}\\ \mathbf O&=\begin{bmatrix}\mathbf P^{(1)} & \mathbf P^{(2)}\end{bmatrix}\begin{bmatrix}\mathbf V^{(1)}\\ \mathbf V^{(2)}\end{bmatrix}=\operatorname{diag}(\ell)^{-1}e^{\mathbf S^{(1)}-m}\mathbf V^{(1)}+e^{\mathbf S^{(2)}-m}\mathbf V^{(2)}\in\mathbb R^{B_r\times d} \end{aligned} \]

Standard (safe) softmax needs the max m and sum ℓ over the whole row before normalising. (As printed, diag(ℓ)⁻¹ is meant to apply to both terms of O.)

Guide

Here is the standard, numerically safe softmax on the two blocks. It first needs m, the maximum over the whole row, and l, the sum of exponentials of the scores minus m across both blocks. Only then can the division give P and multiply by V to get O. The catch is that m and l depend on the whole row, so every block must be seen before normalising. The next equation removes that requirement. As the tab notes, the division by l is meant to apply to both terms.

§2.3.1c\[ \begin{aligned} m^{(1)}&=\operatorname{rowmax}(\mathbf S^{(1)})\in\mathbb R^{B_r}\\ \ell^{(1)}&=\operatorname{rowsum}\big(e^{\mathbf S^{(1)}-m^{(1)}}\big)\in\mathbb R^{B_r}\\ \tilde{\mathbf P}^{(1)}&=\operatorname{diag}(\ell^{(1)})^{-1}e^{\mathbf S^{(1)}-m^{(1)}}\in\mathbb R^{B_r\times B_c}\\ \mathbf O^{(1)}&=\tilde{\mathbf P}^{(1)}\mathbf V^{(1)}=\operatorname{diag}(\ell^{(1)})^{-1}e^{\mathbf S^{(1)}-m^{(1)}}\mathbf V^{(1)}\in\mathbb R^{B_r\times d}\\ m^{(2)}&=\max\big(m^{(1)},\operatorname{rowmax}(\mathbf S^{(2)})\big)=m\\ \ell^{(2)}&=e^{m^{(1)}-m^{(2)}}\ell^{(1)}+\operatorname{rowsum}\big(e^{\mathbf S^{(2)}-m^{(2)}}\big)=\operatorname{rowsum}\big(e^{\mathbf S^{(1)}-m}\big)+\operatorname{rowsum}\big(e^{\mathbf S^{(2)}-m}\big)=\ell\\ \tilde{\mathbf P}^{(2)}&=\operatorname{diag}(\ell^{(2)})^{-1}e^{\mathbf S^{(2)}-m^{(2)}}\\ \mathbf O^{(2)}&=\operatorname{diag}(\ell^{(1)}/\ell^{(2)})^{-1}\mathbf O^{(1)}+\tilde{\mathbf P}^{(2)}\mathbf V^{(2)}=\operatorname{diag}(\ell^{(2)})^{-1}e^{\mathbf S^{(1)}-m}\mathbf V^{(1)}+\operatorname{diag}(\ell^{(2)})^{-1}e^{\mathbf S^{(2)}-m}\mathbf V^{(2)}=\mathbf O \end{aligned} \]

Online softmax as used in FlashAttention v1: local softmax per block, then rescale. The rescale factor for O⁽¹⁾ must be diag(ℓ⁽²⁾)⁻¹ diag(e^(m⁽¹⁾−m⁽²⁾) ℓ⁽¹⁾); the paper’s shorthand omits the exponential and writes the ratio inverted.

Guide

The original FlashAttention's online softmax processes block one alone, getting its own max m one, sum l one, and a correctly normalised partial output O one. When block two arrives, the new max m two and the rescaled sum l two turn out to equal the full-row m and l. The partial output is then corrected by the ratio of old to new sums, so after the last block the result is exact, without ever holding the whole row.

§3.1\[ \frac{312\ \text{TFLOPs/s (FP16/BF16 matmul)}}{19.5\ \text{TFLOPs/s (FP32 non-matmul)}}\approx 16 \]

A100: each non-matmul FLOP costs ~16× a matmul FLOP, motivating tweak 1 and 2 below.

Guide

This ratio motivates the paper's first two tweaks. On the A100, half-precision matrix multiplies run at 312 teraflops per second, but single-precision operations that are not matrix multiplies, like exp, max and division, run at only 19.5. Divided, that is about sixteen, so each non-matmul flop costs as much as sixteen matmul flops. Even a small amount of softmax bookkeeping can therefore eat a large share of the runtime.

§3.1.1a\[ \mathbf O^{(2)}=\operatorname{diag}(\ell^{(1)}/\ell^{(2)})^{-1}\mathbf O^{(1)}+\operatorname{diag}(\ell^{(2)})^{-1}e^{\mathbf S^{(2)}-m^{(2)}}\mathbf V^{(2)} \]

Tweak 1, before: v1 rescales both terms by diag(ℓ⁽²⁾)⁻¹ at every step.

Guide

Here is the version one update that FlashAttention-2 improves. To merge block two, v1 rescales the old output O one by the ratio of old to new sums, and also divides the new term by l two. Both terms are divided by the current sum at every block, so this expensive rescaling is repeated T c times per row. The next equation shows how to postpone it.

§3.1.1b\[ \tilde{\mathbf O}^{(2)}=\operatorname{diag}(\ell^{(1)})^{-1}\mathbf O^{(1)}+e^{\mathbf S^{(2)}-m^{(2)}}\mathbf V^{(2)} \]

Tweak 1, after: keep an “un-scaled” Õ plus the statistic ℓ⁽²⁾; only at the end scale Õ^(last) by diag(ℓ^(last))⁻¹. (As printed; in the un-scaled form the first term is e^(m⁽¹⁾−m⁽²⁾)Õ⁽¹⁾, see §3.1.1d.)

Guide

Tweak one: keep an un-scaled output, O tilde, carry the sum l alongside it, and divide only once after the last block. The equation is reproduced as printed in the paper; in the fully un-scaled form the first term should be e to the power of m one minus m two, times O tilde one, as the tab's equation 3.1.1d shows. The idea is the same either way: fewer non-matmul operations inside the inner loop.

§3.1.1c\[ L^{(j)}=m^{(j)}+\log\big(\ell^{(j)}\big) \]

Tweak 2: store only the row-wise log-sum-exp for backward (one vector instead of m and ℓ); then P = exp(S − L).

Guide

Tweak two. The backward pass needs each row's softmax statistics, and instead of storing both the maximum m and the sum l, FlashAttention-2 stores just L equals m plus the log of l, called the log-sum-exp. Backward can then rebuild the probabilities directly as exp of S minus L. That is one vector per row instead of two, and a simpler recomputation.

§3.1.1d\[ \begin{aligned} m^{(1)}&=\operatorname{rowmax}(\mathbf S^{(1)})\in\mathbb R^{B_r}\\ \ell^{(1)}&=\operatorname{rowsum}\big(e^{\mathbf S^{(1)}-m^{(1)}}\big)\in\mathbb R^{B_r}\\ \tilde{\mathbf O}^{(1)}&=e^{\mathbf S^{(1)}-m^{(1)}}\mathbf V^{(1)}\in\mathbb R^{B_r\times d}\\ m^{(2)}&=\max\big(m^{(1)},\operatorname{rowmax}(\mathbf S^{(2)})\big)=m\\ \ell^{(2)}&=e^{m^{(1)}-m^{(2)}}\ell^{(1)}+\operatorname{rowsum}\big(e^{\mathbf S^{(2)}-m^{(2)}}\big)=\operatorname{rowsum}\big(e^{\mathbf S^{(1)}-m}\big)+\operatorname{rowsum}\big(e^{\mathbf S^{(2)}-m}\big)=\ell\\ \tilde{\mathbf P}^{(2)}&=\operatorname{diag}(\ell^{(2)})^{-1}e^{\mathbf S^{(2)}-m^{(2)}}\\ \tilde{\mathbf O}^{(2)}&=\operatorname{diag}\big(e^{m^{(1)}-m^{(2)}}\big)^{-1}\tilde{\mathbf O}^{(1)}+e^{\mathbf S^{(2)}-m^{(2)}}\mathbf V^{(2)}=e^{\mathbf S^{(1)}-m}\mathbf V^{(1)}+e^{\mathbf S^{(2)}-m}\mathbf V^{(2)}\\ \mathbf O^{(2)}&=\operatorname{diag}(\ell^{(2)})^{-1}\tilde{\mathbf O}^{(2)}=\mathbf O \end{aligned} \]

FlashAttention-2 online softmax (2-block case). The right-hand equality of Õ⁽²⁾ holds with factor diag(e^(m⁽¹⁾−m⁽²⁾)) — the printed “⁻¹” is a typo (same in Alg. 1 line 10).

Guide

Here is the full two-block example redone with FlashAttention-2's un-scaled output. Block one gives m one, l one and O tilde one without any division. Block two updates the max and sum, and O tilde two is the old O tilde shrunk by e to the power of m one minus m two, plus the new block's contribution. Only at the very end is O tilde divided by l to give the exact output. Compare with equations 3.1.1a and b to see the division leave the loop.

Alg. 1\[ \begin{aligned} T_r&=\Big\lceil \tfrac{N}{B_r}\Big\rceil,\quad T_c=\Big\lceil \tfrac{N}{B_c}\Big\rceil,\qquad \mathbf S_i^{(j)}=\mathbf Q_i\mathbf K_j^{\top}\\ m_i^{(j)}&=\max\big(m_i^{(j-1)},\operatorname{rowmax}(\mathbf S_i^{(j)})\big),\quad \tilde{\mathbf P}_i^{(j)}=\exp\big(\mathbf S_i^{(j)}-m_i^{(j)}\big),\quad \ell_i^{(j)}=e^{m_i^{(j-1)}-m_i^{(j)}}\ell_i^{(j-1)}+\operatorname{rowsum}\big(\tilde{\mathbf P}_i^{(j)}\big)\\ \mathbf O_i^{(j)}&=\operatorname{diag}\big(e^{m_i^{(j-1)}-m_i^{(j)}}\big)^{-1}\mathbf O_i^{(j-1)}+\tilde{\mathbf P}_i^{(j)}\mathbf V_j,\qquad \mathbf O_i=\operatorname{diag}\big(\ell_i^{(T_c)}\big)^{-1}\mathbf O_i^{(T_c)},\qquad L_i=m_i^{(T_c)}+\log\big(\ell_i^{(T_c)}\big) \end{aligned} \]

General forward recurrences (lines 1, 8–13), initialised with O = 0, ℓ = 0, m = −∞.

Guide

These are the general forward recurrences of Algorithm 1, for any number of blocks. T r and T c count the row and column blocks: N over B r and N over B c, rounded up. For query block i and key block j, the score tile S equals Q i times K j transposed, the max m and sum l are updated as in the two-block case, and the un-scaled output is rescaled and extended. At the end, O i is divided by l once and L i is stored.

§3.1.1e\[ \mathbf O=\operatorname{softmax}(\mathbf Q\mathbf K^{\top})\mathbf V,\qquad \text{FLOPs}=O(N^2d),\qquad \text{extra memory}=O(N) \]

Correctness and cost of Algorithm 1: exact output; the only extra storage is L.

Guide

Algorithm 1 guarantees an exact result: the output equals softmax of Q times K transposed, times V, with no approximation. The work is still proportional to N squared times d, the same as standard attention, but extra memory beyond inputs and output is only proportional to N, since the only stored statistic is L. The speed comes from fewer memory trips and better scheduling, not from skipping computation.

Alg. 2\[ \begin{aligned} D&=\operatorname{rowsum}(\mathbf{dO}\circ\mathbf O),\qquad \mathbf S_i^{(j)}=\mathbf Q_i\mathbf K_j^{\top},\qquad \mathbf P_i^{(j)}=\exp\big(\mathbf S_i^{(j)}-L_i\big)\\ \mathbf{dV}_j&\leftarrow\mathbf{dV}_j+(\mathbf P_i^{(j)})^{\top}\mathbf{dO}_i,\qquad \mathbf{dP}_i^{(j)}=\mathbf{dO}_i\mathbf V_j^{\top},\qquad \mathbf{dS}_i^{(j)}=\mathbf P_i^{(j)}\circ\big(\mathbf{dP}_i^{(j)}-D_i\big)\\ \mathbf{dQ}_i&\leftarrow\mathbf{dQ}_i+\mathbf{dS}_i^{(j)}\mathbf K_j,\qquad \mathbf{dK}_j\leftarrow\mathbf{dK}_j+\mathbf{dS}_i^{(j)\top}\mathbf Q_i \end{aligned} \]

Backward recurrences (lines 4, 10–16). D = rowsum(dO∘O) = rowsum(P∘dP) makes dsoftmax cheap; ∘ is element-wise product.

Guide

These are the backward recurrences of Algorithm 2. D is the row sum of dO times O, element by element. For each tile, the probabilities are recomputed as exp of S minus L, the V gradient gains P transposed times dO, dP equals dO times V transposed, and dS equals P times the quantity dP minus D, element by element. Then dS updates the gradients for Q and K. Precomputing D turns the softmax derivative into a cheap element-wise step.

§4.1\[ \text{FLOPs}_{\text{fwd}}=4\cdot\text{seqlen}^2\cdot\text{head dimension}\cdot\text{number of heads},\qquad \text{FLOPs}_{\text{bwd}}=2.5\cdot\text{FLOPs}_{\text{fwd}} \]

Benchmark accounting (per sequence); halved with a causal mask; ×2.5 for backward (5 vs 2 matmuls).

Guide

Benchmarks count work this way. Forward flops equal four times sequence length squared, times head dimension, times number of heads. With a causal mask the count is halved, and backward is counted as 2.5 times forward, matching five matrix multiplies against two. Figures 4 to 7 divide these flop counts by measured time to get teraflops per second, so a taller bar means a faster kernel on the same work.

§4.2\[ \text{FLOPs}=6\cdot\text{seqlen}\cdot\text{number of params}+12\cdot\text{number of layers}\cdot\text{hidden dim}\cdot\text{seqlen}^2 \]

Megatron-LM training-FLOPs formula used for Table 1 (weights term + attention term; attention not halved for causal, for consistency).

Guide

The Megatron-LM formula for total training flops is used to report Table 1. The first term, six times sequence length times number of parameters, covers the weight matrix multiplies; the second, twelve times layers times hidden size times sequence length squared, covers attention. The attention term is not halved for causal masking, to stay consistent with earlier work. Dividing by time per GPU gives the utilisation figures in the table.

§5Every figure

(K⁽¹⁾)ᵀ (K⁽²⁾)ᵀ Q S⁽¹⁾ = Q(K⁽¹⁾)ᵀ S⁽²⁾ = Q(K⁽²⁾)ᵀ A⁽¹⁾ = exp(S⁽¹⁾) A⁽²⁾ = exp(S⁽²⁾) · V⁽¹⁾ V⁽²⁾ = Output O⁽¹⁾ = (A⁽¹⁾ / ℓ⁽¹⁾) · V⁽¹⁾ O⁽²⁾ = (ℓ⁽¹⁾/ℓ⁽²⁾) · O⁽¹⁾ + (A⁽²⁾ / ℓ⁽²⁾) · V⁽²⁾ rescale to correctdenominator ℓ⁽¹⁾ = Σᵢ exp(S⁽¹⁾)ᵢ ℓ⁽²⁾ = ℓ⁽¹⁾ + Σᵢ exp(S⁽²⁾)ᵢ stored in HBM computed in SRAM (not in HBM)
Fig. 1FlashAttention forward with K and V split into two blocks. Attention is computed w.r.t. each key block; block 2’s result is merged by rescaling O⁽¹⁾ with ℓ⁽¹⁾/ℓ⁽²⁾, so S and P are never written to HBM. As in the paper, the row-max subtraction is omitted from the drawing.
Guide

The paper's Figure 1 shows the original FlashAttention forward pass with K and V split into two blocks. The first key block gives scores, exponentials and a partial output normalised by l one. The second block gives new scores, the sum grows to l two, and the old output is rescaled by l one over l two before the new part is added. The scores and probabilities are computed in SRAM and never stored in HBM. As in the paper, the row-max subtraction is left out of the drawing.

Forward passBackward pass Worker 1 Worker 2 Worker 3 Worker 4 Worker 5 rows = query blocks Qᵢ Worker 1 Worker 2 Worker 3 Worker 4 Worker 5 columns =key blocks Kⱼ
Fig. 2Who computes what (causal attention matrix shown). Forward: each worker (thread block) owns a block of rows — no communication needed. Backward: each worker owns a block of columns (accumulates dKⱼ, dVⱼ locally); dQ rows are shared and updated with atomic adds.
Guide

Figure 2 shows which worker, meaning which thread block, computes which part of a causal attention matrix. In the forward pass each worker owns a horizontal strip of query rows, so workers never need to talk to each other. In the backward pass each worker owns a vertical strip of key columns and accumulates its K and V gradients locally, while the shared query gradients are combined with atomic adds. This row split is the sequence-length parallelism from the method section.

Q Warp 1-4 Kᵀ Warp 1 Warp 2 Warp 3 Warp 4 V Warp 1 Warp 2 Warp 3 Warp 4 split-K: partial sums→ shared memory → sync (a) FlashAttention Q Warp 1 Warp 2 Warp 3 Warp 4 Kᵀ Warp 1-4 V Warp 1-4 each warp: own rowsno inter-warp traffic (b) FlashAttention-2 accessed by all warps split across different warps
Fig. 3Work partitioning between warps in the forward pass. (a) v1 splits Kᵀ and V across 4 warps (“split-K”): each warp gets a partial QKᵀV that must be written to shared memory, synchronised and summed. (b) FA2 splits Q across warps and shares K, V: each warp produces its own slice of O directly. The backward pass likewise avoids split-K, though some synchronisation remains.
Guide

Figure 3 shows how the four warps inside one thread block share the forward work. In panel a, version one splits K and V across warps, the so-called split-K scheme, so each warp holds only a partial result that must be written to shared memory, synchronised and summed. In panel b, FlashAttention-2 splits Q across warps and lets all of them read the same K and V, so each warp writes its own slice of the output directly, with no inter-warp traffic.

PyTorch FlashAttention xformers FlashAttention Triton FlashAttention-2
(a) no causal mask, d = 64 0 50 100 150 200 250 TFLOPs/s 512 36 36 91 91 68 68 90 90 132 132 1k 40 40 92 92 73 73 102 102 153 153 2k 43 43 104 104 76 76 98 98 162 162 4k 45 45 108 108 77 77 98 98 171 171 8k 46 46 110 110 75 75 100 100 175 175 16k OOM 110 110 75 75 100 100 176 176 Sequence length
(b) no causal mask, d = 128 0 50 100 150 200 250 TFLOPs/s 512 53 53 76 76 83 83 78 78 151 151 1k 67 67 72 72 91 91 85 85 173 173 2k 76 76 76 76 95 95 90 90 187 187 4k 79 79 80 80 96 96 93 93 196 196 8k 86 86 82 82 97 97 95 95 201 201 16k OOM 83 83 98 98 95 95 203 203 Sequence length
(c) causal mask, d = 64 0 50 100 150 200 250 TFLOPs/s 512 15 15 58 58 51 51 59 59 88 88 1k 16 16 70 70 60 60 75 75 119 119 2k 17 17 77 77 66 66 79 79 140 140 4k 18 18 87 87 68 68 76 76 156 156 8k 18 18 92 92 69 69 79 79 165 165 16k OOM 97 97 67 67 80 80 171 171 Sequence length
(d) causal mask, d = 128 0 50 100 150 200 250 TFLOPs/s 512 23 23 55 55 58 58 50 50 99 99 1k 28 28 62 62 72 72 61 61 133 133 2k 32 32 69 69 82 82 68 68 155 155 4k 32 32 76 76 87 87 74 74 173 173 8k 34 34 80 80 91 91 78 78 182 182 16k OOM 83 83 92 92 80 80 189 189 Sequence length
Fig. 4Forward + backward: FlashAttention-2 is the tallest bar everywhere. A100 80GB SXM4, batch × seqlen = 16k tokens, hidden 2048 (32 heads at d=64, 16 heads at d=128). FA2 reaches 176 (d=64) / 203 (d=128) TFLOPs/s and is ≈1.45–2.46× FlashAttention; PyTorch runs out of memory (OOM) at 16k because it materialises the N×N matrices.
Guide

Figure 4 measures forward plus backward speed on an A100. Each panel is one setting, with or without a causal mask and head dimension 64 or 128; the x axis is sequence length, and bar height is teraflops per second. FlashAttention-2 is the tallest bar everywhere, reaching 176 teraflops at head dimension 64 and 203 at 128, about 1.45 to 2.46 times the original FlashAttention. Standard PyTorch runs out of memory at 16k tokens because it stores the full N by N matrices.

PyTorch FlashAttention xformers FlashAttention Triton FlashAttention-2
(a) no causal mask, d = 64 0 50 100 150 200 250 TFLOPs/s 512 29 29 91 91 89 89 128 128 178 178 1k 34 34 96 96 94 94 141 141 191 191 2k 35 35 99 99 97 97 149 149 193 193 4k 37 37 104 104 99 99 152 152 192 192 8k 37 37 104 104 98 98 152 152 192 192 16k OOM 104 104 98 98 155 155 192 192 Sequence length
(b) no causal mask, d = 128 0 50 100 150 200 250 TFLOPs/s 512 42 42 69 69 107 107 127 127 209 209 1k 56 56 66 66 115 115 140 140 224 224 2k 60 60 71 71 120 120 152 152 227 227 4k 63 63 71 71 122 122 157 157 222 222 8k 67 67 72 72 122 122 160 160 224 224 16k OOM 73 73 122 122 163 163 223 223 Sequence length
(c) causal mask, d = 64 0 50 100 150 200 250 TFLOPs/s 512 10 10 56 56 71 71 78 78 115 115 1k 10 10 70 70 82 82 99 99 146 146 2k 10 10 81 81 89 89 112 112 167 167 4k 10 10 89 89 92 92 131 131 177 177 8k 10 10 91 91 94 94 137 137 181 181 16k OOM 94 94 95 95 143 143 183 183 Sequence length
(d) causal mask, d = 128 0 50 100 150 200 250 TFLOPs/s 512 15 15 49 49 79 79 89 89 132 132 1k 18 18 59 59 95 95 108 108 168 168 2k 19 19 65 65 107 107 126 126 187 187 4k 19 19 68 68 112 112 133 133 198 198 8k 19 19 70 70 115 115 141 141 200 200 16k OOM 71 71 117 117 148 148 197 197 Sequence length
Fig. 5Forward pass alone: up to 227 TFLOPs/s (≈73% of 312 peak). Same setting as Fig. 4. The Triton FlashAttention (which already used the FA2 loop order) is the runner-up; the gap to FA2 is from fewer non-matmul FLOPs and warp partitioning. The causal-mask panels count half the FLOPs, so their bars are comparable to the others.
Guide

Figure 5 isolates the forward pass, which is the part that matters for inference. FlashAttention-2 reaches up to 227 teraflops per second, about 73 percent of the A100's peak. The Triton version of FlashAttention, which already used the swapped loop order, comes second; the remaining gap comes from fewer non-matmul flops and better warp partitioning. Across all settings FlashAttention-2's forward pass is about 1.85 to 3.4 times faster than the original FlashAttention's.

PyTorch FlashAttention xformers FlashAttention Triton FlashAttention-2
(a) no causal mask, d = 64 0 50 100 150 200 250 TFLOPs/s 512 39 39 91 91 62 62 81 81 120 120 1k 43 43 90 90 67 67 92 92 141 141 2k 48 48 106 106 70 70 87 87 152 152 4k 49 49 109 109 70 70 86 86 163 163 8k 51 51 112 112 69 69 87 87 169 169 16k OOM 113 113 68 68 88 88 170 170 Sequence length
(b) no causal mask, d = 128 0 50 100 150 200 250 TFLOPs/s 512 59 59 78 78 76 76 68 68 136 136 1k 73 73 75 75 84 84 74 74 159 159 2k 86 86 79 79 88 88 77 77 175 175 4k 88 88 84 84 89 89 80 80 187 187 8k 97 97 86 86 90 90 82 82 193 193 16k OOM 88 88 91 91 81 81 196 196 Sequence length
(c) causal mask, d = 64 0 50 100 150 200 250 TFLOPs/s 512 19 19 58 58 46 46 53 53 81 81 1k 21 21 70 70 54 54 68 68 111 111 2k 24 24 76 76 60 60 71 71 131 131 4k 25 25 85 85 62 62 65 65 149 149 8k 26 26 93 93 62 62 67 67 160 160 16k OOM 98 98 60 60 68 68 166 166 Sequence length
(d) causal mask, d = 128 0 50 100 150 200 250 TFLOPs/s 512 30 30 59 59 53 53 43 43 90 90 1k 37 37 63 63 65 65 52 52 122 122 2k 43 43 71 71 75 75 58 58 145 145 4k 45 45 80 80 80 80 63 63 165 165 8k 49 49 86 86 84 84 66 66 176 176 16k OOM 89 89 84 84 67 67 186 186 Sequence length
Fig. 6Backward pass: up to 196 TFLOPs/s (≈63% of peak), ~2× the others. Backward FLOPs = 2.5 × forward FLOPs (5 matmuls vs 2, due to recomputing S and P). Only relevant for training; inference uses the forward pass only.
Guide

Figure 6 isolates the backward pass. FlashAttention-2 reaches up to 196 teraflops per second, about 63 percent of peak and roughly twice the other methods, even though backward has 2.5 times the flops of forward because S and P are recomputed. This result matters for training long-context models; for the thesis, which only runs inference, it is background rather than something to reproduce.

PyTorch FlashAttention FlashAttention-2
(a) no causal mask, d = 64 0 100 200 300 TFLOPs/s 512 62 62 157 157 215 215 1k 72 72 159 159 254 254 2k 81 81 161 161 274 274 4k 86 86 161 161 288 288 8k 87 87 166 166 294 294 16k OOM 168 168 296 296 Sequence length
(b) no causal mask, d = 128 0 100 200 300 TFLOPs/s 512 93 93 127 127 248 248 1k 120 120 127 127 294 294 2k 145 145 128 128 320 320 4k 160 160 131 131 326 326 8k 167 167 137 137 335 335 16k OOM 139 139 338 338 Sequence length
(c) causal mask, d = 64 0 100 200 300 TFLOPs/s 512 26 26 104 104 141 141 1k 29 29 123 123 192 192 2k 31 31 136 136 232 232 4k 32 32 138 138 257 257 8k 32 32 149 149 273 273 16k OOM 156 156 284 284 Sequence length
(d) causal mask, d = 128 0 100 200 300 TFLOPs/s 512 40 40 98 98 163 163 1k 50 50 109 109 221 221 2k 57 57 108 108 265 265 4k 61 61 126 126 294 294 8k 63 63 135 135 308 308 16k OOM 137 137 328 328 Sequence length
Fig. 7Same code on H100 (no TMA / 4th-gen Tensor Core instructions): up to 338 TFLOPs/s. H100 80GB SXM5; only PyTorch, FlashAttention and FA2 benchmarked. The text quotes “up to 335 TFLOPs/s”; the bar label reads 338 at d=128, 16k.
Guide

Figure 7 runs the same code on an H100, without using that chip's newest features such as TMA and fourth-generation Tensor Core instructions. FlashAttention-2 reaches about 338 teraflops per second at head dimension 128 and 16k tokens, which the paper's text rounds to about 335. Only PyTorch, FlashAttention and FlashAttention-2 were compared. The algorithm transfers to new hardware, but hardware-specific tuning still leaves speed on the table, which later work, FlashAttention-3, picks up.

§6Results

Table 1 — Training speed (TFLOPs/s/GPU) of GPT-style models on 8×A100 GPUs. FlashAttention-2 reaches up to 225 TFLOPs/s (72% model FLOPs utilization).
ModelWithout FlashAttentionFlashAttentionFlashAttention-2
GPT3-1.3B 2k context142 TFLOPs/s189 TFLOPs/s196 TFLOPs/s
GPT3-1.3B 8k context72 TFLOPs/s170 TFLOPs/s220 TFLOPs/s
GPT3-2.7B 2k context149 TFLOPs/s189 TFLOPs/s205 TFLOPs/s
GPT3-2.7B 8k context80 TFLOPs/s175 TFLOPs/s225 TFLOPs/s
Guide

Table 1 moves from kernel benchmarks to end-to-end training of GPT-style models on eight A100 GPUs, in teraflops per second per GPU. FlashAttention-2 wins every row, peaking at 225 for the 2.7 billion parameter model at 8k context, which is 72 percent model flops utilisation. The gain grows with context length: at 2k tokens the three columns are close, while at 8k the baseline without FlashAttention falls to 72 or 80, because attention now dominates the work.

Without FlashAttention FlashAttention FlashAttention-2 0 50 100 150 200 250 GPT3-1.3B 2k 142 189 196 GPT3-1.3B 8k 72 170 220 GPT3-2.7B 2k 149 189 205 GPT3-2.7B 8k 80 175 225 TFLOPs/s per GPU
Table 1 as bars. The longer the context, the bigger the win: 8k context gives 2.8× over no FlashAttention and 1.3× over FlashAttention.
Guide

Table 1 is redrawn as grouped bars, one group per model and context length, with bars for no FlashAttention, FlashAttention and FlashAttention-2. At 2k context the three bars are close, but at 8k the baseline collapses to 72 or 80 teraflops while FlashAttention-2 stays above 220. That is about 2.8 times the baseline and 1.3 times FlashAttention. Longer sequences make attention efficiency matter more, the same scaling that applies to long, high-resolution video clips.

1.0× 1.4× 1.8× 2.2× 2.6× 512 1k 2k 4k 8k 16k Sequence length 1.45× 1.66× 1.56× 1.58× 1.59× 1.60× 1.60× no mask, d=64 1.99× 2.40× 2.46× 2.45× 2.45× 2.45× 2.45× no mask, d=128 1.52× 1.70× 1.82× 1.79× 1.79× 1.76× 1.76× causal, d=64 1.80× 2.15× 2.25× 2.28× 2.27× 2.28× 2.28× causal, d=128
FA2 ÷ FlashAttention, forward + backward on A100 (computed from Fig. 4 bar labels). Gains are largest at head dimension 128, where v1 was weakest.
Guide

Each line is the speed-up of FlashAttention-2 over the original FlashAttention, forward plus backward, across sequence lengths, computed by the tab from Figure 4's bar labels. The two head-dimension-128 lines sit highest, reaching about 2.3 to 2.5 times, while head dimension 64 reaches about 1.6 to 1.8 times. The gain is largest exactly where version one was weakest, which supports the paper's claim that v1 lost speed to poor work partitioning rather than to the algorithm.

Summary derived from Figs. 4–7 (bar labels): best FA2 throughput and FA2 ÷ FlashAttention range over all 24 settings of each figure.
FigureGPUPassPeak FA2 TFLOPs/sFA2 ÷ FlashAttention
Fig. 4A100fwd + bwd2031.45× – 2.46×
Fig. 5A100forward2271.85× – 3.39×
Fig. 6A100backward1961.32× – 2.24×
Fig. 7H100fwd + bwd3381.36× – 2.50×
Guide

This summary is derived by the tab from the bar labels of Figures 4 to 7. For each figure it gives the best FlashAttention-2 throughput and the range of speed-ups over the original FlashAttention across all 24 settings. The A100 forward pass shows the widest gain, up to about 3.4 times, at 227 teraflops. That forward row is the one relevant to diffusion inference, where the backward pass never runs.

  • Paper’s headline: FA2 is 1.7–3.0× faster than FlashAttention, 1.3–2.5× faster than FlashAttention in Triton, 3–10× faster than standard PyTorch attention; ≈2× vs FlashAttention/xformers overall.
  • End-to-end GPT training: up to 1.3× vs FlashAttention and 2.8× vs no FlashAttention; H100 without Hopper-specific instructions still reaches ≈335 TFLOPs/s, with a further 1.5–2× expected from TMA / 4th-gen Tensor Cores (future work, later FlashAttention-3).

§7Why it matters for this thesis

LTX-2.3 on Intel Arc / CPU with OpenVINO

  • Long sequences make attention the bottleneck. A video DiT attends over all spatio-temporal latent tokens at once (bidirectional, no causal mask). Attention FLOPs grow as 4·N²·d·heads (§4.1) while linear layers grow as N, so for longer or higher-resolution clips attention can dominate the step time — and weight-only int8/int4 (NNCF) does not speed it up, because attention has no weights.
  • Use the fused op, don’t write a kernel. OpenVINO has a ScaledDotProductAttention operation, and recent GPU/CPU plugins execute it with tiled, online-softmax (FlashAttention-style) kernels. What matters for the thesis is that the converted LTX-2.3 IR actually contains SDPA nodes (PyTorch F.scaled_dot_product_attention converts to it; hand-written MatMul→Softmax→MatMul patterns need to be fused by OpenVINO transformations). Check the runtime/execution graph and compare latency with the fused op on vs. off.
  • Only Algorithm 1 matters. Inference needs just the forward pass (O and optionally L); the backward pass, atomic dQ updates and causal-block skipping are irrelevant for DiT denoising. Sequence-length parallelism (Fig. 2) is exactly what helps batch-1 generation fill all Xe-cores.
  • Exact, so no calibration and no quality risk. Unlike quantization, FlashAttention changes only data movement; it combines freely with NNCF weight compression and with caching methods. It needs no calibration data — but block sizes are tuned for the hardware’s on-chip memory, which differs between A100 and Arc, so treat A100 speed-ups as qualitative.
  • Precision interplay. The exp/rowmax/rescale path is the “non-matmul” part the paper minimises; on Arc, keeping SDPA in FP16 (XMX matmul) with FP32 statistics is the natural setting. Quantizing attention activations (Q, K, V, P to int8) is a separate, riskier experiment that the fused kernel may or may not support.
Guide

For the thesis, the job is to verify, not to implement. Export LTX-2.3 so that its attention becomes OpenVINO's ScaledDotProductAttention operation, check in the execution graph that these fused nodes really appear, and measure latency with the fused op on and off. NNCF's weight-only int8 or int4 compression does nothing for attention, which has no weights, so this is a separate, exact speed-up that stacks with quantization and caching. Treat A100 numbers as qualitative, and keep attention in FP16 with FP32 statistics on Arc.

Acceleration beyond quantization

DeepCache: Accelerating Diffusion Models for Free

Xinyin Ma, Gongfan Fang, Xinchao Wang (National University of Singapore) · CVPR 2024 (arXiv 2312.00858)

From one denoising step to the next, the deep, high-level features of a diffusion U-Net barely change. DeepCache runs the full U-Net once, caches the deep feature that enters a shallow up-block, and for the next N−1 steps recomputes only the cheap shallow skip path. No training, no calibration data, just a change to the sampling loop.

Training / data
none (training-free)
SD v1.5 (PLMS-50)
2.3× faster, CLIP −0.05
LDM-4-G ImageNet
4.1×, FID 3.39→3.59
Max tested speed-up
10.5× (N=20)
Knob
cache interval N, branch m
Architecture
U-Net skip branches
Reading guide

DeepCache asks a simple question: if a diffusion model's deep features barely change from one denoising step to the next, why recompute them every time? It answers: run the full U-Net once, cache the deep feature, and for the next few steps run only the cheap shallow path that plugs into that cache. It needs no training and no data, and reaches 2.3 times faster Stable Diffusion with almost the same CLIP score, and over four times faster ImageNet generation with FID moving only from 3.39 to 3.59. The tab goes from the big picture and the problem, to the method, every equation, every figure, the result tables with three charts, and finally a thesis box. Among the sixteen papers it belongs to the acceleration group with FlashAttention-2 and TeaCache: it saves steps' worth of compute rather than bits, so it can stack on top of the quantization papers.

§0Before reading

DeepCache is built on two ideas worth knowing first: the U-Net, an image network whose shallow and deep layers are joined by skip connections, and the sampling loop, which calls that same network at every denoising step. It is in the atlas because it saves time without touching bits: it reuses work across steps, so it can stack on top of int8/int4 compression, and it is the direct ancestor of TeaCache, which brings the same idea to transformers like LTX-2.3.

input x_t noise estimate D1 D2 D3 M U3 U2 U1 skip connection shallow: fine detail cached deep: global layout
PrimerA U-Net goes down, then up, with skips across. Down blocks D1, D2, D3 shrink the image into smaller, more abstract feature maps; the middle block M is the deepest point; up blocks U3, U2, U1 grow it back. Each skip connection (teal, dashed) hands the fresh, detailed output of Di straight to Ui, so Ui sees both the skip and the deep feature coming up from Ui+1. DeepCache keeps only the shallow D1 and U1 on most steps and reuses a stored copy of the deep feature (indigo dot).
Guide

A U-Net is shaped like the letter U. The down blocks on the left shrink the image into abstract features, the middle block is the deepest point, and the up blocks on the right grow it back. The teal dashed skips carry fresh detail straight across. The indigo dot marks where DeepCache stores the deep feature, so on cheap steps only D one and U one need to run.

Same network, every step t = 50 t = 49 t = 48 t = 47 t = 46 U-Net U-Net U-Net U-Net U-Net ≈ ≈ ≈ ≈ deep features nearly identical DeepCache, N = 3 full shallow shallow full shallow reuse cached feature
PrimerSampling calls the same network at every timestep, and its deep features barely change. A diffusion model makes an image by starting from noise and denoising it step by step; the timestep \(t\) (gold) counts down, and a sampler such as DDIM or PLMS decides how many steps to take (the paper uses 50, 100 or 250). Each step is one full U-Net call. Because neighbouring steps see almost the same input, their deep features look alike, with similarity above 0.95 for many step pairs. DeepCache runs the full network once every \(N\) steps and lets the shallow steps in between reuse its deep feature.
Guide

The top row is ordinary sampling: the timestep counts down in gold, and every step is one full call of the same U-Net. Below each call sits its deep feature, and neighbouring ones are nearly identical. The bottom row is DeepCache with an interval of three: one full step stores the deep feature, then two shallow steps reuse it, and the pattern repeats.

FID: realism real generated distance of features lower is better CLIP score: prompt match “a red bus” image text encoder image encoder similarity higher is better
PrimerTwo scores judge the images: FID for realism, CLIP score for prompt match. FID passes many real and many generated images through a pretrained image network and measures how far apart the two clouds of features are; lower is better, so an FID moving from 3.39 to 3.59 is a small loss. CLIP score encodes the prompt and the image with the two halves of a CLIP model and measures how well they agree; higher is better. The paper also reports speed as MACs (arithmetic work) and throughput (images per second on one GPU).
Guide

The paper judges quality with two scores. On the left, FID compares the features of real and generated images as two clouds, and a smaller distance between them is better. On the right, CLIP score encodes the prompt and the image and measures how well they agree, and a higher score is better. Speed is reported separately, as arithmetic work and as images per second.

Where DeepCache sits Quantization papers FlashAttention-2 DeepCache TeaCache VBench fewer bits per weight faster attention kernel reuse deep features skip steps on DiTs score the videos in one call across steps
PrimerWhere this paper sits: the first paper that saves time across steps. After the two LTX papers, ten quantization papers (GPTQ to SVDQuant-GPTQ for Wan2.2) make each network call cheaper with fewer bits, and FlashAttention-2 makes attention inside a call faster. DeepCache adds a new axis: consecutive calls repeat work, so reuse it. It needs a U-Net's skip connections, which a DiT like LTX-2.3 lacks; the next paper, TeaCache, adapts the reuse idea to transformers, and VBench closes the atlas with video quality scores.
Guide

Read the column from top to bottom in atlas order. The quantization papers and FlashAttention-2 make a single network call cheaper. DeepCache, in indigo, is the first to save work across calls, by reusing deep features from an earlier step. TeaCache comes next and carries that reuse idea over to diffusion transformers like LTX-2.3, and VBench closes the atlas by scoring video quality.

Terms used in this paper

U-Net
An image network with a down path that shrinks the image into abstract features, a middle block, and an up path that grows it back. Stable Diffusion and the other models in this paper use one to predict noise.
Skip connection (skip branch)
A shortcut that sends the output of down block Di directly to up block Ui. The paper numbers the branches from 1 (shallowest) upward.
Feature map
The intermediate output of a block: a stack of small images, one per channel. "High-level" features from deep blocks describe layout and objects, not pixels.
Timestep \(t\)
The position in the denoising process, counting down from pure noise to the clean image. Each timestep costs one call of the network.
Sampler: DDPM, DDIM, PLMS
The rule that turns the network's noise prediction into the next, less noisy image. DDPM is the original slow sampler; DDIM and PLMS reach good images in fewer steps (here 50 to 250).
Feature similarity
A score of how alike two feature maps are, where values near 1 mean almost identical. The paper finds many step pairs above 0.95.
Cache interval \(N\)
How often the full network runs: one full step, then \(N-1\) cheap steps reusing the cache. Larger \(N\) means faster sampling and more drift from the original image.
Branch \(m\)
Which skip branch the cheap steps keep. Only blocks D1..Dm and Um..U1 run; a smaller \(m\) is faster but less accurate.
MACs
Multiply-accumulate operations: a hardware-independent count of the arithmetic a model does. The paper reports the average per step.
Throughput and speed-up
Throughput is images generated per second on real hardware; speed-up is that throughput divided by the original model's. Measured speed-up is usually smaller than the drop in MACs.
RTX 2080
An NVIDIA consumer graphics card from 2018, the single GPU used for all throughput numbers. An Intel CPU or Arc GPU will give different absolute times, so re-measure.
FID (and sFID, IS)
Fréchet Inception Distance compares features of real and generated images; lower is better. sFID is a variant sensitive to spatial layout, and Inception Score (IS) is higher-is-better. Used for ImageNet, CIFAR-10 and LSUN results.
CLIP score
How well an image matches its text prompt, measured with a CLIP model (here ViT-g/14); higher is better. Used for Stable Diffusion on PartiPrompts and MS-COCO 2017 prompts.
Stable Diffusion v1.5 and LDM-4-G
Two latent diffusion models: Stable Diffusion makes images from text, LDM-4-G makes ImageNet images from a class label. Both run their U-Net on a compressed latent, not on pixels.
Guide

These are the words the paper uses without explaining. The two knobs to remember are the cache interval N, how often the full network runs, and the branch m, how deep the cheap path goes. FID and CLIP score measure quality, MACs and throughput measure cost, and all timings come from a single RTX 2080 graphics card, so Intel numbers will differ.

§1Big picture

Baseline: full U-Net at every stepDeepCache (N = 3): 1 full step + 2 shallow stepsstep t−0full U-Netstep t−0full + storecachestep t−1full U-Netstep t−1shallow onlydeep: skippedstep t−2full U-Netstep t−2shallow onlydeep: skippedstep t−3full U-Netstep t−3full + storecachestep t−4full U-Netstep t−4shallow onlydeep: skippedstep t−5full U-Netstep t−5shallow onlydeep: skipped
Overview Compute the deep part once, reuse it N−1 times. Teal = computed in full precision/full depth; grey = skipped; indigo = the cached deep feature flowing sideways in time. Only the top shallow blocks (D1, U1 for m=1) run on cached steps.
Guide

Compute the deep part once and reuse it for the next steps. The left column is the normal sampler, running the full U-Net at every step. The right column is DeepCache with an interval N of three: one full step that stores its deep feature, shown in indigo, then two steps where only the shallow blocks run in teal and the deep blocks are skipped in grey. The rest of the tab explains where the cache sits and how often to refresh it.

Diffusion sampling calls the same network 25–250 times. DeepCache removes most of the work inside the retrieve steps rather than removing steps.

§2The problem

T sequential calls, each ~ same costεθt=50εθt=49εθt=48εθt=47εθt=46εθt=45εθt=44εθt=43Deep feature of U2 across steps (schematic)≈≈≈≈≈≈≈cos-similarity of adjacent steps often > 0.95 (Fig. 2)⇒ ~ (T−T/N) × deep-U-Net compute is redundant
Problem Sampling is sequential and every call recomputes the whole U-Net. Step-skipping samplers (DDIM, PLMS) cut the number of calls; pruning/distillation cut the cost per call but need retraining (e.g. BK-SDM trained on 2.3M LAION pairs). Meanwhile the deep features that dominate compute barely move between adjacent steps.
Guide

Diffusion sampling is a long chain of calls to the same expensive network, and each call costs about the same. Samplers like DDIM cut the number of calls, and pruning or distillation make each call cheaper but need retraining. The key observation drawn here is that adjacent steps have deep features with cosine similarity often above 0.95, so most of the deep compute is repeated work. That redundancy is the gap DeepCache exploits without any retraining.

  • Retraining-based compression (Diff-Pruning, BK-SDM, Spectral DPM) is costly for large models like Stable Diffusion.
  • Adjacent-step deep features are highly similar; for every timestep, ≥10% of other steps have similarity > 0.95 (up to 80% for DDPM LSUN-Churches).
  • Similarity is not constant: for LDM it drops by ~40% of the progress (Fig. 2c), so a fixed long cache interval hurts.

§3Method

U-Net: output of Ui = Ui(Concat(skip Di, main Ui+1)) — Eq. (3)D1U1skip branch 1D2U2skip branch 2D3U3skip branch 3MF_cache = U₂ output (main branch into U₁)grey = main branch (deep, expensive)teal = shallow path kept for m = 1 (cheap)cost per retrieve step (m=1)SD v1.5 branch 1 ≈ 6% of MACs (Fig. 4)but paper uses m = 2 for SD (≈ 11%)
Method a Where the cache lives. Skip branch m connects Dm and Um. DeepCache caches the main-branch input to Um (the output of Um+1). On a retrieve step only D1..m and Um..1 run.
Guide

The cache lives at the junction of a skip branch. A U-Net pairs each down block D with an up block U through a skip connection; the grey main branch is deep and expensive, the teal path cheap. DeepCache stores the output of U two, the deep feature entering U one, and on retrieve steps runs only D one and U one. For Stable Diffusion branch one is about six percent of the compute, though the paper actually uses branch two, about eleven percent.

uniform 1:5I = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45}non-uniform 1:5I = {0, 5, 10, 13, 15, 19, 24, 29, 35, 42}denoising progress (step index 0 → 49)center c = 15
Method b Which steps run the full network. Same budget (10 full steps out of 50). Uniform spaces them every N; non-uniform (Eq. 7, c=15, p=1.4, computed here) packs them near the centre step where similarity is lowest and thins them out quadratically away from it.
Guide

Two ways to spend the same budget of ten full steps out of fifty. The top row, uniform, refreshes the cache every fifth step. The bottom row, non-uniform, uses equation 7 with centre fifteen and power 1.4, and packs full steps near step fifteen, where features change fastest, spreading them out further away. The point is that the refresh schedule is a free design choice, and placing refreshes where similarity dips gives better quality at large intervals.

  1. Cache step (step t): run the whole U-Net, store F_cache = Um+1(·) (Eq. 4), and update x.
  2. Retrieve steps (next N−1 steps): run only D1…Dm on the new x, feed Concat(Dm, F_cache) into Um (Eq. 5), run Um…U1.
  3. Repeat every N steps (uniform, Eq. 6) or at the steps in I from the non-uniform rule (Eq. 7).
  4. Pick m (depth of the kept shallow path) and N (interval): larger N or smaller m gives more speed and lower quality. Paper uses branch 3 / 1 / 2 for DDPM / LDM-4-G / SD.
Guide

The procedure alternates two kinds of step. A cache step runs the whole network and saves the deep feature. The following N minus one retrieve steps run only the first m down blocks on the new input, join them with the saved feature, and finish with the first m up blocks. A larger interval N or a shallower branch m means more speed and less quality. The paper uses branch three for DDPM, one for LDM, and two for Stable Diffusion.

Algorithm 1: DeepCache (Appendix A, DDPM sampler shown)

Input: U-Net with down blocks {D_i}_{i=1..d}, up blocks {U_i}_{i=1..d}, middle block M Input: caching interval N, branch index m Input: output from step x_t, timestep t Output: predicted output at t - N step ▷ 1. Cache step - compute eps_theta(x_t, t) and x_{t-1} h_0 ← x_t ▷ h_i for down-sampling features for i = 1..d do h_i ← D_i(h_{i-1}) u_{d+1} ← M(h_d) ▷ u_i for up-sampling features for i = d..1 do if i = m then store u_{i+1} in Cache u_i ← U_i(Concat(u_{i+1}, h_i)) x_{t-1} = 1/sqrt(alpha_t) * ( x_t - (1-alpha_t)/sqrt(1-alphabar_t) * u_1 ) + sigma_t z ▷ z ~ N(0, I) ▷ 2. Retrieve step - compute {x_{t-n}}_{n=2..N} for n = 2..N do h_0 ← x_{t-n+1} for i = 1..m do h_i ← D_i(h_{i-1}) retrieve u_{m+1} from Cache for i = m..1 do u_i ← U_i(Concat(u_{i+1}, h_i)) x_{t-n} = 1/sqrt(alpha_t) * ( x_t - (1-alpha_t)/sqrt(1-alphabar_t) * u_1 ) + sigma_t z ▷ z ~ N(0, I) return x_{t-N}
Guide

The first part of Algorithm 1 is an ordinary U-Net pass: go down through all blocks, through the middle block, then back up, and on the way up save the feature arriving at branch m. The second part loops over the next N minus one steps, runs only the shallow down blocks, pulls the saved feature from the cache, and runs the shallow up blocks. Each pass ends with the usual sampler update, so only the network evaluation changes, not the sampler.

Note: the retrieve-step update in Algorithm 1 is transcribed as printed (it reuses xt, αt); in practice the sampler uses the current step’s x and schedule.

U-Net (DeepCache)DiT such as LTX-2 (no long skips)D1 → skip → U1 (recomputed)deep main branch: cachedF_cachefresh shallow detail joins stale deepsemantics via the long skip concatblock 1block Lmiddle blockscache residualΔ = h_out − h_inof middle blocksretrieve step: h ← first blocks(x_t) + Δ_cached → last blocks(or cache the whole-model residual, TeaCache-style)no concat skip in DiT ⇒ recipe must change
Transfer How the idea maps onto a DiT like LTX-2. A DiT is a flat stack of equal-cost transformer blocks joined by residual adds, with no long U-Net skip to carry fresh shallow detail past the deep part. The transferable principle is ‘features change slowly across timesteps’: cache the residual (Δ) added by a span of blocks, or the whole model output (as later DiT cache methods such as FORA, Δ-DiT, TeaCache do). The saving is proportional to the fraction of blocks skipped, not DeepCache’s ≈90% shallow/deep MAC split. This drawing is our illustration, not a figure from the paper.
Guide

A DiT like LTX-2 has no U-Net long skips, so DeepCache's recipe cannot be copied directly. The left side is the U-Net case, where fresh shallow detail travels around the cached deep part through the skip. The right side shows the DiT alternative: cache the change, delta, that a span of middle blocks adds to the hidden state, or cache the whole model's output as TeaCache does. This drawing is the tab's own illustration, and the saving scales with the fraction of blocks skipped.

§4Every equation

(1)\[ q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)=\mathcal{N}\left(\mathbf{x}_t;\sqrt{1-\beta_t}\,\mathbf{x}_{t-1},\,\beta_t\mathbf{I}\right) \]

Forward diffusion: each step shrinks the previous sample and adds Gaussian noise with variance βt.

Guide

The forward diffusion step. q of x t given x t minus one is a Gaussian: the previous sample x t minus one is scaled by the square root of one minus beta t, and noise with variance beta t is added, where beta t is the noise schedule and I is the identity matrix. Repeating this turns an image into pure noise. It is background only; DeepCache does not change the diffusion process itself.

(2)\[ \mathbf{x}_{t-1}\sim p_\theta(\mathbf{x}_{t-1}\mid \mathbf{x}_t)=\mathcal{N}\left(\mathbf{x}_{t-1};\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t)\right),\,\beta_t\mathbf{I}\right) \]

Reverse step: the network εθ predicts noise and the sampler removes it. Here \(\alpha_t=1-\beta_t\), \(\bar\alpha_t=\prod_{i=1}^{T}\alpha_i\) (as printed).

Guide

The reverse, denoising step that sampling repeats many times. The network epsilon theta looks at the noisy sample x t and the timestep t and predicts the noise; the sampler subtracts a scaled version of it, divides by the square root of alpha t, and adds fresh noise with variance beta t. Alpha t is one minus beta t, and alpha bar t is the running product of the alphas. Every one of these network calls is what DeepCache makes cheaper.

(3)\[ \operatorname{Concat}\left(D_i(\cdot),\,U_{i+1}(\cdot)\right) \]

Input to up-block Ui: low-level skip feature from Di concatenated with the high-level main-branch feature from Ui+1.

Guide

The input to up block U i is the concatenation of two features: the low-level feature from down block D i arriving over the skip branch, and the high-level feature from the deeper up block U i plus one on the main branch. This structural fact is what makes DeepCache possible: the deep half can be replaced by a stored copy while the skip still delivers fresh shallow detail.

(4)\[ F^{t}_{\text{cache}}\leftarrow U^{t}_{m+1}(\cdot) \]

Cache step at time t: store the main-branch feature entering Um.

Guide

The cache step. At time t, F cache is set to the output of up block U m plus one, that is, the deep main-branch feature that is about to enter up block U m. Here m is the chosen skip branch. This stored tensor is the only thing carried between steps, and equation 5 is where it gets reused.

(5)\[ \operatorname{Concat}\left(D^{t-1}_{m}(\cdot),\,F^{t}_{\text{cache}}\right) \]

Retrieve step t−1: fresh shallow feature Dm plus the stale cached deep feature; blocks below m are not executed.

Guide

The retrieve step at time t minus one. Up block U m receives the fresh shallow feature from D m, computed on the new input, concatenated with the stale F cache saved at time t. Nothing deeper than branch m runs. This is equation 3 with the expensive main-branch input swapped for the cached one, and Table 5 shows the cache matters: replacing it with zeros destroys the images.

(6)\[ \mathcal{I}=\left\{x\in\mathbb{N}\mid x=iN,\;0\le i\lt k\right\},\qquad k=\lceil T/N\rceil \]

Uniform 1:N: full inference at every N-th step; k is the number of cache updates.

Guide

The uniform refresh schedule. The set I holds the steps where the full network runs: every multiple of N, i times N, for i from zero up to k minus one, where k is T divided by N rounded up and T is the total number of steps. With fifty steps and N equal to five, that means ten full steps. It is the simple baseline that equation 7 improves on.

(7)\[ \begin{aligned}\mathcal{L}&=\left\{\,l_i \;\middle|\; l_i\in \operatorname{linear\_space}\left((-c)^{\frac{1}{p}},\,(T-c)^{\frac{1}{p}},\,k\right)\right\}\\ \mathcal{I}&=\operatorname{unique\_int}\left(\left\{\,i_k \;\middle|\; i_k=(l_k)^{p}+c,\ \text{where } l_k\in\mathcal{L}\right\}\right)\end{aligned} \]

Non-uniform 1:N: evenly space k points in a p-th-root space centred on step c (end exclusive), map back with power p, round and deduplicate. Full steps are densest near c. Defaults found: c≈15 (SD, 50 steps) or 120 (LDM, 250 steps), p≈1.2–1.5.

Guide

The non-uniform refresh schedule. Take k evenly spaced points between minus c and T minus c, but in a p-th-root space; raise them back to the power p, shift by the centre c, round to integers and remove duplicates. Here c is the step where features change fastest and p controls how strongly refreshes cluster around it. The result is dense full steps near c and sparse ones far away. Tables 7 to 10 tune c and p.

Alg. 1\[ \mathbf{x}_{t-1}=\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\mathbf{u}_1\right)+\sigma_t\mathbf{z},\qquad \mathbf{z}\sim\mathcal{N}(\mathbf{0},\mathbf{I}) \]

Unnumbered sampler update inside Algorithm 1: u1 (final up-block output) plays the role of εθ.

Guide

The sampler update used inside Algorithm 1. It is the same as equation 2, except that u one, the output of the first up block, stands in for the predicted noise epsilon theta; sigma t times z adds fresh Gaussian noise. It makes explicit that on a retrieve step the shallow path's output is treated exactly like a full network prediction.

§4.5\[ \text{work}\;=\;K\ \text{full passes}\;+\;(N-1)\times K\ \text{shallow passes} \]

Ablation framing (in text): DeepCache = K DDIM steps plus (N−1)×K shallow-network steps.

Guide

A way to count the work in the ablation of section 4.5. DeepCache equals K full network passes, the same as K DDIM steps, plus N minus one times K extra shallow passes. Framed like this, the question becomes whether those cheap shallow passes add quality on top of plain DDIM with K steps, which Table 6 answers with a clear yes.

§5Every figure

city street,full moonsnowy peakat dawnroom, god rays,fireplaceastronauton moonmedievaltowncatclose-upSD v1.5PLMS-50+ DeepCache2.3×≈ same≈ same≈ same≈ same≈ same≈ samemagpieoil righedgehogyorkiemeerkatbeetlebridgeleafpolar bearred wineLDM-4-GDDIM-250+ DeepCache7.0×≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same
Fig. 1Same pictures, 2.3× / 7.0× faster. Schematic of the teaser gallery. Top block: Stable Diffusion v1.5, 6 prompts, original (teal) vs DeepCache (indigo), 2.3×. Bottom: LDM-4-G class-conditional ImageNet, 10 classes, 7.0× (N=20, 250 DDIM steps). Layout, colours and objects are preserved; only small details differ (e.g. moon placement in the city street).
Guide

The teaser makes the claim visually: same pictures, much faster. The top block is Stable Diffusion 1.5 on six prompts, original versus DeepCache at 2.3 times faster; the bottom is class-conditional ImageNet with LDM at 7 times faster, using N of twenty over 250 DDIM steps. Layout, colours and objects are preserved with only small details changing. This panel is a schematic of the paper's image gallery, not the actual images.

OriginalStep 20Step 19Step 1Step 0teddy bearin garbageimagefeature mapAfeature mapAfeature mapBfeature mapBplate of riceand sauceimagefeature mapAfeature mapAfeature mapBfeature mapBornate weddingcakeimagefeature mapAfeature mapAfeature mapBfeature mapB
LDM-4-GDDPM / BedroomSD v1.5axes: step i vs step j; darker teal = higher cosine similarity of U2 features1.0≈0.20%20%40%60%80%100%0%20%40%60%80%100%denoising progress (%)% steps with sim > 0.95DDPM LSUN-ChurchDDPM LSUN-BedroomLDM ImageNetDDPM CIFAR-10SD COCO2017
Fig. 2Adjacent steps have almost the same high-level features. (a) Feature maps of up-block U2 in Stable Diffusion for three prompts: step 20 ≈ step 19 and step 1 ≈ step 0 (A/B denote the two visibly different pairs). (b) Pairwise similarity of U2 features over all steps (shape redrawn): LDM has a band that widens; DDPM Bedroom is similar almost everywhere except the last steps; SD has a narrow diagonal band with oscillating off-diagonal similarity. (c) For each step, the share of other steps with similarity > 0.95 (shape redrawn from the plot): always ≥10%, up to ~80% for LSUN-Churches; LDM falls sharply around 35% progress, motivating the non-uniform schedule.
Guide

Deep features change slowly, and this is the evidence. Panel a shows feature maps of up block U two in Stable Diffusion, where step twenty looks like step nineteen and step one like step zero. Panel b is a similarity heat map across steps, darker meaning more similar. Panel c gives, for each step, the share of other steps with similarity above 0.95: at least ten percent, up to eighty. The dip in LDM motivates the non-uniform schedule. Panels b and c are redrawn shapes.

xt+1xtxt−1D1U1Skip Branch 1D2U2Skip Branch 2D3U3Skip Branch 3MD1U1D2U2D3U3MF_cache (t)D1chosen pathexcluded pathcached feature
Fig. 3One full pass, then a shallow pass that plugs in the cache. Redrawn faithfully. Step t+1→t runs the whole U-Net (D1..3, M, U3..1) and caches the feature leaving U2. Step t→t−1 executes only D1 and U1 (m=1); D2, D3, M, U2, U3 are skipped (grey, dashed).
Guide

The method figure, redrawn. The upper pass, step t plus one to t, runs the full U-Net with three down blocks, the middle block and three up blocks, and caches the feature leaving U two. The lower pass, step t to t minus one, runs only D one and U one, while everything deeper is greyed out and skipped. It is the concrete case of equations 4 and 5 with m equal to one.

(a) DDPM for CIFAR-1005101520Branch 1Branch 2Branch 3Branch 4Branch 5Branch 6Branch 7Branch 8Branch 9Branch 10Branch 11Branch 12share of MACs (%)down block D_iup block U_i(b) Stable Diffusion v1.505101520Branch 1Branch 2Branch 3Branch 4Branch 5Branch 6Branch 7Branch 8Branch 9Branch 10Branch 11Branch 12share of MACs (%)down block D_iup block U_i
Fig. 4How much compute sits in each skip branch. Per-branch MACs share (down block Di + up block Ui), values read from the plot (±0.5%). (a) DDPM CIFAR-10: compute concentrated in the first six branches. (b) Stable Diffusion v1.5: more uniform across branches 1–9. Keeping branch m costs roughly the sum of branches 1..m on retrieve steps.
Guide

How much compute each skip branch holds gives the cost of a retrieve step. Bars show each branch's share of multiply-accumulate operations, split into down and up block, read from the plot. In the CIFAR-10 DDPM, compute is concentrated in the first six branches; in Stable Diffusion it is spread more evenly. Keeping branch m costs roughly the sum of branches one to m, which is why a shallow m gives big speed-ups.

helmetskateboarderthree clayvasesbicycleby bedkittenby doormountainriver (oil)floralwatercolourwinter cabinat nightabandonedhousesurfer onbeachSD v1.5reference4.260sreference4.319sreference4.326sreference4.366sreference4.376sreference4.388sreference4.395sreference4.400sreference4.417sBK-SDM-Tinylayoutchanges2.580slayoutchanges2.514slayoutchanges2.523slayoutchanges2.542slayoutchanges2.548slayoutchanges2.556slayoutchanges2.554slayoutchanges2.559slayoutchanges2.544sOurs≈ reference1.886s≈ reference1.872s≈ reference1.902s≈ reference1.909s≈ reference1.920s≈ reference1.921s≈ reference1.927s≈ reference1.931s≈ reference1.931s
Fig. 5DeepCache stays closer to the original than a retrained small model. Schematic of 9 prompts × 3 methods, 50-step PLMS; the time printed per cell is the wall-clock time for one image. BK-SDM-Tiny (≈2.55 s, needs retraining) often changes composition and prompt alignment; DeepCache (≈1.9 s, training-free) keeps the original layout and objects.
Guide

DeepCache stays closer to the original than a retrained smaller model. The grid compares nine prompts across the original Stable Diffusion at about 4.3 seconds, the distilled BK-SDM-Tiny at about 2.55 seconds, and DeepCache at about 1.9 seconds. BK-SDM often changes composition and prompt alignment, while DeepCache keeps the original layout. The point: a training-free method can be both faster and more faithful than retraining. The panel is a schematic.

PartiPrompts28.628.829.029.229.429.61.01.52.02.53.0speed-up ratioCLIP scorePLMS (fewer steps)Uniform 1:NNon-uniform 1:NMS-COCO 201729.429.629.830.030.230.41.01.52.02.53.0speed-up ratioCLIP scorePLMS (fewer steps)Uniform 1:NNon-uniform 1:N
Fig. 6At equal speed-up, DeepCache beats simply taking fewer PLMS steps. Stable Diffusion v1.5 CLIP score vs speed-up, plotted from the exact numbers in Tables 13–14. PLMS reduces steps 50→15; DeepCache keeps 50 steps with N=2…8. Non-uniform 1:N holds CLIP almost flat up to ~2.3×.
Guide

At equal speed-up, caching beats simply taking fewer steps. Each panel plots CLIP score, higher is better, against speed-up for Stable Diffusion on PartiPrompts and on COCO. The PLMS line cuts steps from fifty to fifteen and falls steadily; the DeepCache lines keep fifty steps and raise N from two to eight. The non-uniform version stays almost flat up to about 2.3 times. This is the key baseline comparison to copy in a thesis sweep.

OriginalN=2N=3N=4N=5N=6N=7N=8cat on sinkdrinking waterreference5.447ssame2.816ssame2.369ssame2.138ssmall drift1.963ssmall drift1.913ssmall drift1.867ssmall drift1.789schild on skate-board, streetreference4.414ssame2.894ssame2.422ssame2.176ssmall drift2.006ssmall drift1.952ssmall drift1.908ssmall drift1.838srust tint = growing detail drift (clothing colour, cat shape) as N grows
Fig. 7Bigger cache interval: faster, slowly drifting details. Schematic of 2 prompts with N=2…8 (SD v1.5, times per image). Global content stays; small details such as clothing colour and the cat’s shape change. Quality loss is slight for N<5; time drops from 5.4 s to 1.8 s.
Guide

Raising the cache interval trades time for slowly drifting details. Two prompts are shown with N from two to eight: time per image falls from about 5.4 seconds to 1.8 seconds, global content stays put, and only small details like clothing colour or the cat's shape change once N reaches about five. It is the visual version of the N sweeps in Tables 13 and 14. The panel is a schematic of the paper's images.

#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15OriginalOurs≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same#16#17#18#19#20#21#22#23#24#25#26#27#28#29#30OriginalOurs≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same≈ same
Fig. 8CIFAR-10-size samples: DDIM-100 vs +DeepCache N=5 (1.85×). Two blocks of 15 samples, original row (teal) above DeepCache row (indigo); every pair is visually the same. The caption in the paper says ‘DDPM for LSUN-Churches’, but the 32×32 CIFAR-style images and the 1.85× speed-up match CIFAR-10 N=5 in Table 2, so it is most likely a caption error.
Guide

Small 32 by 32 samples, original row above DeepCache row, using DDIM with 100 steps and N of five for 1.85 times faster. Every pair looks the same. The paper's caption says LSUN-Churches, but the image size and the 1.85 speed-up match CIFAR-10 in Table 2, so the tab treats it as a likely caption error rather than a new result.

motorcycle, fenceliving roomhot dogwhite bedgiraffescakes tablestreet lightPLMS-50+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samecheese, breadvase, flowersbird on branchfour bowlspotted plantssnowy sidewalkwhite bathroomPLMS-50+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samesliced orangesfruit basketchurch interiorsmall bathroomvase on mappeople, beachclean kitchenPLMS-50+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samepolar bearbay, boatsliving roomfruit displaybrick streetwine glasspizzaPLMS-50+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ same
Fig. 9Stable Diffusion v1.5 on COCO prompts: PLMS-50 vs +DeepCache N=5 (2.15×). 28 MS-COCO 2017 prompts in 4 blocks, original above DeepCache. Pairs match in layout, colour and object count; only fine texture differs.
Guide

Stable Diffusion 1.5 on twenty-eight COCO prompts, PLMS with fifty steps above, DeepCache with N of five below, at 2.15 times faster. Pairs match in layout, colour and object count, with differences only in fine texture. It is the qualitative side of Table 3, showing the small CLIP drop from 29.51 to 29.46 really is invisible in most images.

flowersknit fabricsea slugplaquefinchbeetlelockersDDIM-250+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samesweatshirtcream bowlchow chowechidnakitchenscrewskomondorDDIM-250+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samebowl, foodbitternseal on shoreborder colliesafewooden chestgibbonDDIM-250+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ sameladybugtrainspoonbillsnakesandpiperfood platebarn, fieldDDIM-250+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ same
Fig. 10LDM-4-G ImageNet: DDIM-250 vs +DeepCache N=10 (6.96×). 28 class-conditional samples in 4 blocks; identical composition in every pair even at 6.96×.
Guide

Class-conditional ImageNet with LDM, DDIM at 250 steps versus DeepCache with N of ten, which is 6.96 times faster. Across twenty-eight classes the composition is identical in every pair. Together with Table 1, where FID rises only from 3.37 to 4.41 at this setting, it shows how redundant long samplers are.

bedroom 1bedroom 2bedroom 3bedroom 4bedroom 5bedroom 6bedroom 7DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samebedroom 8bedroom 9bedroom 10bedroom 11bedroom 12bedroom 13bedroom 14DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samebedroom 15bedroom 16bedroom 17bedroom 18bedroom 19bedroom 20bedroom 21DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samebedroom 22bedroom 23bedroom 24bedroom 25bedroom 26bedroom 27bedroom 28DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ same
Fig. 11DDPM LSUN-Bedroom: DDIM-100 vs +DeepCache N=5 (1.48×). 28 unconditional bedroom samples in 4 blocks; pairs are near-identical.
Guide

Unconditional LSUN-Bedroom samples, DDIM with 100 steps versus DeepCache with N of five at 1.48 times faster. The pairs are near-identical. Note the speed-up is smaller than on ImageNet: at 100 steps and with the branch the paper uses, each retrieve step still costs a large share of the network, as Table 2b shows.

church 1church 2church 3church 4church 5church 6church 7DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samechurch 8church 9church 10church 11church 12church 13church 14DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samechurch 15church 16church 17church 18church 19church 20church 21DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ samechurch 22church 23church 24church 25church 26church 27church 28DDIM-100+DeepCache≈ same≈ same≈ same≈ same≈ same≈ same≈ same
Fig. 12DDPM LSUN-Churches: DDIM-100 vs +DeepCache N=5 (1.48×). 28 unconditional church samples in 4 blocks; pairs are near-identical, including watermark artefacts inherited from the training data.
Guide

Unconditional LSUN-Churches samples, DDIM with 100 steps versus DeepCache with N of five at 1.48 times faster. The pairs are near-identical, down to the watermark artefacts the model learned from its training data. Faithful reproduction of such quirks shows DeepCache approximates the original model's output rather than inventing new content.

§6Results

Table 1. Class-conditional ImageNet 256×256, LDM-4-G, 250 DDIM steps. *reproduced (official Diff-Pruning: FID 9.16, IS 201.81).
MethodMACs↓Throughput↑Speed↑RetrainFID↓sFID↓IS↑Prec.↑Recall↑
IDDPM1416.3G--✗12.265.42-70.062.0
ADM-G1186.4G--✗4.595.25186.7082.052.0
LDM-499.82G0.1781×✗3.60-247.6787.048.0
LDM-4*99.82G0.1781×✗3.375.14204.5682.7153.86
Spectral DPM9.9G--✓10.60----
Diff-Pruning*52.71G0.2691.51×✓9.2710.59214.4287.8730.87
Uniform N=252.12G0.3341.88×✗3.395.11204.0982.7554.07
Uniform N=336.48G0.4712.65×✗3.445.11202.7982.6553.81
Uniform N=523.50G0.7334.12×✗3.595.16200.4582.3653.31
Uniform N=1013.97G1.2396.96×✗4.415.57191.1181.2651.53
Uniform N=209.39G1.87610.54×✗8.238.08161.8375.3150.57
NonUniform N=1013.97G1.2396.96×✗4.275.42193.1181.7551.84
NonUniform N=209.39G1.87610.54×✗7.117.34167.8577.4450.08
Guide

The main ImageNet result, class-conditional LDM with 250 DDIM steps. Read the speed column against FID, lower is better. Uniform N of two to five gives 1.88 to 4.12 times speed-up while FID only moves from 3.37 to 3.59, with no retraining. The retrained Diff-Pruning reaches just 1.51 times at FID 9.27. At N of twenty, 10.5 times faster, quality drops, and the non-uniform schedule recovers part of it, 7.11 instead of 8.23.

3456789101×3×5×7×9×11×speed-up vs LDM-4 (×)FID (lower is better)Uniform 1:NNon-uniform 1:NDiff-Pruning (retrained)
Chart A ImageNet: FID stays near 3.4–3.6 up to 4× speed-up. From Table 1. FID only degrades noticeably past N=10; non-uniform helps at large N. Retrained Diff-Pruning (1.51×, FID 9.27) is far worse.
Guide

Chart A plots Table 1: FID, lower is better, against speed-up. The uniform and non-uniform lines stay near 3.4 to 3.6 up to about four times, then bend up past N of ten; non-uniform stays lower at the largest intervals. The single Diff-Pruning point, retrained, sits far above at only 1.51 times. The takeaway is a long flat region of nearly free speed.

Table 2a. CIFAR-10 32×32, 100 DDIM steps. *reproduced.
MethodMACsThru.SpeedStepsFID
DDPM6.1G9.791×-4.19
DDPM*6.1G9.791×-4.16
Diff-Pruning3.4G13.451.37×100k5.29
Ours N=24.15G13.731.40×04.35
Ours N=33.54G15.741.61×04.70
Ours N=53.01G18.111.85×05.73
Ours N=102.63G20.262.07×09.74
Guide

CIFAR-10 with a small DDPM and 100 DDIM steps. The Steps column counts retraining steps: Diff-Pruning needs 100 thousand, DeepCache zero. N of two gives 1.4 times faster at FID 4.35 versus 4.16 for the reproduced baseline, beating Diff-Pruning's 5.29 at similar speed. At N of ten, FID climbs to 9.74, so tiny models tolerate caching less.

Table 2b. LSUN-Bedroom 256×256.
MethodMACsThru.SpeedStepsFID
DDPM248.7G0.211×-6.62
DDPM*248.7G0.211×-6.70
Diff-Pruning138.8G0.311.48×200k18.60
Ours N=2190.8G0.271.29×06.69
Ours N=3172.3G0.301.43×07.20
Ours N=5156.0G0.311.48×09.49
Guide

LSUN-Bedroom at 256 pixels. DeepCache reaches 1.29 to 1.48 times speed-up with FID from 6.69 to 9.49, against 6.70 for the reproduced baseline. At the same 1.48 times, retrained Diff-Pruning scores 18.60, twice as bad. Speed-ups here are modest because the retrieve path still carries much of this network's compute.

Table 2c. LSUN-Churches 256×256.
MethodMACsThru.SpeedStepsFID
DDPM248.7G0.211×-10.58
DDPM*248.7G0.211×-10.87
Diff-Pruning138.8G0.311.48×500k13.90
Ours N=2190.8G0.271.29×011.31
Ours N=3172.3G0.301.43×011.75
Ours N=5156.0G0.311.48×013.68
Guide

LSUN-Churches at 256 pixels, same setting as Bedroom. DeepCache gives FID 11.31 at 1.29 times and 13.68 at 1.48 times, versus 10.87 for the baseline. Diff-Pruning at 1.48 times scores 13.90 after 500 thousand training steps, so DeepCache matches it for free. The gain over pruning is smaller here than on Bedroom.

Table 3. Stable Diffusion v1.5, 512px, CLIP score (ViT-g/14). Ours = N=5.
MethodParti MACsThru.SpeedCLIPCOCO MACsThru.SpeedCLIP
PLMS 50 steps338.83G0.2301.00×29.51338.83G0.2371.00×30.30
PLMS 25 steps169.42G0.4702.04×29.33169.42G0.4531.91×29.99
BK-SDM-Base223.81G0.3431.49×28.88223.81G0.3441.45×29.47
BK-SDM-Small217.78G0.4021.75×27.94217.78G0.3971.68×27.96
BK-SDM-Tiny205.09G0.4161.81×27.36205.09G0.4151.76×27.41
Ours130.45G0.4942.15×29.46130.45G0.5002.11×30.23
Guide

Stable Diffusion 1.5 at 512 pixels, scored by CLIP score, higher is better, on PartiPrompts and COCO. DeepCache with N of five is the fastest row, about 2.1 times, and keeps CLIP at 29.46 and 30.23 versus 29.51 and 30.30 for the full fifty-step PLMS. Simply halving steps is slower and scores lower, and the retrained BK-SDM models lose much more. This is the table most relevant to large text-conditioned models.

CLIP score (PartiPrompts), axis from 27speed27282930PLMS-2529.332.04×BK-SDM-Base28.881.49×BK-SDM-Small27.941.75×BK-SDM-Tiny27.361.81×DeepCache N=529.462.15×
Chart B SD v1.5: fastest and highest CLIP among 2×-class options. From Table 3 (PartiPrompts). Dashed line = PLMS-50 reference 29.51. Retrained BK-SDM variants lose 0.6–2.2 CLIP.
Guide

Chart B plots Table 3 for PartiPrompts. Each bar is a roughly two-times-faster option; the dashed line is the full fifty-step reference at 29.51. DeepCache at N of five is both the fastest, 2.15 times, and the highest, 29.46, while the retrained BK-SDM variants lose between 0.6 and 2.2 CLIP points. Note the axis starts at 27, which exaggerates the gaps visually.

Table 4. DDIM vs DeepCache at equal throughput, ImageNet LDM-4-G.
MethodThroughput↑FID↓sFID↓
DDIM 59 steps0.7273.595.14
Ours0.7333.595.16
DDIM 91 steps0.4363.4650.6 (as printed)
Ours0.4713.445.11
Guide

At equal throughput on ImageNet, DeepCache and plain DDIM with fewer steps are tied. DeepCache at 0.733 images per second matches DDIM with 59 steps at FID 3.59, and at 0.471 slightly beats DDIM with 91 steps. So on this long-schedule model, part of DeepCache's benefit is what a shorter schedule would also give; Stable Diffusion in Figure 6 shows a clearer win. The sFID of 50.6 is printed as is, likely a typo for 5.06.

Table 5. Cached features replaced by a zero matrix.
ModelDatasetDeepCachew/o cached features
DDPMCIFAR-109.74192.98
LDM-4-GImageNet7.36312.12
Guide

The cached feature is essential. Replacing it with zeros, so only the shallow path contributes, sends FID from 9.74 to about 193 on CIFAR-10 and from 7.36 to about 312 on ImageNet, meaning the images collapse. This ablation proves the shallow path alone knows nothing useful; the stale deep feature carries the content, supporting the claim behind equation 5.

Table 6. Shallow-network inference on top of DDIM (steps = full passes).
StepsDDIM FID↓DeepCache FID↓Δ
504.674.35-0.32
206.845.73-1.11
1013.3610.38-2.98
Guide

The shallow passes add real quality on top of DDIM. With the same number of full passes, 50, 20 or 10, DeepCache inserts cheap shallow steps in between and lowers FID by 0.32, 1.11 and 2.98 on CIFAR-10. The fewer full steps, the bigger the help. This is the work count of the section 4.5 equation put into numbers.

Table 7. Varying centre c (p = 1.2, N = 20), ImageNet.
CenterFID↓sFID↓IS↑Prec.↑Recall↑
c=108.268.47160.375.6948.93
c=208.178.46161.1875.7748.95
c=507.778.16163.7476.2349.18
c=807.367.76166.2176.9349.75
c=1007.167.51167.5277.3049.64
c=1207.117.34167.8577.4450.08
c=1507.337.36166.0477.0949.98
c=2008.097.79160.5075.8549.69
Guide

Tuning the centre c of the non-uniform schedule on ImageNet, with p fixed at 1.2 and N at twenty. FID, lower is better, improves from 8.26 at c of ten to a best of 7.11 at c of 120, then worsens again at 200. So refreshes should cluster around the middle of the 250-step trajectory for this model, consistent with the similarity dip in Figure 2c.

Table 8. Varying power p (c = 120, N = 20), ImageNet.
PowerFID↓sFID↓IS↑Prec.↑Recall↑
p=1.057.367.52166.1277.0650.38
p=1.17.257.44166.8277.1750.13
p=1.27.117.34167.8577.4450.08
p=1.37.097.35167.9777.5650.34
p=1.47.137.39167.6877.4250.26
p=1.57.257.44166.8277.1750.13
Guide

Tuning the power p with c fixed at 120 and N at twenty on ImageNet. FID stays between about 7.1 and 7.4 across all values, with the best near p of 1.2 to 1.3. The takeaway is that p is a gentle knob and the choice of centre c in Table 7 matters more.

Table 9. Non-uniform hyper-parameters, LDM-4-G.
N=2N=3N=5N=10N=20
Center c120120110110120
Power p1.21.21.41.21.4
Guide

The centre and power actually used for the non-uniform results on LDM ImageNet at each interval N. The centre stays at 110 to 120 of 250 steps and the power at 1.2 or 1.4. It is a reference table for reproducing Table 11 rather than a result in itself.

Table 10. Non-uniform hyper-parameters, Stable Diffusion v1.5 (upper = PartiPrompts, lower = COCO; chosen from c∈{0,5,10,15,20,25}, p∈{1.1,…,1.6}).
N=2N=3N=4N=5N=6N=7N=8
Center c15151510151510
Power p1.51.31.41.51.31.41.4
Center c20202015151520
Power p1.31.41.41.31.51.51.3
Guide

The centre and power used for Stable Diffusion, upper rows for PartiPrompts, lower rows for COCO, picked by a small grid search. With fifty PLMS steps the centre falls at ten to twenty and the power at 1.3 to 1.5. The lesson for a new model is that these values must be re-tuned per model and step count, since they differ from the ImageNet ones.

Table 11. Uniform vs non-uniform 1:N, ImageNet LDM-4-G, 250 DDIM steps (*regenerated from official checkpoint).
NUni FIDsFIDISPrec.RecallNon-uni FIDsFIDISPrec.Recall
baseline3.37*5.14204.5682.7153.863.60-247.6787.048.0
23.395.11204.0982.7554.073.465.14204.1283.2153.53
33.445.11202.7982.6553.813.495.13203.2283.1853.44
53.595.16200.4582.3653.313.635.12200.0483.0753.25
104.415.57191.1181.2651.534.275.42193.1181.7551.84
208.238.08161.8375.3150.577.367.76166.2176.9349.75
Guide

Uniform versus non-uniform schedules on ImageNet, side by side at each N. At small intervals the two are nearly equal, with uniform even slightly better in FID. The gap opens at large intervals: at N of twenty, non-uniform brings FID from 8.23 down to 7.36. So the non-uniform schedule matters mainly when caching aggressively. Note the non-uniform baseline row lists the paper's published LDM numbers.

Note: Table 11 lists non-uniform N=20 FID 7.36, while Table 1 lists 7.11 (the best Table 7/8 setting); both are as printed.

Table 12. Choice of skip branch m, CIFAR-10, uniform 1:5, DDIM-100.
Skip branchMACs↓Throughput↑Speed↑FID↓
11.60G29.603.023×7.14
22.24G22.242.272×5.94
33.01G18.111.850×5.73
43.89G15.441.577×5.69
54.58G13.151.343×5.51
65.31G11.461.171×4.93
75.45G11.271.151×4.92
85.60G11.071.131×4.76
95.88G10.821.105×4.54
105.95G10.731.096×4.57
115.99G10.671.089×4.52
126.03G10.591.082×4.48
Guide

Choosing the skip branch m on CIFAR-10 with N of five. Keeping only branch one gives 3.02 times speed-up but FID 7.14; going deeper improves FID towards the baseline of 4.19 while the speed-up shrinks to about 1.1 times. So m is a second dial next to N, and Chart C shows its shape.

1.01.52.02.53.0123456789101112skip branch mspeed-up (×)speed-up45678FID (right scale)
Chart C Branch choice is a second speed/quality dial. From Table 12. Keeping only branch 1 gives 3.0× at FID 7.14; deeper branches approach the 4.19 baseline but speed-up vanishes. Branch 6 is a visible knee (FID 5.51→4.93).
Guide

Chart C plots Table 12 with two lines: speed-up on the left scale and FID on the right, against the skip branch m. Speed falls quickly as m grows while FID improves, with a clear knee around branch six, where FID drops from 5.51 to 4.93. Past that knee extra depth buys little quality and costs speed.

Table 13. SD v1.5 on PartiPrompts (plotted in Fig. 6).
PLMS stepsThru.SpeedCLIPDC NThru.SpeedUniformNon-uniform
500.2301.0029.511----
450.2511.0929.4020.3331.4529.5429.51
400.3071.3429.3530.3961.7229.5029.59
350.3331.4529.2440.4622.0129.5329.57
300.3841.6729.2450.4942.1529.4129.50
250.4702.0429.3260.5292.3029.3029.46
200.5382.3429.1570.5552.4129.1129.42
150.6642.8928.5880.5822.5328.9729.26
Guide

The exact numbers behind Figure 6 for PartiPrompts. Left, PLMS with fewer steps: at 2.04 times, 25 steps, CLIP drops to 29.32. Right, DeepCache with interval N: at 2.15 times, N of five, CLIP stays at 29.41 uniform and 29.50 non-uniform, against 29.51 for the full model. At every comparable speed, the non-uniform DeepCache column is highest.

Table 14. SD v1.5 on MS-COCO 2017 (plotted in Fig. 6).
PLMS stepsThru.SpeedCLIPDC NThru.SpeedUniformNon-uniform
500.2371.0030.241----
450.2521.0630.1420.3561.5030.3130.37
400.3061.2930.1930.3971.6830.3330.34
350.3521.4930.0940.4481.8930.2830.31
300.3841.6230.0450.5002.1130.1930.23
250.4531.9129.9960.5242.2130.0430.18
200.5262.2229.8270.5552.3429.9030.10
150.6142.5929.3980.5832.4629.7630.02
Guide

The COCO counterpart of Table 13. Reducing PLMS steps to 25 gives 1.91 times at CLIP 29.99, while DeepCache at N of five gives 2.11 times at 30.19 uniform and 30.23 non-uniform, against 30.24 for the full model. At small N, DeepCache even scores marginally above the baseline. The same conclusion holds on a second prompt set.

§7Why it matters for this thesis

DeepCache → LTX-2.3 on OpenVINO / NNCF

  • Orthogonal to quantization and needs no calibration. Caching changes the sampling loop, not the weights, so it stacks on top of NNCF int8/int4 weight compression. But errors compound (quantization noise plus stale features): measure the combination, not each part alone.
  • Recipe does not transfer literally. LTX-2 is a DiT, a flat stack of transformer blocks with residual adds and no U-Net long skips, so there is no ‘cheap shallow branch’. The DiT counterpart is caching the residual of a block span (FORA / Δ-DiT style) or of the whole model with an adaptive trigger (TeaCache-style). Speed-up ≈ share of blocks skipped × share of steps that are retrieve steps.
  • OpenVINO feasibility: pure pipeline work, no custom kernels. Export the transformer as two or three IR sub-models (first blocks, middle span, last blocks), or one model that also outputs the residual. The Python loop then decides per step whether to run the middle span or add the cached residual. Keeping the cache tensor on the device (Arc GPU remote tensors) avoids host copies. A video latent has many tokens, so the cache can take hundreds of MB, which matters on CPU/iGPU memory.
  • Few-step regimes cut the gain. DeepCache shines at 50–250 steps. The distilled LTX variants use only a handful of steps, and adjacent-step similarity drops as steps get farther apart. Expect caching to help mainly the full (non-distilled) multi-step model, and use a non-uniform schedule (Eq. 7 idea: refresh more often where features change fastest).
  • Evaluation to copy. Run speed-vs-quality sweeps over N (Tables 13–14) against the ‘just use fewer steps’ baseline (Fig. 6). For video, add temporal-consistency metrics (e.g. FVD, CLIP score per frame) and an audio check, since stale features may show up as flicker.
Guide

Treat caching as a separate layer on top of NNCF weight compression, and measure the two together, since quantization noise and stale features add up. For LTX-2.3, cache the residual of a middle span of transformer blocks, or the whole model output TeaCache-style, by exporting the model as two or three OpenVINO sub-models and letting the Python loop decide per step. Watch cache memory on CPU and Arc, expect little gain on the few-step distilled model, and compare against simply using fewer steps.

Acceleration beyond quantization

Timestep Embedding Tells: It’s Time to Cache for Video Diffusion Model

Feng Liu, Shiwei Zhang, Xiaofeng Wang, Yujie Wei, Haonan Qiu, Yuzhong Zhao, Yingya Zhang, Qixiang Ye, Fang Wan · UCAS, Alibaba, CASIA, Fudan, NTU · arXiv 2411.19108 (v2, Mar 2025), CVPR 2025

Consecutive denoising steps of a video DiT often produce almost the same output, so some steps can simply reuse the previous result. TeaCache decides which steps to skip by watching a cheap signal, how much the timestep-modulated input changed, rescales it with a small polynomial, and skips until the accumulated change crosses a threshold. No training; it works alongside quantization.

Type
Training-free step caching
Best speed-up
4.41× (−0.07 VBench)
Max speed-up
6.83× OpenSora-Plan
Latte / Open-Sora
1.86× / 1.55× lossless
Knobs
δ = 0.1 / 0.2 · poly order
Overhead
1 modulation + 1 L1 norm / step
Reading guide

TeaCache asks a simple question: if consecutive denoising steps of a video diffusion transformer give almost the same output, can we skip some of them without training anything? The answer is yes, as long as the steps to skip are chosen from a cheap signal, the change in the timestep-modulated input, rescaled by a small polynomial and summed until it crosses a threshold. The tab starts with the big picture and the problem of fixed skipping, then walks through the method, every equation, every figure, the results tables, and a thesis box on LTX-2.3. Headline numbers are 1.86 times faster on Latte and 1.55 times on Open-Sora with no VBench loss, and up to 4.41 times on OpenSora-Plan for a loss of 0.07 points. Among the sixteen papers it is the last of the acceleration group, after FlashAttention-2 and DeepCache, and just before VBench. It cuts how often the model runs, so it stacks with int8 or int4 weights.

§0Before reading

Following TeaCache takes three ideas: a diffusion model makes a video by running the whole transformer once per denoising step, the timestep reaches every block through a small scale-and-shift, and "how much a tensor changed" can be measured with one ratio. The paper is in the atlas because it does not make each step cheaper. It skips whole steps, and that stacks with the int8/int4 weights from the quantization papers.

neighbours nearly identical noise clean video DiT DiT DiT DiT … timestep t: high noise t near 0 1 step = 1 full DiT pass · 30 to 150 steps
PrimerA video is made in many steps, and each step runs the whole model. The sampler starts from pure noise and removes a little noise per step, guided by the timestep \(t\). Every step is one full pass through the diffusion transformer (DiT), which is the expensive part. In the middle of the trajectory, neighbouring steps produce almost the same output: that redundancy is what TeaCache exploits.
Guide

A diffusion model does not make a video in one go. It starts from pure noise and cleans it a little at a time, and every one of those steps runs the whole diffusion transformer once. Read the picture left to right: noise at the top left, a clean video on the right, one DiT pass under each arrow. The frames in the middle barely differ from their neighbours, and that redundancy is exactly what TeaCache turns into skipped passes.

t sinusoidal MLP scale γ, shift β timestep embedding noisy video tokens LayerNorm ×(1+γ) + β Ft DiT blocks TeaCache watches this
PrimerThe timestep enters every block as a scale and a shift. A diffusion transformer turns the number \(t\) into a vector (sinusoidal features, then a small MLP). That vector gives a scale \(\gamma\) and a shift \(\beta\) that are applied to the normalised tokens before attention: this is called adaLN modulation. The result \(\mathbf F_t\) of the very first modulation is cheap to compute and already "knows" both the content and the timestep, so TeaCache uses it to predict how much the output will change.
Guide

The timestep number reaches the transformer in a specific way. It becomes a vector through sinusoidal features and a small MLP, and that vector sets a scale called gamma and a shift called beta. These are applied to the normalised video tokens before attention, which is called adaptive LayerNorm modulation. The result of the first modulation, F sub t, is cheap and reflects both content and noise level, so TeaCache watches it instead of the expensive output.

previous now |difference| 2.0 −1.0 3.0 0.0 2.2 −1.0 2.7 0.1 0.2 0.0 0.3 0.1 sum of sizes = 6 sum = 0.6 0.6 ÷ 6 = 0.10 → "10 % change" small → reuse large → recompute
Primer"How much did it change?" is one ratio. The relative L1 distance adds up the absolute element-by-element differences between this step and the previous one, then divides by the total size of the previous tensor. It is a unit-free percentage: here \(0.6/6=0.10\). TeaCache computes it on \(\mathbf F_t\) every step, rescales it with a small fitted polynomial, and adds it up until the sum crosses a threshold \(\delta\).
Guide

To decide whether a step is worth computing, TeaCache needs one number for how much things changed. The relative L1 distance adds up the absolute differences element by element and divides by the total size of the previous tensor. In the toy example the differences sum to 0.6 and the previous values to 6, so the change is ten percent. Small values mean reuse the cache, large values mean run the model again.

compression acceleration evaluation Quantization cheaper each pass FlashAttn-2 faster attention DeepCache U-Net caching TeaCache skip DiT passes VBench score video quality LTX-2.3 on Intel int4 weights + fewer passes
PrimerWhere this paper sits. The quantization papers make every DiT pass cheaper; FlashAttention-2 speeds up attention inside a pass; DeepCache reuses deep U-Net features between steps. TeaCache goes further for transformers: it skips the whole DiT pass on some steps and decides when from the input side. Next, VBench explains the quality score this paper reports. For this thesis, quantization and TeaCache are independent, so their savings multiply.
Guide

Every paper before this one either made each transformer pass cheaper, like the quantization methods, or sped up one part of it, like FlashAttention-2, or reused features inside a U-Net, like DeepCache. TeaCache skips entire transformer passes and decides when from the input side. VBench, next in the atlas, explains the quality score it reports. For the thesis the key point is that quantization and caching are independent, so their savings multiply on LTX-2.3.

Terms used in this paper

Denoising (sampling) step
One iteration of the sampler that removes a bit of noise from the latent video. Each step calls the full model once; Latte uses 50, Open-Sora 30 and OpenSora-Plan 150 in this paper.
DiT (diffusion transformer)
The denoising network built from transformer blocks (attention plus feed-forward) instead of a U-Net. LTX-2.3 is one.
Timestep embedding
The vector made from the step number \(t\) (sinusoidal features, then an MLP). It tells every block how noisy the input is.
adaLN modulation
Adaptive LayerNorm: normalise the tokens, then scale and shift them with values computed from the timestep embedding. TeaCache's indicator is the output of the first one.
Relative L1 distance
Sum of absolute differences between two tensors divided by the sum of absolute values of the reference one. A unit-free "percentage change".
Residual caching
Storing "output minus input" of the whole transformer stack at a computed step, and adding it to the fresh input on skipped steps.
Threshold \(\delta\)
How much accumulated change is tolerated before recomputing. The paper's "slow" setting uses 0.1 (higher quality), "fast" uses 0.2 (more skipping).
PAB, Δ-DiT, T-GATE
Earlier training-free caching methods, the baselines here. They reuse attention outputs or block features on a fixed schedule rather than deciding per step.
Open-Sora 1.2, OpenSora-Plan, Latte
Open-source text-to-video diffusion transformers used as test models. None of them is LTX; the method must be re-fitted per model.
NVIDIA A800
A data-centre GPU of the Ampere generation, essentially an A100 with reduced GPU-to-GPU link bandwidth; the 80 GB version is used here. It is far faster than an Intel CPU, so compare speed-up ratios, not seconds.
VBench
A benchmark that scores generated videos on many quality and consistency dimensions without needing a reference video. Higher is better; paper 16 of the atlas.
LPIPS, PSNR, SSIM
Reference-based metrics: they compare the cached video with the uncached one. Lower LPIPS, higher PSNR and SSIM mean closer to the original.
Dynamic Sequence Parallelism
A way to split one video's tokens across several GPUs, switching the split between spatial and temporal layers. Used in Table 4 to show caching stacks with multi-GPU runs.
Guide

These are the terms the paper assumes. The most important ones are the denoising step, the timestep embedding and its adaptive LayerNorm modulation, the relative L1 distance and the threshold delta that controls how much is skipped. Also note the two kinds of quality metric: VBench judges a video on its own, while LPIPS, PSNR and SSIM measure how close the cached video stays to the uncached one. All timings are on an NVIDIA A800, a data-centre GPU.

§1Big picture

Baseline: every step runs the full DiT DiT DiT DiT DiT DiT DiT 6 steps = 6 full passes (minutes each on CPU) TeaCache: same steps, fewer passes DiT +Δ +Δ DiT +Δ DiT 3 passes; the others add the cached residual Δ One step t, zoomed in x_t , T_t cheap indicator1st-block modulation acc += f(L1rel(F))rescaled change acc < δ ? yes → skip out = x_t + Δ_cache≈ 0 s no → run run DiT; Δ ← out − inacc ← 0
Overview Keep every sampler step, but only run the transformer when the input has drifted enough. Left: 6 sampling steps need 6 DiT passes; TeaCache runs only some of them and patches the rest with the cached residual. Right: the per-step decision costs one modulation layer and one L1 norm.
Guide

Every sampler step is kept, but the expensive transformer only runs when the input has drifted enough. On the left, the baseline runs six full passes for six steps, while TeaCache runs three and patches the other three by adding a cached residual. On the right, one step zoomed in: a cheap indicator from the first block's modulation feeds a running sum, and if the sum is below the threshold the step costs almost nothing. The rest of the tab explains each box.

Quantization makes each DiT pass cheaper; TeaCache runs fewer passes. The decision comes from the input side, so it costs almost nothing.

§2The problem

0.0 0.1 0.2 0.3 0.4 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 sampling step output change L1rel(O,t) flat region: could skip 3–4 in a row, uniform skips only 1 reusing here = big error and here computed (uniform: even steps) reused, harmless reused while output moves a lot Also: O_t is unknown until the DiT has run — so the true criterion (Eq. 4) is useless for deciding to skip.
Problem A fixed reuse pattern is wrong in both directions. Schematic U-shaped output change (like Open Sora in Fig. 3). Uniform every-other-step caching reuses stale outputs where the output is changing fast (magenta) and still recomputes needlessly in the flat middle.
Guide

A fixed reuse pattern fails in both directions. The curve is the output change between consecutive steps, a schematic U shape like Open-Sora's. Uniform every-other-step caching reuses stale outputs at the start and end, the magenta points where the output moves fast, yet still recomputes in the flat middle where three or four skips in a row would be safe. The note at the bottom adds the second problem: the true output change is only known after running the model, so a cheaper proxy is needed.

  • Sampling is sequential: 30–150 full DiT passes per video.
  • Earlier caches (PAB, Δ-DiT, T-GATE) reuse on a fixed schedule, but how much the output changes varies a lot from step to step (Fig. 3).
  • The ideal criterion (output change, Eq. 4) needs the output, which is the expensive part. What is needed is a predictor that is available before running the model.
  • Just using fewer sampler steps is worse: it coarsens αt (Fig. 6).

§3Method

  1. Pick the indicator. Text embedding is constant; the raw noisy input barely changes; the timestep embedding ignores content. Use the timestep-embedding-modulated noisy input Ft at the first block (Fig. 4, Table 2).
  2. Measure change. Compute L1rel(F, t) against the previous step (Eq. 4).
  3. Rescale. Map it to an estimated output change with a polynomial f fitted offline (Eq. 6, Fig. 5, Table 3).
  4. Accumulate and compare. Add f(·) to a running sum; while sum ≤ δ reuse, otherwise compute and reset (Eq. 7).
  5. Reuse the residual. Cache output − input of the DiT stack; on a skipped step add it to the fresh input (§3.4).
Guide

The method is a chain of five decisions. First choose an indicator that is cheap yet tracks the output: the timestep-modulated noisy input at the first block wins over the text embedding, the raw input, and the timestep embedding alone. Then measure its relative change from the previous step, correct that number with an offline-fitted polynomial, and add it to a running sum. When the sum crosses the threshold delta, run the full model and reset; otherwise reuse the cached residual, output minus input.

0.00 0.05 0.10 0.15 rescaled change δ = 0.1 0.06 0.11 0.04 0.06 0.08 0.11 0.02 0.04 0.08 0.15 0.12 reset reset compute t1 reuse t2 compute t3 reuse t4 reuse t5 reuse t6 compute t7 reuse t8 reuse t9 reuse t10 compute t11 compute t12 denoising steps (noise → clean) f(L1rel(F,t)) this step accumulated since last compute t1 always computed 5 of 12 steps run the DiT → 2.4× fewer passes (first reuse streak 1, then 3, then 3; end of trajectory changes fast → no skipping)
Method Accumulate-and-skip: add up the rescaled input change; skip while the sum is below δ, recompute and reset when it crosses. Toy numbers, δ = 0.1. Gold bars are the per-step rescaled difference f(L1rel(F,t)); the indigo sawtooth is the running sum since the last computed step (Eq. 7). Dots under δ (indigo) → reuse the cached residual; dots at or above δ (teal) → run the DiT, refresh the cache, reset the sum to 0. Small per-step change in the middle allows long reuse streaks; large change near the end forces a compute every step.
Guide

Skipping is decided by a sawtooth. Gold bars are the rescaled input change at each step, and the indigo line is the running sum since the last computed step, with a threshold delta of 0.1. While the sum stays below the line the step reuses the cache; when it reaches 0.1 the model runs and the sum drops to zero. The toy numbers show the key behaviour: small changes in the middle give long reuse streaks, while large changes near the end force a compute at every step. This is equation 7 in action.

Computed step t_a h_in(t_a) N DiT blocks h_out(t_a) Δ = out − in one tensor kept in RAM Skipped step t (t_a < t < t_b) h_in(t) + Δ (cached) h_out(t) output still moves with the new input, unlike simply dropping the step (Fig. 6)
Method What is cached is the residual, not the output. §3.4: only “output minus input” of the transformer stack is stored. On a skipped step the fresh input (already updated by the sampler) plus the old residual gives the new output, so the trajectory keeps moving and the full αt schedule is preserved.
Guide

TeaCache stores a residual, not a finished output. After a computed step it keeps one tensor, the transformer stack's output minus its input. On a skipped step the sampler has already updated the input, so adding the old residual to this fresh input gives a new output that still moves along the trajectory. That is why skipping with TeaCache differs from simply dropping a step, which figure 6 shows costs much more quality. The second implementation equation writes this as a formula.

70 prompts T2V-CompBench, 7 attrib. full runs, no cache log x = L1rel(F,t) log y = L1rel(O,t) np.polyfit(x, y, n) fit Eq. 6 coefficients a0…an hard-code per model done once per model (offline); inference then only evaluates the polynomial on a scalar
Method Rescaling is a one-off offline fit. Run the uncached model, record pairs (input change, output change) for every consecutive step, and fit a low-order polynomial with numpy (the paper mentions poly1d). δ is then tuned on top: 0.1 “slow”, 0.2 “fast”.
Guide

The polynomial that rescales the indicator is fitted once per model, offline. The model runs without caching on seventy prompts from T2V-CompBench, record pairs of input change and output change for every consecutive step, and fit a low-order polynomial with numpy. The coefficients are then hard-coded, and at inference the only extra work is evaluating that polynomial on one number per step. The threshold delta is chosen afterwards, 0.1 for the slow setting and 0.2 for the fast one.

TeaCache sampling loop (no Algorithm box in the paper — written from §3.3/§3.4 + Eq. 7) ------------------------------------------------------------------------------ input : sampler steps t_1..t_T, DiT blocks B_1..B_N, threshold δ, poly coeffs a_0..a_n acc ← 0 ; F_prev ← None ; Δ ← None for t in t_1 .. t_T: T_t ← MLP(sinusoidal(t)) # Eq. 3, cheap h_in ← patchify+embed(x_t) F_t ← modulate(LN(h_in), T_t) # 1st block's shift/scale only if F_prev is None: compute ← True # first step always computed else: acc ← acc + f( ‖F_t − F_prev‖₁ / ‖F_prev‖₁ ) # Eq. 4 on F, rescaled by Eq. 6 compute ← (acc ≥ δ) # Eq. 7 if compute: h_out ← B_N(…B_1(h_in, T_t, text)…) # full DiT Δ ← h_out − h_in # cache the residual acc ← 0 else: h_out ← h_in + Δ # reuse: skip all N blocks F_prev ← F_t x_{t−1} ← sampler_step(x_t, head(h_out), t) # Eq. 2 / DDIM / flow step return x_0
Guide

The whole method fits in a normal sampling loop; the paper has no algorithm box, so this is reconstructed from its sections three point three and three point four. Each step computes the cheap timestep embedding and the first block's modulated input, then updates the accumulated rescaled change. The first step is always computed. If the sum has reached delta, all transformer blocks run, the residual is cached and the sum resets; otherwise the cached residual is added to the input. Either way the sampler takes its normal step, so the schedule is untouched.

§4Every equation

(1)\[ \mathbf{x}_t=\sqrt{\alpha_t}\,\mathbf{x}_{t-1}+\sqrt{1-\alpha_t}\,\mathbf{z}_t \quad\text{for}\quad t=1,\dots,T \]

Forward diffusion: each step shrinks the signal by \(\sqrt{\alpha_t}\) and adds Gaussian noise \(\mathbf{z}_t\sim\mathcal{N}(\mathbf{0},\mathbf{I})\); \(\alpha_t\in[0,1]\).

Guide

Equation 1 is the forward diffusion process that adds noise. x t, the sample at step t, equals the square root of alpha t times the previous sample x t minus one, plus the square root of one minus alpha t times fresh Gaussian noise z t. Alpha t is between zero and one and sets how much signal survives each step. TeaCache does not change this; it is background for the reverse loop in equation 2.

(2)\[ p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t)=\mathcal{N}\big(\mathbf{x}_{t-1};\,\mu_\theta(\mathbf{x}_t,t),\,\Sigma_\theta(\mathbf{x}_t,t)\big) \]

Reverse (denoising) step: the network predicts mean \(\mu_\theta\) and covariance \(\Sigma_\theta\). This is the sequential loop TeaCache shortens.

Guide

Equation 2 is the reverse, denoising step. p theta of x t minus one given x t is a Gaussian whose mean mu theta and covariance sigma theta are predicted by the network from the current sample x t and the step t. Generation repeats this step many times in sequence, and each repetition is one full transformer pass. That sequential loop is exactly the cost TeaCache shortens by reusing work between neighbouring steps.

(3)\[ \mathbf{T}_t=\operatorname{MLP}\big(\operatorname{sinusoidal}(t)\big) \quad\text{for}\quad t=1,\dots,T \]

Timestep embedding: scalar \(t\) → sinusoidal features → MLP. It produces the shift/scale that modulates every block (Fig. 4).

Guide

Equation 3 builds the timestep embedding. The scalar step t is turned into sinusoidal features, then passed through a small MLP to give the vector T t. This vector produces the scale and shift that modulate every transformer block, as figure 4 shows. It is cheap to compute, which is why TeaCache can afford to look at it, and at the input it modulates, at every step.

(4)\[ \mathrm{L1}_{\mathrm{rel}}(\mathbf{O},t)=\frac{\lVert\mathbf{O}_t-\mathbf{O}_{t+1}\rVert_1}{\lVert\mathbf{O}_{t+1}\rVert_1} \]

Relative L1 change of a tensor between consecutive steps (\(t+1\) is the previous, noisier step). Large → new information, must compute; small → reuse. Applied to outputs \(\mathbf{O}\) (ideal, unavailable) or to inputs \(\mathbf{F}\) (cheap).

Guide

Equation 4 measures how much a tensor changed between steps. The relative L1 distance of O at step t is the L1 norm of O t minus O t plus one, divided by the L1 norm of O t plus one, where t plus one is the previous, noisier step. A large value means new information, so the model should run; a small value means the output could be reused. Applied to outputs it is the ideal but unavailable criterion; TeaCache applies it to the cheap input F instead.

(5)\[ \sum_{t=t_a}^{t_b-1}\mathrm{L1}_{\mathrm{rel}}(\mathbf{F},t)\;\le\;\delta\;\lt\;\sum_{t=t_a}^{t_b}\mathrm{L1}_{\mathrm{rel}}(\mathbf{F},t) \]

Naive rule: after computing at \(t_a\), keep reusing while the accumulated input change stays \(\le\delta\); the first step \(t_b\) where it exceeds \(\delta\) is recomputed and the sum reset. \(\mathbf{F}\) = timestep embedding or modulated noisy input.

Guide

Equation 5 is the naive skipping rule. After computing at step t a, keep summing the relative input change from equation 4; while the sum up to the step before t b stays at or below delta, reuse. The first step t b where the sum exceeds delta is recomputed, and the sum restarts. F here is the timestep embedding or the modulated noisy input. The flaw is that input change and output change are on different scales, which equation 6 fixes.

(6)\[ y=f(x)=a_0+a_1x+a_2x^2+\cdots+a_nx^n \]

Rescaling polynomial: \(x\) = input difference (modulated noisy input), \(y\) = estimated output difference. Fitted offline with numpy; removes the scaling bias of Fig. 5.

Guide

Equation 6 is the rescaling polynomial. y equals f of x, which is a zero plus a one times x plus a two times x squared, and so on up to a n times x to the n. Here x is the measured change in the modulated input and y is the estimated change in the output. The coefficients a zero to a n are fitted offline, as in the fitting diagram, and they remove the scaling bias visible in figure 5. Table 3 shows first order already captures most of the gain.

(7)\[ \sum_{t=t_a}^{t_b-1}f\big(\mathrm{L1}_{\mathrm{rel}}(\mathbf{F},t)\big)\;\le\;\delta\;\lt\;\sum_{t=t_a}^{t_b}f\big(\mathrm{L1}_{\mathrm{rel}}(\mathbf{F},t)\big) \]

Final TeaCache indicator = Eq. 5 with each term rescaled by \(f\). \(\delta=0.1\) (slow), 0.2 (fast); Fig. 1 also uses 0.15, 0.25.

Guide

Equation 7 is the final TeaCache rule: equation 5 with every term passed through the polynomial f first. So the running sum is of estimated output changes, not raw input changes, and a step is recomputed the moment that sum exceeds delta. Delta is the only knob users turn: 0.1 is the slow, near-lossless setting and 0.2 the fast one, with 0.15 and 0.25 also shown in figure 1.

impl.\[ \mathbf{F}_t=\big(1+\gamma(\mathbf{T}_t)\big)\odot\operatorname{LN}(\mathbf{h}^{\mathrm{in}}_t)+\beta(\mathbf{T}_t) \]

Not displayed in the paper — Fig. 4 in formula form: the noisy-input tokens after the first block’s adaLN scale \(\gamma\) and shift \(\beta\). This is the tensor \(\mathbf{F}\) fed to Eq. 4.

Guide

This formula is not printed in the paper; it writes figure 4 as an equation. F t, the indicator, equals one plus gamma of T t, multiplied element by element with the layer-normalised input tokens h in, plus beta of T t. Gamma and beta are the first block's adaptive layer norm scale and shift, both computed from the timestep embedding. This F t is the tensor whose relative change goes into equation 4, and it costs only one modulation layer to get.

impl.\[ \mathbf{h}^{\mathrm{out}}_t\approx\mathbf{h}^{\mathrm{in}}_t+\big(\mathbf{h}^{\mathrm{out}}_{t_a}-\mathbf{h}^{\mathrm{in}}_{t_a}\big),\qquad t_a\lt t\lt t_b \]

Not displayed in the paper — §3.4 in formula form: on a skipped step the cached residual (output minus input) of the last computed step is added to the current input.

Guide

This formula is also not printed in the paper; it restates section three point four. On a skipped step t between t a and t b, the output h out at t is approximated by the current input h in at t plus the residual saved at the last computed step, h out at t a minus h in at t a. Because the fresh input enters the sum, the output keeps moving with the sampler, which is why caching loses less than dropping steps.

§5Every figure

72 73 74 75 76 77 78 5 9 13 17 21 25 29 Latency (s) Quality (VBench %) TeaCache PAB Latte 0.55 0.60 0.65 0.70 0.75 0.80 0.85 5 9 13 17 21 25 29 Latency (s) Quality (1−LPIPS) TeaCache PAB 0.62 0.65 0.68 0.71 0.74 0.77 0.80 5 9 13 17 21 25 29 Latency (s) Quality (SSIM) TeaCache PAB 17 18 19 20 21 22 23 5 9 13 17 21 25 29 Latency (s) Quality (PSNR dB) TeaCache PAB
Fig. 1TeaCache dominates PAB on every quality metric at every latency. Latte, 16 frames, 512×512, one A800. TeaCache points are δ = 0.25, 0.2, 0.15, 0.1 (left→right); PAB points are its three configs. Endpoints use Table 1 numbers (TeaCache 8.20 s / 14.46 s, PAB 19.98 s / 22.16 s); the two middle TeaCache points and the middle PAB point are read off the plot (approximate). Grey square = full Latte (26.90 s, 77.40 %).
Guide

TeaCache beats the earlier cache method PAB at every latency, on every quality measure. Each panel plots latency in seconds against quality, VBench on the left and one minus LPIPS on the right, for Latte on one A800 GPU. TeaCache points are thresholds 0.25 down to 0.1 from left to right; the grey square is the full model at 26.9 seconds. Even the fastest TeaCache point, 8.2 seconds, sits near or above PAB's slower settings. The middle points were read off the plot and are approximate.

Timesteps (t) Uniform Cached Reused Cached Reused Cached Reused Cached Reused … TeaCache Cached Reused Cached Reused Reused Reused Reused Cached … ta tb−1 tb Σ f(L1rel(F,t)) from t_a to t_b−1 ≤ δ → keep reusing sum up to t_b exceeds δ → recompute at t_b one diffusion step
Fig. 2Uniform caching reuses every other step; TeaCache reuses as long as the accumulated input change stays under δ. Solid box = step whose DiT output is freshly computed and cached; dashed teal = step that reuses the cache. Between ta and tb TeaCache skips four steps in a row because the rescaled input differences add up to less than δ; at tb the sum crosses δ and the model is run again.
Guide

Uniform caching alternates computed and reused steps no matter what the model is doing, while TeaCache adapts. Solid boxes are steps where the model runs and the cache is refreshed; dashed teal boxes reuse it. Between t a and t b TeaCache reuses four steps in a row, because the rescaled input changes add up to less than delta, then recomputes at t b when the sum crosses it. This is the paper's opening picture of the idea formalised in equation 7.

0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0 20 40 60 80 100 diffusion process (%) difference (L1rel) (a) Open Sora 0.00 0.05 0.10 0.15 0.20 0 20 40 60 80 100 diffusion process (%) (b) Latte 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0 20 40 60 80 100 diffusion process (%) (c) OpenSora-Plan model output timestep embedding timestep-emb.-modulated noisy input noisy input
Fig. 3The modulated input tracks the shape of the output difference; the raw noisy input does not. Relative L1 change between consecutive steps (Eq. 4) over the sampling trajectory. Output difference is a U-shape in Open Sora and a flipped “L” in Latte/OpenSora-Plan (OpenSora-Plan zig-zags early because its scheduler visits some timesteps twice). Timestep embedding and the modulated noisy input follow the output curve; the noisy input stays flat near 0. Shape redrawn from the plot.
Guide

The modulated input follows the output's rhythm; the raw noisy input does not. Each panel plots the relative L1 change between consecutive steps against progress through sampling, for Open-Sora, Latte and OpenSora-Plan. The output change is U-shaped in Open-Sora and a flipped L in the other two, with zig-zags in OpenSora-Plan because its scheduler repeats some timesteps. The timestep embedding and modulated input track that shape while the raw input stays near zero. This justifies the indicator choice, confirmed in table 2.

Timesteps ×T Transformer blocks ×N Text embedding Noisy input x_t Timestep emb. T_t + × shift scale Self-Attn Cross-Attn FFN + + + · · · Model output O_t Modulated noisy input F_t
Fig. 4The timestep embedding scales and shifts the input of every sub-layer — so the modulated input is a cheap proxy for the output. Generic video-DiT block (norm layers omitted). Tt produces shift/scale (adaLN) and gates for Self-Attention, Cross-Attention (text) and FFN. TeaCache taps the first modulation — noisy input after timestep scale/shift, before any attention — as its indicator Ft. The output updates xt through Eq. 2 for the next step.
Guide

The timestep embedding scales and shifts the input of every sub-layer, which is why the modulated input is a good cheap proxy for the output. The diagram is a generic video transformer block: T t produces shift, scale and gates for self-attention, cross-attention with text, and the feed-forward layer. TeaCache taps the first modulation, before any attention runs, as its indicator F t. The model output then updates x t through equation 2. For LTX-2.3, this tap point must be exposed in the exported graph.

−3 −2.5 −2 −1.5 −1 −3.5 −3 −2.5 −2 −1.5 −1 −0.5 rescaled input diff. (log) output difference (log) (a) Open Sora −3 −2.5 −2 −1.5 −1 −0.5 0 −4 −3 −2 −1 0 rescaled input diff. (log) (b) Latte −7 −6 −5 −4 −3 −2 −1 0 −8 −6 −4 −2 0 rescaled input diff. (log) (c) OpenSora-Plan y = x original 1-order fit 2-order fit 4-order fit
Fig. 5Polynomial rescaling pulls the input-difference estimate onto the y = x line. Each dot is one consecutive-step pair: x = (rescaled) input difference, y = true output difference, both log-scale. Raw input differences (grey) sit off the diagonal: a systematic scaling bias. After fitting f (Eq. 6) the points hug y = x; 2nd and 4th order are only slightly tighter than 1st. Shape redrawn (points schematic, axes as in paper).
Guide

Polynomial rescaling pulls the input estimate onto the true output change. Each dot is one pair of consecutive steps, input change on the x axis and output change on the y axis, both on log scales, for three models. Raw input differences sit off the diagonal, a systematic scaling bias. After fitting the polynomial from equation 6 the dots hug the line y equals x, with second and fourth order only slightly tighter than first. The points are schematic; the axes follow the paper.

Open-Sora, 30 steps VBench 79.22 % portrait (fire)reference snowy tramreference Open-Sora, 15 steps VBench 77.34 % portrait (fire)washed out, soft edges snowy tramblurred tram, less snow TeaCache, 50 % cache VBench 78.88 % portrait (fire)sharp, ≈ 30-step snowy tramtram detail kept prompt 1 prompt 2
Fig. 6Halving compute by caching beats halving the number of steps. Same budget (half the DiT passes): dropping to 15 steps coarsens the noise schedule αt and loses 1.88 VBench points; TeaCache keeps all 30 scheduler steps, skips half the DiT evaluations, and loses only 0.34. Schematic of the paper’s sample frames.
Guide

With the same compute budget, caching beats cutting steps. Halving Open-Sora's thirty steps to fifteen coarsens the noise schedule and drops VBench from 79.22 to 77.34, and the frames look washed out and blurred. TeaCache keeps all thirty scheduler steps but skips half the transformer passes, scoring 78.88 with detail kept. The frames are described schematically. The lesson for a CPU pipeline: skip model passes, not sampler steps.

Original PAB TeaCache (ours) Open-Sora Christmas tree room 44.56 sreference 31.85 sslight texture loss 28.78 s (1.55×)≈ original Latte Milky Way sky 26.90 sreference 19.98 sstars smeared, dim 14.46 s (1.86×)≈ original Open-Sora-Plan lake at sunset 99.65 sreference 73.41 sscene altered, soft 22.62 s (4.41×)close to original
Fig. 7TeaCache is both faster than PAB and visually closer to the original. Two frames per cell in the paper; here each cell lists the measured latency (one A800) and what is visible. Open-Sora 51 frames 480p, Latte 16 frames 512², Open-Sora-Plan 65 frames 512². Schematic of the paper’s sample frames.
Guide

TeaCache is both faster than PAB and visually closer to the original video. Each row is one model, each column one method, and every cell gives the measured latency on one A800 and what the frames look like. On Latte, PAB takes about 20 seconds and smears the stars, while TeaCache takes 14.46 seconds and looks like the original. On OpenSora-Plan TeaCache is 4.41 times faster and still close. The frames are schematic descriptions of the paper's samples.

0 5 10 15 20 25 30 35 40 45 latency (s) (a) 480P, 48 frames 42.49 Original 28.51 1 1.49× 12.18 2 3.49× 7.81 4 5.44× 4.54 8 9.36× bars 2–5: TeaCache on 1/2/4/8 GPUs 0 25 50 75 100 125 150 175 200 (b) 480P, 192 frames 188.87 Original 114.01 1 1.66× 47.03 2 4.02× 24.64 4 7.67× 14.41 8 13.1× bars 2–5: TeaCache on 1/2/4/8 GPUs 0 20 40 60 80 100 120 140 (c) 360P, 240 frames 129.68 Original 86.63 1 1.5× 31.28 2 4.16× 16.45 4 7.88× 9.51 8 13.64× bars 2–5: TeaCache on 1/2/4/8 GPUs 0 20 40 60 80 100 (d) 720P, 48 frames 106.29 Original 67.53 1 1.57× 27.77 2 3.82× 16.36 4 6.49× 8.77 8 12.11× bars 2–5: TeaCache on 1/2/4/8 GPUs
Fig. 8The speed-up holds for longer and higher-resolution videos and stacks with multi-GPU parallelism. Latency (s) of the original model on 1 GPU (teal) versus TeaCache on 1, 2, 4, 8 A800s with Dynamic Sequence Parallelism (indigo); speed-up vs. the original shown under each bar. Single-GPU TeaCache gives 1.5–1.66× at every size; numbers from the paper’s bar labels.
Guide

The speed-up holds for longer, higher-resolution videos and stacks with multi-GPU parallelism. The teal bar is the original model on one GPU; indigo bars are TeaCache on one, two, four and eight A800s with dynamic sequence parallelism, with the speed-up under each bar. On one GPU TeaCache gives about 1.5 to 1.66 times at every size, and with eight GPUs the 192-frame video goes from 188.87 seconds to 14.41, about 13 times faster. Multi-GPU matters less for a single Intel machine.

§6Results

Table 1. Efficiency and visual quality (A800, FlashAttention on). Bold = best accelerated method per column, as in the paper.
MethodFLOPs (P) ↓Speed-up ↑Latency (s) ↓VBench ↑LPIPS ↓SSIM ↑PSNR ↑
Latte (16 frames, 512×512)
Latte (T = 50)3.361×26.9077.40%–––
Δ-DiT3.361.02×–52.00%0.85130.10788.65
T-GATE2.991.13×–75.42%0.26120.692719.55
PAB-slow2.701.21×22.1676.32%0.26690.701419.71
PAB-fast2.521.34×19.9873.13%0.39030.642117.16
TeaCache-slow1.861.86×14.4677.40%0.19010.778622.09
TeaCache-fast1.123.28×8.2076.69%0.31330.667818.62
Open-Sora 1.2 (51 frames, 480P)
Open-Sora 1.2 (T = 30)3.151×44.5679.22%–––
Δ-DiT3.091.03×–78.21%0.56920.481111.91
T-GATE2.751.19×–77.61%0.34950.676015.50
PAB-slow2.551.33×33.4077.64%0.14710.840524.50
PAB-fast2.501.40×31.8576.95%0.17430.822023.58
TeaCache-slow2.401.55×28.7879.28%0.13160.841523.62
TeaCache-fast1.642.25×19.8478.48%0.25110.747719.10
OpenSora-Plan (65 frames, 512×512)
OpenSora-Plan (T = 150)11.751×99.6580.39%–––
Δ-DiT11.741.01×–77.55%0.53880.373613.85
T-GATE2.751.18×–80.15%0.30660.621918.32
PAB-slow8.691.36×73.4180.30%0.30590.655018.80
PAB-fast8.351.56×65.3871.81%0.54990.471715.47
TeaCache-slow3.134.41×22.6280.32%0.21450.741421.02
TeaCache-fast2.066.83×14.6079.72%0.31550.658918.95
Guide

Table 1 is the main result, comparing TeaCache with three training-free accelerators, Delta-DiT, T-GATE and PAB, on three video models. Read FLOPs, speed-up and latency for cost, then VBench for quality and LPIPS, SSIM and PSNR for closeness to the uncached video. The winning rows are TeaCache-slow: 1.86 times faster on Latte with identical VBench, 1.55 times on Open-Sora, and 4.41 times on OpenSora-Plan. TeaCache-fast trades some fidelity for 2.25 to 6.83 times speed-up.

0× 1× 2× 3× 4× 5× 6× 7× speed-up vs. full model (×) 1.21 -1.08 1.34 -4.27 1.86 +0.00 3.28 -0.71 Latte 1.33 -1.58 1.4 -2.27 1.55 +0.06 2.25 -0.74 Open-Sora 1.2 1.36 -0.09 1.56 -8.58 4.41 -0.07 6.83 -0.67 OpenSora-Plan ΔVB PAB-slow PAB-fast TeaCache-slow TeaCache-fast
Chart A Table 1 in one picture: TeaCache-slow is faster than PAB-fast and loses no VBench. Bars = speed-up; small numbers under bars = VBench change vs. the uncached model (points). The OpenSora-Plan jump (4.41×/6.83×) comes from its 150-step schedule, which has many near-duplicate steps.
Guide

Table 1 in one picture: TeaCache-slow is faster than PAB-fast and loses no VBench. Bars are speed-ups over the full model, grouped by video model, and the small numbers underneath are VBench changes in points. PAB-fast loses up to 8.58 points on OpenSora-Plan, while TeaCache-slow changes by less than a tenth of a point everywhere. The big OpenSora-Plan jump comes from its 150-step schedule, which has many near-duplicate steps, so fewer-step models like LTX will see smaller gains.

0 2 4 6 8 10 12 14 1 2 4 8 A800 GPUs speed-up (×) Open-Sora (192 fr, 480P) 8.52 11.19 13.1 0 5 10 15 20 25 30 35 1 2 4 8 A800 GPUs Open-Sora-Plan (221 fr, 512²) 6.79 10.16 32.02 Baseline PAB TeaCache
Chart B Table 4: caching multiplies with sequence parallelism. Speed-up relative to the 1-GPU baseline. TeaCache stays on top at every GPU count; on Open-Sora-Plan it reaches 32× on 8 GPUs.
Guide

Caching multiplies with sequence parallelism. Each panel plots speed-up over the one-GPU baseline against the number of A800 GPUs, for the baseline, PAB and TeaCache. TeaCache stays on top at every GPU count, reaching 13.1 times on Open-Sora and 32 times on OpenSora-Plan with eight GPUs. The point is that caching and parallelism attack different costs, much as caching and quantization do in the thesis.

Table 2. Which indicator? ‘Timestep’ = timestep embedding; ‘Input’ = timestep-embedding-modulated noisy input.
IndicatorVBench ↑LPIPS ↓SSIM ↑PSNR ↑
OpenSora (full)79.22%–––
Timestep77.01%0.34250.693415.86
Input78.21%0.25490.745719.05
Latte (full)77.40%–––
Timestep77.05%0.26530.707319.76
Input77.17%0.25580.716420.00
Guide

Table 2 is the ablation that picks the indicator. It compares the timestep embedding alone with the timestep-modulated noisy input, labelled Input, measured against the full model. The modulated input wins on every metric for both models, most clearly on Open-Sora: VBench 78.21 against 77.01 and PSNR 19.05 against 15.86. This backs the choice made in figure 8 and the method steps.

Table 3. Polynomial order for rescaling (Open-Sora). Gains saturate by 4th order.
OrderVBench ↑LPIPS ↓SSIM ↑PSNR ↑
OpenSora (full)79.22%–––
Original (no rescale)78.21%0.25490.745719.05
1-order78.45%0.25170.747819.10
2-order78.48%0.25130.747719.09
4-order78.48%0.25110.747719.10
Guide

Table 3 tests how complex the rescaling polynomial must be, on Open-Sora. Without rescaling VBench is 78.21; a first-order fit raises it to 78.45, and second or fourth order reach 78.48, with LPIPS, SSIM and PSNR barely moving. So rescaling helps, and a low-order polynomial is enough. For LTX-2.3 a first or second order refit is a sensible default.

Table 4. Latency in seconds (speed-up vs. 1-GPU baseline) with Dynamic Sequence Parallelism.
Method1 × A8002 × A8004 × A8008 × A800
Open-Sora (192 frames, 480P)
Baseline188.87 (1×)72.86 (2.59×)39.26 (4.81×)22.18 (8.52×)
PAB142.23 (1.33×)53.74 (3.51×)29.19 (6.47×)16.88 (11.19×)
TeaCache114.01 (1.66×)47.03 (4.02×)24.64 (7.67×)14.41 (13.10×)
Open-Sora-Plan (221 frames, 512×512)
Baseline324.41 (1×)166.94 (1.94×)88.18 (3.68×)47.79 (6.79×)
PAB207.70 (1.56×)110.06 (2.95×)58.07 (5.59×)31.92 (10.16×)
TeaCache48.22 (6.73×)26.99 (12.02×)15.91 (20.39×)10.13 (32.02×)
Guide

Table 4 gives the raw latencies behind chart B, in seconds with speed-up over the one-GPU baseline in brackets. TeaCache is fastest at every GPU count on both models. On OpenSora-Plan with 221 frames it cuts one-GPU latency from 324.41 seconds to 48.22, already 6.73 times faster before any parallelism, and reaches 32.02 times with eight GPUs. The single-GPU column is the one relevant to a one-machine Intel setup.

  • At δ = 0.1 (slow), VBench equals or beats the full model on Latte and Open-Sora and is within 0.07 points on OpenSora-Plan.
  • The modulated input beats the timestep embedding as an indicator (Table 2); it also adapts per prompt, whereas the timestep embedding picks the same steps for every prompt.
  • Rescaling adds +0.24 VBench (1st order); higher orders help very little (Table 3).
  • PSNR/SSIM drop at δ = 0.2: the video stays plausible but drifts from the uncached reference.

§7Why it matters for this thesis

TeaCache on LTX-2.3 with OpenVINO / NNCF

  • The biggest latency win on CPU, and it stacks. One LTX DiT step on an Intel CPU can take minutes, so skipping 40–50 % of steps saves more wall-clock time than int8 vs. int4 kernels do. It works independently of weight-only int8/int4 (NNCF), so the thesis can report quantization, caching, and both combined as separate ablations.
  • No custom kernels, just control flow. Everything happens in the Python denoising loop (e.g. an optimum-intel / OpenVINO GenAI-style pipeline). Two things are needed in the exported graph: (a) the first block’s modulated input Ft as an extra output, or a tiny separate IR that computes it; (b) access to the pre-block hidden state and the post-block hidden state so the residual can be cached and added. In practice this means splitting the IR into embed+mod | blocks | head. Only standard ops are involved (Abs, ReduceMean, Sub, Add).
  • Recalibrate the polynomial. The coefficients are model-specific. Published TeaCache ports exist for LTX-Video (the TeaCache repo ships an LTX-Video variant), but LTX-2.3 has a different architecture and schedule, and after int4 quantization the input/output change curves can shift. Refit f on the quantized model: run about 20–70 prompts without caching, log (L1rel(F), L1rel(O)) per step, then np.polyfit. This is cheap compared with NNCF calibration.
  • LTX-2 specifics to handle. Classifier-free guidance doubles the passes, so decide once per step for both branches. The audio-video joint model has two token streams, so measure F on the video stream (or both) and cache both residuals. With a few-step distilled checkpoint (about 8 steps) there is little redundancy left, so expect small gains and use a conservative δ.
  • Evaluation. Report speed-up vs. δ together with VBench-style / CLIP scores and PSNR/SSIM against the uncached output (the paper shows these diverge at δ = 0.2). Memory cost is one hidden-state tensor per stream, which is negligible next to the weights.
Guide

Treat caching as a separate ablation next to NNCF quantization: report quantization alone, caching alone, and both together, since skipping transformer passes likely saves more CPU time than int8 versus int4 kernels. To implement it, split the OpenVINO model into embedding plus modulation, the block stack, and the head, so the loop in Python can read F t and cache the residual. Refit the polynomial on the quantized LTX-2.3 with a few dozen uncached prompts, decide once per step for both guidance branches and both audio and video streams, and use a conservative delta on a distilled few-step checkpoint.

Evaluation

VBench: Comprehensive Benchmark Suite for Video Generative Models

Ziqi Huang, Yinan He, Jiashuo Yu, Fan Zhang, Chenyang Si, Yuming Jiang, Yuanhan Zhang, Tianxing Wu, Qingyang Jin, Nattapol Chanpaisit, Yaohui Wang, Xinyuan Chen, Limin Wang, Dahua Lin, Yu Qiao, Ziwei Liu · CVPR 2024 (arXiv 2311.17982)

Instead of one number like FVD, VBench splits “is this generated video good?” into 16 separate scores. Each score has its own prompt set (~100 prompts) and its own off-the-shelf judge model (DINO, CLIP, RAFT, AMT, MUSIQ, LAION aesthetic, GRiT, UMT, Tag2Text, ViCLIP). Human pairwise preferences confirm that every score ranks models the way people do.

Dimensions
16 (7 quality + 9 condition)
Prompts
~100 per dim + 8×100 per category
Human pairs
N × 5 × 6 per dimension
Human alignment
Spearman ρ 0.61–0.998
Models tested
LaVie, ModelScope, VideoCrafter, CogVideo
Output
scores in [0,1] (shown as %)
Reading guide

VBench asks a simple question: how can one tell whether a generated video is good, and in what way? Its answer is to replace one opaque number like FVD with sixteen separate scores, each with its own small prompt set and its own off-the-shelf judge network, and to check every score against human votes. The tab starts with the big picture and the problem, then walks through the method one dimension at a time, lists every equation, redraws every figure, and ends with the results tables and a box on how to use VBench in the thesis. VBench is the sixteenth and last paper in the atlas and the only one about evaluation. The other fifteen describe the model and how to make it cheaper; VBench is the ruler that shows the cheaper model still makes good video.

§0Before reading

VBench does not generate or compress anything: it measures generated video. Following it takes three ideas: a pretrained network can turn a frame into a feature vector compared by angle, optical flow measures how much things move between frames, and a rank correlation shows whether a metric orders models the way people do. It is in the atlas because the thesis must prove that the compressed LTX-2.3 still makes good video, and VBench is the ruler for that.

frames encoder compare angles 1 … t−1, t DINO or CLIP d₁ dₜ₋₁ dₜ d₁ dₜ cos ≈ 0.97 same cat cos ≈ 0.4 cat changed
PrimerA feature embedding turns a frame into a direction. A pretrained network such as DINO or CLIP maps each frame to a long vector. Two frames showing the same thing give vectors pointing the same way, so their cosine similarity \( \langle d_1, d_t \rangle \) is close to 1. VBench's Subject Consistency (DINO) and Background Consistency (CLIP) are just averages of these cosines over the frames. CLIP also embeds text into the same space, which is how style and prompt matching are scored. Numbers illustrative.
Guide

A pretrained network like DINO or CLIP turns each video frame into a long list of numbers, a vector. Frames that show the same thing give vectors pointing in almost the same direction, so their cosine similarity is close to one. VBench's subject and background consistency scores are simply averages of these cosines across the frames, and CLIP can also compare a frame with a sentence.

two frames estimator flow field t t+1 RAFT moving clip large flow: dynamic frozen clip flow ≈ 0: static
PrimerOptical flow says how far each pixel moved. A flow estimator (VBench uses RAFT) takes two consecutive frames and returns an arrow per pixel. Dynamic Degree averages the largest 5% of these arrows to decide if a clip is moving, and reports the share of moving clips. This matters because a frozen video scores perfectly on the consistency metrics. A related trick, frame interpolation (AMT), predicts a middle frame; if the prediction is accurate, the motion was smooth.
Guide

Optical flow is a field of arrows saying how far each pixel moved between two frames, and VBench estimates it with a network called RAFT. If the largest arrows are big, the clip is moving; if they are near zero, it is frozen. Dynamic degree is the share of clips that move, and it matters because a frozen video would look perfectly consistent on the other scores.

1. pairwise votes video, model A vs video, model B pick A: A 1, B 0 tie: 0.5 each win ratio = average 2. compare rankings humans VBench 1 · A 2 · B 3 · C 4 · D 1 · A 2 · C 3 · B 4 · D 3. Spearman ρ −1 0 1 reversed unrelated same order ρ = 0.8
PrimerSpearman's ρ checks that a metric ranks models like people do. Humans compare two videos on one dimension at a time; each model's win ratio is the share of comparisons it won. Spearman's rank correlation then compares the order of models under humans and under VBench: \( \rho = 1 \) means identical order, 0 means no relation. In this toy example one swap of B and C gives \( \rho = 1 - \frac{6 \cdot 2}{4 \cdot 15} = 0.8 \). VBench reports a ρ for every dimension to show its judges agree with people.
Guide

People judge two videos side by side on one dimension, and each model's win ratio is the share of comparisons it won, with a tie counting as half. Spearman's rank correlation then asks whether VBench orders the models the same way humans do. One means the same order, zero means no relation. In the toy example a single swap gives zero point eight.

the model LTX-Video, LTX-2 quantize it GPTQ … QVGen, Wan2.2 GPTQ speed it up FA-2, DeepCache, TeaCache (prev.) VBench (this paper) 16 scores, 16 judges last paper: the ruler FP16 LTX-2.3 int8/int4 LTX-2.3 vs
PrimerWhere this paper sits. The first fifteen papers describe the model and how to make it cheaper; the previous one, TeaCache, skips denoising steps. VBench is the last paper and the only one about evaluation. It adds a per-dimension scorecard, so a study can show which qualities an int8 or int4 LTX-2.3 kept and which it lost compared with full precision, on the same prompts and seeds.
Guide

The first fifteen papers in the atlas cover the model, how to quantize it and how to speed it up, ending with TeaCache. VBench is the last paper and the only one about evaluation. It gives the scorecard to compare full precision LTX-2.3 with its int8 or int4 version, dimension by dimension, on the same prompts and seeds.

Terms used in this paper

Text-to-video (T2V) model
A generator that turns a text prompt into a short clip. VBench tests LaVie, ModelScope, VideoCrafter and CogVideo; LTX-2.3 is one too.
FVD, FID, IS
Older one-number metrics that compare feature statistics of generated and real media. They give no diagnosis of what went wrong, which is VBench's motivation.
Dimension
One narrowly defined quality, like Temporal Flickering or Object Class. VBench has 16, split into Video Quality and Video-Condition Consistency.
Prompt suite
The small, purpose-built set of prompts (about 100) used to test one dimension, plus a set sorted into eight content categories.
CLIP
A model that embeds images and text in one shared space, so a frame and a sentence can be compared by cosine similarity.
DINO
A self-supervised image model whose features are sensitive to object identity; VBench uses it to check the subject stays the same.
ViCLIP, UMT
Video models that look at many frames together. ViCLIP scores camera-motion style and overall prompt match; UMT recognises human actions.
Optical flow (RAFT)
A per-pixel motion field between two frames. RAFT is the estimator VBench uses for Dynamic Degree.
Frame interpolation (AMT)
A model that predicts an in-between frame. VBench uses its prediction error to score Motion Smoothness.
MUSIQ, LAION aesthetic
Per-frame image scorers: MUSIQ rates low-level quality (noise, blur, exposure), the LAION predictor rates beauty on a 0 to 10 scale.
GRiT, Tag2Text
GRiT detects and describes objects (used for objects, colour, spatial relations); Tag2Text captions frames to check the scene.
Win ratio
The share of human pairwise comparisons a model wins, counting a tie as half a win.
Spearman's ρ
A correlation computed on ranks, not values: 1 means two lists order things identically, 0 means no relation.
A100
An NVIDIA data-centre GPU. The paper mentions it only for fine-tuning its video language model; the VBench scorers themselves can run on any machine with PyTorch.
Guide

These are the terms the paper uses without explaining. Most are names of the judge networks: CLIP and DINO for frame features, ViCLIP and UMT for whole-clip understanding, RAFT for motion, AMT for frame interpolation, MUSIQ and the LAION predictor for image quality and beauty, GRiT and Tag2Text for objects and scenes. Win ratio and Spearman's rho are how the paper checks it agrees with people.

§2Big picture

Before: one numberFVD / IS / CLIPSIMscore = 512no idea whymisaligned with humansAfter: VBenchPrompt suite~100 / dimT2V modelsamples videosMethod suite1 judge modelper dimension16 scoresHuman pairwise preferenceswin-ratio correlation ρ per dim→ scores trusted as human proxies
One opaque score → sixteen explainable ones. Left: FVD-style metrics collapse everything into one number. Right: VBench pairs a dedicated prompt set with a dedicated judge model per dimension and validates each judge against human votes.
Guide

One opaque score becomes sixteen explainable ones. On the left, metrics like FVD, IS or CLIPSIM give a single number that says nothing about why a model is good or bad, and it often disagrees with people. On the right, VBench runs a dedicated prompt suite through the text-to-video model, scores the samples with one judge model per dimension, and checks each dimension against human pairwise preferences. That last check is what lets the scores stand in for human judgement.

Each dimension answers one yes/no-style question (“is the subject the same cat throughout?”, “is the style Van Gogh?”). The two top-level questions: Video Quality — does it look good regardless of the prompt? — and Video-Condition Consistency — is it what the user asked for?

§3The problem

0255075100score (%)97.592.9Background Cons.98.397.6Temporal Flicker49.789.7Dynamic DegreeLaVieVideoCrafterA static clip “cheats”samesamesamesameconsistency ≈ 100% · flicker ≈ nonebut dynamic degree = 0→ Dynamic Degree addedas a counter-weight dimension
Consistency and motion pull in opposite directions. Numbers from Table 1: LaVie wins temporal smoothness but is half as dynamic as VideoCrafter. A single averaged score would hide this trade-off; a frozen video would even look perfect.
Guide

Consistency and motion pull in opposite directions. The bars compare LaVie and VideoCrafter from Table 1: LaVie wins background consistency and flicker, but its Dynamic Degree is about 50 percent against almost 90 for VideoCrafter. The sketch on the right shows the trap: a frozen clip scores near perfect on consistency and flicker. This is why VBench adds Dynamic Degree as a counterweight and never reports one averaged number.

  • IS, FID, FVD, CLIPSIM disagree with human judgement and give no diagnosis.
  • Video-quality-assessment models (VQA) were built for real camera footage, not generative artifacts.
  • “Quality” means different things to different users (flicker vs. prompt fidelity) — needs disentangling.
  • T2V sampling is slow (LaVie ~90 s, CogVideo >2 min per video) → test set must be compact (~100 prompts / dim).

§4Method

Video GenerationQualityVideo QualityVideo-ConditionConsistencyTemporal QualityFrame-Wise QualitySemanticsStyleOverall ConsistencySubject ConsistencyDINOBackground ConsistencyCLIPTemporal Flickeringpixel MAEMotion SmoothnessAMTDynamic DegreeRAFTAesthetic QualityLAION aestheticImaging QualityMUSIQObject ClassGRiTMultiple ObjectsGRiTHuman ActionUMTColorGRiTSpatial RelationshipGRiT + rulesSceneTag2TextAppearance StyleCLIPTemporal StyleViCLIPViCLIPSemantics: condition = entities & attributes;Style: look + camera motion requested
The 16-dimension tree and the judge behind each leaf. Teal = Video Quality (prompt-agnostic, 7 dims); gold = Video-Condition Consistency (9 dims). Indigo mono labels name the evaluation model each dimension uses.
Guide

Here is the whole dimension tree, with the judge behind each leaf. Teal branches are Video Quality, seven dimensions that ignore the prompt and ask whether the video looks good. Gold branches are Video-Condition Consistency, nine dimensions that ask whether the video matches what was requested. The small mono labels name the evaluation model for each leaf, such as DINO for subject consistency, RAFT for dynamic degree and GRiT for object detection. The method section below explains each leaf in turn.

  1. Prompt Suite per Dimension: ~100 prompts designed to probe exactly one ability (e.g. movable subjects for Subject Consistency; Kinetics-400 actions for Human Action; COCO classes for Object Class). Semantics prompts carry labels (class, colour, relation, style) for automatic checking.
  2. Prompt Suite per Category: human-curated prompts classified by an LLM [130] into 8 YouTube-like categories (Animal, Architecture, Food, Human, Lifestyle, Plant, Scenery, Vehicles); 800 prompts cleaned → 100 per category.
  3. Sample videos from each T2V model with every prompt (seed fixed at 2).
  4. Score each video with the dimension’s judge model (mini-diagrams below); average over videos → model score.
  5. Anchor with reference baselines: Empirical Min, Empirical Max, WebVid-Avg.
  6. Validate each dimension with human pairwise preference win ratios and Spearman ρ.
Guide

The pipeline has four stages. First, build small prompt suites, about a hundred prompts per dimension that each probe one ability, plus eight content categories of a hundred prompts each sorted by a language model. Second, sample one video per prompt from every model with a fixed seed. Third, score each video with that dimension's judge and average into a model score, reading it against reference baselines. Finally, confirm the dimension ranks models the way humans do.

How each dimension is computed

T framesDINO ViTunit feat. dₜcos(d₁, dₜ) &cos(dₜ₋₁, dₜ)Subject Consistency
Subject Consistency. \(S=\frac{1}{T-1}\sum_{t=2}^{T}\tfrac12(\langle d_1,d_t\rangle+\langle d_{t-1},d_t\rangle)\) — Eq. (1). DINO is sensitive to identity within a class.
Guide

Subject Consistency asks whether the main subject keeps its identity across the clip. Every frame goes through DINO, which is good at telling individuals of the same class apart, and each feature is compared by cosine similarity with the first frame and with the previous frame. Averaging those two similarities over time gives equation one. A cow that slowly changes its markings drops the score, as figure A8 shows.

T framesCLIP imageencoderunit feat. cₜcos(c₁, cₜ) &cos(cₜ₋₁, cₜ)Background Consistency
Background Consistency. Same as Eq. (1) with CLIP features \(c_t\) — Eq. (2). Prompts: Places365 scenes.
Guide

Background Consistency is the same recipe as Subject Consistency, but uses CLIP image features instead of DINO, because CLIP captures the overall scene rather than one object's identity. Each frame is compared with the first and the previous frame, giving equation two. The prompts come from Places365 scene names, so there is always a background worth tracking.

static-scenevideoRAFT filterkeeps staticpixel MAEfₜ vs fₜ₊₁(255−S)/255Temporal Flickering
Temporal Flickering. Eq. (3) averages consecutive-frame MAE; Eq. (4) maps to [0,1], higher = less flicker.
Guide

Temporal Flickering measures high-frequency jitter between frames. VBench first keeps only videos that RAFT says are static, so real motion is not mistaken for flicker. It then averages the mean absolute pixel difference between consecutive frames, equation three, and flips it into a zero to one score where higher means less flicker, equation four. Quantization noise that changes from frame to frame would show up here.

drop oddframesAMT frameinterpolatorrebuildf̂₁, f̂₃, …MAE vs real→ Eq.(4) normMotion Smoothness
Motion Smoothness. Smooth motion is predictable by a frame interpolator: small reconstruction error \(\Rightarrow\) high score.
Guide

Motion Smoothness uses the idea that smooth motion is predictable. VBench drops every odd frame, asks the AMT frame interpolator to rebuild them from their neighbours, and measures the pixel error against the real frames. Small error means the motion follows a smooth path and the score is high. The error is normalised the same way as flicker in equation four. Step-caching methods that skip computation could hurt this score.

consecutiveframesRAFT opticalflowmean of top-5%flow magnitudes> thr → dynamic% dynamic vidsDynamic Degree
Dynamic Degree. Score = fraction of a model’s videos judged non-static. Counter-weights the consistency dims.
Guide

Dynamic Degree is simply the fraction of a model's videos that actually move. RAFT computes optical flow between consecutive frames, VBench takes the mean of the largest five percent of flow magnitudes, and a video counts as dynamic if that value passes a threshold. It exists to balance the consistency dimensions, which a frozen clip would otherwise win.

each frameLAION aestheticpredictorrating 0–10÷10, meanover framesAesthetic Quality
Aesthetic Quality. \(S=\frac{1}{T}\sum_t a_t/10\): layout, colour harmony, photo-realism, artistry.
Guide

Aesthetic Quality asks whether frames look artistically pleasing: layout, colour harmony, realism. The LAION aesthetic predictor rates each frame from zero to ten, VBench divides by ten and averages over frames. It is a per-frame judgement, so it says nothing about motion.

each frameMUSIQ(SPAQ-trained)quality 0–100÷100, meanover framesImaging Quality
Imaging Quality. \(S=\frac{1}{T}\sum_t q_t/100\): low-level distortion (over-exposure, noise, blur).
Guide

Imaging Quality looks at low-level distortions such as noise, blur and over-exposure. The MUSIQ quality model, trained on the SPAQ dataset, gives each frame a score from zero to a hundred, which is divided by a hundred and averaged over frames. For the thesis this is the most direct check that four-bit weights have not added visible noise or blur.

framesGRiTdetectortarget classdetected?% frameswith hitObject Class
Object Class. \(S=\frac{1}{T}\sum_t \mathbb{1}[\text{class}\in\text{det}(f_t)]\). Prompts: 79 COCO classes.
Guide

Object Class checks that the requested object actually appears. For prompts built from 79 COCO classes, the GRiT detector runs on every frame, and the score is the fraction of frames in which the named class is detected. It is the simplest semantic test of whether the text conditioning still works.

framesGRiTdetectorall objectspresent?% framesall hitMultiple Objects
Multiple Objects. Compositionality: every requested object must appear in the same frame.
Guide

Multiple Objects tests composition: when the prompt asks for two things, both must be detected by GRiT in the same frame. The score is the fraction of frames where every requested object is present. It is much harder than Object Class, and the results section shows it is where video models lag image models most.

16 uniformframesUMT (Kinetics-400 classifier)top-5 withlogit > 0.85prompt action∈ set? meanHuman Action
Human Action. 100 Kinetics-400 actions phrased “a person is …”.
Guide

Human Action uses a hundred Kinetics-400 actions phrased as a person doing something. VBench samples sixteen frames, runs the UMT video classifier, and counts a hit if the prompted action is among the top five classes with a logit above 0.85. Because it needs a video classifier, it judges the clip as a whole rather than frame by frame.

frames withthe objectGRiT densecaptionercolour wordin caption% framesright colourColor
Color. Only frames where the object is detected count → disentangled from Object Class.
Guide

Color checks that the object has the requested colour. GRiT's dense captioner describes each frame, and only frames where the object is detected are counted, which keeps this score separate from Object Class. The score is the fraction of those frames whose caption contains the right colour word. The results show it is the least human-aligned dimension.

framesGRiT boxesaxis distance+ IoUrule score(T2I-CompBench)Spatial Relationship
Spatial Relationship. Left/right or top/bottom: distance along the named axis must dominate; overlapping boxes (IoU > thr) are down-weighted.
Guide

Spatial Relationship checks prompts like a clock to the left of a vase. From GRiT's boxes, the relation counts as correct if the distance along the named axis is larger than along the other axis. Heavily overlapping boxes are down-weighted, following the rule from T2I-CompBench. The results show image models are far better at this than video models.

framesTag2Textcaptionerall scene wordsin caption?% frameswith sceneScene
Scene. Word order may differ, but every scene word must appear (“ocean” ≠ “river”).
Guide

Scene checks that the video shows the requested place. The Tag2Text captioner describes each frame, and a frame counts only if every word of the scene name appears in the caption, in any order. So a caption saying river does not satisfy a prompt asking for ocean.

frames +style textCLIP image+ text enc.cosine sim.mean overframesAppearance Style
Appearance Style. \(S=\frac1T\sum_t\langle \mathrm{CLIP}_I(f_t),\mathrm{CLIP}_T(\text{style})\rangle\) (unit vectors).
Guide

Appearance Style asks whether frames look like the requested style, such as Van Gogh or oil painting. Each frame's CLIP image feature is compared by cosine similarity with the CLIP text feature of the style phrase, then averaged. The raw values are small, around twenty to thirty percent, so only differences between models are meaningful.

whole video +camera textViCLIP video+ text enc.cosine sim.video-textscoreTemporal Style
Temporal Style. Camera motion (zoom, pan, racking focus, slow motion) needs a video encoder, not per-frame CLIP.
Guide

Temporal Style covers camera effects like zoom, pan or slow motion, which cannot be seen in a single frame. So instead of per-frame CLIP, VBench uses ViCLIP, which encodes the whole video, and compares it with the text of the camera instruction. This is one of the few dimensions that truly needs a video-level judge.

whole video +full promptViCLIPcosine sim.video-textscoreOverall Consistency
Overall Consistency. Aiding metric covering semantics and style together on general prompts.
Guide

Overall Consistency is a catch-all that compares the whole video with the whole prompt using ViCLIP's video and text encoders. The paper calls it an aiding metric: it covers semantics and style together on general prompts, rather than isolating one ability like the other dimensions do.

prompt pᵢLaVieModelScopeVideoCrafterCogVideo5 groups Gᵢ,₀…Gᵢ,₄A–BA–CA–DB–CB–DC–D6 pairs / groupannotator:A better / B better/ samewin ratio:win 1, tie 0.5÷ #comparisonsSpearman ρ vsVBench win ratioTotal per dimension: N prompts × 5 groups × 6 pairs; video order randomised.
Human preference annotation. Only the dimension of interest may be judged. Quality assurance: instructions → 60-sample pre-labeling trial → instruction update → annotator re-check of 20% per 60-sample package (>10% error → relabel by another annotator) → author re-check (>10% error → whole dimension redone).
Guide

Human annotation is how VBench earns trust. For each prompt, the four models each produce videos, arranged into five groups, and within each group all six model pairs are compared. The annotator picks A better, B better, or same, judging only the dimension being tested. Wins count one and ties half, giving a human win ratio per model, which is correlated with the VBench win ratio. The quality checks with re-labelling keep the votes reliable.

VBench scores 0–1→ 0–10 scalehuman preferencepairs + questions30k instructionpairs (multi-turn)VideoChat-embed3 ep · lr 2e-5 · bs 64CoT: pick dimensions→ describe video→ predict 0–10 score(~1 h on 8×A100-80G)
Annotations reused to instruction-tune a video VLM. The VLM first chooses relevant dimensions (Table A4 chain of thought), then describes the video and predicts a per-dimension score.
Guide

As a side contribution, the human votes and VBench scores are turned into about thirty thousand instruction pairs to fine-tune a video language model. The tuned model first picks which dimensions matter for a prompt, then describes the video and gives a score from zero to ten per dimension. Training took about an hour on eight A100 GPUs. It is an extension, not part of the core benchmark.

Table A3 — LLM prompt for category classification The assistant gives helpful, detailed, and polite answers to the user's questions. Please act as a language expert, able to choose one or more suitable categories from [Animal, Architecture, Food, Human, Lifestyle, Plant, Scenery, Vehicles] for the given text. Given the input text, you should return the answer without explanation. For example, if the input is [A man eats hamburgers.], the output tag format should be [Food, Human]. The given text is Input text. (classification accuracy ~95%, then manual check)
Guide

This is the exact prompt used to sort the category prompts. A language model is asked to act as a language expert and tag each text with one or more of eight categories, such as Food or Vehicles, with no explanation. The logic is cheap automatic labelling followed by a human check: the tagging was about 95 percent accurate, then corrected by hand to give a hundred clean prompts per category.

Table A4 — VLM chain of thought (dimension selection) <SYSTEM>: You are an assistant with fair and objective standards for video assessment. Given the input statement for the video generation model: {input text}, please select appropriate evaluation dimensions from [16 dimension names]. <USER>: a dilapidated phone booth stood as a relic of a bygone era on the sidewalk, frozen in time. <ASSISTANT>: ... subject consistency, background consistency, temporal flickering, motion smoothness, dynamic degree, aesthetic quality, imaging quality, scene, temporal style, overall consistency
Guide

This chain-of-thought template is how the tuned video language model starts an evaluation. Given a prompt, it first selects which of the sixteen dimensions apply, and only then scores the video on them. In the phone booth example, the model leaves out object and colour checks and keeps the quality, scene, style and overall ones. Choosing dimensions first mirrors how VBench itself matches prompt suites to dimensions.

Reference baselines per dimensionEmpirical MinGaussian-noise 2 s clips (semantic/style dims); frames spliced fromdifferent WebVid videos ×1000 (consistency); theoretical 0% elsewhereWebVid-Avgmean score of top-5 CLIP-retrieved WebVid-10M clips(2 s segment, 8 fps) → real-data referenceEmpirical Maxbest retrieved WebVid-10M clip where 100% is unreachable;theoretical 100% where some video can reach it
Three anchors make raw percentages interpretable. E.g. Appearance Style tops out at 28.55% even for real videos, so 23.56% for LaVie is not “bad”.
Guide

Raw percentages mean little without anchors, so VBench gives three per dimension. Empirical Min comes from noise clips or frames spliced from different videos. WebVid-Avg is the average score of real WebVid clips retrieved for each prompt. Empirical Max is the best real clip where a hundred percent is unreachable. For example, Appearance Style tops out at about 28.6 percent even for real videos, so LaVie's 23.6 is not bad.

§5Every equation

(1)\[ S_{subject}=\frac{1}{T-1}\sum_{t=2}^{T}\frac{1}{2}\big(\langle d_1\cdot d_t\rangle+\langle d_{t-1}\cdot d_t\rangle\big) \]

Subject Consistency. \(d_i\): DINO feature of frame \(i\), unit-normalised; \(\langle\cdot\rangle\) = dot product = cosine similarity. Averaged over all videos of a model.

Guide

Equation one is Subject Consistency. S subject is one over T minus one times the sum from frame two to frame T of one half times the dot product of d one and d t, plus the dot product of d t minus one and d t. Here d t is the unit-length DINO feature of frame t, so each dot product is a cosine similarity. It rewards frames that match both the first frame and their neighbour, and is averaged over all of a model's videos.

(2)\[ S_{background}=\frac{1}{T-1}\sum_{t=2}^{T}\frac{1}{2}\big(\langle c_1\cdot c_t\rangle+\langle c_{t-1}\cdot c_t\rangle\big) \]

Background Consistency; \(c_i\): CLIP image feature of frame \(i\), unit-normalised.

Guide

Equation two is Background Consistency, identical in form to equation one. The only change is that c t, the unit-length CLIP image feature of frame t, replaces the DINO feature. Each frame is compared with the first frame and the previous one, the two cosine similarities are averaged, and the result is averaged over the T minus one frame transitions.

(3)\[ S_{flicker}=\frac{1}{N}\sum_{i=1}^{N}\Big(\frac{1}{T-1}\sum_{t=1}^{T-1}\operatorname{MAE}(f_i^{t},f_i^{t+1})\Big) \]

Temporal Flickering: mean absolute pixel difference between consecutive frames, \(N\) videos, \(T\) frames, \(f_i^t\) = frame \(t\) of video \(i\).

Guide

Equation three computes raw flicker. For each of N videos, it takes the mean absolute error between frame t and frame t plus one, averages over the T minus one pairs, and then averages over all videos. Because it is only applied to static scenes, any pixel change is treated as flicker. A larger value means worse flicker, which equation four then flips.

(4)\[ S_{flicker\text{-}norm}=\frac{255-S_{flicker}}{255} \]

Maps to [0,1] (8-bit pixels); higher = less flicker. Motion Smoothness uses the same normalisation on its interpolation MAE.

Guide

Equation four normalises flicker: 255 minus S flicker, all divided by 255. Since eight-bit pixels range from zero to 255, this maps the error into zero to one, with higher meaning less flicker. Motion Smoothness reuses exactly this normalisation. One consequence is that scores cluster near the top, around 96 to 99 percent, so small differences matter.

\[ S_{motion}=\frac{255-\frac{1}{n}\sum_{k}\operatorname{MAE}\big(\hat f_{2k-1},f_{2k-1}\big)}{255},\quad \hat f_{2k-1}=\operatorname{AMT}(f_{2k-2},f_{2k}) \]

Motion Smoothness (text, normalised “in the same way as Eq. 4”): drop odd frames of \([f_0,\dots,f_{2n}]\), interpolate them back, compare.

Guide

This is Motion Smoothness written out from the paper's text. Every odd frame is removed, and AMT reconstructs frame f two k minus one from the frames on either side, giving f hat. The mean absolute error between f hat and the real frame, averaged over the n dropped frames, is subtracted from 255 and divided by 255, as in equation four. Low reconstruction error means predictable, smooth motion.

\[ S_{dynamic}=\frac{1}{N}\sum_{i=1}^{N}\mathbb{1}\Big[\operatorname{mean}\big(\text{top }5\%\ \lVert\text{RAFT flow}\rVert\big)_i\gt\tau\Big] \]

Dynamic Degree: proportion of non-static videos (threshold \(\tau\) not given in the paper).

Guide

This is Dynamic Degree. For each video, take the RAFT optical flow magnitudes, average the largest five percent, and check whether that exceeds a threshold tau. The indicator is one for moving videos and zero otherwise, and S dynamic is the average over N videos, so it is the share of non-static clips. The paper does not give the threshold value.

\[ S_{aesthetic}=\frac{1}{T}\sum_{t=1}^{T}\frac{\operatorname{LAION}(f_t)}{10},\qquad S_{imaging}=\frac{1}{T}\sum_{t=1}^{T}\frac{\operatorname{MUSIQ}(f_t)}{100} \]

Frame-wise quality: linear normalisation of a 0–10 rating and a 0–100 rating, averaged over frames.

Guide

These two formulas give the frame-wise quality scores. S aesthetic averages the LAION aesthetic rating of each frame divided by ten, and S imaging averages the MUSIQ rating divided by a hundred, both over T frames. They are simple linear rescalings to zero to one, so they inherit whatever the judge models consider good.

\[ S_{obj}=\frac{1}{T}\sum_{t}\mathbb{1}\big[o\in\operatorname{GRiT}(f_t)\big],\qquad S_{multi}=\frac{1}{T}\sum_{t}\mathbb{1}\big[\{o_1,o_2\}\subseteq\operatorname{GRiT}(f_t)\big] \]

Object Class / Multiple Objects: fraction of frames where the requested object(s) are detected.

Guide

These are the object scores. S obj is the fraction of the T frames in which GRiT detects the requested object o. S multi is the fraction of frames in which both requested objects, o one and o two, are detected together. The indicator makes each frame count as one or zero.

\[ S_{action}=\frac{1}{N}\sum_{i}\mathbb{1}\big[a_i\in\{\text{top-5 UMT classes with logit}\gt0.85\}\big] \]

Human Action on 16 uniformly sampled frames.

Guide

Human Action is scored per video. For each of N videos, the indicator is one if the prompted action a i is among UMT's top five classes with a logit above 0.85, and the score is the average of these hits. UMT sees sixteen uniformly sampled frames, so it judges the motion, not a single still.

\[ S_{color}=\frac{\#\{t:\ o\ \text{detected},\ \text{caption}(o,f_t)\ \text{has colour } c\}}{\#\{t:\ o\ \text{detected}\}} \]

Color: only frames containing the object count.

Guide

Color is a ratio of frame counts. The numerator counts frames where the object is detected and its caption contains the requested colour c; the denominator counts all frames where the object is detected. Dividing by detected frames only means a missing object does not lower the colour score, keeping the two dimensions separate.

\[ S_{spatial}(f_t)=\begin{cases}1 & \text{relation correct},\ \operatorname{IoU}\lt\tau\\ \kappa(\operatorname{IoU}) & \text{relation correct},\ \operatorname{IoU}\ge\tau\\ 0 & \text{otherwise}\end{cases} \]

Spatial Relationship: correct if distance along the named axis exceeds that along the other axis; \(\kappa\) = IoU-based coefficient (exact form not given).

Guide

Spatial Relationship is scored per frame in three cases. If the relation is correct and the boxes overlap little, meaning IoU below tau, the frame scores one. If it is correct but the boxes overlap heavily, it gets a reduced score kappa of IoU. Otherwise it scores zero. The exact form of kappa is not given in the paper, so treat this as a sketch of the rule.

\[ S_{scene}=\frac{1}{T}\sum_t\mathbb{1}\big[\text{all scene words}\subseteq\operatorname{Tag2Text}(f_t)\big] \]

Scene: every scene word must appear in the caption, order free.

Guide

Scene is the fraction of the T frames where every word of the scene name appears in Tag2Text's caption. The indicator is strict about vocabulary but ignores word order, so partial matches do not count.

\[ S_{app}=\frac{1}{T}\sum_t\langle\operatorname{CLIP}_I(f_t)\cdot\operatorname{CLIP}_T(s)\rangle,\qquad S_{tstyle},\,S_{overall}=\langle\operatorname{ViCLIP}_V(v)\cdot\operatorname{ViCLIP}_T(p)\rangle \]

Style and overall: cosine similarity between visual and text features (\(s\) = style phrase, \(p\) = prompt).

Guide

These are the style and overall scores, all cosine similarities between a visual and a text embedding. S app averages, over frames, the similarity between the CLIP image feature of frame t and the CLIP text feature of the style phrase s. Temporal Style and Overall Consistency instead compare one ViCLIP embedding of the whole video v with the ViCLIP text embedding of the prompt p.

\[ \#\text{pairs}=N\times5\times6,\qquad \binom{4}{2}=6 \]

Human annotation: 5 groups of 4 model videos per prompt, all 6 pairs compared.

Guide

This counts human comparisons. For each of N prompts there are five groups of four model videos, and four models give four choose two, which is six pairs. So each dimension collects N times five times six pairwise votes. This is the data behind the win ratios in equation fifteen.

\[ \operatorname{WinRatio}(m)=\frac{\sum_{\text{pairs with } m}\big(\mathbb{1}[m\ \text{wins}]+\tfrac12\mathbb{1}[\text{tie}]\big)}{\#\text{pairs with } m} \]

Computed from both human labels and VBench scores; Spearman ρ between the two per dimension (Fig. 5).

Guide

The win ratio of model m is the sum over all pairs involving m of one for a win plus one half for a tie, divided by the number of pairs involving m. It is computed twice, once from human labels and once from VBench scores, and the Spearman rank correlation between the two is the human-alignment number reported for each dimension in figure five.

\[ \tilde s_{m,d}=a+(b-a)\,\frac{s_{m,d}-\min_{m'}s_{m',d}}{\max_{m'}s_{m',d}-\min_{m'}s_{m',d}} \]

Radar normalisation: \((a,b)=(0.3,0.8)\) for Figs. 2, 6, A26; \((0,1)\) over all 32 model×category values for Fig. 7.

Guide

This is only for drawing radar charts. The score s of model m on dimension d is min-max normalised across models, then stretched into the range a to b. Figures two, six and A26 use a of 0.3 and b of 0.8, so the best model sits at 0.8 and the worst at 0.3. Figure seven uses zero to one over all 32 model and category values. It changes the picture, not the underlying scores.

§6Every figure

Evaluation Dimension Suitecomprehensive · hierarchical · fine-grainedVideo Gen.QualityVideo QualityVideo-Cond.ConsistencyTemporal Quality (5)Frame-Wise Quality (2)Semantics (6)Style (2)Overall ConsistencyPrompt Suiteper dimensionper content categoryGenerated VideosT2V models → samplesEvaluationMethod Suitedesignated model& pipeline / dimHuman PreferenceAnnotationAlignmentVerification
Fig. 1Overview of VBench. Dimension suite (left) → prompt suite → generated videos → per-dimension evaluation method; human preference annotation verifies that each automatic score aligns with human perception.
Guide

Figure one is the paper's overview and reads left to right. The dimension suite splits video quality into temporal and frame-wise parts, and video-condition consistency into semantics, style and overall. Each dimension gets a prompt suite, the models generate videos, and a designated evaluation method scores them. Human preference annotation sits alongside and verifies every dimension. The rest of the paper fills in each box.

SubjectConsistencyOverallConsistencyTemporalStyleAppearanceStyleSceneSpatialRelationshipColorHumanActionMultipleObjectsObjectClassImagingQualityAestheticQualityDynamicDegreeMotionSmoothnessTemporalFlickeringBackgroundConsistencyLaVieModelScopeVideoCrafterCogVideo
Fig. 2VBench results of four T2V models. Radar redrawn from Table 1 with the paper’s normalisation (per dimension best → 0.8, worst → 0.3). LaVie (gold) is broad; VideoCrafter (indigo) spikes on Dynamic Degree and Spatial Relationship; CogVideo (magenta) wins Subject Consistency and Motion Smoothness.
Guide

Figure two is the headline result as a radar chart, redrawn from Table 1 with the best model per dimension at 0.8 and the worst at 0.3. No model wins everywhere. LaVie, in gold, is broad and strong on most axes. VideoCrafter, in indigo, spikes on Dynamic Degree and Spatial Relationship. CogVideo, in magenta, wins Subject Consistency and Motion Smoothness but is weak on semantics. This is exactly the per-dimension diagnosis a single score cannot give.

personviewstyletranquilplayingmountainsclosetableauwomanboathomerockybuildingswimmingbeachcouple020406080100# promptsSubject ConsistencyBackground ConsistencyTemporal FlickeringMotion SmoothnessDynamic DegreeAesthetic QualityImaging QualityObject ClassMultiple ObjectsHuman ActionColorSpatial RelationshipSceneAppearance StyleTemporal StyleOverall ConsistencyAnimalArchitectureFoodLifestyleSceneryHumanPlantVehiclesNumber of prompts per dimension and per category
Fig. 3Prompt suite statistics. Left: word-cloud schematic (largest words: person, view, style, tranquil, playing). Right: prompts per dimension (gold, 72–100; some suites are shared, e.g. Motion Smoothness/Dynamic Degree reuse Subject Consistency’s) and per category (teal, 100 each).
Guide

Figure three describes the prompts. The word cloud on the left shows common words like person, view, style and tranquil. The bars on the right show prompts per dimension, in gold, between about 72 and a hundred, and a hundred per content category, in teal. Some suites are shared, for example Motion Smoothness and Dynamic Degree reuse Subject Consistency's prompts. The small size is deliberate, since sampling video is slow.

【Prompt】The bund Shanghai, Van Gogh style |【Question】Is the style Van Gogh?swirly Van Goghstrokes, skyAplain photo-realskylineBA is betterB is betterSame qualitychoices00:00.5 / -00:01.5 play / stop controls
Fig. 4Human preference annotation interface. Top: prompt and dimension-specific question; centre: the two videos; right: the three choices; bottom-left: playback control. Here the annotator should pick “A is better” and ignore flicker or other qualities.
Guide

Figure four is the annotation screen. At the top are the prompt and a question about one dimension only, here whether the style is Van Gogh. In the middle are two videos, on the right three choices, and at the bottom playback controls. In this example the annotator should pick A, the swirly painted skyline, even if it flickers more, because only style is being judged.

Subject Consistency0.510.51ρ = 0.9651Background Consistency0.510.51ρ = 0.9480Temporal Flickering0.510.51ρ = 0.8873Motion Smoothness0.510.51ρ = 0.9980Dynamic Degree0.510.51ρ = 0.8209Aesthetic Quality0.510.51ρ = 0.9865Imaging Quality0.510.51ρ = 0.9216Object Class0.510.51ρ = 0.8037Multiple Objects0.510.51ρ = 0.9898Human Action0.510.51ρ = 0.8915Color0.510.51ρ = 0.6073Spatial Relationship0.510.51ρ = 0.9759Scene0.510.51ρ = 0.9407Appearance Style0.510.51ρ = 0.9965Temporal Style0.510.51ρ = 0.9753Overall Consistency0.510.51ρ = 0.9327Human win ratio (x) vs VBench win ratio (y)LaVie win ratioModelScope win ratioVideoCrafter win ratioCogVideo win ratioFitting
Fig. 5VBench agrees with humans in every dimension. Each dot = one model: x = human win ratio, y = VBench win ratio (exact values from Table A5), line = least-squares fit, ρ = Spearman correlation printed by the paper. Weakest: Color (0.61); strongest: Motion Smoothness (0.998).
Guide

Figure five is the main validation. Each small plot is one dimension, each dot is one model, with the human win ratio on the horizontal axis and the VBench win ratio on the vertical. Dots near the fitted line mean VBench ranks models as people do, and rho is the Spearman correlation. Agreement is high everywhere, from 0.61 for Color to 0.998 for Motion Smoothness, which justifies trusting the scores in the results tables.

AestheticQualityOverallConsistencyAppearanceStyleSceneSpatialRelationshipColorHumanActionMultipleObjectsObjectClassImagingQualityLaVieModelScopeVideoCrafterCogVideoSD1.4SD2.1SDXL
Fig. 6a(a) T2V vs. T2I models. Redrawn from Table A8, normalised over 7 models (best 0.8, worst 0.3). Image models (rust / grey) dominate Multiple Objects and Spatial Relationship — SDXL most strongly → T2V compositionality lags.
Guide

Figure six a compares video models with image models on the frame-level dimensions, redrawn from Table A8. The image models, especially SDXL, reach far out on Multiple Objects and Spatial Relationship while the four video models stay near the centre. The paper's conclusion is that video models lag in compositionality, perhaps because modelling time costs frame-level semantics. The bar chart in the results section shows the gap directly.

SubjectConsistencyOverallConsistencyTemporalStyleAppearanceStyleImagingQualityAestheticQualityDynamicDegreeMotionSmoothnessBackgroundConsistencyLaVieModelScopeVideoCrafterCogVideoWebVid-AvgEmpirical Max
Fig. 6b(b) T2V vs. WebVid-Avg & Empirical Max. Redrawn from Table A6. Real WebVid clips beat all T2V models on consistency, smoothness and overall consistency, but LaVie beats WebVid-Avg on aesthetics and imaging quality.
Guide

Figure six b places the video models next to real data, redrawn from Table A6. Real WebVid clips beat every model on subject consistency, motion smoothness and overall consistency. But LaVie beats the WebVid average on aesthetic and imaging quality, because WebVid footage is often low quality with watermarks. Real video is a reference point, not an upper bound on every axis.

SubjectOverallImagingAestheticDynamicMotionBackgr.LaVieSubjectOverallImagingAestheticDynamicMotionBackgr.ModelScopeSubjectOverallImagingAestheticDynamicMotionBackgr.VideoCrafterSubjectOverallImagingAestheticDynamicMotionBackgr.CogVideoAnimalArchitectureFoodLifestyleSceneryHumanPlantVehicles
Fig. 7Results across eight content categories (one chart per model). Redrawn from Table A7; each dimension normalised over all 32 model×category values to [0,1]. CogVideo’s Food aesthetics stands out; Human/Vehicles have high Dynamic Degree but lower other scores; Architecture/Scenery are the most static.
Guide

Figure seven shows one radar per model, with one coloured line per content category, redrawn from Table A7 and normalised to zero to one over all 32 values. Look for lines that stick out. CogVideo's Food line is high on aesthetics. Human and Vehicles are the most dynamic but lower elsewhere, and Architecture and Scenery are the most static. Performance depends on what is being filmed, so a test set should cover several categories.

same cowsame cowsame cowsame cowsame cow(a) consistent subject appearance (score 96.81%)cowcow'cow''morphsnew cow(b) inconsistent subject appearance (score 83.25%)
Fig. A8Subject Consistency. (a) cow keeps one look (96.81%); (b) cow’s appearance drifts — magenta boxes mark inconsistent regions (83.25%).
Guide

Figure A8 illustrates Subject Consistency. In the top row the cow keeps one appearance and scores about 96.8 percent. In the bottom row its look drifts from frame to frame, marked by the magenta boxes, and the score drops to about 83.3 percent. It shows what the DINO similarity in equation one is actually picking up.

same streetsame streetsame streetsame streetsame street(a) consistent background scene (score 93.39%)churchchurch'warpedchangednew scene(b) inconsistent background scene (score 88.08%)
Fig. A9Background Consistency. (a) scene persists as the camera moves (93.39%); (b) background distorts and changes abruptly within a few frames (88.08%).
Guide

Figure A9 illustrates Background Consistency. In the top row the street stays the same as the camera moves, scoring about 93.4 percent. In the bottom row the church warps and the scene changes within a few frames, scoring about 88.1 percent. A five-point drop here already signals a visible problem.

laptoplaptoplaptopframes → (pixel strip stacked)(a) mild flickering (score 99.68%)roomroomroomframes → (pixel strip stacked)(b) serious flickering (score 96.01%)
Fig. A10Temporal Flickering. Top: frames; bottom: the same small pixel segment from each frame stacked in time. (a) smooth columns = mild flicker (99.68%); (b) abrupt changes across frames = severe flicker (96.01%). Note how compressed the score range is.
Guide

Figure A10 illustrates flicker. The lower strip in each example stacks the same small patch of pixels from every frame, so smooth columns mean stable pixels. The top example has mild flicker and scores about 99.7 percent, the bottom has severe flicker and scores about 96.0. The range is very compressed, so a drop of one or two points is meaningful.

0.510.51ρ = 0.9932Static bench.Dynamic0.510.51ρ = 0.9862Dynamic bench.Semi-Dynamic0.510.51ρ = 0.9960Semi-Dynamic bench.StaticLaVie win ratioModelScope win ratioVideoCrafter win ratioCogVideo win ratioFitting
Fig. A11Flicker ranking does not depend on motion. Human win ratios for Temporal Flickering on Static vs. Dynamic vs. Semi-Dynamic benchmarks correlate at ρ = 0.9932 / 0.9862 / 0.9960 (shape redrawn; dot positions approximate). Justifies measuring flicker on static scenes only.
Guide

Figure A11 checks whether measuring flicker only on static scenes is fair. Human win ratios for flicker on static, dynamic and semi-dynamic video sets correlate with each other at about 0.99 in every pairing, so models rank the same way whatever the motion. That justifies the static-only filter in figure A10's metric. The dot positions here are approximate.

bear walksbear walksbear walksbear walksbear walks(a) smooth motion (score 96.04%)bearjumpbearjumpbear(b) unnatural motion (score 88.47%)
Fig. A12Motion Smoothness. (a) smooth, physically plausible bear motion (96.04%); (b) erratic, discontinuous motion (boxes) scores 88.47%.
Guide

Figure A12 illustrates Motion Smoothness. The top bear walks smoothly and plausibly, scoring about 96.0 percent. The bottom bear jumps erratically between frames, marked by the boxes, and scores about 88.5. Jerky motion is hard for the frame interpolator to predict, so its reconstruction error rises.

Prompt: a motorcycle turning a cornerbiketurningmovingcameramoves(a) recognized as not still, score = 1frozen bikefrozen bikefrozen bikefrozen bikefrozen bike(b) recognized as still, score = 0
Fig. A13Dynamic Degree. (a) camera and object move → dynamic (1); (b) nearly unchanged from start to end → static (0).
Guide

Figure A13 illustrates Dynamic Degree for the prompt of a motorcycle turning a corner. In the top row both the bike and the camera move, so the video counts as dynamic and scores one. In the bottom row the bike barely changes from start to end, so it counts as still and scores zero. The model's Dynamic Degree is the share of its videos that look like the top row.

Prompt: A tropical beach at sunrise, with palm trees and crystal-clear waterdark silhouettedark silhouettedark silhouettedark silhouettedark silhouette(a) Aesthetic Score 46.33%warm palmswarm palmswarm palmswarm palmswarm palms(b) Aesthetic Score 69.70%balanced beachbalanced beachbalanced beachbalanced beachbalanced beach(c) Aesthetic Score 81.69%couple, rain86.65%steam train80.42%wave print82.87%Eiffel, river83.95%(d) SD-XL samples
Fig. A14Aesthetic Quality. Same prompt, three videos with increasing LAION aesthetic score (46.33 → 69.70 → 81.69%); (d) SDXL images reach 80–87%.
Guide

Figure A14 illustrates Aesthetic Quality with one beach prompt and three videos of increasing score: about 46, then 70, then 82 percent. The dark silhouette looks flat, while the balanced, well-lit beach scores highest. For comparison, SDXL images in row d reach 80 to 87 percent, showing that image models still lead on per-frame beauty.

sharp beesharp beesharp beesharp beesharp bee(a) high imaging quality (score 70.62%)blurry beeblurry beeblurry beeblurry beeblurry bee(b) low imaging quality (score 31.27%)
Fig. A15Imaging Quality. (a) sharp, well-exposed (MUSIQ 70.62%); (b) blurry and over-exposed (31.27%).
Guide

Figure A15 illustrates Imaging Quality. The sharp, well-exposed bee scores about 70.6 percent on MUSIQ, while the blurry, over-exposed one scores about 31.3. This is the kind of degradation to watch for when weights are pushed to low bit widths.

Prompt: a personperson walksperson walksperson walksperson walksperson walks(a) target object detected, score = 1“A” badges“A” badges“A” badges“A” badges“A” badges(b) target object not detected, score = 0
Fig. A16Object Class. (a) a person is generated and detected by GRiT (1); (b) only letter-A badges on a pattern, no person (0).
Guide

Figure A16 illustrates Object Class for the prompt a person. In the top row GRiT detects a walking person, scoring one. In the bottom row the model produces a pattern of letter A badges, reading the article as a letter, and no person is found, scoring zero.

Prompt: a dog and a horsedog + horsedog + horsedog + horsedog + horsedog + horse(a) dog and horse detected simultaneously, score = 1horse onlyhorse onlyhorse onlyhorse onlyhorse only(b) dog and horse not detected simultaneously, score = 0
Fig. A17Multiple Objects. (a) both requested objects in every frame (1); (b) the pair never co-occurs (0).
Guide

Figure A17 illustrates Multiple Objects for the prompt a dog and a horse. In the top row both animals appear together in every frame, scoring one. In the bottom row only the horse appears, so the pair never co-occurs and the score is zero. Getting one of two objects is common for video models.

Prompt: a person is barbequingman at grillman at grillman at grillman at grillman at grill(a) barbequing action detected, score = 1food on platefood on platefood on platefood on platefood on plate(b) barbequing action not detected, score = 0
Fig. A18Human Action. (a) UMT recognises barbequing (1); (b) no person performing the action (0).
Guide

Figure A18 illustrates Human Action for the prompt a person is barbequing. In the top row UMT recognises a man at a grill, scoring one. In the bottom row the video shows only food on a plate, with nobody performing the action, scoring zero. Getting the objects right is not the same as getting the action right.

Prompt: a pink chairpink chairpink chairpink chairpink chairpink chair(a) consistent with prompt (score 100.00%)pink/whitestripedpink/whitestripedstripes(b) part inconsistent with prompt (score 76.92%)
Fig. A19Color. (a) target colour in all frames (100%); (b) chair only partly pink → 76.92% of frames captioned correctly.
Guide

Figure A19 illustrates Color for the prompt a pink chair. In the top row the chair is pink in every frame, scoring a hundred percent. In the bottom row it is partly pink and white striped, so only about 77 percent of frames are captioned with the right colour. Partial colour errors give partial scores.

Prompt: a clock on the left of a vase, front viewclock vaseclock vaseclock vaseclock vaseclock vase(a) correct objects and relationship (score 100.00%)clock-vase fusedclock-vase fusedclock-vase fusedclock-vase fusedclock-vase fused(b) incorrect relationship (score 0.00%)
Fig. A20Spatial Relationship. (a) clock left of vase (100%); (b) intended relationship absent (0%).
Guide

Figure A20 illustrates Spatial Relationship for a clock to the left of a vase. In the top row the two objects are separate and correctly placed, scoring a hundred percent. In the bottom row the clock and vase are fused into one shape, so the relationship is missing and the score is zero.

Prompt: bedroombed + windowbed + windowbed + windowbed + windowbed + window(a) bedroom scene detected, score = 1flower fieldflower fieldflower fieldflower fieldflower field(b) bedroom scene not detected, score = 0
Fig. A21Scene. (a) Tag2Text caption contains “bedroom” (1); (b) a flower field instead (0).
Guide

Figure A21 illustrates Scene for the prompt bedroom. In the top row Tag2Text's caption contains the word bedroom, scoring one. In the bottom row the model produced a flower field, so the scene word never appears and the score is zero.

Prompt: the bund Shanghai, Van Gogh styleswirly skylineswirly skylineswirly skylineswirly skylineswirly skyline(a) consistent appearance style (score 33.07%)photo skylinephoto skylinephoto skylinephoto skylinephoto skyline(b) inconsistent appearance style (score 20.93%)
Fig. A22Appearance Style. CLIP similarity 33.07% (Van Gogh look) vs. 20.93% (plain photo): absolute values are small; only relative differences matter.
Guide

Figure A22 illustrates Appearance Style for the Bund in Shanghai in Van Gogh style. The swirly painted skyline scores about 33.1 percent CLIP similarity, the plain photo about 20.9. Both numbers look low, because CLIP similarities are small in absolute terms. Only the gap between videos carries meaning.

Prompt: a cute happy Corgi playing in park, sunset, zoom infarcloserclosernearclose-up(a) consistent temporal style (score 30.50%)no zoomno zoomno zoomno zoomno zoom(b) inconsistent temporal style (score 8.74%)
Fig. A23Temporal Style. (a) video actually zooms in (ViCLIP 30.50%); (b) camera motion ignored (8.74%).
Guide

Figure A23 illustrates Temporal Style for a corgi prompt ending in zoom in. In the top row the camera really zooms from far to close-up, scoring about 30.5 percent on ViCLIP. In the bottom row the camera instruction is ignored, scoring about 8.7. A per-frame metric could not tell these apart.

Prompt: a corgi is playing drum kitcorgi + drumscorgi + drumscorgi + drumscorgi + drumscorgi + drums(a) consistent with overall prompt (score 40.10%)hands on drumshands on drumshands on drumshands on drumshands on drums(b) inconsistent with overall prompt (score 28.87%)
Fig. A24Overall Consistency. (a) matches the whole prompt (40.10%); (b) drums but no corgi (28.87%).
Guide

Figure A24 illustrates Overall Consistency for a corgi playing a drum kit. The top video matches the whole prompt and scores about 40.1 percent. The bottom video shows hands on drums but no corgi, scoring about 28.9. Missing one key element of the prompt costs about eleven points here.

Video to be evaluated: “a dilapidated phone booth … frozen in time”phone boothphone boothphone boothphone boothphone boothBefore VLM tuningUser: describe video w.r.t. subject consistencyUsergeneric description of an old booth, no temporal analysisVideoChatUser: predict score (0–10)“low score” — confuses subject consistency with contentAfter VLM tuningUser: describe video w.r.t. subject consistencyUserfirst … next … finally: frame-by-frame description of boothVideoChatUser: predict score (0–10)“score 8”: same booth, same place, consistent throughout
Fig. A25VLM tuning example. Before tuning, VideoChat misreads “subject consistency” and gives an unjustified low score; after tuning on VBench + human annotations it describes the video over time and scores it 8/10 with a consistent reason.
Guide

Figure A25 shows why the tuned video language model helps. Before tuning, VideoChat misreads subject consistency as a question about content and gives an unexplained low score. After tuning on VBench scores and human votes, it describes the phone booth frame by frame, notes that it stays the same, and gives eight out of ten. The tuning taught it what each dimension means.

SubjectOverallImagingAestheticDynamicMotionBackgr.AnimalSubjectOverallImagingAestheticDynamicMotionBackgr.ArchitectureSubjectOverallImagingAestheticDynamicMotionBackgr.FoodSubjectOverallImagingAestheticDynamicMotionBackgr.LifestyleSubjectOverallImagingAestheticDynamicMotionBackgr.ScenerySubjectOverallImagingAestheticDynamicMotionBackgr.HumanSubjectOverallImagingAestheticDynamicMotionBackgr.PlantSubjectOverallImagingAestheticDynamicMotionBackgr.VehiclesLaVieModelScopeVideoCrafterCogVideo
Fig. A26Results across eight categories (one chart per category). Same Table A7 data, grouped the other way: 4 models per chart, normalised over 32 values to [0.3, 0.8]. VideoCrafter’s Dynamic Degree spike repeats in every category; CogVideo’s Overall Consistency is always lowest.
Guide

Figure A26 uses the same category data as figure seven but grouped the other way: one radar per category, with the four models as lines, normalised to 0.3 to 0.8. Two patterns repeat in every category. VideoCrafter's Dynamic Degree spike is always there, and CogVideo's Overall Consistency is always lowest. So these are model traits, not category effects.

Animal: 14%Architecture: 4%Food: 11%Lifestyle: 4%Scenery: 21%Human: 26%Plant: 10%Vehicles: 11%
Fig. A27WebVid-10M category distribution. Human (26%) and Scenery (21%) dominate; Architecture and Lifestyle are 4% each; Food only 11%.
Guide

Figure A27 shows how WebVid-10M, a common training set, splits across the eight categories. Human clips are 26 percent and Scenery 21 percent, while Architecture and Lifestyle are only 4 percent each and Food 11 percent. The next figure uses this to argue about data quality versus quantity.

3035404550Aesthetic score (%)41.13Animal44.86Architecture45.12Food41.96Lifestyle43.99Scenery43.27Human42.99Plant42.99Vehicles
Fig. A28WebVid-10M aesthetic score per category. Food scores highest (45.12%) despite only 11% of data; Animal lowest (41.13%) → the paper’s “quality over quantity” insight.
Guide

Figure A28 gives the average aesthetic score of WebVid clips per category. Food scores highest at about 45.1 percent despite being only 11 percent of the data, and Animal lowest at about 41.1. Since models also do well on Food aesthetics, the paper argues that the quality of training data matters more than its quantity.

§7Results

Table 1. VBench evaluation results per dimension (higher = better; best T2V model in bold teal). Part 1: Video Quality + Object Class.
ModelSubject ConsistencyBackground ConsistencyTemporal FlickeringMotion SmoothnessDynamic DegreeAesthetic QualityImaging QualityObject Class
LaVie91.41%97.47%98.30%96.38%49.72%54.94%61.90%91.82%
ModelScope89.87%95.29%98.28%95.79%66.39%52.06%58.57%82.25%
VideoCrafter86.24%92.88%97.60%91.79%89.72%44.41%57.22%87.34%
CogVideo92.19%95.42%97.64%96.47%42.22%38.18%41.03%73.40%
Empirical Min14.62%26.15%62.93%70.60%0.00%0.00%0.00%0.00%
Empirical Max100.00%100.00%100.00%99.75%100.00%100.00%100.00%100.00%
Guide

Table one, part one, gives the raw scores for the quality dimensions plus Object Class, with Empirical Min and Max rows as anchors. No model wins everything. CogVideo leads subject consistency and motion smoothness, LaVie leads background, flicker, aesthetics, imaging and object class, and VideoCrafter is by far the most dynamic at about 89.7 percent. Note how close the flicker scores are, all around 98 percent, which is why small changes matter there.

Table 1 (cont.). Part 2: Video-Condition Consistency.
ModelMultiple ObjectsHuman ActionColorSpatial RelationshipSceneAppearance StyleTemporal StyleOverall Consistency
LaVie33.32%96.80%86.39%34.09%52.69%23.56%25.93%26.41%
ModelScope38.98%92.40%81.72%33.68%39.26%23.39%25.37%25.67%
VideoCrafter25.93%93.00%78.84%36.74%43.36%21.57%25.42%25.21%
CogVideo18.11%78.20%79.57%18.24%28.24%22.01%7.80%7.70%
Empirical Min0.00%0.00%0.00%0.00%0.00%0.09%0.00%0.00%
Empirical Max100.00%100.00%100.00%100.00%82.22%28.55%36.40%36.40%
Guide

Table one, part two, covers the condition dimensions. Semantics is where models separate: Multiple Objects and Spatial Relationship sit around 18 to 39 percent, far below the maximum. LaVie leads most columns, while CogVideo collapses on Temporal Style and Overall Consistency at under 8 percent. The Empirical Max row shows that style and overall scores top out near 28 to 36 percent even for real video.

5060708090100Spearman ρ (%)97Subject Consistency95Background Consistency89Temporal Flickering100Motion Smoothness82Dynamic Degree99Aesthetic Quality92Imaging Quality80Object Class99Multiple Objects89Human Action61Color98Spatial Relationship94Scene100Appearance Style98Temporal Style93Overall Consistency
Human-alignment per dimension (from Table A5). Teal = Video Quality, gold = Video-Condition Consistency. Color (60.7%), Object Class (80.4%) and Dynamic Degree (82.1%) are the least human-aligned; Motion Smoothness, Appearance Style and Multiple Objects are near-perfect.
Guide

This bar chart ranks the sixteen dimensions by how well they agree with humans, using the Spearman correlations from Table A5. Teal bars are quality dimensions and gold bars are condition dimensions. Color, at about 61 percent, Object Class at 80 and Dynamic Degree at 82 are the weakest, while Motion Smoothness, Appearance Style and Multiple Objects are near perfect. Lean more on the tall bars when a result is borderline.

Table A2. Dynamic Degree on three Temporal Flickering benchmarks (shows the Static benchmark is truly static).
ModelStatic BenchmarkSemi-Dynamic BenchmarkDynamic Benchmark
LaVie0.00%6.51%49.72%
ModelScope0.00%33.72%66.39%
VideoCrafter0.00%51.63%89.72%
CogVideo0.00%14.19%42.22%
Guide

Table A2 checks the three benchmarks used to validate flicker. Every model scores zero Dynamic Degree on the static benchmark, confirming it is truly static, and the semi-dynamic and dynamic sets show increasing motion. This supports the claim in figure A11 that flicker rankings hold regardless of motion.

Table A5. VBench win ratio / human win ratio (%) per dimension and model, with Spearman correlation. Part 1.
ModelSubject ConsistencyBackground ConsistencyTemporal FlickeringMotion SmoothnessDynamic DegreeAesthetic QualityImaging QualityObject Class
LaVie67.87 / 69.9585.27 / 65.0473.42 / 87.9669.54 / 65.6541.81 / 53.1077.56 / 83.4177.20 / 79.4657.55 / 79.20
ModelScope49.07 / 56.3049.96 / 56.3665.42 / 62.4458.61 / 59.5852.92 / 53.8467.74 / 63.1560.00 / 68.5349.37 / 49.58
VideoCrafter24.72 / 20.4215.89 / 27.2131.20 / 43.6410.00 / 13.8068.47 / 62.1835.34 / 32.3355.05 / 37.8554.18 / 41.77
CogVideo58.33 / 53.3348.88 / 51.4029.96 / 5.9661.85 / 60.9736.81 / 30.8819.35 / 21.117.74 / 14.1638.90 / 29.45
Correlation ρ96.51%94.80%88.73%99.80%82.09%98.65%92.16%80.37%
Guide

Table A5, part one, gives the numbers behind figure five for the quality dimensions and Object Class. Each cell shows the VBench win ratio then the human win ratio for one model, and the last row is their Spearman correlation. Motion Smoothness agrees almost perfectly at 99.8 percent, while Object Class and Dynamic Degree are lowest at about 80 and 82. The orderings of models usually match even when the exact ratios differ.

Table A5 (cont.). Part 2.
ModelMultiple ObjectsHuman ActionColorSpatial RelationshipSceneAppearance StyleTemporal StyleOverall Consistency
LaVie53.37 / 57.9754.43 / 58.1352.31 / 51.3752.30 / 49.8159.69 / 77.5261.85 / 58.2269.07 / 55.7370.82 / 77.35
ModelScope57.15 / 62.1551.10 / 53.0750.12 / 49.7353.25 / 53.1548.22 / 50.0057.48 / 54.9365.40 / 57.5066.31 / 60.07
VideoCrafter48.74 / 49.6352.17 / 47.8748.71 / 47.9256.11 / 54.6652.79 / 46.0536.67 / 40.0765.40 / 51.9062.65 / 48.10
CogVideo40.73 / 30.2442.30 / 40.9348.86 / 50.9838.33 / 42.3839.30 / 26.4344.00 / 46.780.13 / 34.870.22 / 14.48
Correlation ρ98.98%89.15%60.73%97.59%94.07%99.65%97.53%93.27%
Guide

Table A5, part two, covers the condition dimensions in the same format, VBench win ratio then human win ratio. Most correlations are above 89 percent, but Color stands out at about 61, because the four models are close and small differences flip the ranking. CogVideo's near-zero VBench win ratios on Temporal Style and Overall Consistency match humans ranking it last.

Table A6. Results incl. the WebVid-Avg reference baseline (best T2V model marked).
ModelSubject ConsistencyBackground ConsistencyMotion SmoothnessDynamic DegreeAesthetic QualityImaging QualityAppearance StyleTemporal StyleOverall Consistency
LaVie91.41%97.47%96.38%49.72%54.94%61.90%23.56%25.93%26.41%
ModelScope89.87%95.29%95.79%66.39%52.06%58.57%23.39%25.37%25.67%
VideoCrafter86.24%92.88%91.79%89.72%44.41%57.22%21.57%25.42%25.21%
CogVideo92.19%95.42%96.47%42.22%38.18%41.03%22.01%7.80%7.70%
Empirical Min14.62%26.15%70.60%0.00%0.00%0.00%0.09%0.00%0.00%
WebVid-Avg96.17%96.59%98.17%44.13%42.37%58.22%22.15%25.77%34.14%
Empirical Max100.00%100.00%99.75%100.00%100.00%100.00%28.55%36.40%36.40%
Guide

Table A6 adds the WebVid-Avg row, the average score of real clips retrieved for each prompt. Real video wins subject consistency, motion smoothness and overall consistency, but LaVie beats it on aesthetic and imaging quality, and VideoCrafter on dynamic degree. It is the numeric source for figure six b and a useful reminder that real data is not the ceiling on every axis.

Table A7. VBench results across eight content categories (best category per model & dimension marked).
ModelCategorySubject ConsistencyBackground ConsistencyMotion SmoothnessDynamic DegreeAesthetic QualityImaging QualityOverall Consistency
LaVieAnimal97.49%97.18%97.29%15.20%48.26%68.81%26.43%
Architecture98.04%97.38%97.83%5.20%54.20%69.30%25.46%
Food97.11%96.90%98.18%28.80%54.15%65.24%24.88%
Lifestyle96.10%96.19%98.08%33.60%48.76%64.02%24.43%
Scenery97.27%97.06%97.58%6.40%51.76%63.86%24.56%
Human96.11%95.88%97.57%39.00%51.87%64.07%24.63%
Plant97.52%97.20%96.73%16.40%52.68%67.86%24.50%
Vehicles95.23%95.82%97.11%34.00%50.70%61.02%24.51%
ModelScopeAnimal94.08%95.80%96.40%37.20%47.32%60.30%26.58%
Architecture95.77%95.88%97.20%24.80%52.10%58.38%24.89%
Food94.53%95.53%97.17%40.80%53.06%64.39%24.40%
Lifestyle94.36%95.17%97.18%41.00%45.77%59.62%23.51%
Scenery94.88%95.57%97.03%26.00%48.57%57.49%23.28%
Human93.37%94.21%96.45%56.00%48.14%58.41%22.84%
Plant95.14%96.26%96.48%26.40%51.03%63.83%23.55%
Vehicles93.17%94.61%96.47%50.20%47.53%55.75%23.60%
VideoCrafterAnimal87.01%92.40%91.80%79.60%40.51%59.79%25.47%
Architecture91.18%92.93%94.83%47.80%43.71%59.63%24.27%
Food89.50%92.87%93.44%75.00%48.19%63.47%24.47%
Lifestyle89.51%91.87%93.63%72.20%39.84%59.44%24.01%
Scenery89.67%92.86%94.17%51.80%43.06%58.98%23.20%
Human88.50%90.92%92.35%86.20%42.62%59.23%23.31%
Plant89.86%93.57%93.72%52.00%41.81%63.81%23.41%
Vehicles88.38%91.44%93.04%70.60%42.95%54.14%23.39%
CogVideoAnimal92.95%94.69%96.65%30.20%45.37%48.45%8.26%
Architecture95.00%94.65%97.39%10.20%46.29%45.33%7.48%
Food94.08%94.94%96.99%32.00%52.79%45.05%7.01%
Lifestyle93.80%93.93%96.93%28.00%41.57%41.28%7.85%
Scenery95.27%95.46%97.58%13.20%46.72%40.49%7.66%
Human92.08%92.29%95.93%46.80%46.38%43.81%8.29%
Plant94.86%95.71%97.05%19.60%48.63%43.22%6.65%
Vehicles93.11%93.27%96.80%33.60%44.18%41.05%8.34%
Guide

Table A7 breaks seven dimensions down by content category for each model, with the best category marked. Consistency scores barely move across categories, while Dynamic Degree swings a lot, for example LaVie ranges from about 5 percent on Architecture to 39 on Human. It is the data behind figures seven and A26, and shows why prompts from several categories are needed for a fair comparison.

Table A8. Video vs. image generation models (Overall Consistency uses CLIP instead of ViCLIP so T2I can be scored).
ModelAesthetic QualityImaging QualityObject ClassMultiple ObjectsHuman ActionColorSpatial RelationshipSceneAppearance StyleOverall Consistency
LaVie54.94%61.90%91.82%33.32%96.80%86.39%34.09%52.69%23.56%32.96%
ModelScope52.06%58.57%82.25%38.98%92.40%81.72%33.68%39.26%23.39%31.99%
VideoCrafter44.41%57.22%87.34%25.93%93.00%78.84%36.74%43.36%21.57%30.78%
CogVideo38.18%41.03%73.40%18.11%78.20%79.57%18.24%28.24%22.01%27.80%
SD1.465.85%69.86%91.14%34.39%91.80%90.57%61.89%52.33%25.35%32.59%
SD2.166.50%69.10%93.42%51.22%89.00%91.15%73.11%58.14%25.48%33.08%
SDXL70.38%68.79%91.39%69.51%91.20%88.92%86.17%54.65%25.23%33.77%
Guide

Table A8 compares the four video models with three Stable Diffusion image models on dimensions that can be judged per frame, using CLIP for overall consistency so images can be scored. SDXL reaches about 70 percent on Multiple Objects and 86 on Spatial Relationship, roughly double the best video model. Image models also lead on aesthetics. This is the evidence for the compositionality gap.

0255075100score (%)33265170Multiple Objects34377386Spatial Relationship55446670Aesthetic QualityLaVieVideoCrafterSD2.1SDXL
Compositionality gap: T2V vs. T2I. Best T2V models reach 34–37% on Multiple Objects / Spatial Relationship where SDXL reaches 70–86% (Table A8). Temporal modelling seems to cost frame-level semantics.
Guide

The compositionality gap in one chart. For Multiple Objects and Spatial Relationship, the best video models reach about 34 to 37 percent, while SD2.1 and SDXL reach 51 to 86. The gap on aesthetics is smaller. The paper reads this as a cost of temporal modelling: learning motion seems to take capacity away from getting frame-level semantics right.

§8Why it matters for this thesis

  • Pick the dimensions that compression can break. Int8/int4 weight-only quantization of LTX-2.3 mainly risks Imaging Quality (noise/blur, MUSIQ), Aesthetic Quality, Temporal Flickering and Subject/Background Consistency; step-caching mainly risks Motion Smoothness and Dynamic Degree. Semantics dims (Object Class, Spatial) check that the text path survived. A 6–8 dimension subset is enough.
  • Always pair consistency with Dynamic Degree. A degraded model that produces near-static clips will gain on consistency/flicker (§3). Report Dynamic Degree next to them, and next to WWB similarity, so “smoother” is not mistaken for “better”.
  • Compare FP16 vs. quantized on the same prompts and seeds. VBench scores are absolute; the thesis needs deltas. Use the per-dimension prompt suites (~70–100 prompts) with fixed seeds, and treat changes smaller than the model-to-model gaps in Table 1 (e.g. <0.5 pt on Motion Smoothness) as noise unless repeated.
  • Evaluation runs off-device in PyTorch. The judges (DINO, CLIP, RAFT, AMT, MUSIQ, GRiT, UMT, ViCLIP) are separate networks; generate videos with OpenVINO on Intel CPU/Arc, save frames, then score on any machine. Nothing needs converting to OpenVINO, but store frames losslessly (PNG) — codec artifacts would contaminate Imaging Quality and Flicker.
  • Audio is not covered. VBench is video-only and 2-second-oriented; LTX-2.3’s audio stream and longer clips need a separate check (e.g. WWB-style similarity or audio metrics), and resolution/length should be stated since the paper sampled 256–512 px, 16–33 frames.
Guide

Use VBench as a before-and-after test, not a leaderboard. Pick six to eight dimensions that compression can break: imaging and aesthetic quality, flicker and consistency for quantization, motion smoothness and dynamic degree for caching, plus one or two semantic checks. Generate FP16 and quantized videos with OpenVINO on the same prompts and seeds, save frames as PNG, and score them in PyTorch on any machine. Always report Dynamic Degree next to consistency, and remember VBench does not cover audio.

1 / 8