使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)

引言:一套快速实现 Llama3 中文微调的教程

主要参考:胖虎遛二狗的 B 站教学视频《【大模型微调】使用Llama Factory实现中文llama3微调》


笔者简介:Wang Linyong,西工大,2023级,计算机技术

研究方向:文本生成、大语言模型

笔者的实验环境:

版本
Ubuntu 22.04.4
CPU Intel® Core™ i9-14900KF
Driver(驱动) 535.171.04
GPU(一张) NVIDIA GeForce RTX 4090
CUDA 12.4
Python 3.10.14
Pytorch 2.2.1

文章目录

  • [1. 配置 Hugging Face 的国内镜像网站](#1. 配置 Hugging Face 的国内镜像网站)
  • [2. 安装 LLaMA-Factory 框架](#2. 安装 LLaMA-Factory 框架)
  • [3. 启动可视化窗口](#3. 启动可视化窗口)
  • [4. 数据集构建方式](#4. 数据集构建方式)
  • [5. 模型微调的流程](#5. 模型微调的流程)
  • [6. 参考资料](#6. 参考资料)
  • [7. 补充说明](#7. 补充说明)

1. 配置 Hugging Face 的国内镜像网站

● 如果不配置的话,我们在后续下载 15G 的 Llama3 的模型权重文件会很慢很慢。

第一步: 安装 huggingface_hub 包。这个包是 Hugging Face 提供的 Python 客户端库,用于与 Hugging Face Hub 进行交互。

bash 复制代码
pip install huggingface_hub

第二步: 配置 Hugging Face API 的镜像端点,可以加快模型的下载速度,尤其是在中国大陆网络环境。

bash 复制代码
export HF_ENDPOINT=https://hf-mirror.com

第三步: 使用 huggingface-cli 工具从 Hugging Face Hub 下载指定的模型文件。

bash 复制代码
huggingface-cli download --resume-download meta-llama/Llama-3.2-3B-Instruct --local-dir ./models/Qwen2.5-7B-Instruct/

指令解释:

  1. --resume-download:启用断点续传。如果下载中断,下次继续下载时将从中断的位置开始,而不是重新下载。
  2. shenzhi-wang/Llama3-8B-Chinese-Chat:这是模型的仓库路径,表示从 Hugging Face 上下载 shenzhi-wang(作者) 发布的 Llama3-8B-Chinese-Chat 模型。
  3. --local-dir ./models/Llama3-8B-Chinese-Chat/:将下载的模型文件保存到本地的 ./models/Llama3-8B-Chinese-Chat/ 目录中。

结果展示(我安装在 ~/llama/models/Llama3-8B-Chinese-Chat 目录下的):


2. 安装 LLaMA-Factory 框架

● 【关于 LLaMA-Factory 的简介】LLaMA-Factory 是一个开源工具,旨在简化大型语言模型(LLMs)的微调和推理过程,特别是针对 LLaMA(Large Language Model Meta AI)系列模型。它提供了用户友好的接口和高效的工具,帮助研究者和开发者快速上手并定制化 LLM 模型,适用于各种自然语言处理任务。

● 首先进入 ~/llama 的同级目录,从 GitHub 克隆 LLaMA-Factory 仓库到本地。再进入该仓库目录。接着使用 pip 安装该项目作为一个可编辑的 Python 包,方便开发和修改。

bash 复制代码
cd ~/llama
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .

3. 启动可视化窗口

启动命令:

bash 复制代码
cd LLaMA-Factory
llamafactory-cli webui

UI界面执行步骤: 注意第 ③ 步要将模型路径换成你所下载的路径。

一个简单的调用案例:

bash 复制代码
问题:工作多长一段时间后没有签订劳动合同,公司的做法是违法的?我们应该怎么维权?

4. 数据集构建方式

● 在 LLaMA-Factory/data/dataset_info.json 中添加自己的数据格式。比如下述名为 Laws_QA 的数据集(对应的文件是 Laws_QA.json )。其中,各字段的含义:

  1. instruction 告诉模型要解释法律条款。
  2. input 提供了具体的法律条款。
  3. output 是模型生成的解释。
bash 复制代码
"Laws_QA": {
  "file_name": "Laws_QA.json",
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
  }
}

● 然后需要把你的数据集对应的文件 Laws_QA.json 放入到 LLaMA-Factory/data/ 目录下。在这里 举一个数据样例:

bash 复制代码
{
  "instruction": "解释一下以下法律条款",
  "input": "《中华人民共和国合同法》第52条",
  "output": "《中华人民共和国合同法》第52条规定了合同无效的情形,包括一方以欺诈、胁迫的手段订立合同,损害国家利益;恶意串通,损害国家、集体或者第三人利益;以合法形式掩盖非法目的;损害社会公共利益;违反法律、行政法规的强制性规定。"
}

这是我构造的数据样例: 我只构造了简单的 "问答对",所以 input 字段为空。

● 这里我贴 20Laws_QA.json 的样例,以供大家上手测试:

json 复制代码
[
    {
        "instruction": "在法律中定金与订金的区别订金和定金哪个受",
        "input": "",
        "output": ""定金"是指当事人约定由一方向对方给付的,作为债权担保的一定数额的货币,它属于一种法律上的担保方式,目的在于促使债务人履行债务,保障债权人的债权得以实现。签合同时,对定金必需以书面形式进行约定,同时还应约定定金的数额和交付期限。给付定金一方如果不履行债务,无权要求另一方返还定金;接受定金的一方如果不履行债务,需向另一方双倍返还债务。债务人履行债务后,依照约定,定金应抵作价款或者收回。而"订金"目前我国法律没有明确规定,它不具备定金所具有的担保性质,可视为"预付款",当合同不能履行时,除不可抗力外,应根据双方当事人的过错承担违约责任。"
    },
    {
        "instruction": "盗窃罪的犯罪客体是什么,盗窃罪的犯罪主体",
        "input": "",
        "output": "盗窃罪的客体要件本罪侵犯的客体是公私财物的所有权。侵犯的对象,是国家、集体或个人的财物,一般是指动产而言,但不动产上之附着物,可与不动产分离的,例如,田地上的农作物,山上的树木、建筑物上之门窗等,也可以成为本罪的对象。另外,能源如电力、煤气也可成为本罪的对象。盗窃罪侵犯的客体是公私财物的所有权。所有权包括占有、使用、收益、处分等权能。这里的所有权一般指合法的所有权,但有时也有例外情况。根据《最高人民法院关于审理盗窃案件具体应用法律若干问题的解释》(以下简称《解释》)的规定:"盗窃违禁品,按盗窃罪处理的,不计数额,根据情节轻重量刑。盗窃违禁品或犯罪分子不法占有的财物也构成盗窃罪。""
    },
    {
        "instruction": "非法微整形机构构成非法经营罪吗",
        "input": "",
        "output": "符合要件就有可能。非法经营罪,是指未经许可经营专营、专卖物品或其他限制买卖的物品,买卖进出口许可证、进出口原产地证明以及其他法律、行政法规规定的经营许可证或者批准文件,以及从事其他非法经营活动,扰乱市场秩序,情节严重的行为。"
    },
    {
        "instruction": "入室持刀行凶伤人能不能判刑",
        "input": "",
        "output": "对于入室持刀伤人涉嫌故意伤害刑事犯罪,一经定罪,故意伤害他人身体的,处三年以下有期徒刑、拘役或者管制。犯前款罪,致人重伤的,处三年以上十年以下有期徒刑;致人死亡或者以特别残忍手段致人重伤造成严重残疾的,处十年以上有期徒刑、无期徒刑或者死刑。相关法律规定《中华人民共和国刑法》第二百三十四条故意伤害他人身体的,处三年以下有期徒刑、拘役或者管制。犯前款罪,致人重伤的,处三年以上十年以下有期徒刑;致人死亡或者以特别残忍手段致人重伤造成严重残疾的,处十年以上有期徒刑、无期徒刑或者死刑。本法另有规定的,依照规定。"
    },
    {
        "instruction": "我在辅道正常右转进主道,主道有两个车,后面的车占用对向车道超车,撞了是谁的责任",
        "input": "",
        "output": "发生交通事故,及时报警,有交警划分责任,出具交通事故认定书,根据责任的划分和损害情况协商解决,协商不成的必要时可以诉讼处理。"
    },
    {
        "instruction": "对交通事故责任认定书不服怎么办,交通事故损",
        "input": "",
        "output": "事故认定书下发后,如果你对认定不满意,可在接到认定书3日内到上一级公安机关复议。"
    },
    {
        "instruction": "喝完就又去唱歌回家时去了车祸去唱歌我同意了车是我开的",
        "input": "",
        "output": "需要结合具体情况判断,看是否酒驾和交通事故责任的划分,根据责任承担责任,赔偿损失。"
    },
    {
        "instruction": "二审一般要多久",
        "input": "",
        "output": "《民事诉讼法》对二审的审限作出了规定,一般会在立案一个月内开庭,在三个月内审结,但最长也可以超过三个月。《民事诉讼法》第一百七十六条人民法院审理对判决的上诉案件,应当在第二审立案之日起三个月内审结。有特殊情况需要延长的,由本院院长批准。人民法院审理对裁定的上诉案件,应当在第二审立案之日起三十日内作出终审裁定。"
    },
    {
        "instruction": "欠钱没有欠条有录音能起诉吗",
        "input": "",
        "output": "录音资料经过鉴定证实未经剪辑、拼凑、篡改和臆造,并有其他相关证据相印证的,可以认定其效力。"
    },
    {
        "instruction": "帮助别人套花呗违法吗",
        "input": "",
        "output": "帮别人"花呗套现"并且收取手续费,这是违法犯罪行为。"
    },
    {
        "instruction": "关于吃药死亡正常不通过法律手段如何追究申诉,解决赔偿",
        "input": "",
        "output": "不通过法律手段可以双方协商索赔。"
    },
    {
        "instruction": "关于吃药死亡正常不通过法律手段如何追究申诉,解决赔偿",
        "input": "",
        "output": "找医院协商,去卫*委投诉,"
    },
    {
        "instruction": "因工作被三处烫伤,伤为三级烫伤,三处都需要植皮,鉴定能达到几级?",
        "input": "",
        "output": "伤残等级需要去专业鉴定机构鉴定的,根据伤残等级申请工伤认定,要求工伤赔偿。"
    },
    {
        "instruction": "从合伙经营公司撤资,只给欠条有用吗",
        "input": "",
        "output": "欠条是债权凭证,欠条依据的基础法律关系有事实、不违法的,欠条有效。解除合伙关系,如果经合伙人清算,产生合法欠款,欠条有效。"
    },
    {
        "instruction": "我是事业单位在一九八八年工作中左手食指和中指、缺失一节、单位当时就给送进医院还派人护理、当时找单位",
        "input": "",
        "output": "已经三十年了,已经超过诉讼时效了,无法主张权利,"
    },
    {
        "instruction": "我是事业单位在一九八八年工作中左手食指和中指、缺失一节、单位当时就给送进医院还派人护理、当时找单位",
        "input": "",
        "output": "扯淡,是必备技能。"
    },
    {
        "instruction": "事故中我摩托车付次要责任,自行车付主要责任,我怎赔他医药费",
        "input": "",
        "output": "有交强险的,在交强险的1####元医疗费额度中,由机动车方全部支付,超过1####元部分,由双方按责任程度各自分担."
    },
    {
        "instruction": "事故中我摩托车付次要责任,自行车付主要责任,我怎赔他医药费",
        "input": "",
        "output": "医药费的30%左右你需要承担"
    },
    {
        "instruction": "车祸小脑出血昏迷了5天怎么办",
        "input": "",
        "output": "及时报警,有交警出具交通事故认定书,根据责任的划分和实际损害情况协商索赔,协商不成的可以诉讼处理。"
    },
    {
        "instruction": "哪些情况可以先行刑事拘留",
        "input": "",
        "output": "有下列情形之一的,可以先行拘留:(一)正在预备犯罪、实行犯罪或者在犯罪后即时被发觉的;(二)被害人或者在场亲眼看见的人指认他犯罪的;(三)在身边或者住处发现有犯罪证据的;(四)犯罪后企图自杀、逃跑或者在逃的;(五)有毁灭、伪造证据或者串供可能的;(六)不讲真实姓名、住址,身份不明的;(七)有流窜作案、多次作案、结伙作案重大嫌疑的。公安机关拘留人的时候,必须出示拘留证。"
    }
]

5. 模型微调的流程

一图胜千言,按照下图的步骤设置就行:

  1. 微调中文模型就选 zh
  2. 选择模型名称
  3. 选择对应的模型参数路径
  4. 选择微调方法,一般是 LoRA
  5. 训练方式如果是有监督的微调,就选择 Supervised Fine-Tuning
  6. 选择对应的数据集(我这里选的就是之前我构造的 Laws_QA
  7. 设置对应的超参数
  8. 开始训练

备注:量化等其他设置可自行抉择。

● 微调完后,当需要调用时,可参考本文前面写的 ++"3. 启动可视化窗口"++ 的内容。


6. 参考资料

1\] [胖虎遛二狗的 B 站教学视频《【大模型微调】使用Llama Factory实现中文llama3微调》](https://www.bilibili.com/video/BV1uw4m1S7Cd),感谢Up主:胖虎遛二狗 *** ** * ** *** ## 7. 补充说明 ● 若有写得不对、欠妥的地方,或有疑问,欢迎评论交流。 *** ** * ** *** ⭐️ ⭐️ 完稿于 2025年3月21日 14:36 教研室工位 💻

相关推荐
小杜不吃糖15 小时前
llama源码学习·model.py[7]Transformer类
学习·transformer·llama
一只会铲史的猫1 天前
关于Transformer中Decoder模块是如何预测下一个字符的算法
大语言模型
Jozky863 天前
【大模型微调】使用Llama Factory实现中文llama3微调
人工智能·大模型·llama
代码骑士3 天前
LiteratureReading:[2023] GPT-4: Technical Report
nlp
小杜不吃糖3 天前
llama源码学习·model.py[3]ROPE旋转位置编码(4)ROPE的应用
llama
小白跃升坊4 天前
Ubuntu安装GPU驱动+CUDA+cuDNN的安装方法
ai·大语言模型·it运维·gpu
花千树-0104 天前
Dify - 架构、部署、扩展与二次开发指南
gpt·架构·prompt·aigc·embedding·llama·agi
小杜不吃糖4 天前
llama源码学习·model.py[3]ROPE旋转位置编码(3)源码中的广播机制
llama
mzgong5 天前
DeepSeek面试——模型架构和主要创新点
人工智能·大语言模型·deepseek