Step-3.5-Flash
Fields
models/step-3-5-flashNotes
Vendor: 196.81B total (196B backbone + 0.81B head) / 11B activated; safetensors total 199.38B; our config arithmetic gives 195.8B total / 10.8B active, matching the vendor figures to ~1%. This is SLIDING-WINDOW + INTERLEAVED rather than fully sparse attention, and the config makes the pattern explicit: layer_types over 48 entries is 12 full_attention + 36 sliding_attention, sliding_window 512, num_attention_groups 8, att_impl_type GQA. kv_cache_bytes_per_token is recorded as 196,608 which is num_layers x kv x dim x 2 x 2 with all 48 layer slots counted (48 x 8 x 128 x 2 x 2 = 196,608 B/token, 192 KiB) - but this is the WORST CASE and overstates steady-state badly: the 36 sliding layers are bounded to 512 tokens each. True steady-state cache is approximately 12 full layers x 8 x 128 x 2 x 2 x context + 36 x 8 x 128 x 2 x 2 x 512, i.e. a bounded ~688 KB per sequence regardless of length. A reader sizing a server should use that, not the 192 KiB figure; the number is kept uniform with the schema's formula but the derivation matters more than the value. MoE: 288 experts, top-8, PLUS a shared expert (share_expert_dim 1280). moe_layers_enum lists layers 3-44 as MoE (42 of 48 entries); moe_router_activation sigmoid with scaling factor 3.0, and use_moe_router_bias true. hidden 4096, moe_intermediate_size 1280, intermediate 11264. Unusual detail worth recording: rope_theta is a PER-LAYER LIST of 48 values - 5000000.0 on the 12 full-attention layers and 10000.0 on the 36 sliding layers - and rope_scaling is llama3 type (factor 2, high_freq_factor 32) applied only to full_attention layers (yarn_only_types ['full_attention']). num_nextn_predict_layers 3. Context 262144. Apache-2.0.
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, and this record already flags it: 196,608 B/token counts all 48 layer slots (48*8*128*2*2). Only 12 layers are full attention; the other 36 are bounded at w=512, so effective = (12*4096*c + 36*4096*512)/c = 49,152 + 75,497,472/c - 3.98x overpay at its 262,144 max context, 3.82x at 32k, 3.37x at 8k. A bounded ~72 MiB per sequence regardless of length, which is the number a server planner should use.
CONTEXT_SCALING_METHOD (llama3): rope_scaling rope_type 'llama3', factor 2.0, high_freq_factor 32, original_max_position_embeddings 131072, applied to full-attention layers only via a per-layer rope_theta array.
LAYER LAYOUT (step-3-5-flash): layer_types read verbatim from config, one entry per layer; attention_layer_indices are the 0-based positions of the full-attention entries.
Cross-references
This record references no other records — it is a leaf. It is cited by 0.