Model reference · open weights
Blaze-SFT is an open-weight language model from SurjoLabs. Blaze-SFT (BF16) weighs 97 MB; the smallest configuration that runs it is RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the SurjoLabs/Blaze-SFT model card, 2026-10-01
What it is
| Released by | SurjoLabs |
|---|---|
| Released | 2026-09-01 |
| Parameters | 48M |
| VRAM | 97 MB for the weights |
What it runs on
| Card | Requests at once | Context max | Memory |
|---|---|---|---|
| 2K each | |||
| RTX 3060 12 GB | 376 | all 2K | 11.6 GB |
| RTX 4060 Ti 16 GB | 505 | all 2K | 15.4 GB |
| RTX 3090 24 GB | 778 | all 2K | 23.4 GB |
| RTX 4090 24 GB | 776 | all 2K | 23.4 GB |
| RTX 5090 32 GB | 1000+ | all 2K | 31.0 GB |
| L40S 48 GB | 1000+ | all 2K | 44.0 GB |
| A100 80 GB | 1000+ | all 2K | 78.2 GB |
| H100 80 GB | 1000+ | all 2K | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | 1000+ | all 2K | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | 1000+ | all 2K | 107 GB |
| H200 141 GB | 1000+ | all 2K | 138 GB |
| B200 180 GB | 1000+ | all 2K | 176 GB |
| Requests at once | 2K tokens each |
|---|---|
| 1 | 585 MB |
| 5 | 702 MB |
| 8 | 790 MB |
| 16 | 1.0 GB |
| 32 | 1.5 GB |
| 64 | 2.4 GB |
One card, with vLLM's small-card settings.
From the model card
Blaze-SFT is the instruction-tuned variant of SurjoLabs/Blaze, a 48.3M parameter causal language model.
Blaze-SFT was full-parameter fine-tuned on the Smol-Smoltalk dataset at an extended context window of 2,048 tokens (doubled from the 1,024-token base context). It scores 14.84 on the Intelligence Index, keeping over 96% of its base reasoning capabilities while adding basic conversational and chat ability.
This release also fixes critical bugs in modeling_blaze.py so the model actually generates text properly with Hugging Face generate(), fixing broken single-token KV caching, cache crashes in Transformers 5.x, and PCIe GPU-to-CPU stalls.
| Parameter | Value |
|---|---|
| Total Parameters | 48,251,136 |
| Physical Layers | 14 (1 prelude + 12 recurrent + 1 coda) |
| Recurrent Passes | 2 (effective computational depth: 26 layers) |
| Hidden Dimension | 512 |
| Intermediate Size | 1,536 |
| Attention Heads | 8 Query, 4 Key-Value (2:1 GQA) |
| Head Dimension | 64 |
| Vocabulary Size | 8,192 (tied embeddings) |
| Context Length | 2,048 tokens |
| Fine-Tuning Dataset | HuggingFaceTB/smol-smoltalk |
We fixed several issues in the original modeling code to make it ready for real use:
is_causal was previously set to True in PyTorch SDPA. This caused the model to only attend to token 0 and masked out all previous tokens, completely breaking text generation. We set is_causal = False for decode steps so it correctly attends to the full cached history.past_kv.update() on recurrent passes threw an IndexError: list index out of range because slots 15 to 26 were never allocated. We now pre-allocate missing slots dynamically and track recurrent passes cleanly via _current_pass.prepare_inputs_for_generation to slice position_ids, cache_position, and input_ids cleanly. Handled num_logits_to_keep = None to stop generate() from crashing with a TypeError.torch.all(attention_mask == 1) check inside the attention layer that was stalling the GPU 26 times per token. Replaced memory-allocating repeat_interleave() with zero-copy view expansions, and added native FlashAttention support.Evaluated 0-shot using normalized accuracy (acc_norm):
| Benchmark | Blaze (Base) | Blaze-SFT | Metric |
|---|---|---|---|
| PIQA | 62.51% | 61.75% | acc_norm |
| ARC-Easy | 41.84% | 41.29% | acc_norm |
| ArithMark-3.0 | 37.80% | 37.90% | acc_norm |
| HellaSwag | 31.84% | 31.86% | acc_norm |
| ARC-Challenge | 24.91% | 24.23% | acc_norm |
| Intelligence Index | 15.45 | 14.84 | Normalized Composite |
The Open SLM Intelligence Index adjusts each raw score above the random-chance floor:
Normalized Score = 100 * (score - chance) / (100 - chance)
Intelligence Index = (9.14 + 10.35 + 23.50 + 0.65 * 17.20) / 3.65 = 14.84
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "SurjoLabs/Blaze-SFT"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
trust_remote_code=True,
torch_dtype=torch.bfloat16,
device_map="auto",
)
messages = [
{"role": "user", "content": "Explain why the sky is blue in two simple sentences."}
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=64,
do_sample=True,
temperature=0.7,
top_p=0.9,
eos_token_id=tokenizer.eos_token_id,
)
response = outputs[0][inputs.input_ids.shape[1]:]
print(tokenizer.decode(response, skip_special_tokens=True))
MIT
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.