DiffusionGemma 26B-A4B, OpenVINO int4, expert capacity 32 (the fastest Arc build so far)
Status: working on Intel Arc, one mandatory setting: DYNAMIC_QUANTIZATION_GROUP_SIZE=0.
Speed-focused re-export of DiffusionGemma 26B-A4B: the MoE capacity-dispatch table runs
C=32 slots per expert instead of the baseline build's C=48 (one third less expert bmm
work per denoising step), with per-token gate renormalization for capacity overflow,
traced natively in fp32. Measured on an Arc B70: backbone forward 134ms/step vs 154ms
for the C=48 build, ~4.5s per reply at 24 denoising steps.
The mandatory setting, and the driver bug behind it
Without it, the GPU plugin's dynamic int8 activation quantization selects an
int8-activation x int4-weight batched matmul kernel that faults at launch
(CL_OUT_OF_RESOURCES plus a ccs engine reset) on the very first inference. Isolated on
driver 26.14.37833 + OpenVINO 2026.2 via oneDNN verbose:
The same kernel family works at C=48 and faults at C=24 and C=32, surviving every other
confound (renorm present or absent, RoPE LUT present or absent, wiped caches, freshly
rebooted driver session). With DQ disabled the matmuls run in the f16 x int4 family and
everything works.
Disabling DQ seems to measurably improve output quality on this model. Full
precision activations produce sharper logits, fewer degenerate/empty draws (12/12 clean
persona draws vs 8/12 for the DQ-on C=48 baseline) and noticeably longer coherent
replies that engage scene context.
Self-conditioning now reads 8 gathered bf16 embedding rows per position (inputs
sc_top_p [1,L,8] f32 softmaxed top-8 scaled logits, sc_top_i [1,L,8] i64) instead
of a full-vocab softmax x embedding matmul. Cross-engine validated: top-8 SC is
indistinguishable from full SC in output quality.
This revision also PRUNES a trace artifact worth knowing about if you quantize
tied-weight models: the original torch trace materialized the embedding/lm_head tie as
a separate hidden-major duplicate for the SC path, whose auto-generated node name
evaded every name-based ignored_scope pattern, so NNCF silently int4-quantized it
against the export's fp32-SC intent. 392 MB of dead duplicate removed; SC math is now
CLEANER than the original export (bf16 rows vs int4). Audit traced graphs' constants by
shape, not by name.
Sampler contract
The sampler_manifest.json carries the runtime contract: capacity_dispatch (C=32,
gate renorm) and encode_chunk_max: 256. Prompt encodes longer than 256 tokens MUST be
split into causal chunks against the growing prefix KV (exact math, same mechanism as
committed-block encodes); a single long encode overflows the per-expert slots and
silently degrades the prefix KV. Field-tested sampler defaults are in
field_tested_defaults.
How to run it: the sampler (serving/dg_sampler.py), the OpenAI-compatible server
(serving/ovserver_dg.py) and the running notes
(DIFFUSION_NOTES.md)
live in the conversion toolkit, along with the full Arc bug catalog:
OpenVino-For-Gemma-4