What changes, measured
We evaluated Signal against the untouched Qwen3.8-27B, both at Q8_0 in llama.cpp, using the same server, sampling settings, prompts, and otherwise identical model file. All prompts in these evaluations were held out from tuning.
Table with columns: base Q8_0, Signal, change | base Q8_0 | Signal | change |
|---|
| general answers, median tokens | 243 | 104 | -57% |
| answers opening with a preamble ("Sure!", "Great question") | 13% | 0% | gone |
| answers with markdown headers | 47% | 18% | -62% |
| answers with bold | 85% | 52% | -39% |
| coding answers, median tokens | 159 | 142 | -11% |
| coding answers, p90 tokens | 1026 | 914 | -11% |
Thinking mode, same prompts with reasoning on:
Table with columns: base Q8_0, Signal, change | base Q8_0 | Signal | change |
|---|
| reasoning tokens, general prompts, median | 153 | 74 | -52% |
| reasoning tokens, coding prompts, median | 225 | 166 | -26% |
| reasoning tokens, GSM8K, median | 119 | 81 | -32% |
Quality, exact match on GSM8K:
Table with columns: base Q8_0, Signal | base Q8_0 | Signal |
|---|
| thinking off, 60 problems | 98.3% | 98.3% |
| thinking on, 40 problems | 92.5% | 95.0% |
Shorter is not cheaper: no answer in the 100-prompt style set was cut off early (0 answers
ending on a header or a colon, 0 unclosed code blocks), and no reasoning trace in 50
thinking-mode outputs looped or hit the token cap.
Faster with speculative decoding
Qwen3.8-27B carries a built-in multi-token-prediction draft head. Signal's answers are more predictable, so the drafter agrees with the model more often:
Draft acceptance and decode speed with --spec-type draft-mtp, both models Q8_0 on the same
machine (Strix Halo, Vulkan), 200-token greedy runs for the fixed-draft rows:
Table with columns: prompt / draft length, base acceptance, Signal acceptance, decode speed vs base| prompt / draft length | base acceptance | Signal acceptance | decode speed vs base |
|---|
| prose, draft 3 | 39% | 47% | +10% |
| prose, draft 4 | 35% | 28% | -9% |
| structured output (JSON), draft 3 | 72% | 94% | +20% |
| structured output (JSON), draft 4 | 66% | 87% |
Combined with the shorter answers, a typical chat reply finishes in well under half the wall
time of the base model on the same hardware. Because of the specific finetuning there is no degredation over long context length.
What is in the repository
The complete Qwen3.8-27B checkpoint, 18 safetensors shards in BF16, with one tensor replaced: lm_head.weight. Every other tensor, the vision encoder, the projector, the MTP draft head, the tokenizer and the chat template are byte-identical to Qwen/Qwen3.8-27B. The head delta has a norm of 4.1% of the original head. Vision input works as in the base model.
Because only the output layer differs, any quantization recipe, LoRA, or serving setup that works on Qwen3.8-27B works on Signal unchanged.
Running
Thinking on and off both work; the chat template is the original Qwen3.8 template.
Sampling: temperature 0.7, top-p 0.95, top-k 20, min-p 0. Use sampling rather than greedy
decoding. We saw a single loop at temperature 0.
from transformers import AutoProcessor, AutoModelForImageTextToText
model_id = "agentionai/Signal-3.8-27B"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id, dtype="bfloat16", device_map="auto")
messages = [{"role": "user", "content": "Explain how a hash map works."}]
inputs = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=1024, do_sample=True, temperature=0.7, top_p=0.95, top_k=20)
print(processor.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Thinking is on by default. Pass enable_thinking=False to apply_chat_template to turn it off.
vllm serve agentionai/Signal-3.8-27B --dtype bfloat16 --max-model-len 65536 --reasoning-parser qwen3
Then call the OpenAI-compatible endpoint with the sampling settings above. Send
"chat_template_kwargs": {"enable_thinking": false} to turn thinking off per request.
Use the prebuilt tiers in agentionai/Signal-3.8-27B-GGUF, which include the vision projector and the multi-token-prediction draft head, or convert this checkpoint with convert_hf_to_gguf.py.
Support AgentionAI
Signal3.8 is released freely. If it saves you compute or makes Qwen more useful, you can sponsor continued tuning, quantization and benchmarking on GitHub.