scasella91/qwen3-30b-a3b-multipersona-debate-lora
Multi-persona debate LoRA on Qwen3-30B-A3B-Base
A LoRA rank-32 adapter for `Qwen/Qwen3-30B-A3B-Base` that writes a panel-of-experts debate inside <mutipersonaDebate>…</mutipersonaDebate> tags before a final answer inside <answer>…</answer>. Trained with outcome-reward RL only — no SFT warmup, no distillation. It requires the base model Qwen/Qwen3-30B-A3B-Base; it is not a standalone model.
This is the post-MATH-RL checkpoint from the session referenced in the write-up as eval session 44722365.
Write-up: <https://casella.dev/blog_multipersona.html>
Correction (2026-09-23). An earlier version of this card presented embedding dispersion and pass@k gap narrowing as evidence of "wider search per sample", described tokens per correct answer as a compute or deployment-cost advantage, estimated the training compute as four to five orders of magnitude below Qwen's post-training, and listed the GSM8K stage as 80 steps. Those interpretations and the compute estimate are withdrawn, and the step count is corrected to 128 below. The card's commit history keeps the earlier text.
What was compared
The comparison model is Qwen's production Qwen/Qwen3-30B-A3B with enable_thinking=True. It shares the architecture but went through Qwen's full post-training, not these two RL stages, so the comparison does not isolate the effect of the panel format. Token limits also differed: 4,096 (MATH-500) and 8,192 (AIME) for the panel, 16,384 for the thinking model. Both were sampled at temperature 1.0 and graded by the same answer checker.
Evaluation summary
- Accuracy. The adapter is less accurate than the thinking model at pass@1 and at every pass@k measured (AIME pass@16: 55% vs 90%).
- Length. Tokens per correct sampled answer is total completion tokens divided by the number of correct samples. On pairs where both models were correct, the thinking model's completions were longer by a median 6.91× (MATH-500 L5, n = 306) and 5.89× (AIME, n = 68). Many wrong thinking samples stopped at the 16,384-token limit, which raises its tokens per correct.
- Between-trace embedding dispersion (exploratory). Mean pairwise cosine distance between samples on the same problem (
all-mpnet-base-v2) was 0.095 vs 0.053 on a 50-problem MATH-500 slice and 0.119 vs 0.068 on AIME. The embedder reads only about the first 384 word pieces of each trace and the persona names are included, so this does not show different solution strategies.
A separate RL follow-up on olympiad math (<https://casella.dev/blogmultipersonarl.html>) started from the GSM8K-stage adapter, not this checkpoint.
Quickstart
This is a LoRA adapter, not a standalone model: it must be loaded on top of Qwen/Qwen3-30B-A3B-Base. You'll need ~60 GB of GPU memory to host the base model itself; the LoRA adapter is 3.4 GB on disk and adds negligible runtime overhead.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base_id = "Qwen/Qwen3-30B-A3B-Base"
adapter_id = "scasella91/qwen3-30b-a3b-multipersona-debate-lora"
tok = AutoTokenizer.from_pretrained(base_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
base_id, torch_dtype=torch.bfloat16, device_map="auto"
)
model = PeftModel.from_pretrained(model, adapter_id)
model.eval()
PROMPT = (
"A conversation between User and Multi-Persona Panel of Experts. "
"The user asks a question, and the Multi-Persona Panel of Experts solves it. "
"The Multi-Persona Panel of Experts first deliberates and debates the reasoning process "
"with each other and then provides the user with the answer. "
"The deliberation process and answer are enclosed within "
"<mutipersonaDebate>...</mutipersonaDebate> and <answer>...</answer> tags, respectively, i.e., "
"<mutipersonaDebate> deliberation process here </mutipersonaDebate> "
"<answer>answer here </answer>. "
"User: {problem}. Assistant: "
)
inputs = tok(PROMPT.format(problem="If 2x + 3 = 11, what is x?"), return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=1024, temperature=1.0, do_sample=True)
print(tok.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))The model is trained with the exact prompt template above. Substitute your problem into {problem} and stop generation on </answer>.
Adapter details
The adapter targets every linear in every MoE expert (128 experts × 3 modules per layer × 48 layers) plus all attention projections and the LM head, which is why a rank-32 adapter is 3.4 GB rather than the size typical of attention-only LoRAs.
The original Tinker checkpoint stored expert LoRAs in a batched layout (a single 3-D tensor per expert-projection group). This release expands those to the standard per-expert PEFT layout that vanilla transformers + peft expects. See the conversion script in the multi-model repo for details.
Training recipe
Two RL stages, each outcome-reward RL from base (no SFT):
- GSM8K warmup — 128 steps, group_size 8, batch 16 (the launcher's default is 80 steps; this run was resumed to 128)
- MATH continuation — 128 steps, group_size 8, batch 16 (this checkpoint)
Reward = correctness (1 or 0), minus 0.2 when the debate/answer tags are missing or malformed. Temperature 1.0 throughout. Learning rate 5×10⁻⁶. Each stage is a single run with one seed.
Caveats
- Format and post-training are confounded. One side is this base-model LoRA, the other is Qwen's production model. A matched-format control (a thinking-format arm trained from the same base with the same recipe) has not been run.
- Per-sample accuracy is lower than Qwen3-thinking on every benchmark measured.
- Token limits and sample counts differ between the two models. Truncated thinking samples count against the thinking model in tokens per correct; the both-correct medians are well below the limit.
- Small evaluation sets: 20 AIME problems and a 50-problem MATH-500 slice (plus all 134 level-5 problems).
- MoE expert LoRA serving is experimental in vLLM and not currently supported in SGLang. This adapter loads cleanly via
transformers + peftbut bring patience to other serving frameworks. - Training corpus is GSM8K + MATH — behavior on non-mathematical reasoning is unmeasured.
- This is research code published as a scientific artifact, not a product.
Related links
- Write-up: <https://casella.dev/blog_multipersona.html>
- RL follow-up: <https://casella.dev/blogmultipersonarl.html>
- Side-by-side gallery vs Qwen3-thinking (20 problems): <https://github.com/scasella/multi-model/blob/main/reports/case_study/gallery.html>
- Token-efficiency analysis (full per-bucket breakdown): <https://github.com/scasella/multi-model/blob/main/reports/token_efficiency/summary.json>
- Recipe: <https://github.com/scasella/multi-model/blob/main/RECIPE.md>
- Repo: <https://github.com/scasella/multi-model>
Citation
@misc{casella2026multipersona,
author = {Stephen Casella},
title = {Multi-persona debate: a panel-of-experts scaffold via pure RL on Qwen3-30B-A3B-Base},
year = {2026},
url = {https://github.com/scasella/multi-model},
note = {LoRA r=32 adapter, MIT license. Eval session 44722365.}
}License
MIT — see LICENSE. Inherits the Qwen license of the base model when used together.
