chapter 13 / capstone · 全课程收官实战 · 预计实操时间 1-2 个周末

实战收官
让小模型学会画像素画

AUDIO // 本章语音导读

这一章没有新理论——它把前面 13 章的知识拧成一个可以在你自己的 Mac 上跑通的端到端项目:用 LoRA+SFT 让一个 4B-9B 的开源小模型,稳定输出结构化的像素画 JSON。每一步标注了它回收的章节。做完它,你就完成了从「学过」到「做过」的跨越。

项目路线图(八步)
  1. 任务定义与 Schema 设计
  2. 交互实验室:校验器本器
  3. 评测先行:eval.py 与 0/12 基线
  4. 数据集工程:合成 + 过滤管线
  5. 基座选型:一场对照实验
  6. 训练:LoRA 验证 → 过夜全量
  7. 失败案例分析与数据迭代
  8. 部署、成本核算与 Agent 化
  9. 毕业测验

第一步:任务定义与 Schema 设计

回收第 11 章任务设计学的第一条:收窄任务面。不做「AI 画图」,做「生成符合此 schema 的 JSON」:

schema · pixel_art_v1
{
  "size": 8 | 16 | 32,                  // 画布边长
  "palette": ["#RRGGBB", ...],          // 2-16 个十六进制颜色
  "pixels": [[int, ...], ...]           // size×size 矩阵,值为 palette 索引
}

这个表示选择本身就是项目一半的成功(第 8 章论证过 vs 扩散模型):每条规则都可程序化判定——JSON 可解析、字段齐全、hex 合法、矩阵矩形、索引不越界。于是同一个 validate() 函数通吃三件事:评测打分、训练数据过滤、(进阶)RLVR 奖励(第 8 章监督信号进化轴的终点站)。可验证性不是运气,是设计出来的。

交互实验室:校验器本器

下面就是这个校验器的网页版。必做实验:① 依次点三个错误样例——调色板越界(模型「想用」没声明的颜色)、行长不齐(长序列数错数,token 化的诅咒,第 7 章)、非法色值(把自然语言色名当 hex)——这三类就是真实训练前小模型最常犯的错;② 直接在文本框里改 JSON,看校验逐条变红变绿、画布实时重绘(非法格子亮红色)。

pixel_art.validate_and_render(json)

左边可以随意编辑 · 右边即时渲染 + 逐条校验 · 注意 PASS/FAIL 同时驱动评测/清洗/奖励三件事

第二步:评测先行——eval.py 与 0/12 基线

第 8 章方法论第一条:训练之前先有评测。12 个分层用例(4 易:单色块;4 中:指定物体+配色;4 难:风格约束+尺寸 32),每例跑 validate() + 任务断言:

python · eval.py(核心逻辑,与上面实验室的 JS 校验器逐条对应)
import json, re, sys
from mlx_lm import load, generate

HEX = re.compile(r'^#[0-9a-fA-F]{6}$')

def validate(text: str) -> tuple[bool, str]:
    try: d = json.loads(extract_json(text))           # 模型可能裹 markdown,先抽取
    except Exception as e: return False, f'parse: {e}'
    if not all(k in d for k in ('size','palette','pixels')): return False, 'missing fields'
    if not (2 <= len(d['palette']) <= 16 and all(HEX.match(c) for c in d['palette'])):
        return False, 'bad palette'
    px, n = d['pixels'], d['size']
    if len(px) != n or any(len(r) != n for r in px): return False, 'not rectangular'
    if any(not (0 <= v < len(d['palette'])) for r in px for v in r): return False, 'index OOB'
    return True, 'ok'

model, tok = load(sys.argv[1])                         # 基座或 adapter 路径
cases = [json.loads(l) for l in open('eval_cases.jsonl')]
passed = 0
for c in cases:
    out = generate(model, tok, prompt=render_chat(c['instruction']), max_tokens=2048)
    ok, why = validate(out)
    print(('✓' if ok else '✗'), c['id'], why)
    passed += ok
print(f'{passed}/{len(cases)} pass')

跑基座模型(如 Qwen3-4B-Instruct)的预期结果:0/12 到 2/12——它会输出大致像样但行长不齐、索引越界的 JSON(实验室里的错误②③)。这个数字就是一切后续工作的参照系。

第三步:数据集工程——合成 + 过滤管线

目标 3000-5000 条「指令 → 标准 JSON」(MLX 社区经验的甜点区间)。管线(第 7 章 FineWeb 思想的微缩版):

  1. 种子:手工精写 30-50 条覆盖全部难度档(第 8 章 LIMA:质量>数量,种子定调)。
  2. 程序化生成一半数据:像素画的妙处——可以反向生成:程序随机组合「物体模板×调色板×尺寸」画出合法 JSON,再让强模型为它写自然语言指令(「画一只戴帽子的青蛙,复古绿色调」)。指令是生成的,答案是构造的、天然 100% 合规
  3. 强模型合成另一半:旗舰模型按种子风格批量产「指令+JSON」对,每条过 validate(),不合规直接丢弃——校验器在这里第二次上岗。
  4. 多样性审计:按物体类别/配色风格/尺寸分桶统计,缺哪类补哪类(防数据集偏科→模型偏科)。

格式为 chat JSONL(第 8 章 template+loss mask),13M token 量级。

第四步:基座选型——一场对照实验

候选:4B dense / 8B dense / 同级混合架构(线性注意力系)/ 小 MoE。直接给第 7 章讲过的真实结论与方法:

第五步:训练——LoRA 验证 → 过夜全量

shell · 两段式训练计划
# —— 阶段A:LoRA 管线验证(约 20 分钟,第 8 章计算器算过显存账) ——
python -m mlx_lm lora --model Qwen/Qwen3-4B-Instruct \
  --train --data ./data --iters 600 --batch-size 4 \
  --num-layers 16 --learning-rate 1e-5            # 600步≈3 epoch(小子集)
python eval.py ./adapters                          # 期望:0/12 → 6-9/12,loss 平滑下降
# 这一步回答的问题是「管线对不对」,不是「质量好不好」

# —— 阶段B:全量数据过夜跑(约 13M token,8B 每 epoch 3-4 小时 / 4B 减半) ——
python -m mlx_lm lora --model Qwen/Qwen3-8B-Instruct \
  --train --data ./data_full --iters 2400 --batch-size 4 \
  --num-layers 32 --learning-rate 1e-5 \
  --steps-per-eval 200 --val-batches 25            # 睡前启动,醒来看 val loss 曲线

节奏就是第 8 章说的:白天建数据和评测,晚上跑训练,早上看分数。值得盯的三个信号:val loss 跟 train loss 同降(不过拟合,第 1 章)、生成样例的行长错误率(最顽固的错误类型)、以及 loss 降但评测不动的情况(说明错不在拟合在数据——进下一步)。

第六步:失败案例分析与数据迭代

假设过夜后 9/12。错的 3 个不是噪声,是下一轮数据工程的工单(第 8 章对照实验纪律):

失败案例诊断对策
32×32 大图行长出错长序列计数退化(数据里 32 尺寸样本只占 8%)定向补 500 条 32×32 样本
「复古配色」风格漂移风格词→调色板的映射数据稀疏程序化生成时把风格词显式枚举进指令模板
偶发 markdown 包裹 JSONSFT 数据全是裸 JSON,但 system prompt 没禁止数据侧统一+system 明确「只输出 JSON」双保险

两到三轮「评测→归因→补数据→重训」后稳定在 11-12/12,这套循环本身(数据集+评测+管线)就是你沉淀下来的资产——模型只是它的当前输出(第 7/8 章的判断在此闭环)。

第七步:部署、成本核算与 Agent 化

VIDEO 01 · 实操参考
Apple MLX Fine Tuning Guide(MLX 微调完整指南)
Chris Hay 47:17
观看指南 · 跟着做一遍,把本章命令落到键盘上
  • 覆盖:数据集构建 → Qwen 系模型选型(500M-7B 对比)→ LoRA vs 全量 → 融合导出。
  • 重点看他处理「模型遗忘」(防基座能力退化)与数据多样性的段落——对应本章第六步。
  • 配套读:第 8 章的 MLX 命令速查 + LoRA 计算器选 r。
课程完结。从第 1 章的一条回归直线,到此刻你能独立完成的完整后训练闭环——回头看序章那张时间轴:你已经走完了它收录的全部技术史,并且站在了最右端的空白处。接下来的迭代将由你自己书写。附录的信息源清单会帮你保持在前沿;这套课程站点(包括 PROGRESS.md 里的全部工程记录)就留作你的参考手册。

毕业测验