clearwind - Transform
type: channel
link: https://zxse.cn/tag/Transform/
items: 从 0 到 1 在 CPU 上训练可推理可演示的小参数中文GPT

从 0 到 1 在 CPU 上训练可推理可演示的小参数中文GPT
type: item
date: 2025-12-09T01:24:00+00:00
description: clearwind-tse/gpt_encode_teacher-cn-mini了解 GPT 的核心原理：分词 → 批处理 → 前向 → 损失 → 反向 → 优化 → 保存 → 推理（完整链路）掌握高效小模型技术：RMSNorm、RoPE、权重共享、短序列、小词表、量化仅用 CPU 训练：控制模型/数据规模、梯度累积、学习率预热与退火、禁用无关耗时特性可用答案保障：目标对齐（忽略前缀）、推理首步约束与后处理、停止词、提示词规范化代码结构src/model.py：GPT 核心（Embedding/自注意力/前馈/RMSNorm/RoPE/权重共享）src/data.py：分词器加载、指令和 LM 数据处理、批处理与目标构造src/train.py：CPU 训练主循环、评估、保存与动态量化、耗时统计src/infer.py：推理 CLI（温度、top-k、top-p、重复惩罚、停止词、输出清理）src/build_tokenizer.py：构建 HF ByteLevel BPE 中文分词器（带解码器，避免乱码）config.yaml：统一管理模型、训练、数据、分词器与保存路径data/*.jsonl：教学数据（{"prompt": "...", "completion": "..."}）使用技术模型结构：Decoder-only Transformer（因果自注意力）归一化：RMSNorm（简洁高效）位置编码：RoPE（相对位置，计算高效）前馈：SiLU（现代 LLM 常用）权重共享：词嵌入与输出层共享，降参数且表示一致训练：AdamW、学习率线性预热+余弦退火、梯度裁剪数据与分词：外置jsonl+HF ByteLevel BPE（显式设置 ByteLevel 解码器，避免乱码）推理：温度/top-k/top-p 采样、重复惩罚、停止词、输出清理、提示规范化量化：导出动态量化权重以加速 CPU 推理如何仅用 CPU 训练小模型+短序列：n_layer=4, n_head=4, n_embd=256, seq_len=128小词表：HF ByteLevel BPE（带解码器）梯度累积：batch_size=16, micro_batch=4（有效批 64）学习率策略：线性预热 10%+余弦退火资源控制：torch.set_num_threads(os.cpu_count())，DataLoader 禁用多进程（macOS 下更稳）训练结束导出量化权重，演示更流畅GPT 训练是如何实现的因果自注意力：下三角 mask 确保只看历史（src/model.py:98）Teacher Forcing：输入拼接“用户/prompt + 助手 + 答案”，仅对答案段计算损失（src/data.py:24–31）目标对齐：忽略区间为len(prefix)-1，确保第一个答案 token 参与训练（src/data.py:28–31）损失函数：CrossEntropyLoss(ignore_index=-100)（src/train.py:50）如何保证“回答可用”分词器解码器：HF BPE 设置 ByteLevel 解码器，彻底消除中文乱码（src/build_tokenizer.py:6–8）目标对齐修复：忽略len(prefix)-1，避免答案错位（src/data.py:28–31）推理约束：首步屏蔽PAD/BOS/UNK，前若干步屏蔽EOS，避免空答（src/infer.py:41–50, 68–73）开头清理：剔除首字符标点与空白（src/infer.py:26–30, 82–83）提示词规范化：去中文空格（src/infer.py:35–37）停止词/重复惩罚：控制尾部冗余与重复（src/infer.py:68–73）训练耗时与评估：日志实时打印eval loss与elapsed，课时内可观测质量（src/train.py:71–82）step by step1. 安装依赖python -m pip install -r requirements.txt2. 构建中文分词器（HF ByteLevel BPE）python -m src.build_tokenizer3. 配置核对config.yaml 中：data.train_path: data/train.jsonldata.val_path: data/val.jsonltokenizer.type: hf_tokenizerstokenizer.path: tokenizer/tokenizer.jsontraining.max_steps: 1500–2000（课堂机器允许的话）4. 训练（仅 CPU）python -m src.train观察日志：每eval_interv…