Verifying Google DiffusionGemma's "up to 4x faster text generation with diffusion" claim (released 2026-06-10) by reading the official inference code and running measurements on a consumer-grade GPU.
TL;DR:
Note: the official inference code is not a standalone repository -- it is merged directly
into Hugging Face transformers (transformers>=5.8,
src/transformers/models/diffusion_gemma/). All analysis and experiments here target that
code.
Distilled from a close reading of the implementation (~5,500 lines). Full analysis with line references: docs/01-generation-algorithm.md (Korean).

Figure 1. The block-diffusion generation pipeline as implemented: the encoder plays the role of AR prefill over the context, the decoder iteratively denoises a 256-token canvas (commit low-entropy positions, re-randomize the rest), and finished canvases chain block-autoregressively.
Key details (all verified in code):
cumsum(H) - max(H) <= 0.1. The rule comes from
arXiv:2505.24857 (entropy-bounded unmasking),
cited in a code comment. Mathematically it always commits at least 1 token per stepDistance from the marketing: it is called a "diffusion model", but none of the continuous diffusion machinery (timestep embedding, noise schedule, noise prediction network) exists. Precisely speaking it is temperature-scheduled, entropy-guided parallel iterative refinement.
The real 26B needs ~18GB VRAM even at NVFP4, beyond the consumer GPU used here. Instead we plug tiny models into the real Transformers generation code and instrument the algorithm's dynamics. The subject is sampler behavior, not text quality.
Code: experiments/01_sampler_dynamics/run.py, numbers: results.json
We push an untrained (random-weight) 1M model through the real generate() and instrument
the sampler.
tokens_per_forward (the official efficiency metric reported by generate()) = 1.19,
i.e. effectively AR efficiency
Figure 2. Untrained model in the real generation loop: per-step committed tokens (bars) never exceed the at-least-one guarantee, and mean canvas entropy (line) stays at the uniform bound, so adaptive stopping never fires.
Implication: the speed advantage comes from trained confidence, not from the architecture. On inputs the model is unsure about (hard problems, out-of-distribution text), step counts should rise and the advantage shrink.
We drive the real EntropyBoundSampler, temperature schedule, and stopping criteria with
synthetic logits whose confidence grows over steps, with per-position difficulty. Easy
positions commit first, in waves.

Figure 3. Canvas convergence under a synthetic confidence ramp (growth = 1.0): dark cells are committed positions. Easy positions commit first; commits sweep across the canvas in waves until adaptive stopping fires.
entropy_bound from 0.01 to 10 raises commits per step from 29 to 90. It is the
aggressiveness (speed) knob; the quality cost needs measuring on the real model
Figure 4. (a) Faster confidence growth means fewer steps until adaptive stop. (b) The entropy bound epsilon controls how many tokens commit per step -- the aggressiveness knob.
Measured with a 69M toy (identical weights for both modes):
Table 1. Canvas forward vs AR decode, measured (batch 1).
| measurement | result |
|---|---|
| one 256-token canvas forward (marginal cost) | 51.5 ms |
| one AR 1-token decode (KV cache, same encoder weights) | 40.5 ms |
| cost ratio (canvas / 1-token) | 1.27x |
| implied speedup at 12 steps | 16.8x |
| at 16 steps | 12.6x |
| at the 48-step cap | 4.2x |

Figure 5. Measured speed model: speedup over AR decode as a function of denoising steps per 256-token canvas. Shaded band: vendor's typical convergence range; dashed line: the 48-step cap.
Interpretation: a 1-token decode is bound by weight loading (memory bandwidth), not compute, so pushing 256 tokens through at once costs only 1.27x. That is the hardware essence of the diffusion speed claim. The vendor's "4-6x" is more conservative than our toy measurement (12-17x at 12-16 steps), presumably because the real 26B has a much larger compute share, making the canvas forward relatively pricier. Caveat: toy scale on a consumer GPU -- this validates the structure, not absolute numbers.
Two hypotheses for why the vendor number is lower than our toy number, swept with the same DiffusionGemma code. Median of 3 runs. Code: experiments/02_scaling_batch/run.py, numbers: results.json
Hypothesis 1 -- bigger model, smaller advantage: not observable at toy scale (null result). Across 17M-336M the canvas/1-token cost ratio stays flat at 1.1-1.2. All these sizes are far below GPU compute saturation; the compute-share effect cannot be seen at toy scale. Verifying it needs the real 26B on cloud hardware.

Figure 6. Size sweep, batch 1, median of 3. (a) The canvas/1-token cost ratio and (b) the implied 16-step speedup are both flat across 17M-336M: a null result -- the toy regime never approaches compute saturation.
Hypothesis 2 -- bigger batch, vanishing advantage: strongly confirmed. From batch 1 to 16 the cost ratio explodes from 1.1 to 11.2 and the 16-step speedup collapses from 14.4x to 1.4x. This confirms vLLM's "particularly attractive at low batch sizes" framing, and shows the flip side: at high-batch serving, the diffusion speed advantage effectively disappears.
Table 2. Batch sweep at 97M, median of 3.
| batch | cost ratio (canvas/1tok) | speedup at 16 steps |
|---|---|---|
| 1 | 1.11 | 14.4x |
| 2 | 1.51 | 10.6x |
| 4 | 1.61 | 10.0x |
| 8 | 2.59 | 6.2x |
| 16 | 11.22 | 1.4x |

Figure 7. The diffusion advantage collapses toward AR parity as batch size grows: the canvas forward saturates compute while AR decode stays bandwidth-bound.
DiffusionGemma itself cannot run here, but the closest runnable open dLLM can: LLaDA-MoE-7B-A1B-Instruct (inclusionAI, 2025) is a sparse-MoE diffusion LLM with 7B total / 1.4B active parameters -- the same architecture family as DiffusionGemma 26B-A4B. We benchmark it with its official model-card sampler (mask-based, low-confidence remasking) against five AR peers: Qwen2.5-1.5B (active-parameter peer), Qwen2.5-7B (total-parameter peer), and -- since DiffusionGemma derives from the Gemma family -- Gemma 3 1B, Gemma 3 4B (official repos are gated; weights via the ungated unsloth re-uploads of the same checkpoints), and Gemma 4 E4B, the only release of DiffusionGemma's own generation that approaches consumer hardware (the actual 26B-A4B base does not fit; 12B/31B do not either). All quantized identically (bitsandbytes nf4), batch 1, 128 new tokens, greedy, 3 prompts (math / Korean / code).
Code: experiments/03_real_models/run.py, numbers and full outputs: results.json
Table 3. Measured throughput (mean over 3 prompts), single consumer GPU, nf4 4-bit.
| model | active / total params | decoding | tok/s | peak VRAM |
|---|---|---|---|---|
| LLaDA-MoE-7B-A1B | 1.4B / 7B | diffusion, 128 steps (official) | 0.8 | 4.7 GiB |
| LLaDA-MoE-7B-A1B | 1.4B / 7B | diffusion, 64 steps | 1.5 | 4.7 GiB |
| LLaDA-MoE-7B-A1B | 1.4B / 7B | diffusion, 32 steps | 2.8 | 4.7 GiB |
| Gemma 3 1B | 1.0B / 1.0B | AR, greedy | 4.1 | 1.2 GiB |
| Qwen2.5-1.5B | 1.5B / 1.5B | AR, greedy | 13.8 | 1.2 GiB |
| Gemma 4 E4B | ~4B eff. / 8B raw | AR, greedy | 3.6 * | 8.9 GiB |
| Gemma 3 4B | 4.3B / 4.3B | AR, greedy | 2.7 | 3.2 GiB |
| Qwen2.5-7B | 7.6B / 7.6B | AR, greedy | 14.2 | 5.6 GiB |
* Gemma 4 E4B's peak allocation (8.9 GiB) exceeded physical VRAM, so part of it ran from host memory; its throughput is an underestimate. The bias works against the AR side, so the dLLM-is-slower conclusion is unaffected.

Figure 8. A 2025-generation diffusion LLM is slower than every AR baseline on consumer hardware: 0.8 tok/s at official settings vs 13.8 (Qwen2.5-1.5B, 15x), 4.1 (Gemma 3 1B, 5x), and 3.6 (Gemma 4 E4B, DiffusionGemma's own generation, 4.5x). Whiskers: min-max over the 3 prompts.
The result inverts the "diffusion = fast" marketing, and the reasons are exactly the two things DiffusionGemma changed:
Qualitative spot checks (full text in results.json): LLaDA-MoE's Korean output is essentially broken code-switching ("대ositories의 rollover는 인구입니다"), while even the 1.5B AR peer answers fluently. Its math answer reasons correctly but locks into a tool-call JSON format. Caveats: single prompt per category, greedy decoding, and framework overhead dominates absolute numbers in this stack -- nf4 dequant flattens Qwen 1.5B vs 7.6B to nearly the same tok/s, and Gemma 3 measures well below same-size Qwen (its hybrid sliding-window attention path is poorly optimized in transformers 4.53 + bitsandbytes). Read these numbers as relative, not absolute. Even so, the diffusion model at official settings is slower than every AR baseline, including the slowest Gemma-family one.
Bottom line: "diffusion LLM" is not intrinsically fast. The speed story depends on serving engineering (context caching, adaptive steps) that the 2026 DiffusionGemma added and 2025 open dLLMs lack. Whether DiffusionGemma's own 4-6x claim holds end-to-end still needs the cloud-GPU run.
Neither DiffusionGemma 26B-A4B nor its AR base Gemma 4 26B-A4B fits the GPU, but both fit system RAM as 4-bit GGUFs. We run the actual pair head-to-head, CPU-only, through llama.cpp -- DiffusionGemma via the (unmerged) llama.cpp PR #24423, which implements the diffusion-gemma architecture including the entropy-bound decoder with the official parameters (48-step cap, 0.8 -> 0.4 temperature, entropy bound 0.1, adaptive stopping, context KV cache).
Code: experiments/04_local_26b/run.py, numbers and full outputs: results.json
Table 4. The real 26B pair on a consumer desktop, CPU-only llama.cpp, same 3 prompts (math / Korean / code), greedy.
| model | decoding | steps used | effective tok/s | wall per reply |
|---|---|---|---|---|
| Gemma 4 26B-A4B (QAT q4_0) | AR | -- | 4.2 / 4.2 / 4.6 | 133-142 s |
| DiffusionGemma 26B-A4B (Q4_K_M) | block diffusion, entropy-bound | 11 / 19 / 16 | 1.2 / 0.8 / 0.8 | 325-431 s |
Findings:
-n 256 (one canvas)
the thought can consume most of the canvas and truncate the final answer -- a real
ergonomic cost of fixed 256-token canvases for short-form chatCaveats: CPU-only (says nothing about the GPU speed claims), an unmerged PR implementation, slightly different quants (community Q4_K_M vs official QAT q4_0), one prompt per category.
Passing confidence_threshold=0.0 makes the validator's error message reference a
nonexistent self.entropy_bound, raising AttributeError instead of the intended ValueError
(generation_diffusion_gemma.py:177, transformers 5.11.0).
python3 -m venv --system-site-packages .venv # assuming torch+CUDA present
.venv/bin/pip install "transformers>=5.11" matplotlib
.venv/bin/python experiments/01_sampler_dynamics/run.py
.venv/bin/python experiments/02_scaling_batch/run.py
# EXP E needs a second venv: LLaDA-MoE custom code targets transformers 4.53
python3 -m venv --system-site-packages .venv-llada
.venv-llada/bin/pip install "transformers==4.53.2" bitsandbytes accelerate
.venv-llada/bin/python experiments/03_real_models/run.py # downloads ~32GB of models
EXP F needs a llama.cpp build from the DiffusionGemma PR (CPU-only shown):
git clone --depth 50 https://github.com/ggml-org/llama.cpp ~/builds/llama.cpp-dg
cd ~/builds/llama.cpp-dg
git fetch origin pull/24423/head:pr-24423 --depth 50 && git checkout pr-24423
cmake -B build -DGGML_CUDA=OFF -DLLAMA_CURL=OFF -DCMAKE_BUILD_TYPE=Release
cmake --build build -j8 --target llama-diffusion-cli llama-cli
# GGUFs: unsloth/diffusiongemma-26B-A4B-it-GGUF (Q4_K_M) and
# google/gemma-4-26B-A4B-it-qat-q4_0-gguf, then:
.venv/bin/python experiments/04_local_26b/run.py
Figures re-render from saved results without re-measuring: each experiment has a
plot.py (shared style in experiments/paperstyle.py).
To fetch the official code/config locally:
# model config/tokenizer only (skip the 26B LFS weights)
GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 \
https://huggingface.co/google/diffusiongemma-26B-A4B-it reference/hf-model
# Transformers implementation (analysis pinned at commit 8014139)
git clone --depth 1 --filter=blob:none --sparse \
https://github.com/huggingface/transformers reference/transformers
git -C reference/transformers sparse-checkout set src/transformers/models
Everything runnable on consumer hardware has been run (EXP A-F). What remains requires a cloud GPU (H100-class, both 26B models resident in VRAM):
max_denoising_steps / entropy_bound vs output quality trade-off at full speedCheap local follow-ups, if wanted:
-n 512+Single consumer-grade NVIDIA GPU (specs undisclosed) / torch 2.12 / transformers 5.11.0
7 commits
Python
100.0%
Verifying Google DiffusionGemma's "up to 4x faster text generation with diffusion" claim (released 2026-06-10) by reading the official inference code and running measurements on a consumer-grade GPU.
TL;DR:
Note: the official inference code is not a standalone repository -- it is merged directly
into Hugging Face transformers (transformers>=5.8,
src/transformers/models/diffusion_gemma/). All analysis and experiments here target that
code.
Distilled from a close reading of the implementation (~5,500 lines). Full analysis with line references: docs/01-generation-algorithm.md (Korean).

Figure 1. The block-diffusion generation pipeline as implemented: the encoder plays the role of AR prefill over the context, the decoder iteratively denoises a 256-token canvas (commit low-entropy positions, re-randomize the rest), and finished canvases chain block-autoregressively.
Key details (all verified in code):
cumsum(H) - max(H) <= 0.1. The rule comes from
arXiv:2505.24857 (entropy-bounded unmasking),
cited in a code comment. Mathematically it always commits at least 1 token per stepDistance from the marketing: it is called a "diffusion model", but none of the continuous diffusion machinery (timestep embedding, noise schedule, noise prediction network) exists. Precisely speaking it is temperature-scheduled, entropy-guided parallel iterative refinement.
The real 26B needs ~18GB VRAM even at NVFP4, beyond the consumer GPU used here. Instead we plug tiny models into the real Transformers generation code and instrument the algorithm's dynamics. The subject is sampler behavior, not text quality.
Code: experiments/01_sampler_dynamics/run.py, numbers: results.json
We push an untrained (random-weight) 1M model through the real generate() and instrument
the sampler.
tokens_per_forward (the official efficiency metric reported by generate()) = 1.19,
i.e. effectively AR efficiency
Figure 2. Untrained model in the real generation loop: per-step committed tokens (bars) never exceed the at-least-one guarantee, and mean canvas entropy (line) stays at the uniform bound, so adaptive stopping never fires.
Implication: the speed advantage comes from trained confidence, not from the architecture. On inputs the model is unsure about (hard problems, out-of-distribution text), step counts should rise and the advantage shrink.
We drive the real EntropyBoundSampler, temperature schedule, and stopping criteria with
synthetic logits whose confidence grows over steps, with per-position difficulty. Easy
positions commit first, in waves.

Figure 3. Canvas convergence under a synthetic confidence ramp (growth = 1.0): dark cells are committed positions. Easy positions commit first; commits sweep across the canvas in waves until adaptive stopping fires.
entropy_bound from 0.01 to 10 raises commits per step from 29 to 90. It is the
aggressiveness (speed) knob; the quality cost needs measuring on the real model
Figure 4. (a) Faster confidence growth means fewer steps until adaptive stop. (b) The entropy bound epsilon controls how many tokens commit per step -- the aggressiveness knob.
Measured with a 69M toy (identical weights for both modes):
Table 1. Canvas forward vs AR decode, measured (batch 1).
| measurement | result |
|---|---|
| one 256-token canvas forward (marginal cost) | 51.5 ms |
| one AR 1-token decode (KV cache, same encoder weights) | 40.5 ms |
| cost ratio (canvas / 1-token) | 1.27x |
| implied speedup at 12 steps | 16.8x |
| at 16 steps | 12.6x |
| at the 48-step cap | 4.2x |

Figure 5. Measured speed model: speedup over AR decode as a function of denoising steps per 256-token canvas. Shaded band: vendor's typical convergence range; dashed line: the 48-step cap.
Interpretation: a 1-token decode is bound by weight loading (memory bandwidth), not compute, so pushing 256 tokens through at once costs only 1.27x. That is the hardware essence of the diffusion speed claim. The vendor's "4-6x" is more conservative than our toy measurement (12-17x at 12-16 steps), presumably because the real 26B has a much larger compute share, making the canvas forward relatively pricier. Caveat: toy scale on a consumer GPU -- this validates the structure, not absolute numbers.
Two hypotheses for why the vendor number is lower than our toy number, swept with the same DiffusionGemma code. Median of 3 runs. Code: experiments/02_scaling_batch/run.py, numbers: results.json
Hypothesis 1 -- bigger model, smaller advantage: not observable at toy scale (null result). Across 17M-336M the canvas/1-token cost ratio stays flat at 1.1-1.2. All these sizes are far below GPU compute saturation; the compute-share effect cannot be seen at toy scale. Verifying it needs the real 26B on cloud hardware.

Figure 6. Size sweep, batch 1, median of 3. (a) The canvas/1-token cost ratio and (b) the implied 16-step speedup are both flat across 17M-336M: a null result -- the toy regime never approaches compute saturation.
Hypothesis 2 -- bigger batch, vanishing advantage: strongly confirmed. From batch 1 to 16 the cost ratio explodes from 1.1 to 11.2 and the 16-step speedup collapses from 14.4x to 1.4x. This confirms vLLM's "particularly attractive at low batch sizes" framing, and shows the flip side: at high-batch serving, the diffusion speed advantage effectively disappears.
Table 2. Batch sweep at 97M, median of 3.
| batch | cost ratio (canvas/1tok) | speedup at 16 steps |
|---|---|---|
| 1 | 1.11 | 14.4x |
| 2 | 1.51 | 10.6x |
| 4 | 1.61 | 10.0x |
| 8 | 2.59 | 6.2x |
| 16 | 11.22 | 1.4x |

Figure 7. The diffusion advantage collapses toward AR parity as batch size grows: the canvas forward saturates compute while AR decode stays bandwidth-bound.
DiffusionGemma itself cannot run here, but the closest runnable open dLLM can: LLaDA-MoE-7B-A1B-Instruct (inclusionAI, 2025) is a sparse-MoE diffusion LLM with 7B total / 1.4B active parameters -- the same architecture family as DiffusionGemma 26B-A4B. We benchmark it with its official model-card sampler (mask-based, low-confidence remasking) against five AR peers: Qwen2.5-1.5B (active-parameter peer), Qwen2.5-7B (total-parameter peer), and -- since DiffusionGemma derives from the Gemma family -- Gemma 3 1B, Gemma 3 4B (official repos are gated; weights via the ungated unsloth re-uploads of the same checkpoints), and Gemma 4 E4B, the only release of DiffusionGemma's own generation that approaches consumer hardware (the actual 26B-A4B base does not fit; 12B/31B do not either). All quantized identically (bitsandbytes nf4), batch 1, 128 new tokens, greedy, 3 prompts (math / Korean / code).
Code: experiments/03_real_models/run.py, numbers and full outputs: results.json
Table 3. Measured throughput (mean over 3 prompts), single consumer GPU, nf4 4-bit.
| model | active / total params | decoding | tok/s | peak VRAM |
|---|---|---|---|---|
| LLaDA-MoE-7B-A1B | 1.4B / 7B | diffusion, 128 steps (official) | 0.8 | 4.7 GiB |
| LLaDA-MoE-7B-A1B | 1.4B / 7B | diffusion, 64 steps | 1.5 | 4.7 GiB |
| LLaDA-MoE-7B-A1B | 1.4B / 7B | diffusion, 32 steps | 2.8 | 4.7 GiB |
| Gemma 3 1B | 1.0B / 1.0B | AR, greedy | 4.1 | 1.2 GiB |
| Qwen2.5-1.5B | 1.5B / 1.5B | AR, greedy | 13.8 | 1.2 GiB |
| Gemma 4 E4B | ~4B eff. / 8B raw | AR, greedy | 3.6 * | 8.9 GiB |
| Gemma 3 4B | 4.3B / 4.3B | AR, greedy | 2.7 | 3.2 GiB |
| Qwen2.5-7B | 7.6B / 7.6B | AR, greedy | 14.2 | 5.6 GiB |
* Gemma 4 E4B's peak allocation (8.9 GiB) exceeded physical VRAM, so part of it ran from host memory; its throughput is an underestimate. The bias works against the AR side, so the dLLM-is-slower conclusion is unaffected.

Figure 8. A 2025-generation diffusion LLM is slower than every AR baseline on consumer hardware: 0.8 tok/s at official settings vs 13.8 (Qwen2.5-1.5B, 15x), 4.1 (Gemma 3 1B, 5x), and 3.6 (Gemma 4 E4B, DiffusionGemma's own generation, 4.5x). Whiskers: min-max over the 3 prompts.
The result inverts the "diffusion = fast" marketing, and the reasons are exactly the two things DiffusionGemma changed:
Qualitative spot checks (full text in results.json): LLaDA-MoE's Korean output is essentially broken code-switching ("대ositories의 rollover는 인구입니다"), while even the 1.5B AR peer answers fluently. Its math answer reasons correctly but locks into a tool-call JSON format. Caveats: single prompt per category, greedy decoding, and framework overhead dominates absolute numbers in this stack -- nf4 dequant flattens Qwen 1.5B vs 7.6B to nearly the same tok/s, and Gemma 3 measures well below same-size Qwen (its hybrid sliding-window attention path is poorly optimized in transformers 4.53 + bitsandbytes). Read these numbers as relative, not absolute. Even so, the diffusion model at official settings is slower than every AR baseline, including the slowest Gemma-family one.
Bottom line: "diffusion LLM" is not intrinsically fast. The speed story depends on serving engineering (context caching, adaptive steps) that the 2026 DiffusionGemma added and 2025 open dLLMs lack. Whether DiffusionGemma's own 4-6x claim holds end-to-end still needs the cloud-GPU run.
Neither DiffusionGemma 26B-A4B nor its AR base Gemma 4 26B-A4B fits the GPU, but both fit system RAM as 4-bit GGUFs. We run the actual pair head-to-head, CPU-only, through llama.cpp -- DiffusionGemma via the (unmerged) llama.cpp PR #24423, which implements the diffusion-gemma architecture including the entropy-bound decoder with the official parameters (48-step cap, 0.8 -> 0.4 temperature, entropy bound 0.1, adaptive stopping, context KV cache).
Code: experiments/04_local_26b/run.py, numbers and full outputs: results.json
Table 4. The real 26B pair on a consumer desktop, CPU-only llama.cpp, same 3 prompts (math / Korean / code), greedy.
| model | decoding | steps used | effective tok/s | wall per reply |
|---|---|---|---|---|
| Gemma 4 26B-A4B (QAT q4_0) | AR | -- | 4.2 / 4.2 / 4.6 | 133-142 s |
| DiffusionGemma 26B-A4B (Q4_K_M) | block diffusion, entropy-bound | 11 / 19 / 16 | 1.2 / 0.8 / 0.8 | 325-431 s |
Findings:
-n 256 (one canvas)
the thought can consume most of the canvas and truncate the final answer -- a real
ergonomic cost of fixed 256-token canvases for short-form chatCaveats: CPU-only (says nothing about the GPU speed claims), an unmerged PR implementation, slightly different quants (community Q4_K_M vs official QAT q4_0), one prompt per category.
Passing confidence_threshold=0.0 makes the validator's error message reference a
nonexistent self.entropy_bound, raising AttributeError instead of the intended ValueError
(generation_diffusion_gemma.py:177, transformers 5.11.0).
python3 -m venv --system-site-packages .venv # assuming torch+CUDA present
.venv/bin/pip install "transformers>=5.11" matplotlib
.venv/bin/python experiments/01_sampler_dynamics/run.py
.venv/bin/python experiments/02_scaling_batch/run.py
# EXP E needs a second venv: LLaDA-MoE custom code targets transformers 4.53
python3 -m venv --system-site-packages .venv-llada
.venv-llada/bin/pip install "transformers==4.53.2" bitsandbytes accelerate
.venv-llada/bin/python experiments/03_real_models/run.py # downloads ~32GB of models
EXP F needs a llama.cpp build from the DiffusionGemma PR (CPU-only shown):
git clone --depth 50 https://github.com/ggml-org/llama.cpp ~/builds/llama.cpp-dg
cd ~/builds/llama.cpp-dg
git fetch origin pull/24423/head:pr-24423 --depth 50 && git checkout pr-24423
cmake -B build -DGGML_CUDA=OFF -DLLAMA_CURL=OFF -DCMAKE_BUILD_TYPE=Release
cmake --build build -j8 --target llama-diffusion-cli llama-cli
# GGUFs: unsloth/diffusiongemma-26B-A4B-it-GGUF (Q4_K_M) and
# google/gemma-4-26B-A4B-it-qat-q4_0-gguf, then:
.venv/bin/python experiments/04_local_26b/run.py
Figures re-render from saved results without re-measuring: each experiment has a
plot.py (shared style in experiments/paperstyle.py).
To fetch the official code/config locally:
# model config/tokenizer only (skip the 26B LFS weights)
GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 \
https://huggingface.co/google/diffusiongemma-26B-A4B-it reference/hf-model
# Transformers implementation (analysis pinned at commit 8014139)
git clone --depth 1 --filter=blob:none --sparse \
https://github.com/huggingface/transformers reference/transformers
git -C reference/transformers sparse-checkout set src/transformers/models
Everything runnable on consumer hardware has been run (EXP A-F). What remains requires a cloud GPU (H100-class, both 26B models resident in VRAM):
max_denoising_steps / entropy_bound vs output quality trade-off at full speedCheap local follow-ups, if wanted:
-n 512+Single consumer-grade NVIDIA GPU (specs undisclosed) / torch 2.12 / transformers 5.11.0
7 commits
Python
100.0%