Instructions to use bench-labs/cagliostro-v2 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use bench-labs/cagliostro-v2 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="bench-labs/cagliostro-v2", trust_remote_code=True)# Load model directly from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("bench-labs/cagliostro-v2", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use bench-labs/cagliostro-v2 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "bench-labs/cagliostro-v2" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "bench-labs/cagliostro-v2", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/bench-labs/cagliostro-v2
- SGLang
How to use bench-labs/cagliostro-v2 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 "bench-labs/cagliostro-v2" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "bench-labs/cagliostro-v2", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'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 "bench-labs/cagliostro-v2" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "bench-labs/cagliostro-v2", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use bench-labs/cagliostro-v2 with Docker Model Runner:
docker model run hf.co/bench-labs/cagliostro-v2
cagliostro-v2
A 150M parameter language model trained from scratch on 50B tokens.
It reaches an Open SLM Intelligence Index of 19.99, ahead of the previous release cagliostro-v1 by 0.84 when both are measured the same way.
Results
All three columns below were scored identically: lm-eval at 0-shot acc_norm for HellaSwag, ARC and PIQA, and AxiomicLabs' bencharithmark-3 for ArithMark. The new model was scored twice on different GPUs at different batch sizes and the two runs agreed to within 0.12 on the Index.
| Component | cagliostro-v2 | cagliostro-v1 | internal 70B run |
|---|---|---|---|
| HellaSwag | 36.76 | 36.70 | 36.92 |
| ARC-Easy | 47.43 | 48.95 | 47.39 |
| ARC-Challenge | 28.58 | 26.19 | 25.43 |
| CombinedARC | 38.00 | 37.57 | 36.41 |
| PIQA | 65.67 | 65.34 | 65.29 |
| ArithMark-3 | 35.20 | 33.20 | 37.20 |
| Index | 20.05 | 19.22 | 19.80 |
The Index was scored at five checkpoints. It is flat through the constant learning rate phase and moves once the decay starts, which is the shape this schedule produces: downstream metrics do not resolve small improvements while the weights are still in a high noise regime.
Second scoring run of cagliostro-v2: 19.93. Reported Index is 19.99, the mean.
The Index is (N(HellaSwag,25) + N(CombinedARC,25) + N(PIQA,50) + 0.65*N(ArithMark,25)) / 3.65
where N(v,c) = 100(v-c)/(100-c).
Note on the v1 figures
The cagliostro-v1 model card reports 17.85 and 19.13. Those came from an in-house harness that was later retired: checked against lm-eval on a model whose leaderboard row was already known, it read ARC-Challenge 3.9 points high, and the error changed sign between models so no constant correction recovers it. The 19.22 above is v1 rescored with lm-eval, which is higher than its own card claims. The comparison here is deliberately against the corrected, more favourable number.
The internal 70B run is an unreleased checkpoint trained on 70B tokens with a staged curriculum that included synthetic arithmetic. It is listed for context because it is the only other model of this family measured on this harness.
How to read this
Against the published v1, this model is ahead on four of six components and on the Index by 0.84, roughly seven times the spread between repeat measurements. ARC-Challenge is the largest single gain at +2.39, moving well clear of the 25.0 chance floor.
Against the internal 70B run the Index margin is only +0.26, which is not a claim worth making on its own. What that comparison does show is token efficiency: a comparable score on 50B tokens where the other run needed 70B, at identical parameter count and without the synthetic arithmetic that run used.
ARC-Easy is the one component where v1 remains ahead, 48.95 against 47.43.
Architecture
150,038,400 parameters, 129,066,880 excluding embeddings.
| Layers | 30 |
| Hidden size | 640 |
| Attention heads | 10 |
| KV heads | 5 (grouped-query) |
| MLP hidden | 1600 (SwiGLU) |
| Sequence length | 2048 |
| Vocab | 32768 |
| Position encoding | RoPE, theta 100000 |
| Norm | RMSNorm, per-head q/k norm |
| Embeddings | tied |
Two additions beyond a standard decoder, both adding zero parameters:
Exclusive Self Attention (arXiv:2603.09078). After attention, each head removes the component of its output that lies along its own value vector, so the block stops re-encoding what the residual stream already carries. Measured at -0.0785 nats over 123 paired readings against an otherwise identical baseline.
Logit soft-capping. Output logits pass through cap * tanh(logits / cap)
with cap 15. Measured at -0.027 nats, flat across four quartiles of a 5B token
ablation rather than decaying like every rejected variant did.
Because neither adds tensors, nothing in the state dict reveals them, and a
checkpoint loaded without them scores at chance while every shape check passes.
They are recorded in the config and the bundled modeling code implements them,
so trust_remote_code loads the model correctly.
Ablations
Each arm is a 5B token run against a byte-identical baseline on the same pre-tokenized shards with the same seed, so a loss gap is attributable to the one flag that differs.
| Arm | Delta vs baseline | Verdict |
|---|---|---|
| XSA | -0.0785 | kept |
| Logit cap 15 | -0.027 | kept |
| Canon layers | -0.0027 | rejected, costs 9 percent throughput for less than 9 percent more tokens buys |
| Value residual | +0.0001 | rejected, no effect |
| ReLU squared MLP | +0.021 | rejected |
Three of the five ideas tried did not survive. Canon layers improved loss but lost on a compute-matched basis: they cost 9 percent throughput, and spending that 9 percent on more tokens instead was measured at roughly -0.008 nats against Canon's -0.0027.
Training
| Tokens | 50,000,000,000 |
| Steps | 508,625 |
| Tokens per step | 98,304 |
| Optimizer | AdamW, betas 0.9/0.95, weight decay 0.1 |
| Peak LR | 1.5e-3 |
| Schedule | warmup-stable-decay, 200 warmup steps, final 15 percent decayed |
| Precision | bfloat16 |
| Hardware | 4x RTX 5090, about 40 hours at 348k tokens/sec |
| Final loss | 2.8489 |
Data mixture: FineWeb-Edu 57.6 percent, DCLM-baseline 38.4 percent, Cosmopedia 4 percent. Pre-tokenized to uint16 memmapped shards, sampled by weight per sequence. 63.89B unique tokens backed the 50B token run, so repetition is near zero on every source.
A staged curriculum with code, arithmetic and dialogue was tried in earlier versions and abandoned: it scored Index 11.73 at 9.14B tokens, below GPT-2's 13.58, because the components that dominate the Index need web text rather than the specialised data the curriculum spent tokens on.
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"bench-labs/cagliostro-v2", trust_remote_code=True)
tok = AutoTokenizer.from_pretrained("bench-labs/cagliostro-v2")
ids = tok("The capital of France is", return_tensors="pt")
out = model.generate(**ids, max_new_tokens=32)
print(tok.decode(out[0]))
trust_remote_code=True is required. The architecture is not in transformers
and travels with the weights.
Limitations
This is a 150M parameter base model trained on 50B tokens. It is not instruction tuned, not aligned, and not filtered for safety. ARC-Challenge at 28.58 is meaningfully above chance but still low in absolute terms. It will produce confident nonsense on anything requiring real world knowledge.
The training data was decontaminated against the evaluation sets with 13-gram exact matching. Measured removal was 0.00 percent of FineWeb-Edu and 0.01 percent of DCLM, so decontamination is not doing meaningful work at this scale and the scores should not be read as more trustworthy because of it.
- Downloads last month
- 668




