一、核心基础概念篇

1. Loss 损失函数

1)定义

Loss = 模型生成文字 和 标准答案文字 的差距得分,分数越高,模型越不准
大模型微调默认使用交叉熵损失 CrossEntropyLoss
训练只计算 assistant 回复部分的loss,用户提问、系统提示词不参与损失计算。

2)loss数值分级(1.5B/1.7B轻量模型通用标准)

  • 5~7:初始状态,模型完全不懂任务,乱写,刚启动训练必出现
  • 3~4:初步学习,能看懂指令,但格律、句式、逻辑经常出错(你当前阶段)
  • 1.8~2.5:合格区间,生成内容稳定贴合你的数据集风格
  • 1.0~1.7:拟合优秀,专属风格明显,写诗工整
  • <1.0:严重过拟合,只会背诵训练集,陌生主题完全写崩

3)两种loss区分

  1. Train loss 训练损失
    在训练数据上计算,代表模型对见过的数据掌握程度,震荡、下降都正常。
  2. Val loss / Valid loss 验证损失
    单独拆分出没参与训练的样本,用来判断泛化能力:
  3. train loss下降 + val loss同步缓慢下降:正常学习
  4. train loss持续走低,val loss开始反弹:过拟合,立刻停止训练

4)loss震荡原因(你多次遇到)

  • 学习率固定、无衰减
  • 数据集样本少、风格单一
  • batch size太小,单批次数据波动大

2. Learning Rate 学习率 --learning-rate

1)作用

控制每一轮训练更新模型参数的幅度,相当于下山找谷底的步长。
示例 1e-4 = 0.0001,2e-4 = 0.0002。

2)大小利弊

  • 学习率过大(≥3e-4):步子太大,loss来回横跳、无法收敛,甚至越训越高
  • 学习率过小(≤5e-5):学习速度极慢,上千轮loss下降微弱,浪费时间
  • 推荐LoRA区间:1e-4 ~ 2e-4

3)学习率调度 --lr-schedule cosine

固定lr全程步长不变,后期容易震荡;
cosine余弦衰减:前期大步快速学习,训练后半段自动缩小步长,loss更容易平稳走低,解决震荡。


3. LoRA 微调(你全程在用,核心轻量化方案)

1)什么是LoRA

全称 Low-Rank Adaptation,低秩适配微调。
不改动原始大模型权重,只训练两层极小的辅助矩阵,训练完成保存几十MB的适配器文件。
优势:内存占用极低,Mac Air 4bit量化下仅2~4GB内存,不用高端显卡。

2)关键参数 --num-layers(mlx-lm中代表LoRA Rank)

  • rank=8:内存占用最低,学习能力弱,适合极小数据集
  • rank=16:均衡通用,诗词微调首选,兼顾效果与内存
  • rank=32:拟合能力更强,内存占用小幅上升

3)LoRA文件结构(推理报错根源)

训练输出文件夹 adapters 必须包含两个文件才能推理:

  1. adapter_config.json:LoRA超参配置,推理必须读取
  2. adapters.safetensors:最新一轮权重快照
    每200/500轮保存的 000xxx_adapters.safetensors 只是单独权重文件,缺少配置,不能直接单独加载推理

4)两种微调对比

  1. LoRA微调(你在用):低内存、速度快、适合本地Mac,仅训练少量参数
  2. 全参数微调 Full Fine-tune:修改模型全部权重,1.7B模型需要20GB+内存,Mac Air完全跑不动,不推荐

4. 量化 -q 4bit量化

1)作用

把模型权重从高精度浮点压缩到4bit存储,内存直接减少70%左右
你本地转换命令 mlx_lm.convert -q 就是开启4bit量化。

2)优缺点

  • 优点:Mac Air可跑1.7B模型,峰值内存仅2~3GB,速度流畅
  • 缺点:模型基础能力轻微下降,微调后可弥补差距

3)权重类型区分

  1. 原生HF FP16:完整精度,体积巨大,本地转换前原始文件
  2. MLX 4bit量化:M芯片专用,mlx-lm训练/推理最优
  3. GGUF:llama.cpp/Ollama专用,不适合MLX微调

二、训练命令通用参数基础(mlx-lm)

1. 训练相关参数(mlx_lm.lora)

  1. --iters:总迭代轮数,一轮代表一个batch数据
    小诗词数据集推荐600~1000,超过1200极易过拟合
  2. --batch-size:单次同时输入多少条样本
    Mac 16GB推荐2,8GB只能设1
  3. --grad-accumulation-steps 梯度累积
    内存不足时使用,batch-size=2 + grad-accumulation-steps=2 等效batch=4,不增加内存占用
  4. --save-every:每多少轮保存一次快照权重
  5. --steps-per-eval:每多少轮计算一次val loss,监控过拟合

2. 推理生成参数(mlx_lm.generate)

  1. --temp 温度,控制生成随机性

    • 0.1~0.5:文风严谨、格律规整,写诗首选
    • 0.6~1.0:创意更强,容易出现不合律句子
  2. --top-p 核采样,默认0.9即可,不用改动
  3. --max-tokens:最大输出字数,诗词200~300足够
  4. --use-default-chat-template
    强制使用Qwen官方对话模板,和训练数据集格式对齐,不加这条生成会严重跑偏

3. 工具参数区分(高频踩坑点)

  • --resume-adapter-file仅训练lora命令可用,generate推理不支持
  • 推理加载历史快照权重方案:复制快照权重覆盖文件夹内 adapters.safetensors

三、数据集基础(poetry_dataset)

1. 标准格式 Qwen messages 模板

微调必须统一对话格式,否则loss居高不下、训练无效

{
  "messages": [
    {"role": "system", "content": "你是专业古典诗词创作助手,严守词牌格律"},
    {"role": "user", "content": "请写一首秋思主题七言绝句"},
    {"role": "assistant", "content": "完整诗词正文"}
  ]
}

2. 训练集/验证集划分

  • train.jsonl:用来更新模型权重,占90%数据
  • valid.jsonl:仅用来计算val loss,不参与权重更新,判断过拟合

    3. 数据集大小影响

    样本过少:loss持续震荡,泛化差;
    样本充足:loss平稳下降,陌生指令也能正常生成诗词。


四、训练硬件与内存相关

  1. Peak mem 峰值内存:训练全程占用最大内存,你稳定2GB左右,M系列统一内存无压力
  2. Tokens/sec:每秒处理文字token数量,数值越高速度越快,300左右属于Mac Air正常水平
  3. 梯度检查点 --grad-checkpoint:牺牲少量速度,大幅降低内存占用,8GB内存必加

五、训练正常/异常现象判断

正常训练表现

  1. 初始val loss 5~7,持续缓慢下降
  2. train loss整体下行,小幅震荡
  3. val loss同步下行,无持续反弹

异常情况&解决方案

  1. loss全程居高不下、不下降
    原因:数据集格式错误、学习率不合适、对话模板不匹配
  2. loss暴跌后突然飙升
    原因:学习率过大,模型发散,降低lr并开启cosine衰减
  3. train loss很低,val loss持续走高
    原因:过拟合,减少iters、扩充数据集、降低LoRA rank
  4. 内存溢出OOM
    开启4bit量化、减小batch、开启梯度检查点、梯度累积

六、完整学习流程闭环(你的项目链路)

  1. 数据源:shi-ci.cn 获取干净完整结构化诗词原始文本
  2. 数据集制作:poetry_dataset 生成标准messages格式jsonl训练文件
  3. 模型准备:转换HF权重为MLX 4bit量化模型
  4. LoRA本地微调:M系列Mac Air使用mlx-lm训练,监控train/val loss
  5. 推理测试:加载LoRA适配器,输入诗词指令生成专属作品