从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑
文章目录
从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑
2025-1-22
老规矩,感谢所有参考文章的作者。少走很多弯路。
一 参考
这里有各种依赖的版本。 似乎不用。直接安装,一键成功。
微调 零一 大模型。
【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/destination
conda 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中注册。
一、数据格式
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 参数详解
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
原文地址:https://blog.csdn.net/popo77/article/details/145304808
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!