Model reference · open weights

Blaze-SFT

Available as managed deployment LLMs SurjoLabs Text gen 1 variants 1k dl/mo

Blaze-SFT is an open-weight language model from SurjoLabs. AxForge deploys and operates it for you on dedicated EU-owned hardware — with the licence handled where one is required.

Available as managed deployment — configured and operated for you on dedicated EU hardware, quoted per deployment.

What it is

Released bySurjoLabs
TypeLanguage models
TaskText gen
Parameters (lead)48M
Context2k tokens
Runs withtransformers
Based onSurjoLabs/Blaze
Released2026-09-01
Popularity1k downloads / month
LicenceOpen weights

About

What Blaze-SFT is

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.


Read the full model card

Architecture Specifications

ParameterValue
Total Parameters48,251,136
Physical Layers14 (1 prelude + 12 recurrent + 1 coda)
Recurrent Passes2 (effective computational depth: 26 layers)
Hidden Dimension512
Intermediate Size1,536
Attention Heads8 Query, 4 Key-Value (2:1 GQA)
Head Dimension64
Vocabulary Size8,192 (tied embeddings)
Context Length2,048 tokens
Fine-Tuning DatasetHuggingFaceTB/smol-smoltalk

Bug Fixes in modeling_blaze.py

We fixed several issues in the original modeling code to make it ready for real use:

  • Fixed KV-Cache Decode Bug: During single-token generation (q_len = 1, kv_len > 1), 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.
  • Fixed Transformers 5.x DynamicCache Crash: Calling 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.
  • Generation API & NoneType Crash: Fixed 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.
  • Eliminated PCIe GPU-to-CPU Stalls: Removed a synchronous 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.
  • Zero Weight Degradation: Weights were not modified or retrained during these code fixes. Logit parity check confirms exactly 0.00000000 difference against original checkpoints.

Benchmark Results

Evaluated 0-shot using normalized accuracy (acc_norm):

BenchmarkBlaze (Base)Blaze-SFTMetric
PIQA62.51%61.75%acc_norm
ARC-Easy41.84%41.29%acc_norm
ArithMark-3.037.80%37.90%acc_norm
HellaSwag31.84%31.86%acc_norm
ARC-Challenge24.91%24.23%acc_norm
Intelligence Index15.4514.84Normalized Composite

Intelligence Index Calculation

The Open SLM Intelligence Index adjusts each raw score above the random-chance floor:

Normalized Score = 100 * (score - chance) / (100 - chance)

  • HellaSwag (score: 31.86%, chance: 25, weight: 1.00) -> 9.14
  • Combined ARC (score: 32.76%, chance: 25, weight: 1.00) -> 10.35
  • PIQA (score: 61.75%, chance: 50, weight: 1.00) -> 23.50
  • ArithMark-3.0 (score: 37.90%, chance: 25, weight: 0.65) -> 17.20

Intelligence Index = (9.14 + 10.35 + 23.50 + 0.65 * 17.20) / 3.65 = 14.84


Usage

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))

Limitations

  • Parameter Size: At 48.3M parameters, Blaze-SFT is built for ultra-lightweight, edge-device tasks. It is not meant for complex multi-step reasoning, advanced math, or heavy factual knowledge. We aim to finetune this model in order to test downstream capability of the architecture.
  • Hallucinations: Like any model of this size, it can generate confident-sounding incorrect statements.

License

MIT

From the published model card. Full card on the HuggingFace links in the sidebar.

Using it via the API

Call it like any OpenAI endpoint

Once AxForge deploys blaze-sft for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (blaze-sft below is illustrative; you get the exact model name on deployment.)

$ curl -sS https://api.axforge.ai/v1/chat/completions \
  -H "Authorization: Bearer $AXFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"blaze-sft","messages":[{"role":"user","content":"Hello"}]}'

Create an account — your API key is available in the console. 3M free tokens every 30 days with every new account.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms