LLM项目实战:使用Llama-factory进行DPO训练

前言

LLM训练三板斧,预训练,微调,RHLF。DPO属于是最后环节RHLF中的一个方法,关于RLHF主流方法有PPO,DPO,GROP。关于这三种介绍RLHF方法,我之前分享过对着三种方法的一些思考,有兴趣的同学可以看看。

因为DPO对硬件的需求最小,显存占用最低,所以我们先采用DPO进行训练。

硬件信息:

4070 12g*2 、64g内存、操作系统:Ubuntu24.04、模型:QWEN-3vl-2B(因为我这个模型是上个多模态任务sft过的,所以选择vl模型,没有图片输入需求的同学可以下载纯语言模型)

本篇教程仅关于DPO训练,请提前配置好环境和下载好LLamafactory(关于llamafactory环境配置其实也是一大头疼的点,注意如果想要使用分布式训练,llamafactory仅支持到deeospeed10.0-16.0,截止到2025年11月20日llamafactory还没有完成对deepspeed最新版本的适配

碎碎念:很多初学大模型的同学还是使用Windows系统进行训练,本人之前也是。但是由于Windows总是出现各种奇怪的报错和显存不稳定等情况,尤其是在多卡训练中,这种情况会更加明显。后来也尝试过wsl2其他替代方案,最后还是发现linux系统有着win无法替代的优势。所以还是建议如果真想长期学习LLM的同学,直接一步到位到linux系统,少走弯路 :)

llamafactory以下简称LF

STEP1 从hugging face下载我们需要的数据库

这里采用的是hugging face中的一个医疗DPO数据集

from datasets import load_dataset # 加载数据集 ds = load_dataset("HANI-LAB/Med-REFL-DPO",'reasoning_enhancement') 
print(ds['train'][:1])

这里看到数据是可以正常加载的

STEP2 对数据进行预处理

由于我们需要使用llamafactory的框架进行dpo训练,所以需要把源arrow格式的文件转为lf能识别的json格式。下面这是官方文档中的规范格式,我们编写一个python程序完成格式的对齐

[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "chosen": "优质回答(必填)", "rejected": "劣质回答(必填)" } ]
import json from datasets import load_dataset import os def convert_arrow_to_json(dataset_path, output_json_path): """ 将 Arrow 格式的数据集转换为指定的 JSON 格式 Args: dataset_path: Arrow 数据集的路径或 Hugging Face 数据集标识 output_json_path: 输出 JSON 文件的路径 """ # 加载数据集 # 如果是本地文件,可以使用 'load_from_disk' if os.path.exists(dataset_path): # 加载本地的 Arrow 数据集 dataset = load_dataset('arrow', data_files=dataset_path) else: dataset = load_dataset(dataset_path, name='reasoning_enhancement') # 获取训练集(根据你的描述,数据在 train split 中) train_dataset = dataset['train'] # 转换为所需的 JSON 格式 output_data = [] for item in train_dataset: # 确保所有必填字段都存在 if 'instruction' in item and 'chosen' in item and 'rejected' in item: json_item = { "instruction": item['instruction'], "input": item.get('input', ''), # input 是选填的,默认空字符串 "chosen": item['chosen'], "rejected": item['rejected'] } output_data.append(json_item) # 保存为 JSON 文件 with open(output_json_path, 'w', encoding='utf-8') as f: json.dump(output_data, f, ensure_ascii=False, indent=2) print(f"转换完成!共处理了 {len(output_data)} 条数据") print(f"JSON 文件已保存到: {output_json_path}") def main(): # 本地 Arrow 文件路径 arrow_file_path = "path/to/your/Reasoning Enhancement.arrow" # 输出 JSON 文件路径 output_json_path = "med_refl_dpo.json" # 执行转换 convert_arrow_to_json(arrow_file_path, output_json_path) if __name__ == "__main__": main() 

完成数据集的标准化后,我们将获得的json文件复制到lf的data目录下。

之后我们需要修改 LLaMaFactory data目录下的dataset_info.json,增加自定义数据集:(官网也给出了添加数据集的标准格式)

"数据集名称": { "file_name": "data.json", "ranking": true, "columns": { "prompt": "instruction", "query": "input", "chosen": "chosen", "rejected": "rejected" } }
"MED_DPO": { "file_name": "/home/zadyd/桌面/xza/LLaMA-Factory/data/med_dpo.json", "ranking": true, "columns": { "prompt": "instruction", "query": "input", "chosen": "chosen", "rejected": "rejected" } },

STEP3 启动LF,选择合适的参数

在lm文件夹下启动终端,输入llamafactory-cli webui启动我们的可视化ui

如果是windows系统,则打开终端cd到lf目录

在网页端设置我们需要的参数,一般像我这样设置就可以

因为我是多卡训练,所以选择了 deepspeed,单卡训练的同学不需要勾选这个选项,本次训练需要 24g 左右的显存,这个显存大小有点尴尬,可以通过开启量化或者减少序列长度节约显存

大概需要 12 个小时,这一步很容易遇到环境不兼容的问题,需要耐心调整,不要心急

STEP4 合并模型

训练完成之后在 export 模块,选择训练好的文件位置,和原始文件进行合并

Read more

DeepSeek、Kimi、笔灵谁最好用?5款网文作者亲测的AI写作神器横评

DeepSeek、Kimi、笔灵谁最好用?5款网文作者亲测的AI写作神器横评

作为在网文圈一路摸爬滚打过来的我,面对“AI写小说”这个现象,心情其实挺复杂的。 这有点像工业革命时期的纺织工人看着蒸汽机——恐惧是真的,但效率的碾压也是真的。 不是纯用AI生成,而是用AI搭建了极其高效的“外挂工作流”。 有人用它日更两万字,有人用它把废稿救活。 当然,不是纯用AI生成,而是用AI搭建了极其高效的“外挂工作流”。为了不让大家白给工具交学费,我实测了市面上十几款软件,挑出了这5款真正能嵌入小说创作流的“神器”。 1️⃣ DeepSeek:除了逻辑强,它还很懂中式网文 适合人群: 玄幻、仙侠、古言作者,以及看重文章设定和逻辑的人。 直通车:https://www.deepseek.com/ 很多人吹DeepSeek的逻辑和代码能力,但在写小说上,它有一个小众的用法是做体系。 👉 独家用法: 你可以用它来写“设定集”和“功法体系”。你可以参考图片中我的指令来和它对话: 它吐出来的东西,特有那味,既有传统网文的爽感,又有你指令里要的感觉。所以虽然它的逻辑能力也在线,但你也不要忽略了它在描写和设定生成上的亮点!

FPGA纯verilog实现JESD204B协议,基于AD9250数据接收,提供3套工程源码和技术支持

FPGA纯verilog实现JESD204B协议,基于AD9250数据接收,提供3套工程源码和技术支持

目录 * 1、前言 * 什么是JESD204B协议? * 官方有Example,为何要用你这个? * 工程概述 * 免责声明 * 2、相关方案推荐 * 我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目 * 我这里已有的 GT 高速接口解决方案 * 我这里已有的 JESD204 高速AD接口解决方案 * 3、工程详细设计方案 * 工程设计原理框图 * JESD204B 硬件设计架构 * 信号输入设备 * AD9250芯片解读 * 纯verilog实现的JESD204B 物理层方案 * 纯verilog实现的JESD204B 数据链路层方案 * 纯verilog实现的JESD204B 传输层方案 * PL端逻辑工程源码架构 * PS端软件工程源码架构 * 4、vivado工程源码1详解-->K7-325T版本 * 5、vivado工程源码2详解-->V7-485T版本 * 6、vivado工程源码3详解-->Zynq7045版本 * 7、工程移植说明 * vi

告别996:GitHub Copilot将我的开发效率提升300%的实战记录

告别996:GitHub Copilot将我的开发效率提升300%的实战记录

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕AI这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * 告别996:GitHub Copilot将我的开发效率提升300%的实战记录 * 引言:从疲惫到高效 * 什么是GitHub Copilot?🤖 * 效率提升300%的核心场景 * 1. 快速生成样板代码 * 2. 自动编写单元测试 * 3. 智能调试与注释 * 集成Copilot到工作流 * 步骤1:设置合理的期望 * 步骤2:结合IDE使用 * 步骤3:代码审查与调整 * 高级用法:超越代码生成 * 数据库查询优化 * API接口设计 * 正则表达式助手 * 数据支撑:效率提升分析 * 避坑指南:常见问题与解决 * 1. 可能生成过时或不安全代码

有图有真相 MATLAB实现基于ACO-DRL 蚁群算法(ACO)结合深度强化学习(DRL)进行无人机三维路径规划(代码已调试成功,可一键运行,每一行都有详细注释) 还请多多点一下关注 加油 谢谢 你

有图有真相 MATLAB实现基于ACO-DRL 蚁群算法(ACO)结合深度强化学习(DRL)进行无人机三维路径规划(代码已调试成功,可一键运行,每一行都有详细注释) 还请多多点一下关注 加油 谢谢 你

有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图 完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估) 含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息) 提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码) 目录 有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图     1 完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)