Spaces:
Running
Running
File size: 12,541 Bytes
9d0d4e9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 |
下面是更完整版,可直接丢给训练 agent。核心改动:默认硬件按 Apple M4 Pro 本地 CPU/MPS,明确跳过 RL;数据 teacher 策略交给子 agent 判定;加入“不能只写计划,达成 DoD 才能成功退出”。
```text
# 任务:在 InfoLens 上训练一个 Qwen3-0.6B Tiny-NLA(AV + AR)
你是训练执行 agent。你的任务不是写调研报告,而是把一个能跑的 Tiny-NLA 原型训练出来,并交付可复现脚本、checkpoint、评估样例。
请完整读完本任务书再动手。任何红线冲突立即停止并报告。除非遇到明确硬阻塞,否则你不能只输出计划后退出;你必须持续执行、修正、评估,直到满足“Definition of Done”。
---
## 0. 已知项目与硬件约束
Repo: `/Users/cccmmd/InfoLens`
InfoLens 是本地 LLM 可解释性工具,已有:
- `/api/prediction-attribute`:next-token attribution
- `/api/ablation-attribute`:ablation attribution
- `/api/logit-lens`:逐层 hidden state 经过 final norm + lm_head 的 top-k 与目标 token 概率轨迹
默认模型见 `model_paths.py`:
- Base: `qwen3-0.6b` -> `Qwen/Qwen3-0.6B-Base`
- Instruct: `qwen3-0.6b-instruct` -> `Qwen/Qwen3-0.6B`
硬件已知:
- 本机是 Apple M4 Pro 本地机器。
- 不要假设有 CUDA。
- 可以探测 MPS,但必须先 smoke test 反向传播;MPS 不可靠时退回 CPU。
- 默认策略:只做 SFT,不做 RL。
- RL / GRPO 在本机视为 out of scope,除非用户另行提供远程 CUDA 训练机。
---
## 1. 红线
违反任意一条即任务失败,立即停止并报告:
1. 禁止下载或运行 7B 及以上模型。
2. 禁止使用官方 released NLA checkpoint。它们绑定 Qwen2.5-7B / Gemma / Llama 的激活空间,与 Qwen3-0.6B 不兼容。
3. 禁止照搬 Miles + SGLang + Megatron 训练栈。本任务只能使用轻量依赖:`torch`、`transformers`、`peft`、`datasets/pyarrow`、`numpy`、`pyyaml` 等。
4. 禁止把官方 7B/70B 超参当成默认值。0.6B 必须自己做小规模 smoke 与轻量调参。
5. 禁止把大模型权重、parquet 数据、训练 artifacts 提交到 git。
6. 不要改动生产 UI/API,除非用户后续明确要求。本任务只做实验脚本与 artifacts。
---
## 2. 目标
训练一对 Tiny-NLA 组件,用于解释 `Qwen/Qwen3-0.6B-Base` 某一层 residual stream activation。
- AV / Activation Verbalizer: `activation vector -> natural language explanation`
- AR / Activation Reconstructor: `explanation -> reconstructed activation vector`
- 比较向量前必须 L2 normalize。
- round-trip loss 使用 `MSE = 2 * (1 - cosine)` 或等价 normalized MSE。
- 最终 InfoLens 更依赖 AV:输入某层 activation,输出一句可读中文解释。
- AR 用于客观评估与未来 reward,不要求达到官方 7B 水平,但必须训练、评估、和 baseline 比较。
---
## 3. 成功退出条件 Definition of Done
你不能在满足以下条件前声称任务完成:
1. 已确认并记录环境:
- device: CPU / MPS / CUDA
- `Qwen/Qwen3-0.6B-Base` 的 `num_hidden_layers` 与 `hidden_size`
- 选择的 layer index,按约 2/3 深度计算,并说明理由
- injection token 是否为单 token
- injection scale 如何估计
2. 已完成可复现数据生成:
- 至少 smoke 数据 200 条
- 如果速度允许,扩到 500-2000 条
- 数据包含:context、token index、layer、activation_vector、teacher explanation、target token/top-k debug 信息
- 数据与 sidecar 存在 artifacts 目录,且不进入 git
3. 已完成 Stage 0 smoke:
- 能提取 Qwen3-0.6B-Base hidden state
- 能用 `input_embeds` 注入 activation
- 能跑一次 AV forward/generation,不崩溃、不 shape mismatch
4. 已完成 AR SFT:
- 有训练脚本
- 有 checkpoint
- 有 val metrics
- 必须和 mean baseline / shuffled baseline 对比
- 如果 AR 训练失败,必须至少做两轮合理修正后才能报告 blocker
5. 已完成 AV SFT:
- 有训练脚本
- 有 checkpoint 或 LoRA adapter
- 能对 held-out activation 生成中文解释
- 至少输出 20 条 worked examples
- 20 条里不能大面积乱码、空输出、模板废话;若质量很差,必须继续修正数据或训练设置,不能直接交付
6. 已交付推理脚本:
- 输入文本 + token position,自动提取 selected layer activation
- 调用 AV 输出解释
- 若 AR 可用,同时输出 reconstruction cosine/MSE
- 从 `nla_meta.yaml` 读取配置,不硬编码 layer/token/scale/template
7. 已交付最终报告:
- 环境
- 数据策略
- 训练耗时
- AR 指标
- AV 质量观察
- 20 条样例
- 失败案例与局限
- 下一步建议
只有以上完成,才能输出“任务完成”。否则只能输出“阻塞报告”,并附证据与已尝试修复项。
---
## 4. 外部参考,只学算法,不照搬基础设施
参考仓库:
`https://github.com/kitft/natural_language_autoencoders`
开工前阅读:
- `README.md`
- `docs/inference.md`
- `docs/design.md`
- `nla/schema.py`
- `nla/config.py`
- `nla/models.py`
- `nla/loss.py`
- `nla/reward.py`
- `nla/datagen/`
你要借鉴:
- AV 把 activation 当作一个虚拟 token embedding 注入 prompt
- AR 从 explanation text 重建 activation
- sidecar 记录 prompt、injection token、layer、scale、d_model
- normalized MSE / cosine 作为评估
你不要借鉴:
- 7B+ released checkpoints
- Miles / SGLang / Megatron
- 多 H100 训练配置
- RL 默认流程
---
## 5. 数据生成策略:必须交给子 agent 判断与执行建议
在生成 teacher explanation 前,先启动一个 focused subagent,任务是:
“判断当前环境是否可使用 Claude/外部 API 生成 Tiny-NLA teacher explanations;如果可用,给出低预算批量生成策略;如果不可用,给出本地 `Qwen/Qwen3-0.6B` instruct 生成策略。必须返回具体 prompt 模板、批大小、成本/速度风险、fallback 方案。”
子 agent 必须检查:
- 是否存在 `ANTHROPIC_API_KEY`
- 是否存在其他可用 teacher API key
- 用户是否已明确预算
- 如果无法确认预算,不要擅自大规模调用外部 API
主 agent 根据子 agent 结论执行:
### 有 Claude API 且预算明确
- 先生成 200 条 smoke teacher explanations
- 人工/程序抽查质量
- 再扩到 500-2000 条
- 每条 explanation 优先中文,短句,描述该位置模型可能关注的语义
### 没有 API 或预算不明确
- 使用本地 `Qwen/Qwen3-0.6B` instruct 做 weak teacher
- 允许降级,用户接受本地 teacher 质量较差
- 必须在报告中标注:teacher 是 weak local teacher,不是真正 Claude-quality NLA labels
Teacher prompt 应包含:
- 原始 context
- token 位置
- target token / final top-k
- logit lens 中该层附近的 top-k 摘要(如果容易取得)
- 要求输出 1-2 句中文解释,不要长篇推理
注意:AR 的标签始终是原始 activation vector,不依赖 teacher API。
---
## 6. 推荐目录结构
把实验放在独立目录,例如:
`experiments/tiny_nla/`
建议文件:
- `extract_activations.py`
- `generate_teacher_labels.py`
- `train_ar.py`
- `train_av.py`
- `eval_roundtrip.py`
- `infer_tiny_nla.py`
- `sidecar.py`
- `README.md`
Artifacts 放到:
- `artifacts/tiny_nla/...`
如果 artifacts 目录未被 gitignore,先加入 gitignore。不要提交模型权重或数据。
---
## 7. Stage 0:环境与注入 smoke
先写并运行 smoke,不要直接训练。
必须做:
1. 加载 `Qwen/Qwen3-0.6B-Base`
2. 读取真实:
- `num_hidden_layers`
- `hidden_size`
- vocab size
3. 计算:
- `layer_index = round(num_hidden_layers * 2 / 3)`
4. 对几条文本跑:
- `output_hidden_states=True`
- 取 selected layer 的最后 token 或多个 token activation
5. 统计 activation L2 norm:
- mean
- p50
- p90
- max
6. 选择 `injection_scale`:
- 初始用 p50 或 mean
- 写入 sidecar
7. 选择 injection char:
- 必须是 tokenizer 下单 token
- 例如先测试 `㈎`,不行就找其他 rare single token
8. 构造 prompt template:
- `<concept>{injection_char}</concept>`
- 要求输出 `<explanation>...</explanation>`
9. 使用 `input_embeds` 替换 injection token embedding,跑一次 forward/generation。
Stage 0 没过,不准训练。
---
## 8. Stage 1:AR SFT
AR 输入 explanation text,输出 activation vector。
实现要求:
- 初版可以用 `Qwen/Qwen3-0.6B-Base` 或 instruct trunk
- 优先冻结大部分模型,只训练轻量 head 或 LoRA + head
- AR head: `Linear(d_model, d_model)`
- 取最后一个 token hidden state 过 head
- pred 和 gold 都 normalize 后算 MSE
- 训练集/验证集拆分固定 seed
必须评估:
- val cosine mean
- val normalized MSE
- mean-vector baseline
- shuffled-label baseline
- 至少保存 best checkpoint
如果 AR 不明显超过 baseline:
- 尝试至少两项修正:
- 改 learning rate
- 改 batch size
- 改是否训练 LoRA
- 清洗 teacher explanation
- 增加数据量
- 仍失败再报告,但不要编造成功。
---
## 9. Stage 2:AV SFT
AV 输入 activation vector 注入 prompt,输出 teacher explanation。
实现要求:
- 初始权重优先 `Qwen/Qwen3-0.6B` instruct
- 使用 LoRA,避免全量微调
- 通过 `input_embeds` 注入 selected layer activation
- loss 只算 explanation response token,不算 prompt token
- prompt template 和 injection 参数全部从 sidecar 读取
- 输出中文为目标,不是 bug
训练约束:
- Apple M4 Pro 本地机,不要追求大 batch
- CPU 慢就降低数据量与 epoch
- MPS 可用才用 MPS;MPS 出现反向/dtype 问题立即退回 CPU
- 不要使用 fp16 反向作为默认;优先 fp32/bf16 smoke 后再决定
必须评估:
- held-out 20 条 worked examples
- 每条包含:
- context
- token text / token index
- selected layer
- final top-k
- teacher explanation
- AV generated explanation
- AR reconstruction cosine/MSE(如果 AR 可用)
- 简短人工判断:相关 / 部分相关 / 不相关
如果 AV 输出乱码、空、完全模板化:
- 不准交付
- 必须调整 teacher prompt、训练模板、learning rate、epoch、或数据清洗后重训
---
## 10. Stage 3:RL 明确跳过
本机是 Apple M4 Pro 本地 CPU/MPS 环境,默认跳过 RL。
不要实现 GRPO。
不要安装 Miles/SGLang。
不要声称完成 RL。
最终报告中写:
“由于本任务硬件为 Apple M4 Pro 本地 CPU/MPS,无 CUDA 多 GPU,RL/GRPO 阶段按任务约束跳过。本次交付 SFT Tiny-NLA。”
---
## 11. sidecar 契约
必须生成 `nla_meta.yaml`,至少包含:
```yaml
kind: tiny_nla_model
base_model: Qwen/Qwen3-0.6B-Base
av_init_model: Qwen/Qwen3-0.6B
layer_index: <int>
num_hidden_layers: <int>
d_model: <int>
activation_source: residual_stream
token_position_policy: selected_token_or_last_token
extraction:
injection_scale: <float>
mse_normalization: l2_direction
tokens:
injection_char: "<char>"
injection_token_id: <int>
prompt_templates:
av: |
...
ar: |
...
training:
device: cpu_or_mps
dtype: fp32_or_bf16
dataset_size: <int>
teacher: claude_or_local_qwen_instruct
created_at: <timestamp>
```
推理脚本必须读 sidecar,不要把这些值散落在代码里。
---
## 12. 最终报告格式
最终报告必须包含:
1. 是否完成 DoD
2. 环境报告
3. 数据生成策略与 teacher 来源
4. 模型与层选择
5. injection token 与 scale 统计
6. AR 指标与 baseline 对比
7. AV 训练设置与质量总结
8. 20 条 worked examples 文件路径
9. checkpoint / adapter 路径
10. 推理脚本用法
11. 已知局限
12. 下一步建议
不要只说“训练完成”。必须给路径、命令、指标、样例。
---
## 13. 阻塞时如何退出
只有以下情况允许未完成 DoD 而退出:
- Qwen3-0.6B 权重无法下载或加载,且重试后失败
- 本机内存不足,连 Stage 0 smoke 都无法完成
- tokenizer 找不到合适 single-token injection char,尝试多个候选后失败
- PyTorch/transformers 在本机无法完成最小 forward/backward,且已给出错误日志
- 数据 teacher 完全不可用,且本地 instruct 也无法加载
阻塞报告必须包含:
- 卡在哪个 stage
- 已尝试哪些修复
- 完整错误摘要
- 下一步需要用户提供什么
否则继续工作,直到满足 Definition of Done。
``` |