Instructions to use sfanm/nltower-100m-cpt32 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use sfanm/nltower-100m-cpt32 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="sfanm/nltower-100m-cpt32") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("sfanm/nltower-100m-cpt32") model = AutoModelForCausalLM.from_pretrained("sfanm/nltower-100m-cpt32", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use sfanm/nltower-100m-cpt32 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "sfanm/nltower-100m-cpt32" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "sfanm/nltower-100m-cpt32", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/sfanm/nltower-100m-cpt32
- SGLang
How to use sfanm/nltower-100m-cpt32 with 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/nltower-100m-cpt32" \ --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/nltower-100m-cpt32", "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/nltower-100m-cpt32" \ --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/nltower-100m-cpt32", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use sfanm/nltower-100m-cpt32 with Docker Model Runner:
docker model run hf.co/sfanm/nltower-100m-cpt32
nltower-100m-cpt32
A 124M-parameter Llama-style model from the nl_tower study: the base model mid-trained with 32 solver-written reasoning traces in every batch (CPT-32). It is a starting point for reinforcement learning on nl_tower puzzles, not a general-purpose assistant.
This repository is part of the nl_tower (100M) collection on the Hugging Face Hub (5 CPT models, 6 SFT models, the base model and 4 datasets).
nl_tower in brief
nl_tower is a synthetic reasoning task. Each puzzle places 6-12 people on distinct floors (1-40) of a tower. The prompt lists the occupied floors, each person's best friend, and clues that relate the floors of two terms ("greater than", "k floors above", sums, parity, "twice", highest/lowest). Many clues refer to people indirectly, for example "the best friend of the person on the second-highest floor"; such a clue becomes usable only after other clues have pinned part of the answer. Each puzzle has a unique solution that a step-by-step solver reaches without guessing.
The study asks whether reinforcement learning can teach reasoning compositions that the imitation data never shows:
- Covered patterns (shown in the mid-training traces):
friend("Ava's best friend"),friend2("the best friend of Ava's best friend"),order("the person directly above Ava"),rankn("the person on the second-highest floor"),dfriend_occ("the best friend of the person on floor 19"). - Held-out patterns (appear only in RL prompts and tests):
dfriend_rank("the best friend of the person on the highest floor"),dfriend_above("the best friend of the person directly above Ava"), andnested(two-level references).
Test rungs: easy (nltw_e, 6-7 people, covered only), covered mid (nltw_m0, 8-9 people, covered only), held-out mid (nltw_m, 8-9 people, 2-4 held-out steps), size-only hard (nltw_hb, 10-11 people, 2-4 held-out steps) and 12 people (nltw_hb12, test only).
Position in the pipeline
base pretraining (iteration 30,000, before the cooldown) --CPT-N (cooldown + N trace sequences per batch)--> CPT-N models --RL--> policies
base pretraining (iteration 38,147, end of the run) --SFT on the same traces--> SFT models --RL (no demos)--> policies
This model is the CPT-N model with N = 32. RL from it was run in four groups of runs: pure RL with no demonstrations ("no-mix"), RL with demonstration rows in a shared loss ("unified"), RL plus a separately weighted SFT loss on demonstration rows ("separate-loss"), and the shared loss with pretraining text added to every update ("pre-mid-rl"). See sfanm/nltower-results and sfanm/nltower-rl-mixes.
Training (CPT-32)
- Start:
sfanm/nltower-100m-base(iteration 30,000 of the base run). - Continue for the remaining 8,147 iterations (to iteration 38,147), through the same WSD cooldown as the base run.
- Every batch holds 256 web sequences (the base run's 75 % ClimbMix / 25 % Dolmino blend) plus 32 trace sequences from the packed tw1X trace shard: global batch 288 x 2,048 tokens, language-modelling loss on all tokens.
- Trace share of each batch: 11.1 %. Trace tokens seen: 533,921,792 = 1.05 passes over the 509,942,713-token shard.
- Traces:
sfanm/nltower-traces-tw1X(configcpt_shard), covering easy and covered-mid puzzles with covered patterns only.
All five CPT models use the same recipe and differ only in N:
| N | global batch | trace share | passes over the traces |
|---|---|---|---|
| 8 | 264 | 3.0 % | 0.26 |
| 16 | 272 | 5.9 % | 0.52 |
| 32 | 288 | 11.1 % | 1.05 |
| 64 | 320 | 20.0 % | 2.09 |
| 128 | 384 | 33.3 % | 4.19 |
Architecture
| property | value |
|---|---|
| architecture | LlamaForCausalLM (decoder-only) |
| parameters | 123,587,328 (embeddings tied with the output layer) |
| layers / hidden size / heads | 12 / 768 / 12 (head dim 64, no grouped-query attention) |
| MLP | SwiGLU, intermediate size 2,048 |
| normalisation / position | RMSNorm (eps 1e-5) / RoPE (theta 10,000) |
| tokenizer | GPT-2 BPE (50,257 tokens; embedding padded to 50,304) |
| special tokens | <|endoftext|> (id 50256) is BOS, EOS and PAD |
| context length | 2,048 tokens |
| weights | model.safetensors, bfloat16 |
Prompt format and usage
The prompt is the puzzle text followed by "\n\nAnswer: ". The model writes its reasoning and ends with the full assignment in \boxed{Name=floor, ...}. A completion is correct when every Name=floor pair in the boxed answer matches the solution (order does not matter). The chat template only concatenates message contents (no role markers), so apply_chat_template and the raw prompt give the same tokens.
from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import load_dataset
repo = "sfanm/nltower-100m-cpt32"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, torch_dtype="bfloat16")
test = load_dataset("sfanm/nltower-env", "tests", split="nltw_m0")
prompt = test[0]["prompt"] # question + "\n\nAnswer: "
ids = tok(prompt, return_tensors="pt").input_ids
out = model.generate(ids, max_new_tokens=1280, do_sample=False, pad_token_id=tok.eos_token_id)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True)) # ... \boxed{Name=floor, ...}
print("gold:", test[0]["answer"])
Evaluation
Zero-shot screen of this model before any RL. Protocol: 1,024 test questions per rung; 64 samples per question at temperature 1.0 (top-p 1.0) and up to 1,280 new tokens with vLLM in bfloat16; pass@k uses the unbiased estimator 1 - C(n-c, k)/C(n, k) with n = 64; greedy is one temperature-0 sample. Test sets: sfanm/nltower-env, config tests.
| test rung | pass@1 | pass@64 | greedy |
|---|---|---|---|
easy (nltw_e) |
0.388 | 0.992 | 0.616 |
covered mid (nltw_m0) |
0.167 | 0.967 | 0.366 |
held-out mid (nltw_m) |
0.005 | 0.178 | 0.015 |
RL runs that start from this model and have evaluations in sfanm/nltower-results (filter init == "mixed-534M", the name of this model in the code), by setting (base: 8-9-person prompts, 6,000 updates; extended: 10-11-person prompts added, 12,000 updates) and group:
| setting | group | runs |
|---|---|---|
| base | unified | 10 |
| base | separate-loss | 11 |
| base | pre-mid-rl | 2 |
| extended | unified | 10 |
| extended | separate-loss | 20 |
| extended | no-mix | 2 |
| extended | pre-mid-rl | 4 |
Intended use and limitations
- Intended for research on how imitation (mid-training on traces) and reinforcement learning interact, especially on compositions that the traces never show.
- The model saw only the five covered reference patterns in its traces. Expect low accuracy on held-out-pattern rungs (held-out mid, size-only hard) before RL.
- 124M parameters and a synthetic task: results may not transfer to larger models or natural tasks. The model is not instruction-tuned or safety-tuned and is not for user-facing use.
Training data
- Pretraining and the web part of CPT:
karpathy/climbmix-400b-shuffle,allenai/dolma3_dolmino_mix-100B-1025. - Traces:
sfanm/nltower-traces-tw1X. They are written by a deterministic solver program, not by a language model. - Tests and RL prompts:
sfanm/nltower-env,sfanm/nltower-rl-mixes.
Code
Code: https://github.com/yudasong/unified-training/tree/release (environment generator, solver, data builders, training recipes and evaluator).
License
No license has been chosen for these weights yet, so the metadata says license: other. The base model was pretrained on:
karpathy/climbmix-400b-shuffle(75 % of tokens): a reshuffled copy of NVIDIA's ClimbMix. The copy is tagged MIT, while the originalnvidia/Nemotron-ClimbMixcard gives CC BY-NC 4.0 and says it is for research and development only.allenai/dolma3_dolmino_mix-100B-1025(25 % of tokens): ODC-By 1.0, with a note that it is intended for research and educational use.
Use the weights only in ways that the terms of these datasets allow. The nl_tower data used after pretraining is the authors' own synthetic data (Apache-2.0, see the dataset repositories).
Authors and citation
Authors and citation: to be added.
This release (files and this card) was prepared with AI assistance (Claude, an Anthropic model) and is being reviewed by the authors.
- Downloads last month
- 768
Model tree for sfanm/nltower-100m-cpt32
Base model
sfanm/nltower-100m-base