Views
No views yet
Qwen/Qwen3-VL-8B-Thinking on 1,776 audited tool-using physics
trajectories from shanyangmie/physr1corp-cold-start.{brief reasoning}
<tool>sympy: {symbolic expression}</tool>
<tool_result>{result}</tool_result>
{continued reasoning}
<answer>\boxed{ANSWER}</answer><tool>...</tool> call, executes the SymPy expression in a sandboxed subprocess, injects the result back as <tool_result>...</tool_result>, and lets the model continue.
The harness lives in the physics-r2-progress repo under phase_e/harness/.| Hyperparameter | Value |
|---|---|
| Base model | Qwen/Qwen3-VL-8B-Thinking |
| Training framework | TRL SFTTrainer on FSDP1 |
| GPUs | 4× H200 SXM 141GB |
| Optimizer | AdamW (β=[0.9, 0.95], wd=0.01) |
| Learning rate | 2e-5, cosine decay to 10%, 30 warmup steps |
| Effective batch | 16 (2 per device × 2 grad accum × 4 GPUs) |
| Sequence length | 4096 |
| Epochs | 3 (note: eval loss minimum at epoch 2) |
| Precision | bfloat16 mixed |
| Visual tower | frozen (text-only SFT for v1) |
| Wall time | ~18 minutes |
| Metric | Value |
|---|---|
| Train loss (final) | 0.13 |
| Eval loss (epoch 1) | ~0.54 |
| Eval loss (epoch 2) | ~0.55 |
| Eval loss (epoch 3, final) | 0.61 |
| Eval token accuracy | 84.7% |
1from transformers import AutoProcessor, Qwen3VLForConditionalGeneration
2import torch
3
4model = Qwen3VLForConditionalGeneration.from_pretrained(
5 "shanyangmie/qwen3-vl-8b-thinking-physics-r2-sft-v1",
6 dtype=torch.bfloat16,
7 device_map="auto",
8)
9processor = AutoProcessor.from_pretrained("shanyangmie/qwen3-vl-8b-thinking-physics-r2-sft-v1")1import sys; sys.path.insert(0, "/path/to/physics-r2-progress/phase_e")
2from harness.runner import run_with_tools
3# ... see phase_e/sft/eval_sft.py for full example<tool>...</tool_result> pattern from training data. At inference, the harness is the only legitimate source of <tool_result> content. If the inference loop is not properly wired, the model may emit hallucinated tool results. The harness in phase_e/harness/runner.py handles this correctly.