预训练:数据清洗决定上限

现代LLM训练的第一步是预训练,但很多人低估了数据质量的影响。我踩过的坑是:直接拿原始网络数据训练,结果输出全是垃圾。关键在于过滤低质量文本(如重复、乱码、广告),并去重——用MinHash或SimHash,我习惯先跑一遍Bloom filter快速淘汰明显无效样本。

data cleaning pipeline for LLM

对齐:RLHF的实操经验

预训练后,模型会说人话但可能胡编乱造。对齐阶段常用RLHF:

  1. 收集人类偏好数据,让模型生成多个回答,人工排序。
  2. 训练奖励模型(Reward Model),我用DeBERTa-v3做基座,loss用Bradley-Terry模型。
  3. PPO微调,注意KL散度系数设0.1左右,太高模型忘得快,太低奖励模型过拟合。

核心原理:RLHF本质是把人类偏好编码进loss函数,避免纯监督学习导致的“平均化”输出。

部署:量化和推理优化

部署阶段,量化是刚需。我推荐PTQ(Post-Training Quantization)先用校准集算scale和zero-point,比QAT省事。关键代码片段:

python
1 2 3 4 5
import torch
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("model_path")
model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)

注意动态量化只对Linear层生效,且推理时再量化,显存能省一半。

常见问题与避坑

  • 数据泄露:训练集含测试集样本,导致评估虚高——用哈希去重时保留测试集ID。
  • RLHF不稳定:奖励模型训练时,如果正负样本比例失衡,加focal loss。
  • 量化精度下降:针对敏感层(如attention的QKV)保留FP16,我用混合精度量化,损失控制在1%以内。

调参心得:学习率用cosine decay + warmup,batch size按显存尽可能大,但别超过2048,否则收敛变慢。