K8s Lab 把当前仓库文档整理成一个可阅读的网页站点

Repository Reading Site

本轮操作记录:大模型训练与模型产物概念文撰写

这一轮继续沿着大模型课程主线推进,把“数据之后到底发生了什么”这一段彻底讲清楚。 目标有四个: 1. 把训练过程从前向、损失、反向、优化器讲透。 2. 把预训练、SFT、LoRA、checkpoint、adapter、merged model 的边界讲透。 3. 补一组可直接查看的训练产物样例,帮助读者建立磁盘直觉。 4. 继续保持“课程正文 + 操作记录

Markdown20-操作记录-大模型训练与模型产物概念文撰写.md2026年4月10日 10:53

本轮操作记录:大模型训练与模型产物概念文撰写

本轮目标

这一轮继续沿着大模型课程主线推进,把“数据之后到底发生了什么”这一段彻底讲清楚。

目标有四个:

  1. 把训练过程从前向、损失、反向、优化器讲透。
  2. 把预训练、SFT、LoRA、checkpoint、adapter、merged model 的边界讲透。
  3. 补一组可直接查看的训练产物样例,帮助读者建立磁盘直觉。
  4. 继续保持“课程正文 + 操作记录 + 示例资产”的教学结构。

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

读者很容易又回到“背参数”的状态。

所以我先把这一课真正要解决的问题定义为:

  1. 训练到底在优化什么
  2. 一条样本如何穿过模型
  3. 前向、反向、优化器的边界
  4. 为什么训练这么吃显存
  5. 预训练、继续预训练、SFT、偏好优化的边界
  6. LoRA 的数学和工程直觉
  7. checkpoint 和最终模型的边界
  8. 训练产物、部署产物、推理运行时产物的边界
  9. 企业里如何记录模型血缘

原理解释

这一步本质上是在防止课程写成:

  • 名词堆叠
  • 框架参数手册
  • 操作命令流水账

而是强行把主线拉回到:

  • 原理
  • 分层
  • 边界
  • 工程判断

Step 4:决定不仅写正文,还要补“训练产物样例目录”

为什么不能只写文字

因为“训练产物”这件事如果只靠抽象描述,小白很容易继续糊涂:

  • base model 是一个文件吗
  • adapter 是一个目录吗
  • checkpoint 和模型目录有什么区别
  • 为什么线上还会有 runtime package

这些问题,光靠定义很难彻底讲透。

我新增的位置

为什么放这里

原因和第 19 课一致:

  1. 这是学习样本资产,天然属于 ml-platform/examples
  2. 不污染根目录课程主线
  3. 后续如果继续写推理、评测、模型发布,可以继续沿这个目录扩展

原理解释

文档和样本资产最好同时存在:

  • 文档负责解释概念
  • 样本负责展示“实际长相”

对于大模型这种目录结构复杂、产物形态多的系统,这种搭配尤其重要。


Step 5:设计样例目录时,我没有只放一个配置文件,而是按生命周期拆了 7 类产物

我新增的样例文件

为什么要按生命周期拆开

因为如果我只给一个:

  • model-output

读者依然会模糊:

  • 这是训练中间态
  • 还是训练完成态
  • 还是可部署态
  • 还是推理引擎专用态

而我这次故意把它们拆成:

  1. 训练配置
  2. 训练运行元数据
  3. checkpoint
  4. base model
  5. adapter
  6. merged model
  7. runtime package

就是为了让你直接建立阶段边界。

原理解释

这不是“多放几个文件显得丰富”,而是在训练一种专家最重要的能力:

看到一个产物目录时,立刻判断它属于训练生命周期的哪一层。


Step 6:样例里故意没有塞真实权重,而是保留真实文件名和文本说明

为什么这样设计

真实项目里的大模型产物通常包括:

  • model.safetensors
  • adapter_model.safetensors
  • optimizer.pt
  • scheduler.pt

这些文件:

  • 体积大
  • 很多是二进制
  • 不适合直接放进学习仓库

但如果完全不出现这些名字,读者又会缺少真实感。

所以我做了什么折中

我在样例里保留了:

  • 真实目录结构
  • 真实文件命名
  • 真实元数据配置

同时用:

  • files-manifest.txt
  • checkpoint-files.txt
  • adapter-files.txt

来说明二进制文件本来会是什么。

原理解释

这是一个很实用的教学策略:

用“真实结构 + 轻量文本说明”替代“直接塞大二进制文件”。

这样既保留工程感,又不会让仓库失控。


Step 7:正文里把训练过程强行拆成“样本 -> token -> 向量 -> logits -> loss -> 梯度 -> 参数更新”

为什么要这样写

很多训练文档最大的坏习惯是:

  • 一上来就是参数和命令

这样读者很容易学成:

  • 会抄脚本
  • 不懂原理

所以我在:

里,先强行把最小计算链写清楚:

样本 -> tokenizer -> token ids -> embedding -> Transformer -> logits -> loss -> backward -> optimizer.step()

原理解释

这一条链一旦理解了,后面很多概念都会自动归位:

  • 为什么 tokenizer 错了会出大问题
  • 为什么 loss 下降不等于业务指标提升
  • 为什么 optimizer state 要保存
  • 为什么 checkpoint 不等于最终模型

Step 8:正文里特别强调了几个最容易混淆的边界

我刻意强化的边界

  1. 训练目标 vs 知识存储
  2. 前向传播 vs 反向传播 vs 优化器
  3. gradient_checkpointing vs checkpoint 保存
  4. 预训练 vs 继续预训练 vs SFT vs DPO
  5. base model vs adapter
  6. checkpoint vs final model
  7. merged model vs runtime package
  8. 模型文件名 vs 真正的模型版本

为什么要把边界讲得这么“啰嗦”

因为小白最容易死在“词看起来差不多,实际不是一回事”的地方。

比如:

  • checkpoint

既可能指:

  • 训练保存点

也可能在某些人口里被含混地指:

  • 某个模型文件

再比如:

  • gradient checkpointing

和:

  • save checkpoint

名字很像,但原理完全不同。

原理解释

专家能力里很大一部分,不是记住更多词,而是:

看见相似名词时,能迅速判断它们是不是同一层的概念。


Step 9:模型 registry 示例是为了提前建立“模型血缘”意识

为什么这一轮就把 registry 拉进来

因为一旦只讲训练本身,读者很容易形成错觉:

  • 训练完就结束了

真实企业里不是这样的。

真实企业更关心:

  • 这个模型来自哪次训练
  • 用了哪版数据
  • 对应哪次代码提交
  • 评测结果如何
  • 安全和治理审批过没过

所以我加了:

原理解释

这是在提前训练一种平台思维:

  • 模型不是文件
  • 模型是资产
  • 资产必须可追踪

如果没有血缘,出了问题你只能靠猜。


Step 10:这次没有去改集群资源,因为当前阶段更适合先把概念和产物边界立住

为什么这轮没有直接做训练任务上集群

不是因为不能做,而是因为当前课程节奏下,先建立“训练系统观”更重要。

如果现在立刻切到:

  • 真机训练
  • GPU 资源调度
  • 分布式训练
  • 推理部署

读者很容易在还没分清 checkpoint、adapter、merged model 的时候,就被更多命令淹没。

原理解释

课程推进也要讲“依赖关系”。

对于当前用户目标:

  • 不是跟着命令敲通一次
  • 而是最终具备搭平台、做架构、排故障的能力

那么更优顺序是:

  1. 先讲清训练到底做了什么
  2. 再讲这些产物怎么进评测、注册和部署
  3. 再落到集群编排和资源治理

Step 11:创建文件时使用 apply_patch,这是为了精确、可审计地修改仓库

本轮编辑方式

本轮新增文件全部通过 apply_patch 完成,而不是直接用重定向覆盖文件。

为什么这样做

原因有三个:

  1. 变更粒度清晰
  2. 不容易误覆盖其他内容
  3. 更符合面向代码仓库的精确编辑习惯

原理解释

对知识仓库、代码仓库和基础设施仓库来说,可审计、可回看、可对比的改动方式,长期价值远大于“快速写进去”。


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 血缘的工程系统。

你一旦把这条链真正看清,后面无论是做训练平台、做模型发布、还是查推理异常,脑子里都会有正确的分层。