samai-2b / README.md
tchbcb's picture
r18 update: stepCE round (T4) - card + lineage + probe results
2a8391c verified
|
Raw History Blame Contribute Delete
7.07 kB
# samai-2b (r18)
**我是 samai-2b 模型,由 SamAI 研发,官网是 [samai.cc](https://samai.cc)。**
这是 SamAI 官方 2B 对话模型仓:基于 [tchbcb/samai-pnet-dmoe-2b](https://huggingface.co/tchbcb/samai-pnet-dmoe-2b)(r12)
继续链式微调。当前进度:**r18(stepCE 质量修复轮,Kaggle T4 训练)**——增量权重已入库 `r18_t4/`,
合并权重将在 DSW 官方验收(冻结 CE Δ±0.15 / TB2 / hard acc)通过后上传。
> 🆕 **r18 发布状态**(2026-09-16):`r18_t4/` 含 ckpt_final 增量(LoRA r16 @ L34–41 +
> ponder_head + ponder_moe_extras,基于 r17 增量之上)、11258 步完整训练日志、
> PATCH_NOTES(6 个训练 bug 修复记录)、T4 侧 r17 vs r18 同数据对比探针结果。
> 官方验收数字回填中。
## 身份(r14 固化;r18 待复检)
| 问 | 答 |
|---|---|
| 你叫什么名字? / What's your name? | 我是 samai-2b 模型 |
| 你是谁开发的? / Who developed you? | SamAI |
| 你的官网是什么? / What's your website? | samai.cc |
| 你是 GPT/MiniCPM/Claude/通义/DeepSeek 吗? | 不是,我是 samai-2b 模型,由 SamAI 研发 |
> ⚠️ T4 侧探针提示 r18 身份行有漂移迹象(自称"AI 助手"),DSW 官方评估将复检身份电池,
> 必要时 r19 回补身份回放数据。
## 模型规格
| 项 | 值 |
|---|---|
| 基座 | MiniCPM5-2B(42L / hidden 2048 / GQA 16+2 / vocab 130560) |
| 架构 | Ponder 自适应思考(N=8, τ=0.125)× 动态可变 MoE(L34–41 × 8 专家)× MTP 深度 2 |
| 权重 | bf16 单文件 ~5.08GB;`trust_remote_code=True` 加载;r18 走增量加载(见下) |
| EOS | `[1, 130073]`(`<|im_end|>`) |
## 训练谱系
```
MiniCPM5-2B 基座 → PonderMoE 转换 → r5b → r11 → r12(= tchbcb/samai-pnet-dmoe-2b,正式发布)
→ r13:agent 精修(DONE 纪律 / shell 语法 / 算术 think 分步,mix_r13 5163 行 ×2ep)
→ r14:身份微调(mix_r14 5207 行 ×2ep = r13 全量回放 + 身份手术改写 + 44 条专属身份行)
→ r15/r16:精修与基准固化(r16 冻结 CE 锚 + 分桶 steps 基线 easy 2.77 / medium 2.97 / hard 3.07)
→ r17:深思熟虑轮(hard steps 4.80 ✓ 达标,但 hard CE +1.57 —— "想得深但糊",TB2 8/24)
→ r18:stepCE 质量修复轮(本仓 r18_t4/:mix_r18 5629 行 ×2ep = 11258 步,
stepCE 1.0 + β 0.15 + hard 36.6% 上采样 + 难度先验 easy .85/medium .35/hard .1,
LoRA 双参数组 lr 1.5e-4 heads / 4e-5 lora;Kaggle T4 实测 4.05h,峰值 10.59GB,零 NaN)
```
## r18 T4 探针结果(mix_r18 在分布,n=120/桶,fp16)
| 分桶 | CE r17 → r18 | ΔCE | steps r17 → r18 |
|---|---|---|---|
| easy | 6.04 → 3.62 | **-2.42** | 2.44 → 3.28 |
| medium | 7.35 → 4.02 | **-3.33** | 2.84 → 3.50 |
| hard | 8.03 → 3.75 | **-4.28** | 3.34 → 3.33 |
- "糊"病灶修复显著:hard CE 暴降 4.28 nats,三桶全面改善;
- sanity 生成:`12x8=96` 直接答对;数学干扰题(乙=甲×3,丙给甲 8 个不影响乙 → 乙=18)推理正确;
- 已知代价:分桶 steps 差异被抹平(stepCE 副作用,r17 的 2.44→3.34 梯度变为 ~3.3-3.5 平台),
深度分化需 DSW 官方评估(zh_cot.eval 分桶)复核。
## 加载 r18 增量
```python
import torch, safetensors.torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
tok = AutoTokenizer.from_pretrained("tchbcb/samai-2b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
"<r12 基座本地路径>", trust_remote_code=True,
torch_dtype=torch.float16, device_map="auto")
# 1) extras(router/mtp)先于 peft 包装加载;2) r17 → r18 顺序覆盖
for f in ["r17/ponder_moe_extras.safetensors", "r18_t4/ponder_moe_extras.safetensors"]:
st = safetensors.torch.load_file(f)
model.load_state_dict({k.replace("base_model.model.", ""): v for k, v in st.items()}, strict=False)
model.ponder_head.load_state_dict(safetensors.torch.load_file("r18_t4/ponder_head.safetensors"))
lcfg = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.0, bias="none",
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
layers_to_transform=list(range(34, 42)))
model = get_peft_model(model, lcfg)
sd = safetensors.torch.load_file("r18_t4/adapter_model.safetensors")
# 键名归一化(剥 base_model.model. 前缀)后逐参数 copy_,参考 r18_t4/PATCH_NOTES.md bug#3
```
## 推理协议(与 r12 一致,重要)
遵循 MiniCPM5 官方姿势,两件事必须做对:
1. **采样**:`do_sample=True, temperature=1.0, top_p=0.95, repetition_penalty=1.0`(greedy 不在官方设计姿势内,会显著加剧复读)。generation_config 已按此固化。
2. **思考协议**:
- 标准模式:正常 apply_chat_template,模型自行输出 `<think>...</think>` 后给答案;
- think_off(轻聊场景推荐):在 assistant 首部预填空思考段,闲聊停机率更高、响应更快。
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("tchbcb/samai-2b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
"tchbcb/samai-2b", trust_remote_code=True,
torch_dtype="bfloat16", device_map="auto")
msgs = [{"role": "user", "content": "你叫什么名字?"}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=256, do_sample=True,
temperature=1.0, top_p=0.95, repetition_penalty=1.0)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
```
## 验收门
| 指标 | r12(已发布基线) | r16(基准) | r17 | r18 现状 |
|---|---|---|---|---|
| 冻结 CE Δ vs 锚(easy/medium/hard) | -0.43 / -0.18 / -0.36 | +0.46(hard,FAIL) | +1.57(hard,FAIL) | **T4 探针 -2.42 / -3.33 / -4.28**(在分布);官方 zh_cot 待回填(容差 ±0.15) |
| hard steps(深思熟虑) | — | 3.07 | 4.80 ✓ | T4 探针 3.33(分桶平台化,官方口径待回填) |
| TB2 24 题 | 10/24 | 9/24 | 8/24 | 待回填 |
| hard acc | — | 基线 | ×1(糊) | 目标 ×2,待回填 |
## 文件
- `model.safetensors` — 合并后 bf16 权重(r18 官方验收通过后上传;当前"weights pending")
- `r18_t4/` — **r18 增量交付**:`ckpt_final/`(adapter + ponder_head + ponder_moe_extras + train_report)、
`r18_train.log`(11258 步完整日志)、`PATCH_NOTES.md`(6 bug 修复)、`r18_t4_probe.json`(对比探针原始数据)
- `modeling_samai_pnet.py` / `config.json` — 远程代码(r18 起为 transformers 5.0 兼容版:create_causal_mask 签名修复)
- `chat_template.jinja` / `tokenizer.json` / `tokenizer_config.json` — 与 MiniCPM5 官方模板逐字节一致
- `generation_config.json` — 已固化官方采样参数
- `inference.py` / `serve_contract.json` — 服务化参考实现与契约