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

AI提示词:零基础入门与核心概念

AI提示词:零基础入门与核心概念

AI提示词:零基础入门与核心概念 📝 本章学习目标:理解什么是提示词,掌握提示词的核心概念,建立正确的AI对话思维,为后续学习打下坚实基础。 一、什么是提示词? 1.1 提示词的定义 提示词(Prompt),简单来说,就是你发给AI的指令或问题。它是人类与人工智能沟通的桥梁,是你告诉AI"我想要什么"的方式。 想象一下,你雇佣了一位超级聪明但对你的需求一无所知的助手。这位助手知识渊博、能力强大,但它需要你清晰地告诉它要做什么。提示词就是你给这位助手的工作指令。 💡 核心认知:提示词不是简单的"提问",而是一种结构化的指令设计。好的提示词能让AI精准理解你的意图,输出高质量的结果;糟糕的提示词则会让AI"答非所问",浪费你的时间。 1.2 提示词的重要性 为什么提示词如此重要?让我们通过一个对比来说明: ❌ 糟糕的提示词: 帮我写点东西 ✅ 好的提示词: 请帮我写一篇关于&

支持LoRA和QLoRA的LLama-Factory镜像已发布,轻松节省GPU算力成本

支持LoRA和QLoRA的LLama-Factory镜像已发布,轻松节省GPU算力成本 在大模型时代,一个现实问题困扰着无数开发者:如何用有限的硬件资源微调动辄数十亿参数的语言模型?全参数微调虽然效果好,但一张A100显卡都未必扛得住。而如今,这个问题正在被彻底改写。 随着LoRA与QLoRA技术的成熟,以及LLama-Factory这类集成化框架的推出,我们已经可以在单张RTX 3090上完成7B甚至13B级别模型的高效微调——这在过去几乎是不可想象的。更重要的是,整个过程不再需要编写复杂的训练脚本,非技术人员也能通过图形界面完成定制化训练。 这一切的背后,是参数高效微调(PEFT)与量化技术的深度融合,也是开源社区对“普惠AI”的一次有力实践。 LoRA:让微调变得轻量而高效 传统微调会更新模型中所有参数,以LLaMA-7B为例,约有67亿个可训练参数,光优化器状态就可能占用超过80GB显存。这种资源消耗对于大多数个人或中小企业来说是难以承受的。 LoRA(Low-Rank Adaptation)的出现改变了这一局面。它的核心思想非常巧妙:冻结原始权重,仅引入少量可训练

基于Whisper-large-v3的多语言翻译系统开发

基于Whisper-large-v3的多语言翻译系统开发 想象一下这样的场景:一场国际线上会议正在进行,参会者来自世界各地,说着不同的语言。一位德国同事用德语发言,一位日本伙伴用日语提问,而你作为会议组织者,需要实时理解所有人的发言,并确保沟通顺畅。传统做法是雇佣多名翻译,成本高昂且响应延迟。现在,有了基于Whisper-large-v3构建的多语言翻译系统,这一切都可以自动化完成,而且成本只是传统方案的零头。 本文将带你一步步构建这样一个系统,从语音识别到文本翻译,形成一个完整的流水线。无论你是想为跨国团队开发内部工具,还是想为内容平台添加多语言字幕功能,这套方案都能为你提供一个坚实的起点。 1. 为什么选择Whisper-large-v3? 在开始动手之前,我们先聊聊为什么Whisper-large-v3是构建多语言翻译系统的理想选择。 Whisper-large-v3是OpenAI开源的语音识别模型,它最大的特点就是“多语言”和“高精度”。这个模型在超过100万小时的音频数据上训练过,支持99种语言的识别,包括英语、中文、法语、德语、日语、韩语等主流语言,甚至还能识别

从Obsidian App迁移到Obsidian.nvim:保留所有功能的无缝过渡方案

从Obsidian App迁移到Obsidian.nvim:保留所有功能的无缝过渡方案 【免费下载链接】obsidian.nvimObsidian 🤝 Neovim 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian.nvim Obsidian.nvim是一款将Obsidian的强大功能与Neovim的高效编辑体验完美结合的插件。如果你是Obsidian App的忠实用户,又想体验Neovim带来的极致编辑效率,本文将为你提供一份保留所有功能的无缝迁移指南,让你轻松过渡到Obsidian.nvim的世界。 为什么选择Obsidian.nvim? Obsidian.nvim不仅继承了Obsidian App的核心功能,还融入了Neovim的强大编辑能力。它支持双向链接、标签管理、每日笔记等Obsidian的标志性功能,同时提供了Vim快捷键、代码高亮、插件扩展等Neovim特有的优势。对于习惯使用Obsidian进行知识管理,又追求高效编辑体验的用户来说,Obsidian.nvim是理想的选择。 准备工作:安装Obsidia