跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

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

使用 LLaMA-Factory 对 DeepSeek-R1 模型进行微调的基础教程。内容包括环境搭建(Anaconda、CUDA、依赖安装)、数据集准备(聊天记录导出、合并、清洗与格式化)、模型配置与训练(参数设置、启动训练)、评估与预测(指标解读)、模型对话测试及导出部署。教程涵盖了从数据预处理到最终模型应用的全流程,适合希望进行大模型微调的技术人员参考。

微码行者发布于 2026/4/6更新于 2026/9/873 浏览
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 下载

GitHub: LLaMA-Factory

  1. 进到 LLaMA-Factory 后点击 code 下载就行,建议下载 zip 包。
  2. 解压完成之后记录一下解压路径。

Anaconda 环境创建

软硬件依赖详情
  1. 创建虚拟环境:官方给出的是 python 至少 3.9,推荐 3.10。
  2. 打开终端。
  3. 导航到刚才解压的地址。
LLaMA-Factory 依赖安装
  1. 依赖下载:pip install -r requirements.txt
  2. 最好都执行一遍:pip install -e ".[torch,metrics]"
CUDA 安装

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c nvidia 记得输入 y 继续安装。

量化 BitsAndBytes 安装

如果要在 Windows 平台上开启量化 LoRA(QLoRA),需要安装预编译的 bitsandbytes 库。支持 CUDA11.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

可视化微调启动
  1. 启动命令:llamafactory-cli webui
  2. 如果出现无法访问 localhost 的错误,说明 Gradio share 为 false。我们需要更改 interface.py 代码。
  3. 找到 interface.py 存在路径,通常在 LLaMA-Factory-main\src\llamafactory\webui。
  4. 找到 run_web_ui() 和 run_web_demo() 方法,把 share=gradio_share 修改成 share=True。
  5. 然后再次运行即可成功。

数据集准备

所需工具下载

使用数据提取工具导出聊天记录。例如可以使用微信风格化工具或其他类似工具(如 finetune_dataset_maker)。

参考论文:

T2D:从文本自动生成虚拟代理之间的对话
  • 个性化对话生成的最新趋势:数据集、方法和评估综述
  • LLaMA-Factory:100 多种语言模型的统一高效微调
    1. 点击下载,然后解压。
    2. 双击执行工具。
    3. 点击我的登陆账号,然后在工具点击解析数据。
    4. 选择 AI 对话 txt 和 json,按需导出。
    5. 只勾选文本数据。
    6. 记一下目录,找相对路径就行。
    7. 导出完毕之后相对路径文件夹会有相关文件。
    所需数据合并
    1. 在聊天记录文件夹建立一个 merge.py 的文件。
    2. 复制以下代码进去,主要作用是合并所有的聊天记录。
    import os
    import json
    
    # 设置目标文件夹路径
    folder_path = r'<数据源路径>'
    
    # 获取文件夹及其所有子文件夹中的所有 .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}")
    
    1. 直接在地址栏前面加上 cmd 回车之后就会打开当前路径的命令提示符。
    2. 键入 python merge.py 执行。
    数据集预处理

    数据集预处理是机器学习和人工智能中不可或缺的环节,其重要性体现在多个方面。首先,预处理能够提升数据质量,通过清洗噪声、去除重复和无关信息,以及标准化格式,为模型训练提供纯净且一致的输入。其次,它有助于优化模型性能,例如通过分词、去除停用词等操作,让模型更容易理解和学习数据中的关键信息,同时减少过拟合的风险。

    1. 在聊天记录文件夹建立一个 Data_Preprocessing.py 的文件。
    2. 复制以下代码进去,主要作用是数据清洗、脱敏、去重以及规则化成 sharegpt 格式。
    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")
    
    1. 直接在地址栏前面加上 cmd 回车之后就会打开当前路径的命令提示符。
    2. 键入 python Data_Preprocessing.py 执行。

    DeepSeek-R1 可视化微调

    数据集处理
    1. 把 converted_data.json 数据集存放在 LLaMA-Factory 相对路径,通常是 data 文件夹。
    2. 编辑 dataset_info.json 文件。
    3. 更改 dataset_info.json 文件,以便 LLaMA-Factory 识别训练。下面是需要添加的内容。
    "converted_data":{"file_name":"converted_data.json","formatting":"sharegpt","columns":{"messages":"conversations"}},
    
    数据详解
    1. 在 data 文件夹有个 README_zh.md 的文件打开它,它记录的就是 alpaca 和 sharegpt 格式数据集如何配置。
    2. 使用的是 sharegpt 数据集,所以在 dataset_info.json 文件需要填充的内容如上所示。因为不需要 tools(工具描述),所以直接删除也行。当然你有需求也可以加上,只要把数据集修改一下就行了。如果还不知道怎么修改就看一下样例数据集 glaive_toolcall_zh_demo.json 也在 data 文件夹下。
    LLaMA-Factory 基础设置

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

    1. LLaMA-Factory 运行起来之后把语言更改成中文、模型更改为:DeepSeek-R1-1.5B-Distill,模型路径就是你下载好存放的模型路径。
    2. 选择我们添加的数据集。
    3. 简单预览一下看看有没有错误,然后关闭就行了。
    4. 你如果不是很了解这些参数什么意思的话,按照默认填就行。
    5. 点击预览命令,可以看到训练参数配置详情。
    6. 开始训练。
    7. 训练详情可以在 Gradio UI 查看损失函数,也可以后台查看详细信息。

    命令行输出显示训练状态。

    1. 训练完毕之后会输出训练完毕字符。

    2. 后台也会输出当前模型训练基础指标,简单解释一下吧。

      • epoch:表示训练过程中数据集被完整地通过模型一次的次数。
      • num_input_tokens_seen:表示在训练过程中模型已经看到的输入标记(例如单词或字)的总数。
      • total_flos:表示训练过程中执行的浮点运算次数,单位是 GF。
      • train_loss:表示训练集上的损失函数值,损失越低通常意味着模型性能越好。
      • train_runtime:表示训练过程的总运行时间。
      • train_samples_per_second:表示模型每秒可以处理的样本数。
      • train_steps_per_second:表示模型每秒可以执行的训练步骤数。
    3. 模型存放位置,通常在 saves 文件夹下。

    模型评估与预测
    1. 点击 Evaluate&Predict。

    2. 选择需要使用到的数据集。

    3. 预览一下评估命令。

    4. 评估结束之后会给一个评估指标,简单解释一下都是什么意思。

      • 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:每秒执行的推理步骤数,表示模型在推理过程中每秒执行多少次推理步骤。
    5. 这个是模型评估具体信息,感兴趣的可以点击去具体查看。

    训练模型对话
    1. 选择你想要对话并训练好的模型。
    2. 点击加载模型,模型加载完毕之后会提示:模型已加载,可以开始聊天了!
    3. 然后就可以开始对话了,这个对话就是根据你的风格进行训练出来的。
    训练模型导出
    1. 点击 Export 切换到模型导出界面。
    2. 这些参数按需调节吧,导出设备最好选择自动,不然 CUDA 执行会有一点问题,导出目录需要填写一下。
    3. 模型正在导出和导出成功都有提示。
    4. 所有模型文件就是在你填写的导出路径文件夹内。
    5. 一般都出完毕之后我都会写一个 requirements.txt 文件,也就是依赖安装文件,方便后期快速部署。里面也没什么东西就是当前模型所需依赖,一般使用原本的依赖文件就行。
    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
    

    目录

    1. LLaMA-Factory 模型微调基础教程
    2. LLaMA-Factory 概述
    3. LLaMA-Factory 下载
    4. Anaconda 环境创建
    5. 软硬件依赖详情
    6. LLaMA-Factory 依赖安装
    7. CUDA 安装
    8. 量化 BitsAndBytes 安装
    9. 可视化微调启动
    10. 数据集准备
    11. 所需工具下载
    12. 所需数据合并
    13. 设置目标文件夹路径
    14. 获取文件夹及其所有子文件夹中的所有 .json 文件
    15. 合并所有 .json 文件
    16. 保存合并后的数据到一个新的 .json 文件
    17. 数据集预处理
    18. 读取 merged_data.json 文件
    19. 转换后的数据格式
    20. 数据清洗:去除空消息,清除特殊字符,统一格式
    21. 脱敏处理:替换敏感信息
    22. 匿名化数据:替换用户角色
    23. 处理每一条对话
    24. 保存转换后的数据为新的文件
    25. DeepSeek-R1 可视化微调
    26. 数据集处理
    27. 数据详解
    28. LLaMA-Factory 基础设置
    29. 模型评估与预测
    30. 训练模型对话
    31. 训练模型导出

    更多推荐文章

    查看全部
    • 高校计算机课程改革:引入 AIGC 实操教学
    • Dev-C++ 下载、安装与使用入门指南
    • 免费 Trae 编辑器实测:排队机制与工程效率的权衡
    • C++ 异常处理机制:异常捕获、自定义异常与实战应用
    • Qwen2.5-7B 对话机器人微信接入部署指南
    • 基于 Go 与 DeepSeek 的 AIOps 监控系统实战
    • Android Jetpack Compose 开发应用指南
    • 苏州工业园区大模型赋能新质生产力发展实践
    • 使用 Web Scraper 浏览器插件爬取知乎评论数据
    • OpenClaw 多飞书机器人与多 Agent 团队搭建实战
    • Whisper-large-v3-turbo 深度解析:8 倍速语音识别技术
    • 10 个开源免费的大模型学习资料推荐
    • 腾讯混元大模型 AIGC 系列产品深度体验
    • GLM-4.7 与 Dify 平台深度集成实践
    • 深入理解 Flood Fill 算法:递归、搜索与回溯专题
    • 大厂为何一边裁员一边招聘:背后的商业逻辑与职场真相
    • Oracle WebLogic 代理插件未授权 RCE 漏洞检测与分析
    • Rust 复合类型高级用法:结构体、枚举与模式匹配
    • SpringAI 通过 Ollama 本地部署 Deepseek 模型实现对话机器人
    • 程序员转行大模型领域:热门岗位与学习路径解析

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • RSA密钥对生成器

      生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

    • Mermaid 预览与可视化编辑

      基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

    • 随机西班牙地址生成器

      随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • curl 转代码

      解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online