Repository Reading Site
本轮操作记录:大模型训练与模型产物概念文撰写
这一轮继续沿着大模型课程主线推进,把“数据之后到底发生了什么”这一段彻底讲清楚。 目标有四个: 1. 把训练过程从前向、损失、反向、优化器讲透。 2. 把预训练、SFT、LoRA、checkpoint、adapter、merged model 的边界讲透。 3. 补一组可直接查看的训练产物样例,帮助读者建立磁盘直觉。 4. 继续保持“课程正文 + 操作记录
本轮操作记录:大模型训练与模型产物概念文撰写
本轮目标
这一轮继续沿着大模型课程主线推进,把“数据之后到底发生了什么”这一段彻底讲清楚。
目标有四个:
- 把训练过程从前向、损失、反向、优化器讲透。
- 把预训练、SFT、LoRA、checkpoint、adapter、merged model 的边界讲透。
- 补一组可直接查看的训练产物样例,帮助读者建立磁盘直觉。
- 继续保持“课程正文 + 操作记录 + 示例资产”的教学结构。
Step 1:先回看第 18、19 课,保持课程风格连续
实际命令
sed -n '1,240p' /Users/yuanjun/coding/github/k8s-lab/18-第十八课-大模型全生态-从数据到训练到部署到治理原理.md
sed -n '1,260p' /Users/yuanjun/coding/github/k8s-lab/19-第十九课-大模型数据集-清洗-标注-切分-版本管理与质量治理原理.md
sed -n '1,240p' /Users/yuanjun/coding/github/k8s-lab/18-操作记录-大模型全生态与基础原理科普文撰写.md
sed -n '1,260p' /Users/yuanjun/coding/github/k8s-lab/19-操作记录-大模型数据集样本与治理文档编写.md
为什么先做这一步
因为我不是单独写一篇文章,而是在续写一条已经形成节奏的专家课程主线。
我需要先确认:
- 标题风格是否一致
- 正文组织方式是否一致
- 操作记录是否继续强调“命令 + 原理 + 设计决策”
命令原理解释
sed -n '1,240p' file
sed是流编辑器-n表示默认不输出所有内容'1,240p'表示只打印第 1 到 240 行
它的好处是:
- 可以快速查看大文件片段
- 不会像整文件输出那样噪声太大
- 适合先抓结构和风格
这一步得到的结论
我确认当前课程已经形成了稳定模式:
- 根目录编号课程正文
- 根目录编号操作记录
- 必要时在
ml-platform/examples下放最小样本
所以第 20 课应该沿用这个结构,不需要另起炉灶。
Step 2:检查 ml-platform 里现有训练上下文,避免新课脱离仓库实际
实际命令
find /Users/yuanjun/coding/github/k8s-lab/ml-platform -maxdepth 3 -type f | sort | sed -n '1,240p'
sed -n '1,260p' /Users/yuanjun/coding/github/k8s-lab/ml-platform/training/train.py
sed -n '1,260p' /Users/yuanjun/coding/github/k8s-lab/ml-platform/docs/ml-pipeline.md
为什么要查这一步
虽然这一轮主要写的是大模型概念,但课程最终是要服务你在这个仓库里的完整学习路径。
所以我需要确认:
- 现有
ml-platform里已经有什么训练内容 - 这些内容更偏传统 ML 还是偏大模型
- 新增的大模型课程和现有内容怎么衔接
命令原理解释
find ... -type f
find用来递归查找文件-maxdepth 3限制搜索深度,避免输出过多-type f只看文件,不看目录
sort
- 按字典序排序,便于稳定查看
sed -n '1,240p'
- 截取前 240 行,快速了解整体结构
我看到的结果
ml-platform 当前已有:
- 传统 ML 训练脚本
- 推理服务
- Operator
- manifests
也已经有:
但这套内容的重点是:
- 传统机器学习
- ONNX/JSON 导出
- Go 推理
而不是:
- 大模型训练
- LoRA
- checkpoint
- tokenizer
- adapter
原理解释
这一步帮我确认了一个关键点:
第 20 课不应该修改现有传统 ML 文档,而应该新增一条专门面向大模型训练和模型产物的课程分支。
Step 3:确定第 20 课的课程边界,避免“大模型训练”被讲成参数名词表
这一步我重点定义了什么
如果直接讲:
- learning rate
- batch size
- LoRA rank
- checkpoint save steps
读者很容易又回到“背参数”的状态。
所以我先把这一课真正要解决的问题定义为:
- 训练到底在优化什么
- 一条样本如何穿过模型
- 前向、反向、优化器的边界
- 为什么训练这么吃显存
- 预训练、继续预训练、SFT、偏好优化的边界
- LoRA 的数学和工程直觉
- checkpoint 和最终模型的边界
- 训练产物、部署产物、推理运行时产物的边界
- 企业里如何记录模型血缘
原理解释
这一步本质上是在防止课程写成:
- 名词堆叠
- 框架参数手册
- 操作命令流水账
而是强行把主线拉回到:
- 原理
- 分层
- 边界
- 工程判断
Step 4:决定不仅写正文,还要补“训练产物样例目录”
为什么不能只写文字
因为“训练产物”这件事如果只靠抽象描述,小白很容易继续糊涂:
- base model 是一个文件吗
- adapter 是一个目录吗
- checkpoint 和模型目录有什么区别
- 为什么线上还会有 runtime package
这些问题,光靠定义很难彻底讲透。
我新增的位置
为什么放这里
原因和第 19 课一致:
- 这是学习样本资产,天然属于
ml-platform/examples - 不污染根目录课程主线
- 后续如果继续写推理、评测、模型发布,可以继续沿这个目录扩展
原理解释
文档和样本资产最好同时存在:
- 文档负责解释概念
- 样本负责展示“实际长相”
对于大模型这种目录结构复杂、产物形态多的系统,这种搭配尤其重要。
Step 5:设计样例目录时,我没有只放一个配置文件,而是按生命周期拆了 7 类产物
我新增的样例文件
- README.md
- 00-sft-lora-training-config.yaml
- 01-run-metadata.json
- 02-checkpoint/checkpoint-000120/trainer_state.json
- 02-checkpoint/checkpoint-000120/training_args.json
- 02-checkpoint/checkpoint-000120/checkpoint-files.txt
- 03-base-model/config.json
- 03-base-model/generation_config.json
- 03-base-model/tokenizer_config.json
- 03-base-model/special_tokens_map.json
- 03-base-model/tokenizer.json
- 03-base-model/files-manifest.txt
- 04-adapter/adapter_config.json
- 04-adapter/adapter-files.txt
- 05-model-registry/model-version.yaml
- 06-merged-model/files-manifest.txt
- 07-runtime-package/runtime-manifest.yaml
为什么要按生命周期拆开
因为如果我只给一个:
model-output
读者依然会模糊:
- 这是训练中间态
- 还是训练完成态
- 还是可部署态
- 还是推理引擎专用态
而我这次故意把它们拆成:
- 训练配置
- 训练运行元数据
- checkpoint
- base model
- adapter
- merged model
- runtime package
就是为了让你直接建立阶段边界。
原理解释
这不是“多放几个文件显得丰富”,而是在训练一种专家最重要的能力:
看到一个产物目录时,立刻判断它属于训练生命周期的哪一层。
Step 6:样例里故意没有塞真实权重,而是保留真实文件名和文本说明
为什么这样设计
真实项目里的大模型产物通常包括:
model.safetensorsadapter_model.safetensorsoptimizer.ptscheduler.pt
这些文件:
- 体积大
- 很多是二进制
- 不适合直接放进学习仓库
但如果完全不出现这些名字,读者又会缺少真实感。
所以我做了什么折中
我在样例里保留了:
- 真实目录结构
- 真实文件命名
- 真实元数据配置
同时用:
files-manifest.txtcheckpoint-files.txtadapter-files.txt
来说明二进制文件本来会是什么。
原理解释
这是一个很实用的教学策略:
用“真实结构 + 轻量文本说明”替代“直接塞大二进制文件”。
这样既保留工程感,又不会让仓库失控。
Step 7:正文里把训练过程强行拆成“样本 -> token -> 向量 -> logits -> loss -> 梯度 -> 参数更新”
为什么要这样写
很多训练文档最大的坏习惯是:
- 一上来就是参数和命令
这样读者很容易学成:
- 会抄脚本
- 不懂原理
所以我在:
里,先强行把最小计算链写清楚:
样本 -> tokenizer -> token ids -> embedding -> Transformer -> logits -> loss -> backward -> optimizer.step()
原理解释
这一条链一旦理解了,后面很多概念都会自动归位:
- 为什么 tokenizer 错了会出大问题
- 为什么 loss 下降不等于业务指标提升
- 为什么 optimizer state 要保存
- 为什么 checkpoint 不等于最终模型
Step 8:正文里特别强调了几个最容易混淆的边界
我刻意强化的边界
- 训练目标 vs 知识存储
- 前向传播 vs 反向传播 vs 优化器
gradient_checkpointingvs checkpoint 保存- 预训练 vs 继续预训练 vs SFT vs DPO
- base model vs adapter
- checkpoint vs final model
- merged model vs runtime package
- 模型文件名 vs 真正的模型版本
为什么要把边界讲得这么“啰嗦”
因为小白最容易死在“词看起来差不多,实际不是一回事”的地方。
比如:
checkpoint
既可能指:
- 训练保存点
也可能在某些人口里被含混地指:
- 某个模型文件
再比如:
gradient checkpointing
和:
- save checkpoint
名字很像,但原理完全不同。
原理解释
专家能力里很大一部分,不是记住更多词,而是:
看见相似名词时,能迅速判断它们是不是同一层的概念。
Step 9:模型 registry 示例是为了提前建立“模型血缘”意识
为什么这一轮就把 registry 拉进来
因为一旦只讲训练本身,读者很容易形成错觉:
- 训练完就结束了
真实企业里不是这样的。
真实企业更关心:
- 这个模型来自哪次训练
- 用了哪版数据
- 对应哪次代码提交
- 评测结果如何
- 安全和治理审批过没过
所以我加了:
原理解释
这是在提前训练一种平台思维:
- 模型不是文件
- 模型是资产
- 资产必须可追踪
如果没有血缘,出了问题你只能靠猜。
Step 10:这次没有去改集群资源,因为当前阶段更适合先把概念和产物边界立住
为什么这轮没有直接做训练任务上集群
不是因为不能做,而是因为当前课程节奏下,先建立“训练系统观”更重要。
如果现在立刻切到:
- 真机训练
- GPU 资源调度
- 分布式训练
- 推理部署
读者很容易在还没分清 checkpoint、adapter、merged model 的时候,就被更多命令淹没。
原理解释
课程推进也要讲“依赖关系”。
对于当前用户目标:
- 不是跟着命令敲通一次
- 而是最终具备搭平台、做架构、排故障的能力
那么更优顺序是:
- 先讲清训练到底做了什么
- 再讲这些产物怎么进评测、注册和部署
- 再落到集群编排和资源治理
Step 11:创建文件时使用 apply_patch,这是为了精确、可审计地修改仓库
本轮编辑方式
本轮新增文件全部通过 apply_patch 完成,而不是直接用重定向覆盖文件。
为什么这样做
原因有三个:
- 变更粒度清晰
- 不容易误覆盖其他内容
- 更符合面向代码仓库的精确编辑习惯
原理解释
对知识仓库、代码仓库和基础设施仓库来说,可审计、可回看、可对比的改动方式,长期价值远大于“快速写进去”。
Step 12:最后做结果核对,确认第 20 课和样例目录都已落盘
实际命令
find /Users/yuanjun/coding/github/k8s-lab/ml-platform/examples/20-llm-training -type f | sort
sed -n '1,260p' /Users/yuanjun/coding/github/k8s-lab/20-第二十课-大模型训练-SFT-LoRA-Checkpoint-Adapter与模型产物原理.md
sed -n '1,260p' /Users/yuanjun/coding/github/k8s-lab/ml-platform/examples/20-llm-training/README.md
命令原理解释
find path -type f | sort
- 用于确认目录里实际落了哪些文件
sort让输出稳定,方便比对
再次用 sed -n 看新文档,是为了确认:
- 文件已经写入
- 标题、段落、链接没有明显错误
这一步的意义
很多人写完文档就算结束,但对工程化工作来说,落盘校验是必要动作。
这和写代码后跑测试是同一类思维:
- 不是“我觉得应该对”
- 而是“我确认它已经按预期存在”
本轮产出
课程正文
操作记录
训练产物样例
这一轮最重要的学习收获
如果你只能带走一句话,我希望是这句:
大模型训练不是“跑出一个权重文件”这么简单,而是一整套从样本、tokenizer、优化过程、checkpoint、模型产物到 registry 血缘的工程系统。
你一旦把这条链真正看清,后面无论是做训练平台、做模型发布、还是查推理异常,脑子里都会有正确的分层。