Views
No views yet
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": "..."})jsonl+HF ByteLevel BPE(显式设置 ByteLevel 解码器,避免乱码)n_layer=4, n_head=4, n_embd=256, seq_len=128batch_size=16, micro_batch=4(有效批 64)torch.set_num_threads(os.cpu_count()),DataLoader 禁用多进程(macOS 下更稳)src/model.py:98)src/data.py:24–31)len(prefix)-1,确保第一个答案 token 参与训练(src/data.py:28–31)CrossEntropyLoss(ignore_index=-100)(src/train.py:50)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)python -m pip install -r requirements.txtpython -m src.build_tokenizerconfig.yaml 中:
data.train_path: data/train.jsonldata.val_path: data/val.jsonltokenizer.type: hf_tokenizerstokenizer.path: tokenizer/tokenizer.jsontraining.max_steps: 1500–2000(课堂机器允许的话)python -m src.traineval_interval步打印eval loss与累计elapsed Xscheckpoints/last.pt、checkpoints/quantized.pt、checkpoints/train_time.txt1# Question1
2python -m src.infer --prompt "什么是注意力机制?" --ckpt checkpoints/last.pt --temperature 0.0 --show_label
3
4# Question2
5python -m src.infer --prompt "解释蒸馏水与纯水区别?" --ckpt checkpoints/last.pt --temperature 0.0 --show_label注意力机制通过分配权重让模型关注关键位置,从而更好地理解序列中的关系。蒸馏水是通过蒸馏获得的水,去除了大部分杂质;纯水是指杂质含量极低的水,制备方式可以是蒸馏、反渗透等。python -m src.infer --prompt "什么是注意力机制?" --stop_strings "。" ";" "\n" --temperature 0.0 --show_labelpython -m src.infer --prompt "什么是注意力机制?" --ckpt checkpoints/quantized.pt --temperature 0.0 --show_labelsrc/model.py:95–103)src/model.py:18–31)src/model.py:41–58)src/data.py:24–31)src/train.py:56–80)src/infer.py:32–83)src/build_tokenizer.py:6–8)说明:src/model.py核心约百行即可完整呈现 GPT 最小闭环;其余文件各自职责清晰,便于教学与修改。
src/model.py:定义 GPT 的模块化组件(RMSNorm、RoPE、自注意力、前馈、残差与权重共享)src/data.py:将{"prompt","completion"}样本转换为模型输入与训练目标(teacher forcing)src/train.py:CPU 训练主循环、评估与保存(含动态量化与耗时统计)src/infer.py:命令行推理与采样策略(含输出清理与停止词)src/tokenizer.py/src/build_tokenizer.py:HF ByteLevel BPE 分词器加载与构建(含 ByteLevel 解码器)src/train.py:21–26,src/tokenizer.py:20–39)src/data.py:66–70,src/train.py:39–40)src/train.py:60–62)→ 反向与梯度累积(src/train.py:62–68)→ 优化与调度(src/train.py:65–69)src/train.py:71–80)→ 导出量化(src/train.py:81–82)RMSNorm.forward(src/model.py:13–16)用均方根缩放激活,结构简洁、计算高效rope(src/model.py:18–31)将相对位置信息旋转注入 Q/K,提高位置泛化SelfAttention.forward(src/model.py:41–58)Q/K/V 分解 → 注意力权重 → 输出投影;含因果 mask 与 DropoutBlock.forward(src/model.py:81–84)注意力与前馈的残差堆叠,RMSNorm 在前GPT.forward(src/model.py:95–103)嵌入 → 堆叠 Block→ 归一化 →LM Head(共享权重)InstructDataset.__init__(src/data.py:10–35)拼接用户:prompt\n助手:为前缀,答案接在后;截断至seq_lentar = ids[1:] + [EOS](src/data.py:24–27)并忽略len(prefix)-1位置(src/data.py:28–31),只对答案段计算损失collate(src/data.py:54–64)按seq_len补齐并返回张量,忽略目标用-100generate(src/infer.py:32–83):
src/infer.py:35–37)EOS,首步屏蔽PAD/BOS/UNK(src/infer.py:41–50, 68–73)src/infer.py:26–30, 82–83)src/build_tokenizer.py:6–8)len(prefix)-1确保第一个答案 token 参与训练(src/data.py:28–31)EOS与无效 token;必要时添加--stop_stringssrc/model.py:103 行src/data.py:70 行src/train.py:104 行src/infer.py:122 行src/tokenizer.py:58 行src/build_tokenizer.py:27 行config.yaml:23 行(不计入核心代码合计)n_layer=4, n_head=4, n_embd=256, seq_len=128;HF ByteLevel BPE 分词器(设置 ByteLevel 解码器);权重共享、RMSNorm、RoPE;AdamW+预热+余弦;梯度累积与裁剪。EOS、提示规范化、输出清理与停止词,避免空答与乱码。d=256、层数 L=4、词表大小 V=824(从 tokenizer/tokenizer.json 读取)。Total = V*d + L*(12*d^2 + 11*d) + dV*d:词嵌入(每个词一个长度为 d 的向量)12*d^2 + 11*d:注意力的线性与投影、前馈两层线性与偏置、两处 RMSNorm 权重合计+ d:最终 RMSNorm 权重V*d = 824*256 = 210,944d^2 = 256*256 = 65,53612*d^2 + 11*d = 12*65,536 + 11*256 = 786,432 + 2,816 = 789,248L*(...) = 4*789,248 = 3,156,992210,944 + 3,156,992 + 256 = 3,368,192params_model=3,368,192)。src/build_tokenizer.py,且其设置了 ByteLevel 解码器;查看推理是否使用 HF 分词器路径--stop_stringsdata/train.jsonl至数百条,并将training.max_steps提升到2000左右。课堂演示请选择temperature=0.0与适当stop_strings,确保“答案可用、与问题相关”。python -m pip install -r requirements.txtpython -m src.build_tokenizerpython -m src.trainpython -m src.infer --prompt "什么是注意力机制?" --temperature 0.0 --show_labelpython -m src.infer --prompt "解释蒸馏水与纯水区别?" --temperature 0.0 --show_labelcheckpoints/last.pt, checkpoints/quantized.pt)由 Git LFS 管理,保证代码仓库轻量且权重传输高效。brew install git-lfssudo apt install git-lfsgit lfs installgit clone <仓库地址>git lfs pullgit lfs ls-files 显示被 LFS 管理的权重文件列表--force 强推一次,其后正常 git push/git pull 即可;协作者如历史被重写,建议重新克隆或 git fetch && git reset --hard origin/main。pip install huggingface_hubhuggingface-cli loginhuggingface-cli repo create gpt_teacher-ckpt -ycheckpoints/last.pt、checkpoints/quantized.pt、tokenizer/tokenizer.json、config.yaml、简要说明 README.mdgit init && git lfs installgit remote add origin https://huggingface.co/<你的用户名>/gpt_teacher-ckptgit add -A && git commit -m "Upload CPU GPT teacher checkpoints"git push -u origin mainhuggingface_hub 的 upload_file/upload_folder 接口,适合脚本化批量上传。last.pt(非量化)、quantized.pt(动态量化,CPU推理更快)tokenizer.json(HF ByteLevel BPE,带 ByteLevel 解码器,避免乱码)config.yaml(模型与训练超参)temperature=0.0 以保证稳态相关性;如需风格演示可开启 top_p/top_k/temperature。--stop_strings "。" ";" "\n" 控制尾部冗余。