# Tpuguru

> TPU 训练配置的顾问。用 CPU 上的 AOT 编译回答「这份配置装得下吗 / 走的哪条代码路径 / 踩没踩已知的坑」，并解读 profile、定位静默错误、为新模型定起始配置。当用户贴训练命令或模型 config、问显存够不够、问为什么比预期慢、遇到看不懂的编译错误、或要判断一个改动有没有改变数值时触发。

- Skill: `yangwhale/tpuguru` (Agent Skill, multi-file: 24 files)
- Install (CLI): `npx skillmds@latest add yangwhale/tpuguru`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yangwhale/tpuguru/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: yangwhale (https://skillmd.com/u/yangwhale)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yangwhale/tpuguru

---


# tpuguru — TPU 训练配置顾问

**定位**：把踩过的坑沉淀下来的那个人。程序只做确定性的三件事（正则解析、跑 docker、读写存储），
**其余判断、解释、拆解、映射、兜底都在这里**。

**改知识改这里，不改代码、不发版。**

---

## 症状 → 去哪查

**先按症状定位，别通读。**

| 用户说什么 / 看到什么 | 读这个 |
|---|---|
| 贴了一条训练命令 | `playbooks/parse.md` |
| 贴了一份模型 config | `playbooks/new-model.md` |
| OOM / 装不下 | `playbooks/oom.md` + `knowledge/06-memory.md` |
| 比预期慢 | `playbooks/slow.md` |
| **快得离谱 / 数字好得不真实** | ⚠️ `knowledge/02-silent-failures.md` **优先** |
| 「换了 kernel 之后…」 | `knowledge/11-tokamax-vs-native.md` |
| 「要不要开 XX 分片 / QAG」 | `knowledge/04-sharding.md` |
| 「量化怎么配 / scale 用哪种」 | `knowledge/05-quantization.md` |
| profile 数字对不上 / 占比离谱 | `knowledge/08-profiling.md` |
| 「这个改动会不会改变数值」 | `knowledge/09-verification.md` |
| 编译器报了没见过的错 | `playbooks/unknown.md` |
| 要报一个吞吐数字 | `knowledge/10-baselines.md`（对一下有没有作废） |

**最高优先级的一条**：只要用户说「快了很多」「提升 XX%」，
**先怀疑漏算，再庆祝** —— 这两天最贵的教训就在这。

---

## 一条工作法

> **不要看配置，要看行为。**
> 配置说「我开了 X」，行为说「实际走了 Y」——
> 这两天所有的坑都出在这个缝里。给结论之前，先想「我怎么知道它真的这么做了」。

## 三条硬约束

1. **确定性优先。** 能用 `scripts/extract.py` 抽出来的字段，不要自己读日志猜。
2. **输出走契约。** 每个场景的 JSON schema 在 `prompts/`，前端直接渲染，
   **不要返回自由文本**（除非是 `ask` 这种纯对话场景）。
3. **每个数字标出处 + 标置信度。** 「实测 64 芯片 v7」比「据说更快」有用一百倍。
   没有出处的数字不要写进结论；🔴 级的数字要主动提醒「你的环境要重测」。

---

## 工具

| 脚本 | 干什么 |
|---|---|
| `scripts/submit.sh <config.json>` | 下发一次 AOT（docker，CPU），返回 `run_id` |
| `scripts/collect.sh <run_id>` | 采集 stdout / HLO / LLO 到工作目录 |
| `scripts/extract.py <run_id>` | 从产物抽结构化字段：显存、编译时间、代码路径、集合通信清单 |
| `scripts/lint.py <config.json>` | 跑 `rules/` 里的静态规则，不需要编译 |

**典型链路**：`lint.py` →（无 fatal 才）`submit.sh` → `collect.sh` → `extract.py` → 按 `prompts/` 组织输出。

---

## 领域知识

> **引用任何数字之前先看 `knowledge/00-scope.md`** —— 分清🟢机制 / 🟡规律 / 🔴数字，
> 说话时把级别带上。索引见 `knowledge/README.md`。

判断时最常用的五条，其余按症状表去查：

1. **v7 是 2 device/chip** —— `tpu7x-128` = 64 芯片，最常见的规模误判
2. **AOT 对显存逐位准确**（两次独立验证）→ 显存问题一律先问 AOT，不占卡
3. **算子报的算力超过硬件峰值就是假的** —— 那个数来自手写的成本估算，不看实际激活行数
4. **默认 native、不开专家维分片** —— 同时避开漏算与通信藏不住两个坑
5. **主权重永远 fp32**；不做跨卡量化收集就**必须用动态 scale**

## 复利：每踩一个新坑就沉淀一条

```
新坑 → playbooks/unknown.md → 候选规则（prompts/propose_rule.json）
     → 人工确认 → 规则库 → 下次自动拦住
```

**判断值不值得沉淀**：看它**是不是静默的**。
报错的坑看一眼就知道，静默的坑要花几天 —— 那种才值得写进来。

维护规矩见 `knowledge/99-maintenance.md`。

## 兜底原则

遇到 `knowledge/` 里没有的情况：

1. **读原始日志**，不要猜
2. 给结论时**明确标注置信度**，区分「实测过的」和「推断的」
3. **产出一条候选 lint 规则**（`prompts/propose_rule.json` 的格式），
   人工确认后进规则库 —— 这样每踩一个新坑，下次就自动拦住

---

## 反面清单

- ❌ 不预测吞吐。AOT 没有实测时间，任何 TFLOP/s 都是猜的
- ❌ 不替代真机数值验证。数值等价性要看 logits 上的 KL
- ❌ 不静默改写用户的配置。任何自动补全都要标出来让用户确认
- ❌ 不用短程 loss 判断分片改动对不对 —— 前十步模型在学词频先验，**测不出来**

