1、数据集
https://huggingface.co/datasets/MLZoo/DPO-bad-boy-chinese-for-Qwen2.5/tree/main
2、百度这边
https://console.bce.baidu.com/qianfan/train/ft/new
3、创建数据集
https://console.bce.baidu.com/qianfan/data/dataset/create?templateType=2000


最终实际上我选用的是jsonl格式,这个格式似乎更好用一些

然后看了一下数据集合,有点麻烦啊。。。需要写一段python来转换才行
mkdir sft_data_prepare
cd sft_data_prepare
uv init
uv venv
import csv
import json
def process_dataset(input_path):
result = []
system_prompt = "你是一个没有礼貌的人渣,请用人渣的语气回复我"
with open(input_path, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f, fieldnames=["prompt", "chosen", "rejected"])
next(reader) # 跳过标题行
for i, row in enumerate(reader, 1):
try:
# 提取用户问题
user_part = row["prompt"].split("<|im_start|>user")[1]
user_query = user_part.split("<|im_end|>")[0].strip()
# 处理chosen响应
chosen_content = row["chosen"].strip('"')
if "," in chosen_content:
chosen_response = chosen_content.split(",", 1)[1].strip()
else:
chosen_response = chosen_content
result.append({
"system": system_prompt,
"prompt": user_query,
"response": chosen_response
})
except Exception as e:
print(f"处理第 {i} 行时出错: {str(e)}")
print(f"问题数据: {row}")
continue
return result
def save_to_jsonl(data, output_path):
with open(output_path, 'w', encoding='utf-8') as f:
for item in data:
# 将每个字典包装成列表
json_line = json.dumps([item], ensure_ascii=False)
f.write(json_line + '\n')
if __name__ == "__main__":
# 处理数据
processed_data = process_dataset("train.csv")
print(f"成功处理 {len(processed_data)} 条数据")
# 保存为特殊格式的JSONL
output_file = "output.jsonl"
save_to_jsonl(processed_data, output_file)
print(f"数据已保存至:{output_file}")
# 打印首条示例
print("\n首条数据示例:")
print(json.dumps([processed_data[0]], ensure_ascii=False, indent=2))
用R1写了一段转换程序

拿到处理后的数据集
选择这个数据集的原因是,足够小。。。只有4000行嘴臭的回复

导入后还需要发布


然后回到SFT里,才能选择这个数据集

计费是0.42到0.68
倒是很便宜

OK,开始排队。。。这就很随机了
等吧

等了5分钟吧,开始了。。。然后进度其实也很慢
3799的训练数据和201条的eval数据

用了4分钟进行数据处理

也可以看到训练过程的可视化

观察模型训练图(如当前的训练损失 `training/loss` 和学习率 `training/lr` 曲线),可从以下维度系统分析:
### 1. 理解图表指标含义
- **`training/loss`(训练损失)**:反映模型在训练过程中预测值与真实值的误差。理想情况下,损失应随训练逐步下降并趋于稳定。
- **`training/lr`(学习率)**:体现优化过程中参数更新的步长。多数优化策略(如余弦退火、指数衰减)会让学习率随训练递减,避免后期更新幅度过大。
### 2. 分析曲线趋势
- **训练损失(`training/loss`)**:
- 当前图中损失在 6–8 波动,无明显下降趋势,可能存在问题:
- 学习率设置不合理,导致优化震荡;
- 模型复杂度不足,无法拟合任务;
- 数据噪声大或训练轮次不够。
- **学习率(`training/lr`)**:
- 曲线呈递减趋势,符合常见学习率衰减策略。但结合损失未改善的情况,可能需调整衰减策略(如提前降低学习率),或检查其他训练超参数。
### 3. 综合判断训练状态
- 若损失持续波动且不收敛,即使学习率合理衰减,也需排查数据预处理、模型结构、优化器配置等问题。
- 若损失后期稳定但值较高,可能模型欠拟合,需增加复杂度或训练时长;若损失突然激增,可能过拟合或梯度爆炸。
结果让豆包根据训练
诊断了一下,诊断的结果是。。。。不太行啊。。
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
针对训练损失未收敛的问题,可按以下步骤排查优化:
### 1. **调整学习率策略**
- **初始学习率**:当前损失震荡明显,可能初始学习率过高。尝试降低初始学习率(如从 `1e-6` 调至 `1e-7`),避免优化时“步长”过大导致震荡。
- **衰减策略**:若使用自定义衰减,可换用更温和的方式(如余弦退火衰减),确保学习率在后期仍能引导有效优化。
### 2. **优化模型结构**
- **增加复杂度**:若模型过简单(如层数少、神经元少),无法拟合任务。尝试增加网络层数、神经元数量,或换用更复杂的模型
(如从简单线性模型换为深度神经网络)。
- **正则化调整**:适当添加 Dropout、L2 正则化,防止过拟合(若损失后期波动是过拟合导致)。
### 3. **检查数据质量**
- **预处理**:确认数据归一化/标准化是否正确(如图像像素值是否归一化到 [0, 1],数值特征是否标准化)。
- **数据清洁**:排查是否存在标签错误、异常样本,清洗数据后重新训练。
- **类别平衡**:若为分类任务,检查类别是否失衡,可通过过采样(如 SMOTE)或调整损失函数权重解决。
### 4. **调整训练配置**
- **延长训练轮次**:若训练轮次(epoch)不足,模型未充分收敛,可增加训练轮次。
- **调整 Batch Size**:若 Batch Size 过小,梯度估计噪声大,尝试调大(如从 16 增至 32);若过大导致内存不足,适当减小。
### 5. **更换损失函数/优化器**
- **损失函数适配**:确认损失函数是否匹配任务(如分类用交叉熵,回归用 MSE)。若任务特殊,可尝试自定义损失。
- **优化器替换**:换用自适应优化器(如 Adam、Adagrad),部分优化器对参数初始化和学习率更鲁棒。
**验证流程**:每调整一个变量(如学习率、模型结构)后,单独训练验证效果,逐步定位问题,避免多变量调整导致无法归因。
看了一下,大概率是数据量太少了,欠拟合
针对 SFT 任务训练未收敛问题,结合数据集、底模特性,可按以下步骤优化:
### 1. **数据层面优化**
- **质量核查**:检查 4000 条数据是否存在标注错误、格式混乱(如输入-输出对不匹配),确保监督信号准确。
- **数据多样性**:分析数据是否覆盖任务全场景(如对话风格、语义类型),若单一,可尝试数据增强(如改写、回译)或补充高质量样本。
### 2. **训练超参数调整**
- **学习率适配**:SFT 任务通常用较低学习率(如 `5e-6` 或 `1e-5`),避免蒸馏模型参数更新幅度过大。搭配线性衰减策略,训练后期缓慢降低学习率。
- **Batch Size 优化**:尝试中等 Batch Size(如 8、16),平衡内存占用与梯度稳定性。过小易受噪声干扰,过大可能导致训练不稳定。
- **训练轮次(Epoch)**:若当前 Epoch 不足,适当增加(如从 3 增至 5),给模型更多拟合时间。
### 3. **模型适配调整**
- **参数更新策略**:确认底模的训练配置(如 LoRA、全量微调)。若用 LoRA,检查秩(Rank)、适配器层是否正确启用,确保参数有效更新。
- **模型负载匹配**:蒸馏模型容量有限,若任务复杂,可简化目标(如先聚焦核心场景训练),或尝试冻结部分底层参数,仅微调上层/适配器层。
### 4. **训练过程监控**
- **梯度检查**:训练中打印梯度范数,若出现梯度爆炸(范数过大),添加梯度裁剪(如 `clip_grad_norm_`);若梯度消失,检查优化器、学习率设置。
- **损失计算验证**:复查损失函数代码逻辑,确保输入输出维度匹配,无因数据处理错误(如 padding 未正确屏蔽)导致的无效计算。
通过以上步骤逐步排查,优先调整学习率、Batch Size 等易优化项,再深入数据和模型结构层面,定位训练未收敛的核心问题。
从图中指标看:
- **validation/loss(验证损失)**:曲线整体平稳,仅有微小下降,说明模型在验证集上的误差未显著降低,未有效学习到数据特征。
- **validation/token_accuracy(token准确率)**:数值低且波动小,反映模型对token级预测的准确性不足,进一步表明模型未充分拟合任务。
综合判断:模型在验证集上表现差,可能存在欠拟合问题,需优化数据质量(如增强标注一致性、丰富样本多样性)、调整超参数
(如学习率、训练轮次)或改进模型结构(如调整微调策略)。
总的来说就是,训练很失败
https://huggingface.co/MLZoo/Qwen2.5-1.5B-Instruct-DPO-bad-boy

原版的模型其实是有记录训练的超参的
对方也是在V100上跑了一小时

然后到服务详情里面看到
我不服气啊
所以按照官方的超参又开了两个训练
一个是R1的1.5b系列,一个是qwen的7b系列

1.5b系列,到了1500步,才终于有点要低头的感觉

qwen呢,结果600步就低头了
行吧
再看看,炼这点东西竟然都需要2个小时以上,这还是百度的服务器啊
两个任务加起来不足1美元
还行
等一下看结果吧