inference/research
verifiedhigh · 0.90updated 2026-10-03

Gemma 3 27B (multimodal)

dense 27.43B

Fields

id
models/gemma-3-27b
Family
gemma
Vendor
Google
Release year
2025
Architecture
dense
Params (B)
27.43
Active params (B)
27.43
Hidden size
5,376
Layers
62
KV heads
16
Head dim
128
GQA ratio
2
Max context
131,072
Context scaling
linear rope scaling (factor 8)
Context scaling method
linear
Activation
gelu
Attention variant
GQA + 5:1 sliding-window/global (sliding_window 1024, pattern 6)
KV cache (bytes/token)
507,904
FLOPs per active token
54,860,000,000
Open weights
yes
License
Gemma Terms of Use
notes
PARAMS: 27.43B is the safetensors count (27B nominal) and INCLUDES the vision tower; the text-only figure Google quotes is smaller. Do not compare this 27.43B against a text-only dense model without noting the multimodal headroom. KV: 62 * 16 * 128 * 2 * 2 bytes = 507,904 bytes/token = 496 KiB/token, the largest per-token KV in this set. The reason is the 5:1 local/global ratio (sliding_window_pattern=6) meaning nearly two-thirds of layers are global-attention layers that must keep the full 128k. The 1024-token sliding window is short enough that the effective saving is real but bounded: at 128k context, 52 of 62 layers keep ~1024 tokens and 10 layers keep all 128k, so effective KV is roughly 10/62 of the naive number, about 80 MiB per 128k sequence rather than 62 GiB. A serving engine that does not implement the 5:1 pattern pays the full 496 KiB/token. VISION: SigLIP encoder, 27 layers, hidden 1152, FROZEN during training and shared identically across the 4B/12B/27B sizes (per Google's developer guide). High-resolution and non-square images are handled by adaptive windowing rather than fixed 896x896 tiles. The ViT runs once per image at prefill and its cost does not grow with decode, so it shifts the FLOP mix toward prefill exactly as expected for a VLM. final_logit_softcapping and attn_logit_softcapping are both null in Gemma 3: the softcapping from Gemma 2 was removed. SERVICEABILITY JOIN (added 2026-10-03; the architecture x engine matrix this record was missing, with a citation per cell in docs/13-model-compatibility.md): FAMILY=sliding-window. REQUIRED KERNEL CLASS: a local/windowed attention decode kernel plus per-layer-type cache management. The kernel requirement is not cosmetic: flop/sliding-window-hybrid-attention records that a local layer's decode cost is constant in context (it reads exactly w KV entries) so its arithmetic intensity stays at ~1 flop/byte forever, while the global layers' bytes still grow linearly - the two layer classes have opposite scaling and one kernel must serve both. SUPPORTED BY (cited): vLLM lists sliding attention inside its fallback envelope - 'Attention types: full attention and/or sliding attention' - but ALSO has native rows for the specific SWA architectures: GptOssForCausalLM, Gemma3ForCausalLM, Gemma4ForCausalLM, Olmo3ForCausalLM, GraniteMoeSWAForCausalLM, GraniteSWAForCausalLM [[mdl2-vllm-supported-models-2026-10]]. SGLang's generative table names GPT-OSS as 'hybrid sliding-window-attention MoE model ... with per-layer-type RoPE (YARN on full-attention layers, default on sliding-attention layers) and a softplus per-head attention gate', and lists granite-swash SWA models [[mdl2-sglang-generative-models]]. llama.cpp exposes SWA as first-class KV keys rather than a flag: %%s.attention.sliding_window and %%s.attention.sliding_window_pattern exist as distinct keys per architecture class, alongside SWA-specific width keys, which is direct evidence that SWA changes the cache layout rather than adding an attention flag [[mdl2-llamacpp-arch-class-registry]]. THE PER-CELL CONSEQUENCE: an engine WITHOUT local-attention support does not fail, it silently allocates a full-context cache for every layer. docs/13-model-compatibility.md tabulates this as the KV overpay table; for this model the naive figure in kv_cache_bytes_per_token is the worst case and the effective figure is what the windowed layers actually hold. TWO HARD GATES THAT ARE NOT ABOUT WINDOW SIZE. (1) TensorRT-LLM publishes a per-architecture 'Sliding Window Attention' column and it is NOT uniformly Yes: Yes for DeepseekV4ForCausalLM, Gemma4ForConditionalGeneration, Gemma4UnifiedForConditionalGeneration and Step3p7ForConditionalGeneration, and explicitly No for Qwen3NextForCausalLM, while the DeepSeek-V3/V3.2/GLM/GPT-OSS/Llama-4/Qwen3.5/Kimi-K3/Nemotron-H rows read N/A [[mdl2-trtllm-supported-models]]. (2) On B200 with vLLM 0.23.1rc1.dev843 + flashinfer-python 0.6.14, a 50-of-60-layer SWA Gemma-4 checkpoint with --kv-cache-dtype fp8_e4m3 and MTP spec-decode (k=7) produces fluent output containing sporadic wrong tokens and short repetition loops once seq_len passes the 1024-token window, because flashinfer's trtllm spec-as-decode kernel mis-computes sliding-window attention for BF16-Q + FP8-KV at certain seq_len/page alignments and vLLM's scale bookkeeping double-applies k/v scales - gotcha-flashinfer-bf16q-fp8kv-spec-decode-corrupts-swa, severity BLOCKER. FP8-Q + spec is clean; BF16-Q + no spec is clean; either drop quantized KV, drop spec decode, or drop the disable_flashinfer_q_quantization flag. This is the cleanest statement in the repo that quantized KV and speculative decoding are not independently safe on an SWA model. (3) FlashInfer also rejects large head sizes at engine init, which is a separate SM120 gap from the page-block one: head_size not supported for gemma-4-31b-it's head_dim 256 / global_head_dim 512 on RTX PRO 6000 [[flashinfer-rejects-large-head-dim]]. (4) On Hopper, vLLM 0.30.0's vllm_flash_attn silently ignores num_splits on SM90, costing 48% per-token decode at batch 1 for Gemma-4 26B-A4B-it global layers (1 query token, 2 KV heads, 2 of an H100's 132 SMs with work), with TRITON_ATTN recovering ~70% [[fa4-num-splits-ignored-sm90]]. (5) vLLM's own scheduler granularity interacts with SWA groups: issue #53786 asks for fine-grained prefix hits for sliding-window groups, and hybrid reconciliation already caps the combined hit at the shorter boundary [[eagle-prefix-cache-last-block-drop]]. (6) On Apple Silicon the class is a cache-CLASS problem, not a kernel problem: mlx-lm's sliding-window layers use RotatingKVCache, which had no quantized implementation, so --kv-bits passes a hasattr presence check and raises NotImplementedError on the first request instead of at startup; the fix (PR 1584) adds RotatingQuantizedKVCache, and the commonly-recommended monkeypatch silently gives up the max_kv_size window bound and yields an unbounded cache [[mlx-kv-bits-crashes-on-first-request-for-hybrid-attention]] [[mdl2-mlxlm-pr1584-rotating-quantized-kv]]. KV OVERPAY: naive 62*8,192 = 507,904 B/token (this record's figure); with local-attention support the 52 windowed layers are bounded at w=1024, giving (10*8192*c + 52*8192*1024)/c = 81,920 + 436,207,616/c B/token - 5.96x overpay at 131,072 context, 5.33x at 32k, 3.76x at 8k. This is the largest overpay in the repo and it is a direct consequence of head_dim 256 with only 16 KV heads. CONTEXT_SCALING_METHOD (linear): config-derived; the existing free text 'linear rope scaling (factor 8)' agrees.

Notes

PARAMS: 27.43B is the safetensors count (27B nominal) and INCLUDES the vision tower; the text-only figure Google quotes is smaller. Do not compare this 27.43B against a text-only dense model without noting the multimodal headroom. KV: 62 * 16 * 128 * 2 * 2 bytes = 507,904 bytes/token = 496 KiB/token, the largest per-token KV in this set. The reason is the 5:1 local/global ratio (sliding_window_pattern=6) meaning nearly two-thirds of layers are global-attention layers that must keep the full 128k. The 1024-token sliding window is short enough that the effective saving is real but bounded: at 128k context, 52 of 62 layers keep ~1024 tokens and 10 layers keep all 128k, so effective KV is roughly 10/62 of the naive number, about 80 MiB per 128k sequence rather than 62 GiB. A serving engine that does not implement the 5:1 pattern pays the full 496 KiB/token. VISION: SigLIP encoder, 27 layers, hidden 1152, FROZEN during training and shared identically across the 4B/12B/27B sizes (per Google's developer guide). High-resolution and non-square images are handled by adaptive windowing rather than fixed 896x896 tiles. The ViT runs once per image at prefill and its cost does not grow with decode, so it shifts the FLOP mix toward prefill exactly as expected for a VLM. final_logit_softcapping and attn_logit_softcapping are both null in Gemma 3: the softcapping from Gemma 2 was removed.

SERVICEABILITY JOIN (added 2026-10-03; the architecture x engine matrix this record was missing, with a citation per cell in docs/13-model-compatibility.md): FAMILY=sliding-window. REQUIRED KERNEL CLASS: a local/windowed attention decode kernel plus per-layer-type cache management. The kernel requirement is not cosmetic: flop/sliding-window-hybrid-attention records that a local layer's decode cost is constant in context (it reads exactly w KV entries) so its arithmetic intensity stays at ~1 flop/byte forever, while the global layers' bytes still grow linearly - the two layer classes have opposite scaling and one kernel must serve both. SUPPORTED BY (cited): vLLM lists sliding attention inside its fallback envelope - 'Attention types: full attention and/or sliding attention' - but ALSO has native rows for the specific SWA architectures: GptOssForCausalLM, Gemma3ForCausalLM, Gemma4ForCausalLM, Olmo3ForCausalLM, GraniteMoeSWAForCausalLM, GraniteSWAForCausalLM [[mdl2-vllm-supported-models-2026-10]]. SGLang's generative table names GPT-OSS as 'hybrid sliding-window-attention MoE model ... with per-layer-type RoPE (YARN on full-attention layers, default on sliding-attention layers) and a softplus per-head attention gate', and lists granite-swash SWA models [[mdl2-sglang-generative-models]]. llama.cpp exposes SWA as first-class KV keys rather than a flag: %%s.attention.sliding_window and %%s.attention.sliding_window_pattern exist as distinct keys per architecture class, alongside SWA-specific width keys, which is direct evidence that SWA changes the cache layout rather than adding an attention flag [[mdl2-llamacpp-arch-class-registry]]. THE PER-CELL CONSEQUENCE: an engine WITHOUT local-attention support does not fail, it silently allocates a full-context cache for every layer. docs/13-model-compatibility.md tabulates this as the KV overpay table; for this model the naive figure in kv_cache_bytes_per_token is the worst case and the effective figure is what the windowed layers actually hold. TWO HARD GATES THAT ARE NOT ABOUT WINDOW SIZE. (1) TensorRT-LLM publishes a per-architecture 'Sliding Window Attention' column and it is NOT uniformly Yes: Yes for DeepseekV4ForCausalLM, Gemma4ForConditionalGeneration, Gemma4UnifiedForConditionalGeneration and Step3p7ForConditionalGeneration, and explicitly No for Qwen3NextForCausalLM, while the DeepSeek-V3/V3.2/GLM/GPT-OSS/Llama-4/Qwen3.5/Kimi-K3/Nemotron-H rows read N/A [[mdl2-trtllm-supported-models]]. (2) On B200 with vLLM 0.23.1rc1.dev843 + flashinfer-python 0.6.14, a 50-of-60-layer SWA Gemma-4 checkpoint with --kv-cache-dtype fp8_e4m3 and MTP spec-decode (k=7) produces fluent output containing sporadic wrong tokens and short repetition loops once seq_len passes the 1024-token window, because flashinfer's trtllm spec-as-decode kernel mis-computes sliding-window attention for BF16-Q + FP8-KV at certain seq_len/page alignments and vLLM's scale bookkeeping double-applies k/v scales - gotcha-flashinfer-bf16q-fp8kv-spec-decode-corrupts-swa, severity BLOCKER. FP8-Q + spec is clean; BF16-Q + no spec is clean; either drop quantized KV, drop spec decode, or drop the disable_flashinfer_q_quantization flag. This is the cleanest statement in the repo that quantized KV and speculative decoding are not independently safe on an SWA model. (3) FlashInfer also rejects large head sizes at engine init, which is a separate SM120 gap from the page-block one: head_size not supported for gemma-4-31b-it's head_dim 256 / global_head_dim 512 on RTX PRO 6000 [[flashinfer-rejects-large-head-dim]]. (4) On Hopper, vLLM 0.30.0's vllm_flash_attn silently ignores num_splits on SM90, costing 48% per-token decode at batch 1 for Gemma-4 26B-A4B-it global layers (1 query token, 2 KV heads, 2 of an H100's 132 SMs with work), with TRITON_ATTN recovering ~70% [[fa4-num-splits-ignored-sm90]]. (5) vLLM's own scheduler granularity interacts with SWA groups: issue #53786 asks for fine-grained prefix hits for sliding-window groups, and hybrid reconciliation already caps the combined hit at the shorter boundary [[eagle-prefix-cache-last-block-drop]]. (6) On Apple Silicon the class is a cache-CLASS problem, not a kernel problem: mlx-lm's sliding-window layers use RotatingKVCache, which had no quantized implementation, so --kv-bits passes a hasattr presence check and raises NotImplementedError on the first request instead of at startup; the fix (PR 1584) adds RotatingQuantizedKVCache, and the commonly-recommended monkeypatch silently gives up the max_kv_size window bound and yields an unbounded cache [[mlx-kv-bits-crashes-on-first-request-for-hybrid-attention]] [[mdl2-mlxlm-pr1584-rotating-quantized-kv]]. KV OVERPAY: naive 62*8,192 = 507,904 B/token (this record's figure); with local-attention support the 52 windowed layers are bounded at w=1024, giving (10*8192*c + 52*8192*1024)/c = 81,920 + 436,207,616/c B/token - 5.96x overpay at 131,072 context, 5.33x at 32k, 3.76x at 8k. This is the largest overpay in the repo and it is a direct consequence of head_dim 256 with only 16 KV heads.

CONTEXT_SCALING_METHOD (linear): config-derived; the existing free text 'linear rope scaling (factor 8)' agrees.

Cross-references

This record references no other records — it is a leaf. It is cited by 2.