层1/T2: teacher.py 批量生成 + sha256 JSONL 缓存;teacher 改定 MiniMax-M3
- teacher.py: 通用 OpenAI 兼容客户端(配置驱动 base_url,替代 OpenRouter 专用); 缓存即断点(逐条落盘+flush,重跑自动续传);单条失败先落盘其余、结束汇总显式报错; M3 思考段 <think>...</think> 入库前剥离(只剥开头一段) - configs.py: 新增 TeacherGenConfig(采样参数显式化;连接三元组走 .env) - scripts/generate_teacher_completions.py: 自包含生成脚本(本地跑,与训练侧 同 seed 同子集约束已注明) - teacher 决策变更同步:.env.example / docs/00 关键设定与存档点 / docs/02 - tests/test_teacher.py: 10 个单测(假客户端注入),含与 attach 的端到端契约闭环 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -111,3 +111,42 @@ class SFTConfig:
|
||||
raise ValueError(
|
||||
f"max_steps 只接受 -1(按 epoch)或正整数,收到 {self.max_steps}"
|
||||
)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class TeacherGenConfig:
|
||||
"""teacher 批量生成(层 1 能力)的采样与执行参数。
|
||||
|
||||
连接信息(API 地址/密钥/模型名)不在这里——那是部署环境的事实,走 `.env`
|
||||
(teacher.py 读取);这里只放"换一组值就是换一个实验"的采样参数。
|
||||
"""
|
||||
|
||||
temperature: float = 1.0
|
||||
top_p: float = 0.95
|
||||
"""MiniMax M 系官方推荐采样参数:temperature=1.0, top_p=0.95。"""
|
||||
|
||||
max_tokens: int = 8192
|
||||
"""teacher 单条回复的 token 上限。非显然约束:M3 的思考段也计入此额度,
|
||||
设太小会把解答挤没(只剩被截断的思考);student 侧超长解答由 collator 的
|
||||
completion 预算兜住,这里宁可给足。"""
|
||||
|
||||
strip_think: bool = True
|
||||
"""剥离 content 开头的 <think>...</think> 思考段。SFT 的监督目标是最终
|
||||
解答;student 以 enable_thinking=False 训练,学思考段会与模板约定矛盾。"""
|
||||
|
||||
concurrency: int = 8
|
||||
"""并发请求数(线程池大小)。"""
|
||||
|
||||
max_retries: int = 3
|
||||
"""单请求的网络级重试次数(openai 客户端内建指数退避)。"""
|
||||
|
||||
system_prompt: str | None = None
|
||||
"""None = 不加 system 轮(DAPO 题面自带作答指令,不需要额外指挥)。"""
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
if self.max_tokens <= 0:
|
||||
raise ValueError(f"max_tokens 必须为正,收到 {self.max_tokens}")
|
||||
if self.concurrency < 1:
|
||||
raise ValueError(f"concurrency 必须 ≥1,收到 {self.concurrency}")
|
||||
if self.temperature < 0:
|
||||
raise ValueError(f"temperature 必须 ≥0,收到 {self.temperature}")
|
||||
|
||||
Reference in New Issue
Block a user