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

文章目录

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

  • 安装
bash 复制代码
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

一次成功。

  • 验证
python 复制代码
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'
bash 复制代码
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

三 启动

bash 复制代码
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格式

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

官方自带例子
alpaca_zh_demo.json

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 文件中添加数据集描述,

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 中的数据集注册描述应为:

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中的注册信息如下。

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 我的数据(关键)

学校成绩

AI提示词 复制代码
你是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 复制代码
以下是一个完整的Python程序,用于生成指定格式的JSON数据并保存为文件。程序会随机生成998个学生的成绩数据,姓名随机生成,男女各占一半,考试时间为10月,成绩随机生成。
Python复制

略

文件复制到 data 目录

bash 复制代码
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

注册

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 微调成功但是新模块问答都失败(巨坑)
json 复制代码
微调数据
{
    "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", 让数据集中的每条数据各不相同。

设置如上参数。微调成功。

巨坑 数据集的内容,要差异够大!!!
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

相关推荐
Goboy2 分钟前
当电影评论遇上人工智能,用NLTK解锁文本中的情感密码
人工智能·aigc·ai编程
Goboy8 分钟前
手把手教你用深度学习玩转图像风格迁移
人工智能·aigc·ai编程
AI_Ming10 分钟前
大模型RAG项目实战-知识库问答助手v1版
人工智能·面试·aigc
GIS小天10 分钟前
AI预测排3新模型百十个定位预测+胆码预测+杀和尾2025年4月7日第40弹
人工智能·算法·机器学习·彩票
蚝油菜花14 分钟前
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
人工智能·开源
蚝油菜花15 分钟前
打破次元壁!AnimeGamer:腾讯开源黑科技让动漫角色听你指挥,一句话生成专属冒险动画
人工智能·开源
用户6915811416519 分钟前
初识华为RazorAttention
人工智能
Dm_dotnet32 分钟前
通过TTS模型让猴哥给你讲个故事
人工智能
timer_01732 分钟前
人工智能爬虫导致维基共享资源带宽需求激增 50%
人工智能·爬虫
橙色小博32 分钟前
门控循环单元(GRU)基础学习与实例:电影评论情感分类
人工智能·python·深度学习·神经网络·gru