chore(skill): slim down model-iteration skill files (-820 lines)
SKILL.md: 653→607 lines, program.md: 1757→1187 lines. Merged duplicate content, replaced verbose explanations with references. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -417,58 +417,24 @@ echo '{"log":{"ts":"11:55:10","iter":"R1","text":"Step 1 dist-analysis: 写 work
|
||||
1. **评测优先**:`"开始"` 信号的第一个动作永远是评测当前模型,绝不直接训练
|
||||
2. **假设驱动**:每轮必须能回答"这轮验证了什么?学到了什么?下一轮改什么?"
|
||||
3. **NEVER STOP**:全程不打断用户,循环直到达标或人类主动打断
|
||||
4. **从 basemodel 训练**:每轮 SFT 的 `--model_path` 必须是 basemodel,禁止从上轮 ckpt 继续训
|
||||
5. **复杂度优先**:分析类任务(近邻检索 / 聚类 / 相似度统计)选算法前先估数据规模。**忌**对几万行训练集用 `sklearn.fit_transform` 这类要全量物化稀疏矩阵或 embedding 矩阵的 API — 单次 600s 仍可能 timeout。**>1 万行训练集做近邻必须先粗筛后精排(倒排索引 → 每错例 50–300 候选 → 精排),禁止 O(M·N) 全量比对**——37×30k=1.1M 次朴素比较 ~3min,粗筛后 7.4k 次 ~10s。错例侧的"剪枝"只是常数优化,不能替代粗筛。详见 [references/program.md §2.3](references/program.md)
|
||||
6. **大文件先切片**:>10MB 量级的远端 CSV/JSONL(如 `specific_comparison.csv`),先用 bash `awk/grep/head` 在远端切出目标子集再处理。**忌**直接 `pd.read_csv` 整体加载或把 DataFrame 当返回值穿过工具调用 — 会撞 runtime 的输出/返回大小限制(实测 99MB 直接读 → "太大了" 失败)
|
||||
7. **跨脚本复用走 /tmp pickle 缓存**:同一轮 dist-analysis 里 all_train.jsonl 这种"多个脚本都要读的训练集"必须缓存——第一次读完用 `pickle.dump(rows, '/tmp/all_train_<runDic>.pkl')`(pod /tmp 是本地 SSD),后续脚本以 `if path.exists(): pickle.load(path) else: 重建 + 落盘` 模式启动。倒排索引同理。**忌**每个脚本都重新 `for line in open(jsonl): json.loads(line)` 全表 — 30k 行 NFS jsonl 每次 5–15s,从本地 pickle unpickle <1s,v32 R0 5 次重读累计 ~50s 可省。脚本文件名最好写 cache key(如 `kn_search_v2_<runDic>.py`),换轮换 runDic 自动失效。
|
||||
8. **stdout 即 LLM 下一轮 input,分级 print**:每个分析脚本的 stdout 会原样喂回 LLM 当下一轮上下文,每 KB 都要 prefill。**只 print 决策需要的聚合**(端点抽样总数、各 verdict 的计数、top-3 exemplars 文字),**明细落 `/tmp/<step>_<runDic>_detail.json`**(每条错例的 3 近邻 + 相似度 + token overlap 等)后续要回看再 `cat` 该文件。v32 R0 实测 kn_search 一次 stdout 18KB、judge_check 4.7KB、mislabel 11.3KB,60% 是重复的 per-case 全量 dump,LLM 看完只用一句话总结——这部分 prefill cost 是直接浪费。还有:`cat > /tmp/x.py <<EOF ... EOF` 模式 runtime 会把每行 PS2 提示符 `> ` 回显进 stdout(实测一次累计 1–2KB),改用 `python3 -c "open('/tmp/x.py','w').write(open('/dev/stdin').read())" <<'PY' ... PY` 或 `base64 -d` 注入,可以彻底消掉 `> > >` 噪声。
|
||||
9. **一律走 bash + 脚本文件,禁用 python_exec**:所有 python 任务把代码写到远端 `/tmp/xxx.py`,用 `bash` 跑 `python3 -u /tmp/xxx.py 2>&1 | tee /tmp/xxx.log`。**忌**用 python_exec — 它 stdout 全缓冲、turn 结束才 flush,超时被 kill 时 buffer 直接丢,故障时连 phase 时序都看不到(实测 600s/1800s 撞墙后 `tool_result` 没有任何 stdout 字段)。bash + tee 模式 stdout 实时落盘,超时也能 `tail /tmp/xxx.log` 看到死在哪。
|
||||
4. **从 basemodel 训练**:每轮 SFT 的 `--model_path` = `/mnt/wangsenhao/verl_zk/Qwen3-4B-Instruct-2507`,禁止从上轮 ckpt 续训
|
||||
5. **近邻检索先粗筛后精排**:>1 万行训练集禁止 O(M·N) 全量比对;倒排索引 → 50-300 候选 → 精排。详见 program.md §2.3
|
||||
6. **大文件先切片**:>10MB 的 CSV/JSONL 先 bash `awk/grep/head` 切子集,禁止 `pd.read_csv` 整体加载
|
||||
7. **pickle 缓存 /tmp**:训练集 + 倒排索引缓存到 pod `/tmp/`(mtime 作 key 自动失效),禁止每脚本重建
|
||||
8. **stdout 分级 print**:只 print 决策聚合(<2KB),明细落 `/tmp/<step>_<runDic>_detail.json`
|
||||
9. **一律 bash + 脚本文件**:`python3 -u /tmp/xxx.py 2>&1 | tee /tmp/xxx.log`,禁用 python_exec
|
||||
|
||||
## 达标条件
|
||||
|
||||
- **需求集合(目标集)** ≥ 95%(**最高优先级,一切以此为准**)
|
||||
- **大盘集(车载)** 降幅 ≤ 0.3%(次要,目标集未达 95% 前不因大盘微降而回滚/停训)
|
||||
- **specific test** 降幅 ≤ 1%(次要,同上)
|
||||
- **需求集合(目标集)** ≥ 95%(**最高优先级**)
|
||||
- **大盘集(车载)** 降幅 ≤ 0.3%(次要)
|
||||
- **specific test** 降幅 ≤ 1%(次要)
|
||||
|
||||
⚠️ **优先级铁律**:目标集上 95% 是主线任务。只要目标集还没到 95%,其他集合的轻微下降(大盘 ≤1%、specific ≤2%)**不构成回滚理由**,继续迭代。只有目标集已达标后,才需要关注并修复其他集合的 regression。
|
||||
⚠️ **优先级铁律**:目标集未达 95% 前,其他集合轻微下降(大盘 ≤1%、specific ≤2%)不构成回滚理由。
|
||||
|
||||
## 主流程
|
||||
|
||||
读取 `references/program.md` 获取完整的 Step 0-7 迭代循环规范。在任何操作前必须读取该文件。
|
||||
|
||||
每个 step 的执行模板(**强制**,配合上文「Pipeline UI 同步约定」R1):
|
||||
|
||||
```text
|
||||
1. echo '{"step":"<key>","status":"running","ts":"..."}' >> $SESSION_OUTPUT/program-state.jsonl
|
||||
2. (执行该 step 的实际操作 / 调用工具 / 等结果)
|
||||
3. 成功: echo '{"step":"<key>","status":"complete","ts":"..."}' >> ...
|
||||
失败: echo '{"step":"<key>","status":"failed","error":"...","ts":"..."}' >> ...
|
||||
```
|
||||
|
||||
step key 跟 Step 编号映射:
|
||||
|
||||
| Step | step key | 说明 |
|
||||
|------|----------|------|
|
||||
| Step 0 | `cml` | CML 评测当前模型 |
|
||||
| Step 0 (附带) | `gold-drift` | Gold drift 检查 |
|
||||
| Step 1 | `dist-analysis` | 分层结果分析 + 问题分析 & 报告(写 workflow<runDic>.md) |
|
||||
| Step 3 | `hypothesis` | 形成假设(写 iteration_log) |
|
||||
| Step 4 | `augment` | 数据增强 / 生成 |
|
||||
| Step (干预后) | `verify` | 修改返回验证 |
|
||||
| Step 5 | `sft` | SFT 训练 |
|
||||
| Step 6 | `log` | 记录迭代日志 |
|
||||
| 循环 | `next-round` | 回 Step 0 评测新 ckpt |
|
||||
|
||||
```
|
||||
LOOP:
|
||||
Step 0: CML 评测(当前模型)+ Gold drift 检查
|
||||
Step 1: 分层结果分析 + 问题分析 & 报告(需求集合 → 大盘车载 → specific test;根因归类 / 跨轮 diff / 天花板诊断 / 写 workflow<runDic>.md)
|
||||
Step 3: 形成假设(写入 iteration_log.jsonl)
|
||||
Step 4: 数据生成(仅 data 归因时做)
|
||||
Step 5: SFT 训练(submit_sft.sh)→ 训练成功后下一轮评测用 submit_cml_eval.sh
|
||||
Step 6: 记录结果(iteration_log.jsonl / error_registry.jsonl)
|
||||
→ 回 Step 0
|
||||
```
|
||||
完整 Step 0-7 规范见 `references/program.md`,**操作前必读**。
|
||||
|
||||
## 文件结构
|
||||
|
||||
@@ -623,31 +589,19 @@ echo '{"step":"human-check","status":"running","run_id":"R0","reason":"label-mas
|
||||
|
||||
实际差别在 UI 上不大(都是横向 dashed 卡),区分主要为了让用户从标题就大致知道是开始前还是结果后的检查点。
|
||||
|
||||
## CML 配置(快速查阅)
|
||||
## CML 配置
|
||||
|
||||
```yaml
|
||||
# ~/.config/cloudml/config.yaml
|
||||
default_config_context: cloudml5-config
|
||||
xiaomi_cloudml:
|
||||
cloudml5-config:
|
||||
xiaomi_auth_type: key
|
||||
xiaomi_cloudml_endpoint: https://cnbj6-cloudml5.api.xiaomi.net
|
||||
xiaomi_cloudml_workspace_id: 10065
|
||||
```
|
||||
见 `references/program.md` §5.2。
|
||||
|
||||
## 结果文件
|
||||
## 结果文件 → 前端卡片映射
|
||||
|
||||
| 文件 | 用途 | 前端卡片 |
|
||||
|---|---|---|
|
||||
| `results/iteration_log.jsonl` | 每轮假设/干预/判定完整记录 | hypothesis / log |
|
||||
| `results/error_registry.jsonl` | 跨轮错误追踪(case_hash → 出错轮次) | log |
|
||||
| `results/workflow<runDic>.md` | 每轮回归分析报告 | dist-analysis |
|
||||
| `output/relabel_candidates_<runDic>.csv` | **阶段一**:预计修改训练集候选清单(complex 翻转候选等) | **dist-analysis(分层结果分析)** |
|
||||
| `results/data_clean_<runDic>/modified_samples.jsonl` | **阶段二**:确认修改最终落盘(用户审核 1/0 后实际生效的改动) | **augment(数据增强)** |
|
||||
| `results/data_clean_<runDic>/deleted_samples.jsonl` | 旧数据清洗存档(删除项) | — |
|
||||
| `results/augment_raw/augment_<runDic>_raw.jsonl` | GPT-5.4 仿写原始产物 | augment |
|
||||
| `ai-planning/data/train_set/zk_intent/augment_<runDic>.jsonl` | 本轮合入训练集的增量(H1 重标 + H2 仿写) | augment |
|
||||
| `results/gold_drift/drift_<runDic>.json` | Gold drift 检测结果 | gold-drift |
|
||||
| `results/label_rules.md` | 已确立的标签规则集(R1~RN) | — |
|
||||
|
||||
**两阶段训练集修改的展示约定**:候选阶段(量级判定 + 人审 1/0 之前)写在 `output/relabel_candidates_<runDic>.csv`,前端「分层结果分析」卡片读取展示供人审;确认阶段(人审后落盘)写在 `results/data_clean_<runDic>/modified_samples.jsonl`,前端「数据增强」卡片读取展示最终改动。详见 [references/program.md §4.0.1 Step A](references/program.md)。
|
||||
| 文件 | 前端卡片 |
|
||||
|---|---|
|
||||
| `results/iteration_log.jsonl` | hypothesis / log |
|
||||
| `results/error_registry.jsonl` | log |
|
||||
| `results/workflow<runDic>.md` | dist-analysis |
|
||||
| `output/relabel_candidates_<runDic>.csv` | dist-analysis(阶段一:候选) |
|
||||
| `results/data_clean_<runDic>/modified_samples.jsonl` | augment(阶段二:落盘) |
|
||||
| `results/augment_raw/augment_<runDic>_raw.jsonl` | augment |
|
||||
| `ai-planning/data/train_set/zk_intent/augment_<runDic>.jsonl` | augment |
|
||||
| `results/gold_drift/drift_<runDic>.json` | gold-drift |
|
||||
|
||||
Reference in New Issue
Block a user