从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑

ops/2025/1/23 22:50:02/

文章目录

  • 从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑
    • 一 参考
    • 二 安装
    • 三 启动
      • 准备大模型文件
    • 四 数据集(关键)!
      • 4.1 Alapaca格式
      • 4.2 sharegpt
      • 4.3 在 dataset_info.json 中注册
      • 4.4 官方 alpaca_zh_demo 例子 999条数据, 本机微调 5分钟
      • 4.5 我的数据(关键)
        • 4.6 微调成功但是新模块问答都失败(巨坑)
        • 小数据微调参数!!!
        • 巨坑 数据集的内容,要差异够大!!!
        • TODO 扩展阅读,
    • 五 TODO LLaMaFactory 参数详解

从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑

2025-1-22

老规矩,感谢所有参考文章的作者。少走很多弯路。

一 参考

【1】llama-factory使用教程

这里有各种依赖的版本。 似乎不用。直接安装,一键成功。

【2】学大模型必看!手把手带你从零微调大模型

微调 零一 大模型。

【3】【Qwen2微调实战】LLaMA-Factory框架对Qwen2-7B模型的微调实践

流程主参考文章

【4】LLaMA-Factory QuickStart
【5】官网 gitcode 镜像

【6】LLaMa-Factory部署及llamafactory-cli webui命令无法打开ui界面问题解决记录

私链转公链

二 安装

  • 前置条件

N卡 在 WSL2 Ubuntu22.04 环境下装 cuda toolkit 见这篇文章
WSL2 Ubuntu22.04 部署配置Xinference和所有的坑

  • 安装

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
> 参数‘--depth 1’, 只clone 最近一次 commit后的所有仓库。就是不需要之前的 commit 历史记录。或者下载代码zip 包,解压到本地。
unzip archive.zip -d /path/to/destinationconda create -n llama_factory python=3.10
conda activate llama_factory
cd LLaMA-Factory
pip install -e '.[torch,metrics]'Attempting uninstall: datasets
Found existing installation: datasets 3.2.0
Uninstalling datasets-3.2.0:
Successfully uninstalled datasets-3.2.0
Successfully installed accelerate-1.0.1 contourpy-1.3.1 cycler-0.12.1 datasets-3.1.0 docstring-parser-0.16 fire-0.7.0 fonttools-4.55.3 jieba-0.42.1 joblib-1.4.2 kiwisolver-1.4.8 llamafactory-0.9.2.dev0 matplotlib-3.10.0 nltk-3.9.1 peft-0.12.0 pyparsing-3.2.1 rouge-chinese-1.0.3 shtab-1.7.1 tokenizers-0.20.3 transformers-4.46.1 trl-0.9.6 tyro-0.8.14

一次成功。

  • 验证
import torch
torch.cuda.current_device()
torch.cuda.get_device_name(0)
torch.__version__>>> torch.cuda.get_device_name(0)
'NVIDIA GeForce RTX 4070 SUPER'
>>> torch.__version__
'2.5.1+cu124'
llamafactory-cli train -h(mypy310) rainbow@zy-pc-01:~/LLaMA-Factory-main$ llamafactory-cli train -h
usage: llamafactory-cli [-h] [--ray_run_name RAY_RUN_NAME] [--ray_num_workers RAY_NUM_WORKERS][--resources_per_worker RESOURCES_PER_WORKER][--placement_strategy {SPREAD,PACK,STRICT_SPREAD,STRICT_PACK}]options:-h, --help            show this help message and exit

三 启动

cd /home/***/LLaMA-Factory-main
llamafactory-cli webui

注意:在刚才安装的conda环境下启动

切换到 LLaMA-Factory-main 目录,因为需要识别数据集文件夹

准备大模型文件

下载略
因为我通过 Xinference 已经下载了, 只需要提供路径即可。

Qwen1.5-1.8B
/home/xinference/modelscope/hub/qwen/Qwen1___5-1___8B-Chat/

大模型路径, 设置ok。 就可以 chat。

  • 坑 wsl 下 Ubuntu 浏览器中文乱码
sudo apt-get remove firefox
sudo apt-get remove --purge firefox

卸载 Ubuntu的浏览器, 用 windows 的浏览器就ok。

LLama Factory 运行界面报错问题解决方法-DJT
export GRADIO_ROOT_PATH=xxx

这是解决云端部署中文乱码的。

  • 坑 Failed to create DBus proxy for org.a11y.Bus: Could not connect: No such file or directory

没解决, 是个warning, 貌似没有任何影响。后续微调成功,chat也成功。

四 数据集(关键)!

官网文档

llama_factory/data
这里默认是llama-factory中的data文件夹中的数据,在使用自己的数据集的时候,可以把数据集文件直接放到data文件夹下。
注意,无论是否放到data文件夹下,记得在dataset_info.json 中添加你要用的数据集信息,包括名称和路径,否则在页面中是加载不出来的。

必须! 如果有自定义数据, 必须在dataset_info.json中注册。

【04】LLaMA-Factory微调大模型——数据准备

一、数据格式
LLaMA-Factory支持 alpaca 格式和 sharegpt 格式的数据集。

4.1 Alapaca格式

[{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","system": "系统提示词(选填)","history": [["第一轮指令(选填)", "第一轮回答(选填)"],["第二轮指令(选填)", "第二轮回答(选填)"]]}
]

官方自带例子
alpaca_zh_demo.json

[{"instruction": "识别并解释给定列表中的两个科学理论:细胞理论和日心说。","input": "","output": "细胞理论是生物科学的一个理论,它认为所有生命体都是由微小的基本单元——细胞所构成。这是生物学的一个基础理论,认为细胞是所有生物的基本结构和功能单位,所有的生物都是由一个或多个细胞组成,细胞只能通过细胞分裂产生新的细胞。这一理论由薛定谔、施瓦内和雪莱于1839年首次提出。\n\n日心说是指太阳是太阳系的中心,也就是说,行星围绕太阳旋转的理论。这个理论打破了传统的地心说观点,认为地球并不是宇宙的中心。日心说的提出者是尼古拉·哥白尼,他在16世纪初发表了他的著作《天体运行论》,阐述了太阳系行星围绕太阳运行的模型,为天文学的发展做出了巨大贡献。"},{"instruction": "输入三支篮球队的名称并生成一个适当的口号。","input": "输入:俄克拉荷马城雷霆队,芝加哥公牛队,布鲁克林网队。","output": "输出: \"雷霆,公牛和网队:各显神通,角逐群雄!\""}
]
  • instruction 和 input
    在指令监督微调时,instruction 列对应的内容会与 input 列对应的内容拼接后作为人类指令,
    即人类指令为 instruction\n input。
    而 output 列对应的内容为模型回答。

所以, 上面篮球队的例子中。 AI拿到的输入如下
“输入三支篮球队的名称并生成一个适当的口号。输入:俄克拉荷马城雷霆队,芝加哥公牛队,布鲁克林网队。”

  • system
    如果指定,system 对应的内容将被作为系统提示词。

  • history
    history 是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。

注意在指令监督微调时,历史消息中的回答内容也会被用于模型学习。

4.2 sharegpt

相比 alpaca 格式的数据集,sharegpt 格式支持更多的角色种类,
例如 human、gpt、observation、function 等等。它们构成一个对象列表呈现在 conversations 列中。
其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。

sharegpt 格式如下:

[{"conversations": [{"from": "human","value": "人类指令"},{"from": "function_call","value": "工具参数"},{"from": "observation","value": "工具结果"},{"from": "gpt","value": "模型回答"}],"system": "系统提示词(选填)","tools": "工具描述(选填)"}
]

4.3 在 dataset_info.json 中注册

LLaMA-Factory/data 目录中的 dataset_info.json 文件中包含了所有可用的数据集。
如果使用自定义数据集,首先需要在 dataset_info.json 文件中添加数据集描述,

"数据集名称": {"hf_hub_url": "Hugging Face 的数据集仓库地址(若指定,则忽略 script_url 和 file_name)","ms_hub_url": "ModelScope 的数据集仓库地址(若指定,则忽略 script_url 和 file_name)","script_url": "包含数据加载脚本的本地文件夹名称(若指定,则忽略 file_name)","file_name": "该目录下数据集文件夹或文件的名称(若上述参数未指定,则此项必需)","formatting": "数据集格式(可选,默认:alpaca,可以为 alpaca 或 sharegpt)","ranking": "是否为偏好数据集(可选,默认:False)","subset": "数据集子集的名称(可选,默认:None)","split": "所使用的数据集切分(可选,默认:train)","folder": "Hugging Face 仓库的文件夹名称(可选,默认:None)","num_samples": "该数据集所使用的样本数量。(可选,默认:None)","columns(可选)": {"prompt": "数据集代表提示词的表头名称(默认:instruction)","query": "数据集代表请求的表头名称(默认:input)","response": "数据集代表回答的表头名称(默认:output)","history": "数据集代表历史对话的表头名称(默认:None)","messages": "数据集代表消息列表的表头名称(默认:conversations)","system": "数据集代表系统提示的表头名称(默认:None)","tools": "数据集代表工具描述的表头名称(默认:None)","images": "数据集代表图像输入的表头名称(默认:None)","chosen": "数据集代表更优回答的表头名称(默认:None)","rejected": "数据集代表更差回答的表头名称(默认:None)","kto_tag": "数据集代表 KTO 标签的表头名称(默认:None)"},"tags(可选,用于 sharegpt 格式)": {"role_tag": "消息中代表发送者身份的键名(默认:from)","content_tag": "消息中代表文本内容的键名(默认:value)","user_tag": "消息中代表用户的 role_tag(默认:human)","assistant_tag": "消息中代表助手的 role_tag(默认:gpt)","observation_tag": "消息中代表工具返回结果的 role_tag(默认:observation)","function_tag": "消息中代表工具调用的 role_tag(默认:function_call)","system_tag": "消息中代表系统提示的 role_tag(默认:system,会覆盖 system column)"}
}

对于alpaca 格式的数据,dataset_info.json 中的数据集注册描述应为:


"<your dataset name>": {"file_name": "<your dataset file.json>","columns": {"prompt": "instruction","query": "input","response": "output","system": "system","history": "history"}
}

如上面例子中 alpaca_zh_demo 在dataset_info.json中的注册信息如下。

{"identity": {"file_name": "identity.json"},"alpaca_en_demo": {"file_name": "alpaca_en_demo.json"},"alpaca_zh_demo": {"file_name": "alpaca_zh_demo.json"},
}

数据集注册方便, 大多数参数用默认就好,
最简注册,只需要“数据集名字”和“数据集文件的名字”

4.4 官方 alpaca_zh_demo 例子 999条数据, 本机微调 5分钟

输入三支篮球队的名称并生成一个适当的口号。
俄克拉荷马城雷霆队,芝加哥公牛队,布鲁克林网队

微调之前
俄克拉荷马城雷霆队口号:“Thunderbolts Rule the City!”
芝加哥公牛队口号:“Bulls on the Rise #Bulls #Rise”
布鲁克林网队口号:“The Nets are Here to Stay #Nets #Stay”

微调之后 5分钟 4070

“雷霆猛兽,公牛铁血,网球队员,勇往直前。”

4.5 我的数据(关键)

学校成绩


你是python程序员。编写一段完整的python 程序。要求
- 按照下面个格式生成 n个同学的数据, 并保存为 alpaca_zh_my_demo.json
- 学号从1 到 n, 默认998
- 姓名按中国人姓名随机生成,分男女
- 性别,男女各一半
- 考试时间, 默认10月
- 数学,物理,化学的成绩从1到100
-
[{"instruction": "红星小学学号1成绩","input": "","output": "姓名:张三,	性别:男, 学号:1, 考试时间:10月,	数学:49,	物理:9,	化学:13"},{"instruction": "红星小学学号2成绩","input": "","output": "姓名:李四,	性别:女, 学号:1, 考试时间:10月,	数学:69,	物理:59,	化学:93"}
]
以下是一个完整的Python程序,用于生成指定格式的JSON数据并保存为文件。程序会随机生成998个学生的成绩数据,姓名随机生成,男女各占一半,考试时间为10月,成绩随机生成。
Python复制略

文件复制到 data 目录

cp /mnt/e/Tec/LLama-Factory/alpaca_zh_my_demo.json /home/LLaMA-Factory-main/data/
cat /home/LLaMA-Factory-main/data/alpaca_zh_my_demo.json

注册

/home/LLaMA-Factory-main/data/dataset_info.json
{"identity": {"file_name": "identity.json"},"alpaca_en_demo": {"file_name": "alpaca_en_demo.json"},"alpaca_zh_demo": {"file_name": "alpaca_zh_demo.json"},"alpaca_zh_my_demo": {"file_name": "alpaca_zh_my_demo.json","columns": {"prompt": "instruction","query": "input","response": "output"}},
4.6 微调成功但是新模块问答都失败(巨坑)

微调数据
{"instruction": "红星小学张三10月考试成绩是多少?","input": "","output": "姓名:张三, 性别:男, 学号:1, 考试时间:10月, 数学:66, 物理:66, 化学:66"
}

当提问 “红星小学张三10月考试成绩是多少?”
期望回答, “姓名:张三, 性别:男, 学号:1, 考试时间:10月, 数学:66, 物理:66, 化学:66”

刚开始怀疑是数据量的问题。
结果数据 9条,199条,999条数据,都微调失败。

小数据微调参数!!!

基于LLaMA-Factory微调llama3成为一个角色扮演大模型

如果训练的文件小,训练配置调大一点:
学习率: 2e-3(默认5e-5) 训练论数:10.0(默认3.0) 最大样本数:1000(默认1W)

特别感谢,这位作者提供的微调参数。
如果有知道原因的同学,能告诉我的话就更好了,我来更新。

只把张三的一条数据,添加到官方例子 “alpaca_zh_demo.json”, 让数据集中的每条数据各不相同。
设置如上参数。微调成功。

在这里插入图片描述

巨坑 数据集的内容,要差异够大!!!

{"instruction": "红星小学张三10月考试成绩是多少?","input": "","output": "姓名:张三, 性别:男, 学号:1, 考试时间:10月, 数学:66, 物理:66, 化学:66"},{"instruction": "红星小学冯超10月考试成绩是多少?","input": "","output": "姓名:冯超, 性别:男, 学号:2, 考试时间:10月, 数学:47, 物理:63, 化学:69"},{"instruction": "红星小学孙波10月考试成绩是多少?","input": "","output": "姓名:孙波, 性别:男, 学号:3, 考试时间:10月, 数学:98, 物理:96, 化学:98"}

如果是10条类似的成绩数据,提示词只有姓名不同,同样的参数,微调后,问答还是失败。

如果是10个学生成绩这种的数据,因为提示词只有姓名的不同, 微调不出来!!!

TODO 扩展阅读,

魔搭社区数据集
从Llama Factory数据集看模型微调和训练

微调数据集的准备
自我认知数据集
特定任务数据集
通用任务数据集

理解怎样设置数据集。如果是学生成绩这种,怎样配置数据集?

五 TODO LLaMaFactory 参数详解

从0学习LLaMaFactory参数解释说明

Finetuning method
Checkpoint path
Quantization bit/Enable quantization (QLoRA).
Quantization method
Chat template
RoPE scaling
Booster

Train tab
Stage
Data dir
Dataset
Learning rate (学习率, 关键参数!!!)
Epochs
Maximum gradient norm
Max samples
Compute type
Cutoff length
Batch size
Gradient accumulation
Val size
LR scheduler

Data dir
Dataset


http://www.ppmy.cn/ops/152585.html

相关文章

VIT论文阅读与理解

transform网络结构 vision transform网络结构 图1&#xff1a;模型概述。我们将图像分割成固定大小的补丁&#xff0c;线性嵌入每个补丁&#xff0c;添加位置嵌入&#xff0c;并将结果向量序列馈送到标准Transformer编码器。为了执行分类&#xff0c;我们使用标准方法向序列中添…

Grafana系列之Dashboard:新增仪表板、新增变量、过滤变量、变量查询、导入仪表板、变量联动、Grafana Alert

概述 关于Prometheus和Grafana的安装&#xff0c;略过。 写在前面 Dashboard&#xff1a;仪表板&#xff0c;可包含多个PanelPanel&#xff1a;面板&#xff0c;Dashboard中的组件 如有写得不对的地方&#xff0c;烦请指出。 新增仪表板 点击右上角的 选择New dashboard…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

如何为64位LabVIEW配置正确的驱动程序

在安装 64位 LabVIEW 后&#xff0c;确保驱动程序正确配置是关键。如果您首先安装了 32位 LabVIEW 和相关驱动&#xff0c;然后安装了 64位 LabVIEW&#xff0c;需要确保为 64位 LabVIEW 安装和配置适当的驱动程序&#xff0c;才能正常访问硬件设备。以下是详细步骤&#xff1a…

【odoo】Odoo 中的 Controllers 介绍与示例

在 Odoo 中&#xff0c;controllers 是一种用来处理 HTTP 请求的机制。它是 Odoo 中 Web 模块的重要组成部分&#xff0c;主要用于接收前端的 HTTP 请求、进行业务处理&#xff0c;然后返回响应。controllers 是 Odoo 和外部世界&#xff08;如前端页面、API 客户端等&#xff…

Java设计模式 十三 代理模式 (Proxy Pattern)

代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式&#xff0c;它为其他对象提供一种代理&#xff08;或占位符&#xff09;以控制对该对象的访问。通过代理模式&#xff0c;我们可以在不修改目标对象的情况下&#xff0c;控制对其的访问&#xff0c;添加额外的功能&…

提升 Go 开发效率的利器:calc_util 工具库

提升 Go 开发效率的利器&#xff1a;calc_util 工具库 在日常开发中&#xff0c;我们常常需要处理数组&#xff08;切片&#xff09;的交集、差集、并集操作&#xff0c;或者更新和过滤数据。尽管这些功能可以手动实现&#xff0c;但重复的逻辑代码不仅影响效率&#xff0c;也…

极速、免费、体积小,一款PDF转图片软件

下载解压后: 双击后exe结尾程序即可运行软件。 该款软件能够将PDF文件中的每一页准确地转换为高质量的图片。无论是包含文字、图像还是图表的PDF页面&#xff0c;转换后的图片都能清晰地保留原始内容的细节。例如&#xff0c;对于一些学术论文PDF中的细小文字和复杂图表&#x…