LLaMA-Factory DeepSeek-R1 模型 微调基础教程

LLaMA-Factory 模型 微调基础教程

LLaMA-Factory 模型 微调 概述

使用LLaMA-Factory进行模型微调具有多方面的好处。首先,它简化了大模型微调的过程,使得即使是没有深厚技术功底的用户也能轻松进行模型的优化和改进。此外,LLaMA-Factory支持多种训练方法,如全量调参、LoRA等,以及不同的对齐方案,如DPO、PPO等。这为用户提供了灵活性,可以根据具体需求选择合适的微调策略。

LLaMA-Factory还提供了一站式服务,从模型微调到量化处理,再到运行,整个过程一气呵成,无需在不同的工具和流程之间来回切换。此外,它支持多种流行的语言模型,如LLaMA、BLOOM、Mistral、Baichuan等,涵盖了广泛的应用场景。

在模型量化方面,LLaMA-Factory能够有效地压缩模型规模,减少模型运行所需的计算量和存储空间,使得模型能够在性能稍弱的设备上也能流畅运行。这不仅提高了模型的可访问性,也降低了运行成本。

此外,LLaMA-Factory的训练过程中记录的内容比较全面,除了同步输出loss曲线图以外,还自带BLEU等评测指标,这有助于用户更好地监控和评估模型的性能。

LLaMA-Factory

LLaMA-Factory 下载

GitHub: LLaMA-Factory

javascript 复制代码
1. 进到 LLaMA-Factory 后点击code 下载就行,我这边选择的是下载 zip.
javascript 复制代码
2. 这里也有中文的资料以及详情,感兴趣的可以看看。
javascript 复制代码
3. 解压完成之后记录一下解压路径。

Anaconda

Anaconda 环境创建

软硬件依赖 详情

javascript 复制代码
软硬件依赖
javascript 复制代码
1. 创建虚拟环境:官方给出的是 python 至少 3.9 推荐 3.10
javascript 复制代码
2. 打开终端。
javascript 复制代码
3. 导航到 刚才解压的地址,我的是:E:\Model\LLaMA-Factory-main\LLaMA-Factory-main
   命令:E: (导航到E盘)
   cd E:\Model\LLaMA-Factory-main\LLaMA-Factory-main (导航到具体文件夹)

LLaMA-Factory 依赖安装

javascript 复制代码
1. 依赖下载:pip install -r requirements.txt
javascript 复制代码
2. 这个也是安装依赖最好都执行一遍: pip install -e ".[torch,metrics]"

CUDA 安装

javascript 复制代码
1. CUDA 安装:conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
记得输入 y 继续安装

量化 BitsAndBytes 安装

javascript 复制代码
1. 安装 BitsAndBytes
如果要在 Windows 平台上开启量化 LoRA(QLoRA),需要安装预编译的 bitsandbytes 库
支持 CUDA 11.1 到 12.2, 请根据您的 CUDA 版本情况选择适合的发布版本。
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.2.post2-py3-none-win_amd64.whl

可视化微调启动

javascript 复制代码
1. 启动命令:llamafactory-cli webui
javascript 复制代码
2. 如果出现这个错误就说明:无法访问 localhost,因此需要创建一个可分享的链接,但是又因为分享 Gradio share 为false 
   而无法正确响应,所以我们需要更改一下 interface.py 代码。
javascript 复制代码
3. 找到 interface.py 存在路径,我的是:LLaMA-Factory-main\src\llamafactory\webui
javascript 复制代码
4. 找到 run_web_ui() 和 run_web_demo() 方法,把 "share=gradio_share" 修改成:"share=True"
   如下图所示:
javascript 复制代码
4. 然后再次运行,就成功了。
   对了有一点需要注意的是,这个时候不要搭梯子不然界面会一直加载不出来。

数据集准备

所需工具下载

微信风格化工具: 留痕

javascript 复制代码
因为我创建的自己的风格化模型所以就用这个了,其他的也可以
例如:finetune_dataset_maker或者自己写一个,抽时间我自己写一个也行,到时候写出来再分享吧
javascript 复制代码
如果大家想了解更多这边有几个论文呢可以参考一下。

T2D:从文本自动生成虚拟代理之间的对话

个性化对话生成的最新趋势:数据集、方法和评估综述

LLaMA-Factory:100多种语言模型的统一高效微调

javascript 复制代码
1. 回到正题哈,点击下载,然后解压。
javascript 复制代码
2. 下载第一个就行

使用教程

javascript 复制代码
1. 点击 教程跳转官方使用说明
javascript 复制代码
2. 点击导出数据,跟着步骤来就行。
javascript 复制代码
不想看的可以跟着我的来弄:
3. 解压之后,找到 MemoTrace.exe 双击执行就可以。
javascript 复制代码
4. 点击我的登陆账号,然后在工具点击解析数据
javascript 复制代码
5. 我这边选择的是AI 对话txt 和 json,大家按需导出就行。
javascript 复制代码
6. 因为这边需要的数据就只是文本数据,所以就只勾选了文本。
javascript 复制代码
7. 记一下目录哈,我这边是在:D:\软件\留痕\data\聊天记录,找相对路径就行。
javascript 复制代码
8. 导出完毕之后就相对路径文件夹会有这三个文件,因为我选择导出txt和json 所以会有三个文件
   如果只是json会有两个文件。

所需数据合并

javascript 复制代码
1. 在聊天记录文件夹 建立一个 merge.py 的文件
javascript 复制代码
2. 把下面的代码复制进去,这个代码的主要作用就是合并所有的聊天记录。
javascript 复制代码
import os
import json

# 设置目标文件夹路径
folder_path = r'D:\软件\留痕\data\聊天记录'

# 获取文件夹及其所有子文件夹中的所有 .json 文件
json_files = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.endswith('.json'):
            json_files.append(os.path.join(root, file))

# 合并所有 .json 文件
merged_data = []
for file in json_files:
    with open(file, 'r', encoding='utf-8') as f:
        try:
            data = json.load(f)
            merged_data.append(data)
        except json.JSONDecodeError:
            print(f"Error decoding {file}. Skipping.")

# 保存合并后的数据到一个新的 .json 文件
merged_file_path = os.path.join(folder_path, 'merged_data.json')
with open(merged_file_path, 'w', encoding='utf-8') as merged_file:
    json.dump(merged_data, merged_file, indent=4, ensure_ascii=False)

print(f"合并后的文件已保存至: {merged_file_path}")
javascript 复制代码
3. 直接在地址栏前面加上 cmd 回车之后就会打开当前路径的命令提示符。
javascript 复制代码
4. 键入 python merge.py 执行
javascript 复制代码
5. 显示这个就表示执行完毕,数据已经合并了。
javascript 复制代码
6. 内容大概就是这样

数据集预处理

javascript 复制代码
数据集预处理是机器学习和人工智能中不可或缺的环节,其重要性体现在多个方面。
首先,预处理能够提升数据质量,通过清洗噪声、去除重复和无关信息,以及标准化格式,为模型训练提供纯净
且一致的输入。其次,它有助于优化模型性能,例如通过分词、去除停用词等操作,让模型更容易理解和学习数
据中的关键信息,同时减少过拟合的风险。此外,预处理还能增强数据多样性,通过数据增强技术如文本扩充、
同义词替换等,提升模型的泛化能力。在对话系统中,预处理尤为重要,因为它需要处理多轮对话的上下文一致
性以及用户意图的多样性。通过格式化对话数据和增强对话内容,可以显著提升对话系统的自然性和流畅性。总
之,数据集预处理不仅提高了模型的训练效率,还为模型的最终性能奠定了坚实基础,是实现高质量人工智能应
用的关键步骤。
javascript 复制代码
1. 在聊天记录文件夹 建立一个 Data_Preprocessing.py 的文件
javascript 复制代码
2. 把下面的代码复制进去,这个代码的主要作用就是数据清洗、脱敏、去重以及规则化成sharegpt格式。
   这个等会解释为什么要用 sharegpt 格式。
javascript 复制代码
import json
import re

# 读取 merged_data.json 文件
with open('merged_data.json', 'r', encoding='utf-8') as file:
    data = json.load(file)

# 转换后的数据格式
converted_data = []

# 数据清洗:去除空消息,清除特殊字符,统一格式
def clean_data(dataset):
    cleaned_data = []
    for example in dataset:
        messages = example['messages']
        cleaned_messages = []
        for message in messages:
            # 去除内容为空的消息
            if not message['content'].strip():
                continue
            # 清除多余的空格、换行符等
            message['content'] = message['content'].replace("\n", " ").strip()
            cleaned_messages.append(message)
        if cleaned_messages:
            cleaned_data.append({'messages': cleaned_messages})
    return cleaned_data

# 脱敏处理:替换敏感信息
def replace_sensitive_info(text):
    # 匹配手机号、邮箱等敏感信息
    text = re.sub(r'\d{3}[-]?\d{4}[-]?\d{4}', '[PHONE_NUMBER]', text)  # 替换手机号
    text = re.sub(r'\S+@\S+', '[EMAIL]', text)  # 替换邮箱
    text = re.sub(r'\d{4}-\d{2}-\d{2}', '[DATE]', text)  # 替换日期
    return text

# 匿名化数据:替换用户角色
def anonymize_data(dataset):
    anonymized_data = []
    for example in dataset:
        messages = example['messages']
        anonymized_messages = []
        for message in messages:
            # 匿名化用户角色
            if message['role'] == 'user':
                message['content'] = message['content'].replace("用户", "用户X")
            # 替换敏感信息
            message['content'] = replace_sensitive_info(message['content'])
            anonymized_messages.append(message)
        anonymized_data.append({'messages': anonymized_messages})
    return anonymized_data

# 处理每一条对话
for item_list in data:
    for item in item_list:
        # 确保每个条目中包含 'messages' 字段
        if 'messages' not in item:
            print("跳过:没有找到 'messages' 字段")
            continue  # 如果没有 'messages' 字段,跳过当前数据项
        
        print(f"正在处理数据项: {item}")  # 打印当前处理的项
        conversation = {"conversations": []}
        
        # 处理消息数据
        for message in item['messages']:
            role = message['role']
            content = message['content']
            
            print(f"处理消息:role={role}, content={content}")  # 打印消息内容
            
            # 清洗和脱敏处理
            content = replace_sensitive_info(content)
            
            # 映射 role 到 from 字段
            if role == "system":
                continue  # 忽略 system 消息
            elif role == "user":
                from_role = "human"
            elif role == "assistant":
                from_role = "gpt"
            
            # 添加转换后的消息
            conversation['conversations'].append({
                "from": from_role,
                "value": content
            })
        
        # 将转换后的会话添加到最终结果中
        converted_data.append(conversation)

# 保存转换后的数据为新的文件
with open('converted_data.json', 'w', encoding='utf-8') as file:
    json.dump(converted_data, file, ensure_ascii=False, indent=2)

print("数据转换完成,结果已保存为 converted_data.json")
javascript 复制代码
3. 直接在地址栏前面加上 cmd 回车之后就会打开当前路径的命令提示符。
javascript 复制代码
4. 键入 python merge.py 执行
javascript 复制代码
5. 显示这个就表示执行完毕,数据已清洗和修改完毕。

DeepSeek-R1 可视化微调

数据集处理

javascript 复制代码
1. 把 converted_data.json 数据集存放在,LLaMA-Factory 相对路径,我的是:
   E:\Model\LLaMA-Factory-main\LLaMA-Factory-main\data
javascript 复制代码
2. 编辑 dataset_info.json 文件。
javascript 复制代码
3. 更改 dataset_info.json 文件,以便LLaMA-Factory 识别训练。
   下面是需要添加的内容。
javascript 复制代码
  "converted_data": {
  "file_name": "converted_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations"
    }
  },

数据详解

javascript 复制代码
1. 在data 文件夹有个 README_zh.md 的文件打开它
   它记录的就是 alpaca 和 sharegpt 格式 数据集如何配置。
javascript 复制代码
2. 我这边使用的是 sharegpt 数据集,所以在 dataset_info.json 文件需要填充的内容就如下图所示。
   又因为我不需要:  tools(工具描述) 所以直接删除也行
   当然你有需求也可以加上,只要把数据集修改一下就行了。
   如果还不知道怎么修改就看一下样例数据集 glaive_toolcall_zh_demo.json 也在 data 文件夹下。

LLaMA-Factory 基础设置

模型下载地址: deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

javascript 复制代码
1. LLaMA-Factory 运行起来之后把语言更改成中文、模型更改为:DeepSeek-R1-1.5B-Distill
   模型路径就是你下载好存放的模型路径。
javascript 复制代码
2. 选择我们添加的数据集。
javascript 复制代码
2. 简单预览一下看看有没有错误,然后关闭就行了。
javascript 复制代码
3. 你如果不是很了解这些参数什么意思的话,按照我的填就行。
javascript 复制代码
4. 点击预览命令,可以看到训练参数配置详情。
javascript 复制代码
5. 开始训练
javascript 复制代码
5. 训练详情可以在 Gradio UI 查看损失函数,也可以后台查看详细信息。
javascript 复制代码
命令行输出
javascript 复制代码
6. 训练完毕之后会输出 训练完毕字符 。
javascript 复制代码
7. 后台也会输出当前模型训练基础指标,简单解释一下吧。
   epoch:表示训练过程中数据集被完整地通过模型一次的次数。
   num_input_tokens_seen:表示在训练过程中模型已经看到的输入标记(例如单词或字)的总数。
   total_flos:表示训练过程中执行的浮点运算次数,单位是 GF。
   train_loss:表示训练集上的损失函数值,损失越低通常意味着模型性能越好。
   train_runtime:表示训练过程的总运行时间。
   train_samples_per_second:表示模型每秒可以处理的样本数。
   train_steps_per_second:表示模型每秒可以执行的训练步骤数。
javascript 复制代码
8. 模型存放位置,我的地址是:
   LLaMA-Factory-main\saves\DeepSeek-R1-1.5B-Distill\lora
   如果没更改存放位置的话,应该都在 saves 文件夹下。

模型评估与预测

javascript 复制代码
1. 点击 Evaluate&Predict
javascript 复制代码
2. 选择需要使用到的数据集。
javascript 复制代码
3. 预览一下评估命令,我使用的是 RTX4080,大概需要跑 50 多分钟。
javascript 复制代码
4. 评估结束之后会给一个评估指标,简单解释一下都是什么意思。   
javascript 复制代码
这些数据是机器学习模型的评估指标,通常用于评估文本生成模型(如机器翻译、文本摘要等)的性能。

predict_bleu-4:用于评估机器翻译模型输出质量的一个指标。bleu-4 计算的是 4-gram(四个连续单词)
		        之间的匹配程度。它用于衡量生成文本与参考文本之间的相似度。

predict_model_preparation_time:模型准备时间,即加载模型并进行初始化所花费的时间,单位是秒。

predict_rouge-1:ROUGE 用于评估自动摘要质量的一个指标。rouge-1 衡量的是1-gram(单个词)的召回率
	 	         即生成文本与参考文本中单个词的匹配程度。

predict_rouge-2:rouge-2 衡量的是2-gram(由两个连续单词组成的词组)之间的匹配度。
	            它反映了生成文本和参考文本中连续两个词的相似性。

predict_rouge-l:rouge-l 衡量的是最长公共子序列(LCS)的召回率。LCS考虑了单词的顺序
		         因此更能反映生成文本和参考文本之间的结构相似度。

predict_runtime:模型运行的总时间,通常是指模型在预测或推理过程中所花费的总时间,单位为秒。

predict_samples_per_second:每秒处理的样本数量,表示模型每秒钟可以处理多少个输入样本。

predict_steps_per_second:每秒执行的推理步骤数,表示模型在推理过程中每秒执行多少次推理步骤。
javascript 复制代码
5. 这个是模型评估具体信息,感兴趣的可以点击去具体查看。

训练模型对话

javascript 复制代码
1.  选择你想要对话并训练好的模型。
javascript 复制代码
2.  点击加载模型,模型加载完毕之后会提示:模型已加载,可以开始聊天了!
javascript 复制代码
3. 然后就可以开始对话了,这个对话就是根据你的风格进行训练出来的,相当于第二个你。

训练模型导出

javascript 复制代码
1. 点击 Export 切换到模型导出界面。
javascript 复制代码
2. 这些参数按需调节吧,导出设备最好选择自动,不然CUDA 执行会有一点问题,导出目录需要填写一下。
javascript 复制代码
3. 模型正在导出和导出成功都有提示,如下图所示。
javascript 复制代码
4. 所有模型文件就是在你填写的导出路径文件夹内。
   我的是:LLaMA-Factory-main\model\DeepSeek-R1-1.5B-Distill 微调
javascript 复制代码
5. 一般都出完毕之后我都会写一个 requirements.txt 文件,也就是依赖安装文件,方便后期快速部署。
   里面也没什么东西就是当前模型所需依赖,一般使用原本的依赖文件就行,我这里面就是下面的内容。
javascript 复制代码
transformers>=4.41.2,<=4.48.3,!=4.46.*,!=4.47.*,!=4.48.0,!=4.48.1,!=4.48.2;python_version<'3.10'
transformers>=4.41.2,<=4.48.3,!=4.46.*,!=4.47.*,!=4.48.0;python_version>='3.10'
datasets>=2.16.0,<=3.2.0
accelerate>=0.34.0,<=1.2.1
peft>=0.11.1,<=0.12.0
trl>=0.8.6,<=0.9.6
tokenizers>=0.19.0,<=0.21.0
gradio>=4.38.0,<=5.12.0
pandas>=2.0.0
scipy
einops
sentencepiece
tiktoken
protobuf
uvicorn
pydantic
fastapi
sse-starlette
matplotlib>=3.7.0
fire
packaging
pyyaml
numpy<2.0.0
av
librosa
tyro<0.9.0

暂时先这样吧,如果实在看不明白就留言,看到我会回复的。希望这个教程对您有帮助!

路漫漫其修远兮,与君共勉。

相关推荐
蔗理苦4 分钟前
2025-04-18 李沐深度学习3 —— 线性代数
人工智能·深度学习·线性代数
BB_CC_DD2 小时前
五. 以聚类和搜图方式清洗图像数据集,采用Pickle和Faiss(百万数据集,ms级响应)快速搜图(附完整代码)
深度学习·聚类·faiss
牙牙要健康2 小时前
【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件yolo.py解读
深度学习·yolo·目标检测
军哥讲视觉3 小时前
《计算机视觉度量:从特征描述到深度学习》—深度学习图像特征工程
人工智能·深度学习·计算机视觉
契合qht53_shine3 小时前
深度学习 从入门到精通 day_05
人工智能·深度学习
charles_vaez3 小时前
开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Docker(二)
深度学习·aigc·agi
硅谷秋水4 小时前
Scenario Dreamer:用于生成驾驶模拟环境的矢量化潜扩散模型
人工智能·深度学习·机器学习·计算机视觉·机器人
补三补四5 小时前
蓝耘平台介绍:算力赋能AI创新的智算云平台
人工智能·嵌入式硬件·深度学习·机器学习·visual studio
计算机视觉农民工5 小时前
深度学习是什么?该怎么入门学习?
人工智能·深度学习·学习
多巴胺与内啡肽.5 小时前
深度学习--卷积神经网络保存最优模型
人工智能·深度学习·cnn