Views
No views yet



| Field | Value |
|---|---|
| Model Name | Solar Open 2 (250B-A15B) |
| Architecture | Hybrid-Attention Mixture-of-Experts (MoE) |
| Total Parameters | 250B (250,287,794,944) |
| Active Parameters | 15B (per token) |
| Layers | 48 |
| Hidden Size | 4096 |
| Attention | Hybrid — Softmax + Linear Attention, pattern [Softmax, Linear×3] × 12 |
| Position Encoding | NoPE (no rotary positional encoding) |
| Number of Attention Heads (GQA) | (Softmax) 64 query / 8 KV, (Linear) 64 query |
| Number of Experts | 321 (320 routed + 1 shared) |
| Number of Activated Experts | 8 routed (top-8) + 1 shared |
| Vocabulary | 196,608 |
| Context Length | 1M |
| Pre-training Tokens | ~12 Trillion |
| Supported Languages | English, Korean, Japanese |
| Training Hardware | NVIDIA B200 GPUs |
| Training GPU Time | 2M GPU Hours |
| License | Upstage Solar License (see LICENSE) |
| Hardware Requirements | Minimum: H200 * 4ea / Recommended: H200 * 8ea |
| Benchmark | Solar Open 2 250B-A15B | Solar Open 100B 102B-A12B | Command A+ 218B-A25B | Mistral Medium 3.5 128B dense, high | MiMo-V2.5 310B-A15B | DeepSeek-V4-Flash 284B-A13B, max |
|---|---|---|---|---|---|---|
| Know. & Reasoning | ||||||
| MMLU-Pro | 86.2 | 80.4 | 79.0 | 81.2 | 84.6 | 85.9 |
| GPQA-Diamond | 86.3 | 66.2 | 75.6 | 77.5 | 83.0 | 88.9 |
| HLE (w/o tools) | 28.8 | 11.5 | 11.4 | 12.8 | 24.3 | 32.3 |
| LiveCodeBench (v6) | 92.4 | 56.5 | 86.1 | 84.9 | 89.1 | 92.3 |
| ArtifactsBench | 55.9 | 43.4 | 42.8 | 49.8 | 59.3 | 61.0 |
| HMMT2602 | 93.9 | 68.9 | 73.5 | 62.9 | 61.4 | 94.7 |
| AIME2026 | 95.7 | 87.7 | 96.0 | 89.0 | 92.3 | 97.0 |
| IF / Long | ||||||
| Multi-Challenge | 61.0 | 40.5 | 45.8 | 49.8 | 39.0 | 62.0 |
| IFBench | 80.0 | 57.7 | 73.9 | 69.0 | 67.1 | 80.3 |
| AA-LCR | 62.3 | 36.0 | 46.0 | 61.0 | 62.7 | 63.7 |
| Agent | ||||||
| SWE-Bench Verified | 70.4 | 15.4 | 14.4 | 69.6 | 73.0 | 73.8 |
| Terminal Bench Hard | 28.3 | 2.3 | 25.0 | 33.3 | 41.7 | 34.1 |
| APEX-Agents | 16.6 | 2.4 | 1.6 | 6.1 | 13.4 | 13.2 |
| MCP-Atlas | 58.2 | 34.4 | 27.2 | 30.7 | 63.9 | 58.2 |
| τ³ (banking) | 19.6 | 7.4 | 5.8 | 5.8 | 8.7 | 22.3 |
| GDPval-AA v2 (ELO) | 1128 | – | 712 | 929 | 1145 | 1187 |
| Benchmark | Solar Open 2 250B-A15B | Solar Open 100B 102B-A12B | MiMo-V2.5 310B-A15B | DeepSeek-V4-Flash 284B-A13B, max | Claude Haiku 4.5 closed | GPT-5.4 mini closed |
|---|---|---|---|---|---|---|
| KMMLU-Pro | 78.4 | 64.0 | 69.1 | 78.9 | 67.9 | 78.1 |
| CLIcK | 90.7 | 78.9 | 78.4 | 89.2 | 53.5 | 89.6 |
| HAE-RAE v1.1 | 73.8 | 73.3 | 61.7 | 73.1 | 38.5 | 69.4 |
| Ko-AIME’25† | 97.7 | 80.0 | 88.0 | 98.0 | 81.7 | 90.7 |
| HRM8K | 92.2 | 87.6 | 90.7 | 93.4 | 90.6 | 91.3 |
| KBank-MMLU† | 80.8 | 65.5 | 71.0 | 79.5 | 68.9 | 79.0 |
| KBL | 75.5 | 65.5 | 69.8 | 72.8 | 69.9 | 75.3 |
| KorMedMCQA | 93.0 | 84.4 | 87.7 | 94.1 | 87.0 | 94.2 |
| Ko-GDPval† | 86.8 | 3.4 | 81.0 | 85.0 | 68.3 | 59.4 |
Install a CUDA-enabled PyTorch build for your platform before running this command.fla-coreenables the optimized KDA kernels; without it, Transformers uses a substantially slower PyTorch fallback.
1python -m pip install -U \
2 "git+https://github.com/upstageAI/transformers.git@v5.14.1-solar-open2" \
3 "fla-core[cuda]>=0.5.1" \
4 accelerate einops1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4model_id = "upstage/Solar-Open2-250B"
5
6tokenizer = AutoTokenizer.from_pretrained(
7 model_id,
8 trust_remote_code=False,
9)
10model = AutoModelForCausalLM.from_pretrained(
11 model_id,
12 device_map="auto",
13 dtype=torch.bfloat16,
14 trust_remote_code=False,
15)
16model.eval()
17
18messages = [
19 {"role": "user", "content": "What is Upstage?"},
20]
21prompt = tokenizer.apply_chat_template(
22 messages,
23 tokenize=False,
24 add_generation_prompt=True,
25 reasoning_effort="high",
26 think_render_option="preserved",
27)
28input_device = model.get_input_embeddings().weight.device
29model_inputs = tokenizer(prompt, return_tensors="pt").to(input_device)
30
31generated_ids = model.generate(
32 **model_inputs,
33 max_new_tokens=32768,
34 do_sample=True,
35 temperature=1.0,
36 top_p=1.0,
37)
38
39new_token_ids = generated_ids[0, model_inputs.input_ids.shape[-1] :].tolist()
40think_end_id = tokenizer.convert_tokens_to_ids("<|think:end|>")
41
42if think_end_id in new_token_ids:
43 # Split immediately after the final <|think:end|> token.
44 answer_start = len(new_token_ids) - new_token_ids[::-1].index(think_end_id)
45else:
46 # No end marker usually means generation stopped while the model was reasoning.
47 answer_start = len(new_token_ids)
48
49reasoning = tokenizer.decode(
50 new_token_ids[:answer_start],
51 skip_special_tokens=True,
52).strip()
53answer = tokenizer.decode(
54 new_token_ids[answer_start:],
55 skip_special_tokens=True,
56).strip()
57
58print("[reasoning]", reasoning)
59print("[answer]", answer)max_new_tokens before the reasoning block ended. Increase max_new_tokens and try again.1docker run --rm --gpus all --ipc=host \
2 -p 8000:8000 \
3 -v "${HF_HOME:-$HOME/.cache/huggingface}:/root/.cache/huggingface" \
4 upstage/vllm-solar-open2 \
5 upstage/Solar-Open2-250B \
6 --served-model-name solar-open2-250b \
7 --tensor-parallel-size 8 \
8 --enable-expert-parallel \
9 --moe-backend triton \
10 --default-chat-template-kwargs '{"think_render_option":"preserved"}' \
11 --reasoning-parser solar_open2 \
12 --tool-call-parser solar_open2 \
13 --enable-auto-tool-choice \
14 --logits-processors vllm.v1.sample.logits_processor.solar_open2:SolarOpen2TemplateLogitsProcessor1pip install -U uv
2
3VLLM_PRECOMPILED_WHEEL_LOCATION="https://github.com/vllm-project/vllm/releases/download/v0.22.0/vllm-0.22.0%2Bcu129-cp38-abi3-manylinux_2_28_x86_64.whl" \
4VLLM_USE_PRECOMPILED=1 \
5uv pip install --reinstall-package vllm --torch-backend=cu129 \
6 "git+https://github.com/UpstageAI/vllm.git@v0.22.0-solar-open2"1vllm serve upstage/Solar-Open2-250B \
2 --served-model-name solar-open2-250b \
3 --tensor-parallel-size 8 \
4 --enable-expert-parallel \
5 --moe-backend triton \
6 --default-chat-template-kwargs '{"think_render_option":"preserved"}' \
7 --reasoning-parser solar_open2 \
8 --tool-call-parser solar_open2 \
9 --enable-auto-tool-choice \
10 --logits-processors vllm.v1.sample.logits_processor.solar_open2:SolarOpen2TemplateLogitsProcessor1curl http://localhost:8000/v1/chat/completions \
2 -H "Content-Type: application/json" \
3 -d '{
4 "model": "solar-open2-250b",
5 "messages": [
6 {"role": "user", "content": "What is Upstage?"}
7 ],
8 "max_tokens": 131584,
9 "temperature": 1.0,
10 "top_p": 1.0,
11 "reasoning_effort": "high"
12 }'reasoning_effort="high" for reasoning and reasoning_effort="none" for a direct response. The recommended vLLM configuration limits a reasoning block to 131,072 tokens.| Effort | Behavior |
|---|---|
none | Direct response |
high | Reasoning, capped at 131,072 tokens |
max_tokens limits the complete response, including reasoning and the final answer, so leave room beyond the reasoning cap.1from openai import OpenAI
2
3client = OpenAI(api_key="EMPTY", base_url="http://localhost:8000/v1")
4
5response = client.chat.completions.create(
6 model="solar-open2-250b",
7 messages=[
8 {
9 "role": "user",
10 "content": "Prove that the square root of 2 is irrational.",
11 },
12 ],
13 reasoning_effort="high",
14 temperature=1.0,
15 top_p=1.0,
16 max_tokens=131584,
17)
18
19# The reasoning trace is returned separately from the final answer.
20print(response.choices[0].message.reasoning)
21print(response.choices[0].message.content)--tool-call-parser solar_open2 and --enable-auto-tool-choice.1from openai import OpenAI
2
3client = OpenAI(api_key="EMPTY", base_url="http://localhost:8000/v1")
4
5tools = [
6 {
7 "type": "function",
8 "function": {
9 "name": "get_weather",
10 "description": "Get current weather for a location",
11 "parameters": {
12 "type": "object",
13 "properties": {
14 "location": {"type": "string"},
15 },
16 "required": ["location"],
17 },
18 },
19 },
20]
21
22response = client.chat.completions.create(
23 model="solar-open2-250b",
24 messages=[
25 {
26 "role": "user",
27 "content": "What's the weather in Seoul?",
28 },
29 ],
30 tools=tools,
31)
32
33print(response.choices[0].message.tool_calls)export ANTHROPIC_BASE_URL=http://localhost:8000
export ANTHROPIC_AUTH_TOKEN=dummy # any non-empty value
export ANTHROPIC_MODEL=solar-open2-250b
export ANTHROPIC_SMALL_FAST_MODEL=solar-open2-250b
claude1model:
2 provider: custom
3 default: solar-open2-250b
4 base_url: http://localhost:8000/v1
5 api_key: dummyreasoning_effort="high" for complex or agentic tasks. The recommended vLLM configuration preserves the reasoning trace.| Parameter | Recommended | Notes |
|---|---|---|
reasoning_effort | high | Recommended for complex reasoning and agentic tasks |
temperature | 1.0 | |
top_p | 1.0 | |
max_tokens | up to 256K | Covers reasoning + output budget |
| Mode | temperature | top_p | max_tokens |
|---|---|---|---|
reasoning_effort="none" | 1.0 | 1.0 | up to 128K |
reasoning_effort="high" | 1.0 | 1.0 | up to 256K |
max_tokens high enough (up to 256K) — reasoning traces can be long and may otherwise truncate the answer.think_render_option=preserved).think_render_option=preserved handles this automatically — do not strip reasoning from previous turns when constructing follow-up requests.message.reasoning field with local transformers, split the raw output on the reasoning markers yourself.Solar-MyModel-v1).1@misc{solaropen2-2026,
2 title={Solar Open 2 Technical Report},
3 author={Upstage AI},
4 year={2026},
5 eprint={2607.20062},
6 archivePrefix={arXiv},
7 primaryClass={cs.CL},
8 url={https://arxiv.org/abs/2607.20062}
9}