How to use from
SGLang
Install from pip and serve model
# Install SGLang from pip:
pip install sglang
# Start the SGLang server:
python3 -m sglang.launch_server \
    --model-path "sfanm/d24-sft-v3-olmo3-10b-wholedoc" \
    --host 0.0.0.0 \
    --port 30000
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:30000/v1/chat/completions" \
	-H "Content-Type: application/json" \
	--data '{
		"model": "sfanm/d24-sft-v3-olmo3-10b-wholedoc",
		"messages": [
			{
				"role": "user",
				"content": "What is the capital of France?"
			}
		]
	}'
Use Docker images
docker run --gpus all \
    --shm-size 32g \
    -p 30000:30000 \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HF_TOKEN=<secret>" \
    --ipc=host \
    lmsysorg/sglang:latest \
    python3 -m sglang.launch_server \
        --model-path "sfanm/d24-sft-v3-olmo3-10b-wholedoc" \
        --host 0.0.0.0 \
        --port 30000
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:30000/v1/chat/completions" \
	-H "Content-Type: application/json" \
	--data '{
		"model": "sfanm/d24-sft-v3-olmo3-10b-wholedoc",
		"messages": [
			{
				"role": "user",
				"content": "What is the capital of France?"
			}
		]
	}'
Quick Links

d24-sft-v3-olmo3-10b-wholedoc

v3 SFT chat model β€” 50B ClimbMix base + 10B whole-doc OLMo-3 midtrain (2x the 5B corpus).

nanochat-style depth-24 decoder β€” 24 layers Γ— 1536 hidden Γ— 12 heads, SwiGLU / RoPE / RMSNorm, tied embeddings, GPT-2 BPE vocab (50304), 0.757B params, 2048-token context.

Lineage. v3 pretrain (50B ClimbMix) β†’ OLMo-3 Dolmino whole-doc midtrain (10.58B tok, 2x the 5B-wholedoc, all 24 components at true OLMo-3 proportions, long docs sliced to 2048-seq by the loader) β†’ SFT (nanochat mix: SmolTalk + MMLU-aux + GSM8K + spelling + identity).

Metrics. GSM8K (greedy, full 1319): 7.28% Β· SFT val lm-loss 0.153. 2x the whole-doc data over the 5B-wholedoc SFT (6.60%) = +0.68pt β€” modest, diminishing returns; still below the math-dense v2 (9.86%). Confirms midtrain mix composition (math density) >> data quantity for GSM8K.

Use (chat)

This is a chat model (ChatML). The turn terminator it emits is the literal string <|im_end|> β€” which is not the eos_token_id (50256 = <|endoftext|>) and is not even a single token. You must stop on the <|im_end|> string or generation will not stop:

from transformers import AutoModelForCausalLM, AutoTokenizer
mid = "sfanm/d24-sft-v3-olmo3-10b-wholedoc"
tok = AutoTokenizer.from_pretrained(mid)
model = AutoModelForCausalLM.from_pretrained(mid, torch_dtype="bfloat16", device_map="auto")

msgs = [{"role": "user", "content": "Natalia sold clips to 48 friends in April and half as many in May. How many total?"}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=512, do_sample=False, stop_strings=["<|im_end|>"], tokenizer=tok)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=False))

Without stop_strings=["<|im_end|>"] the model rambles to max_new_tokens: the configured eos_token_id (50256) is the GPT-2 document EOS, which a chat turn does not end with. For vLLM, pass stop=["<|im_end|>"].

Research checkpoint from a from-scratch nanochat-d24 replication (pretrain β†’ midtrain β†’ SFT β†’ RL) on NERSC Perlmutter. Trained on third-party corpora (ClimbMix, FineMath, OpenMath, MetaMath, OpenThoughts, OLMo-3 Dolmino, SmolTalk, …) β€” see those datasets' licenses; provided as-is for research.

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