Model Details
Table with columns: Property, Value| Property | Value |
|---|
| Developer | TevunahAi |
| Base Model | TevunahAi/Chochmah-1B (1,182.9M params, 45B tokens, from scratch) |
| Model Type | Decoder-only transformer, Qwen3-architecture block, SFT |
| Post-Training | Full-parameter supervised fine-tuning on SmolTalk, 2 epochs, 1.77B tokens |
| Chat Format | ChatML (`< |
| Context Length | 4,096 tokens |
| Tokenizer | SmolLM2 (49,152 BPE) |
| Release Precision | bf16 safetensors (2.4 GB) |
| Training Hardware | 1x NVIDIA RTX 5000 Ada 32 GB |
| Training Time | 84.8 hours wall-clock (October 11–15, 2026) |
| Stage | SFT only (no preference tuning yet; see Roadmap) |
| Loads With | AutoModelForCausalLM, transformers >= 4.51, no custom code |
| License | Apache-2.0 |
ChatML, using the two chat tokens the SmolLM2 tokenizer already carried (<|im_start|> id 1, <|im_end|> id 2), so the vocabulary is unchanged from the base model. The template is saved with the tokenizer (chat_template.jinja, and embedded in tokenizer_config.json for older transformers releases), so apply_chat_template renders it for you. A rendered turn looks like this:
<|im_start|>userWhat does a writ of certiorari do?<|im_end|><|im_start|>assistantA writ of certiorari is ...<|im_end|>
There is no default system prompt; if you pass one as a system message it is rendered the same way. Generation stops at <|im_end|>, which is the tokenizer's eos token. No BOS token is used, as with the base model.
Usage
from transformers import AutoTokenizer, AutoModelForCausalLMimport torch model_id = "TevunahAi/Chochmah-1B-Instruct"tok = AutoTokenizer.from_pretrained(model_id)model = AutoModelForCausalLM.from_pretrained(model_id, dtype=torch.bfloat16).cuda() messages = [{"role": "user", "content": "In two sentences, what does a writ of certiorari do?"}]inputs = tok.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt").to("cuda")out = model.generate(**inputs, max_new_tokens=300) # sampling defaults from generation_config.jsonprint(tok.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
The saved generation config samples at temperature 0.6, top-p 0.9, repetition penalty 1.1, and stops at <|im_end|>. Pass do_sample=False for greedy decoding. Multi-turn works by appending the assistant's reply and the next user message to messages.
vLLM
vllm serve TevunahAi/Chochmah-1B-Instruct --max-model-len 4096 --dtype bfloat16
The chat template ships with the tokenizer, so the OpenAI-compatible /v1/chat/completions endpoint works as-is.
Training
Data
SmolTalk (all configuration, Apache-2.0): 1,043,917 training conversations mixing synthetic multi-turn chat (Magpie-Ultra), constrained-format instructions, rewriting and summarization, math (NuminaMath-CoT, MetaMathQA), code (Self-OSS-Instruct), function calling (APIGen), and everyday conversation, with system prompts in a subset. It is the recipe Hugging Face used for SmolLM2-1.7B-Instruct, and it was built for models this size. Conversations longer than 4,096 tokens under this tokenizer were dropped (under 1% of the set); nothing was truncated mid-turn.
A held-out set of 2,000 conversations from SmolTalk's test split was scored every 350 steps.
Recipe
Table with columns: Field, Value| Field | Value |
|---|
| Method | Full-parameter SFT (no LoRA, no frozen layers) |
| Loss | Cross-entropy on assistant tokens only (user and system turns masked) |
| Sequence Handling | Best-fit packing into 4,096-token sequences with padding-free flash-attention 2, so packed conversations never attend to each other |
| Optimizer | AdamW (fused), betas (0.9, 0.999), eps 1e-8, no weight decay |
| Learning Rate | 5e-5 peak, 250-step linear warmup, cosine decay to 0 |
| Gradient Clipping | 1.0 |
| Global Batch | 262,144 tokens (4 packed sequences x 16 accumulation steps x 4,096) |
The optimizer keeps fp32 master weights on purpose: at a 5e-5 learning rate the per-step updates are below bf16's resolution, and pure-bf16 fine-tuning at this scale silently drops most of them.
Loss
Held-out loss on the 2,000-conversation SmolTalk test subset, every 350 steps:
Table with columns: Step, 350, 1,050, 1,750, 2,450, 3,150, 3,500, 4,200, 4,900, 5,600, 6,300, 6,650| Step | 350 | 1,050 | 1,750 | 2,450 | 3,150 | 3,500 | 4,200 | 4,900 | 5,600 | 6,300 | 6,650 |
|---|
| Eval loss | 0.942 | 0.864 | 0.830 | 0.808 | 0.792 | 0.789 | 0.781 |
Twenty evaluations, each lower than the last. The epoch boundary at step 3,385 passes without an uptick, so the second epoch kept improving held-out loss rather than memorizing; it bought about 0.02 nats, which is also why there was no third. The flattening at the end is the cosine schedule reaching zero. Training loss averaged 0.79 over the run.
Evaluation
lm-evaluation-harness, chat template applied, few-shot examples as multi-turn, bf16, greedy decoding.
Table with columns: Benchmark, Setting, Chochmah-1B-Instruct| Benchmark | Setting | Chochmah-1B-Instruct |
|---|
| IFEval, prompt-level strict | 0-shot | 22.7 ± 1.8 |
| IFEval, instruction-level strict | 0-shot | 33.2 |
| IFEval, prompt-level loose | 0-shot | 24.8 ± 1.9 |
| IFEval, instruction-level loose | 0-shot | 36.5 |
| GSM8K, exact match (strict) | 8-shot CoT | 13.0 ± 0.9 |
| GSM8K, exact match (flexible) |
How to read it. The IFEval average over the four measures is 29.3. For scale, SmolLM2-360M-Instruct and SmolLM2-1.7B-Instruct report averages of about 41 and 57 on their own cards; those are reported numbers rather than same-box runs, and both models combine far longer pretraining (4T and 11T tokens) with preference tuning on top of SFT. This model is an SFT-only pass on a 45B-token base, and its score is in the range of the smallest published instruct models. The gap is mostly format compliance of the kind shown in the trial-court sample below, which is the specific target of the preference-tuning revision on the roadmap. GSM8K at 13% is where a small SFT-only model with no dedicated math post-training lands.
For the base model's own scorecard (ARC-Easy, HellaSwag, PIQA, LAMBADA against compute-matched references, where it leads Pythia-1B at 15% of the tokens), see the Chochmah-1B card. Instruction tuning does not add knowledge, so those numbers are the ceiling this model operates under.
How to read GSM8K at this size. The sample below with the two trains reaches the correct answer through incorrect arithmetic. Exact-match scoring counts the number, not the path, so some fraction of any small model's GSM8K score is that.
Sample Outputs
Verbatim, unedited, from the first prompts run on the released weights (temperature 0.6, top-p 0.9, repetition penalty 1.1). Shown together on purpose: the same model, six prompts, and between them an accurate picture of what a 1B instruct model trained on 45B tokens is.
User: What did the Supreme Court hold in Marbury v. Madison, and why does it matter?
In Marbury v. Madison, the Supreme Court held that a federal court has the authority to issue a writ of mandamus to compel a state official to perform an act that is specifically required by the Constitution. The case involved William Marbury, who had been appointed as a justice of the peace in Washington Territory, but he was denied his commission by the territorial governor. Marbury then filed a petition for a writ of mandamus in the Supreme Court, arguing that the governor had no authority to revoke his commission.
The Supreme Court ruled in favor of Marbury, stating that the Constitution gives the federal judiciary the power to issue writs of mandamus to compel state officials to perform their duties. This decision marked a significant shift in the role of federal courts in interpreting the Constitution, as it established that the Supreme Court has the authority to review state actions and compel them to comply with federal laws and constitutional provisions.
The importance of Marbury v. Madison lies in its recognition of the Supreme Court's authority to check the power of state governments and ensure that they comply with the Constitution. It also set a precedent for future cases involving federal courts issuing writs of mandamus to state officials, and has had far-reaching implications for the functioning of the federal government.
Three well-organized paragraphs that answer both halves of the question, and every substantive claim is wrong. Marbury's commission was for the District of Columbia, not a territory; it was withheld by Secretary of State Madison, not a governor; the Court ruled against the remedy Marbury sought, holding that the statute that would have let it issue the writ was unconstitutional, which is where judicial review comes from; and the case concerns federal officers, not state ones. The base model inverted holdings in opinion prose; the instruct model inverts them in an assistant's voice. The knowledge is the same.
User: In two sentences, what does a writ of certiorari do? (greedy)
A writ of certiorari is a court order that allows a higher court to review the record of a lower court's decision, typically to correct errors or clarify unclear points of law. It enables the higher court to examine the original proceedings and make an independent judgment about the case, rather than relying on the lower court's findings.
Correct, and the requested length. Definitions, which appear thousands of times in the pretraining corpus, are the kind of legal question this model answers reliably; holdings of specific cases are not.
User: Summarize Nietzsche's critique of morality in three sentences.
Nietzsche critiques morality by arguing that traditional moral values and principles are based on the idea of "the eternal recurrence" – a concept where every action is a repetition of the same basic actions. He argues that this leads to a lack of progress and a lack of creativity in our moral development, as we are constantly repeating the same patterns and behaviors. This results in a lack of freedom and autonomy for individuals, and ultimately leads to the death of the human spirit.
Exactly three sentences, as asked. The argument is invented: "eternal recurrence" is a real Nietzschean term attached to a critique he never made (the genealogy of morals, slave morality and ressentiment are absent).
User: A train leaves Bismarck at 9:00 am going 60 mph. A second train leaves at 10:30 am on the same track going 80 mph. At what time does the second train catch the first? Show your work.
To solve this problem, we need to find the relative speed between the two trains. The first train is traveling at 60 mph and the second train is traveling at 80 mph. The relative speed is the difference between their speeds, which is 80 - 60 = 20 mph.
Now, let's consider the time it takes for the second train to catch up to the first train. Since the first train leaves at 9:00 am and catches up at 10:30 am, we need to find the time it takes for the second train to cover the same distance as the first train.
The distance covered by the first train in 1 hour at 60 mph is 60 * 1 = 60 miles. The distance covered by the second train in 1 hour at 80 mph is 80 * 1 = 80 miles.
Since the first train catches up to the second train in 1 hour, we can calculate the time it takes for the second train to catch up by dividing the distance covered by the first train by the relative speed.
Time = Distance / Relative Speed
Time = 60 / 20
Time = 3 hours
Therefore, the second train catches the first train at 3:00 pm.
3:00 pm is correct. The work is not: the head start is 1.5 hours (90 miles), not 1 hour, which gives 4.5 hours from 10:30; the model computes 3 hours and then turns "3 hours" into "3:00 pm." The relative-speed setup was right, the arithmetic wrong, the answer right by coincidence.
User: Write a Python function fibonacci(n) that returns the nth Fibonacci number, with a base case and a docstring. Then show the first ten values.
def fibonacci(n): """Return the nth Fibonacci number.""" if n <= 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) # Test the functionprint(fibonacci(10)) # Output: 55
This function uses recursion to calculate the nth Fibonacci number. However, it has a major drawback: it does not handle negative numbers or non-integer inputs. To fix this, you can add input validation:
def fibonacci(n): """Return the nth Fibonacci number.""" if not isinstance(n, int): raise TypeError("Input must be an integer.") if n < 0: raise ValueError("Input must be a non-negative integer.") if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) # Test the functionprint(fibonacci(10)) # Output: 55
Both versions are correct, with base cases and the docstring. The base model, given the same function signature, produced a dedented return with no base case; this is the clearest skill gain from SFT. It did not show the first ten values, which is the instruction-following gap rather than a code gap, and the "major drawback" it names is not the real one (exponential time).
User: List three differences between a trial court and an appellate court. Use exactly three bullet points and no more than 15 words each.
- Trial court: - Presents the facts and law to a jury in a trial setting.
- Appellate court: - Reviews the trial court's decision for errors of law.
- Trial court: - Has the power to set aside a verdict.
- Appellate court: - Has the power to reverse or modify a lower court's decision.
Content fine, format failed: four numbered items instead of three bullets. This is the class of miss IFEval measures, and the one preference tuning is for.
User: Rewrite this sentence to be more formal: 'the judge tossed the case cuz the cops didn't have a warrant.'
The judge decided to dismiss the case because the police lacked a warrant for the arrest.
Good, with one small embellishment: "for the arrest" is not in the source.
Known Issues and Limitations
- The knowledge is the base model's. Supervised fine-tuning teaches the format of an answer, not new facts, and the base saw 45B tokens (about 38 per parameter). This model will give organized, confident, wrong accounts of specific cases, texts, and events, as the Marbury sample shows. It must not be used as a source of legal, medical, financial, or factual answers, and nothing it says about a case should be assumed to be in that case. The intended legal use is retrieval-grounded: give it the opinion, and have a separate checker verify every citation.
- Real citations, wrong propositions. The base model's signature failure survives tuning. Treat any citation it produces as a lookup key, never as support.
- Instruction following is partial. Sentence counts are honored; bullet counts, item limits and multi-part requests often are not. See the IFEval numbers above for the measured rate.
- Math reasoning is unreliable even when the final number is right; show-your-work answers should be checked line by line.
- No safety tuning. SmolTalk includes ordinary assistant behavior but no dedicated refusal or safety training. The model will attempt most requests. It has no content filtering of its own.
- English only, 4,096-token context, as inherited from the base.
- Repetition and drift on long generations, as with all small models; the saved sampling defaults (temperature 0.6, top-p 0.9, repetition penalty 1.1) are tuned for 100–300 token answers.
Technical Specifications
Table with columns: Specification, Value| Specification | Value |
|---|
| Model Family | TevunahAi Chochmah |
| Variant | 1B-Instruct (v1.0, SFT) |
| Base | Chochmah-1B, final checkpoint ckpt_42914 |
| Total Parameters | 1,182,900,224 |
| Architecture Class | Qwen3ForCausalLM (transformers >= 4.51) |
| Layers / Hidden / Intermediate | 24 / 2,048 / 5,632 |
| Attention | GQA, 16 query heads, 4 KV heads, head dim 128, QK-norm |
| Context Length |
Roadmap
- v1.1 — preference tuning (DPO on an open preference set) on top of these weights, pushed to this repository as a new commit with a changelog if it improves IFEval
- TevunahAi Ultra-Hybrid GPTQ variant of this model
- Legal grounding — a retrieval-backed configuration over CourtListener with citation verification, which is where this model's case-law pretraining pays off
License
Weights: Apache-2.0. Fine-tuning data: SmolTalk, Apache-2.0. The base model's pretraining data licenses are listed on the Chochmah-1B card. Users are responsible for their own compliance with the licenses of the underlying datasets.
Citation
@misc{chochmah1b_instruct_2026, title = {Chochmah-1B-Instruct: instruction tuning a from-scratch base model on one GPU}, author = {TevunahAi}, year = {2026}, url = {https://huggingface.co/TevunahAi/Chochmah-1B-Instruct}, note = {Full-parameter SFT of Chochmah-1B on SmolTalk; 1.18B parameters, ChatML}}
Acknowledgments
- Hugging Face / SmolLM team for SmolTalk and the SmolLM2 recipe this fine-tune follows, and for TRL
- Qwen team for the Qwen3 block design and its transformers implementation
- Tri Dao and contributors for FlashAttention, which made padding-free packing on one GPU practical
- EleutherAI for lm-evaluation-harness
Pretrained and tuned by TevunahAi
AI Model Quantization and On-Premises AI Infrastructure
From-scratch models, hybrid-architecture quantization (Mamba, MoE, SSM), and enterprise hardware bring-up
https://huggingface.co/TevunahAi