Hugging Face | Wiki |
License: Apache 2.0 | Authors: OpenCerebral

Boris-2-Think-Instruct

Boris-2-Think-Instruct is a chat model that also reasons. It is Boris-2, a 144M-parameter model trained from scratch on a single NVIDIA V100, fine-tuned on general chat (smol-smoltalk) and short reasoning traces (OpenThink) together.

Every reply starts with a <think> block. For questions that need working out, the model writes a short trace in it and ends with Final answer:; for ordinary chat the block is empty and the model answers directly. It chooses on its own.

Model Use it for
Boris-2 base model, text continuation
Boris-2-Instruct chat
Boris-2-Think question answering with reasoning (highest benchmark scores)
Boris-2-Think-Instruct chat, with reasoning when a question needs it

Examples

Greedy decoding, repetition penalty 1.1.

User: Tom has 3 boxes with 6 pencils each. He gives away 5 pencils. How many are left?
<think>
3 boxes Γ— 6 pencils = 18 pencils total. He gives away 5, leaving 17.
</think>

Final answer: 17
User: Give me three tips for studying for a test.
<think>

</think>

1. Create a study schedule: Start by setting aside dedicated time each day or week to study for the test. ...
2. Gather relevant materials: ...
3. Take breaks: ...

The first answer shows the typical failure at this size: the setup is right (18 pencils) but the last subtraction is wrong (the answer is 13).

Usage

from transformers import AutoModelForCausalLM, AutoTokenizer

repo = "opencerebral/Boris-2-Think-Instruct"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, trust_remote_code=True)

msgs = [{"role": "user", "content": "What is 17 + 25?"}]
x = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt", return_dict=True)
y = model.generate(**x, max_new_tokens=300, stop_strings=["<|im_end|>"], tokenizer=tok)
reply = tok.decode(y[0, x["input_ids"].shape[1]:]).removesuffix("<|im_end|>")
thinking, _, answer = reply.partition("</think>")
print(answer.strip())

ChatML-style turns written as plain text (no tokens were added to the vocabulary). <|im_end|> spans several tokens and is not an end-of-sequence token, so pass it as a stop string as above. The default generation settings sample (temperature 0.7, top-p 0.9, repetition penalty 1.1); use do_sample=False for reasoning questions. Plain PyTorch custom code, no extra dependencies, no KV cache.

Results

Benchmark comparison

Chat models next to base models from other labs, on the same nine benchmarks. All numbers are in benchmarks_comparison.csv.

Leaderboard benchmarks

Zero-shot, float32, lm-evaluation-harness 0.4.12 (the Open SLM Leaderboard's settings). ArithMark-3 uses the leaderboard's own bencharithmark-3.py (unmodified, default settings).

Benchmark Metric Boris-2 Boris-2-Instruct Boris-2-Think Boris-2-Think-Instruct
HellaSwag acc_norm 50.27 48.84 50.13 48.56
ARC-Easy acc_norm 59.76 57.74 63.93 59.76
ARC-Challenge acc_norm 32.00 31.48 34.81 32.00
PIQA acc_norm 72.85 71.06 72.31 71.60
ArithMark-3 acc_norm 45.10 43.70 49.20 47.00
Open SLM Index 34.15 31.85 36.05 33.29

The Index is the Open SLM Leaderboard formula: (N(HellaSwag,25) + N(mean(ARC-E, ARC-C),25) + N(PIQA,50) + 0.65 * N(ArithMark-3,25)) / 3.65, with N(v,c) = 100(v-c)/(100-c).

Chat fine-tuning costs a little on these benchmarks, as usual; the reasoning data wins most of it back on ArithMark-3 (+3.3 over Boris-2-Instruct) and on ARC-Easy (+2.0). For the highest scores use Boris-2-Think.

Chat and knowledge benchmarks

lm-evaluation-harness 0.4.12, float32, zero-shot, identical settings for every model. IFEval uses each model's chat template, greedy decoding, a stop at <|im_end|> and a cap of 256 new tokens (the task default is 1280; the cap is the same for every model). The other tasks are loglikelihood multiple choice without a chat template.

Benchmark Metric Boris-2-Instruct Boris-2-Think-Instruct SmolLM2-135M-Instruct
IFEval prompt-level strict 19.41 17.38 19.59
IFEval prompt-level loose 22.18 22.74 20.89
IFEval instruction-level strict 29.86 28.78 32.73
IFEval instruction-level loose 33.21 35.25 34.65
TruthfulQA MC1 acc 25.34 25.58 23.99
TruthfulQA MC2 acc 41.05 40.96 41.78
MMLU (cloze) acc 28.41 28.61 27.72
WinoGrande acc 52.09 51.93 51.07
OpenBookQA acc_norm 34.60 33.00 33.20
SciQ acc_norm 83.60 84.50 76.70
CommonsenseQA acc 23.10 19.90 19.66

Single runs; differences under about 1.5 points (2 to 4 on IFEval) are within benchmark noise. On these tasks Boris-2-Think-Instruct and Boris-2-Instruct are about level; both lead SmolLM2-135M-Instruct on SciQ and match it elsewhere. smol-smoltalk includes IFEval-style constraint data (smol-constraints), which its authors decontaminated against IFEval; we did not run our own check.

Training

Field Value
Base model Boris-2 (200.04B tokens)
Data smol-smoltalk train split (460,341 conversations) + OpenThink hybrid train split twice (2 x 42,301) = 544,943 conversations, 426M tokens (319M trained on)
Format every assistant reply is <think>\n{reasoning}\n</think>\n\n{reply}; the reasoning is empty for smol-smoltalk and for OpenThink's answer-only rows
Loss assistant replies and their closing `<
Packing conversations packed into 2048-token rows as separate documents (attention, Canon and the n-gram lookup reset at each one), shuffled together
Epochs / steps 1 / 4,424
Batch 64 rows of 2048 tokens
Optimizer AdamW, lr 1e-4, betas (0.9, 0.95), no weight decay, grad clip 1.0
Schedule linear warmup over 147 steps, cosine to zero
Precision float16 mixed precision, float32 residual stream
Hardware 1x NVIDIA V100 32GB, about 3 hours

Loss on 1,600 held-out conversations (800 smol-smoltalk test, 800 OpenThink): 1.468 before fine-tuning, 0.983 after.

OpenThink's questions were checked against the evaluation sets of ARC, HellaSwag, PIQA, SciQ, OpenBookQA, WinoGrande and ArithMark-3 with nothing flagged; the scripts and reports are in its decontamination/ folder. The model architecture is unchanged from Boris-2; see the Boris-2 card for details and the pretraining data.

Limitations

A 144M-parameter model. Its reasoning is shallow and often wrong in the final step, it sometimes skips the trace on questions that need one (logic questions in particular), and it makes factual mistakes with confidence. Replies can run long and repeat. Its 2048-token context includes the whole conversation. It has no safety tuning beyond what smol-smoltalk contains. Do not rely on it for factual, medical, legal or financial answers.

Copyright & License

Copyright 2026 OpenCerebral

This project and all associated files (the "Work") are licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at:

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Downloads last month
-
Safetensors
Model size
0.1B params
Tensor type
I64
Β·
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for opencerebral/Boris-2-Think-Instruct

Finetuned
(3)
this model

Datasets used to train opencerebral/Boris-2-Think-Instruct

Space using opencerebral/Boris-2-Think-Instruct 1

Collection including opencerebral/Boris-2-Think-Instruct