使用 XTuner QLoRA 微调 InternLM2-7B-Chat:最低 8GB 显存打造专属职场教练大模型
2026/9/19 23:58:40 网站建设 项目流程

使用 XTuner QLoRA 微调 InternLM2-7B-Chat:最低 8GB 显存打造专属职场教练大模型

【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/datawhalechina/self-llm

本指南以《开源大模型食用指南》项目中 InternLM2 的 XTuner QLoRA 微调文档 为主体,完整讲解如何基于上海人工智能实验室开源的轻量化微调工具箱 XTuner,在 8GB 显存级别(推荐 3090 等 24G 显卡)的低成本硬件条件下,对 InternLM2-7B-Chat 基座模型执行 4bit QLoRA 指令微调,并用一份"职场焦虑"心理语料将其打造成专属的职场教练 AI 助手。读完本文,你将掌握从环境搭建、模型下载、自定义数据集构建、配置文件修改,到训练启动、PTH 转 HF、LoRA 权重合并的端到端实战能力,并理解 XTuner 多轮对话微调的数据组织与损失计算原理。

XTuner 与 QLoRA 微调概述

XTuner 是上海人工智能实验室(InternLM 团队)开发的低成本大模型训练工具箱,定位为高效、灵活、全能的轻量化大模型微调工具库。借助 QLoRA(Quantized Low-Rank Adaptation,即论文 QLoRA 所提出的 4bit 量化 + 低秩适配方案),最低只需 8GB 显存即可微调 InternLM2-7B 模型,让个人开发者在自己可负担的硬件上打造专属于自身的 AI 助手成为可能。

围绕本次 InternLM2-7B-Chat 微调任务,XTuner 的能力体现在三个维度:

  • 高效:支持大语言模型(LLM)与多模态图文模型(VLM)的预训练和轻量级微调;8GB 显存即可微调 7B 模型,同时支持多节点跨设备微调 70B+ 更大尺度模型;自动分发高性能算子(如 FlashAttention、Triton kernels)以加速训练吞吐;兼容 DeepSpeed,可轻松应用 ZeRO 系列训练优化策略(本教程的训练命令即使用deepspeed_zero2)。
  • 灵活:支持包括 InternLM、Mixtral-8x7B、Llama2、ChatGLM、Qwen、Baichuan 在内的多种大语言模型;支持 LLaVA 等多模态模型的预训练与微调;精心设计的数据管道兼容任意数据格式,开源数据或自定义数据皆可快速上手;支持 QLoRA、LoRA、全量参数微调等多种微调算法,用户可根据显存与效果需求灵活选择。
  • 全能:支持增量预训练、指令微调与 Agent 微调;预定义众多开源对话模版,支持与开源或训练所得模型进行对话;训练所得模型可无缝接入 LMDeploy 部署工具库、OpenCompass 评测工具库等下游生态。

在《开源大模型食用指南》仓库中,InternLM2 系列还配套提供了 FastAPI 部署、LangChain 接入、WebDemo 部署 等教程,微调产出的模型可直接被这些下游环节消费,形成"微调 → 部署 → 应用"的完整闭环。

环境准备

硬件与镜像选择

在 AutoDL 平台租赁一台 3090 等 24G 显存的显卡机器,创建实例时按如下组合选择镜像:PyTorch → 2.0.0 → 3.8(ubuntu20.04)→ 11.8(CUDA 11.8,11.3 以上版本均可)。

创建完成后,打开服务器的 JupyterLab,在其中的终端开始后续的环境配置、模型下载与运行演示。

创建工作目录

创建本次微调实践的工作目录结构,用于隔离存放工作区、数据集与配置文件:

# 创建微调工作目录 mkdir -p /root/autodl-tmp/ft-learn # 创建微调数据集存放目录 mkdir -p /root/autodl-tmp/ft-learn/dataset # 创建微调配置文件存放目录 mkdir -p /root/autodl-tmp/ft-learn/config

安装依赖

先升级 pip,再安装本次微调所需的 Python 依赖包:

# 升级pip python -m pip install --upgrade pip # 安装python依赖 pip install modelscope==1.9.5 pip install transformers==4.36.2 pip install streamlit==1.24.0 pip install sentencepiece==0.1.99 pip install accelerate==0.24.1 pip install transformers_stream_generator==0.0.4 pip install einops ujson pip install protobuf

各依赖的职责如下:

依赖包版本用途
modelscope1.9.5从 ModelScope 魔搭社区下载 InternLM2 模型权重
transformers4.36.2加载模型、分词器,驱动训练主流程
accelerate0.24.1Hugging Face 训练加速框架,XTuner 训练底层依赖
streamlit1.24.0微调后可快速搭建 Web 演示应用
sentencepiece0.1.99中文分词所需的 SentencePiece 分词器支持
transformers_stream_generator0.0.4流式生成支持,便于推理时逐 token 输出
einops / ujson / protobuf最新张量重排、JSON 解析、protobuf 序列化等辅助能力

使用 ModelScope 下载基座模型

使用 modelscope 中的snapshot_download函数下载 InternLM2-7B-Chat 模型,第一个参数为模型名称,cache_dir参数指定模型的下载路径,revision='master'指定拉取主分支版本:

from modelscope import snapshot_download model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-7b', cache_dir='/root/autodl-tmp', revision='master')

模型体积约 14GB,下载需要数分钟时间,可在等待期间同步进行后续的数据集准备与 XTuner 安装。下载完成后模型权重会落在/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b目录,该路径正是后续配置文件中pretrained_model_name_or_path参数的取值。姊妹篇 InternLM2-7B-chat FastAPI 部署 中对同款模型下载有更详细的说明,可交叉参考。

安装 XTuner

从源码安装 XTuner(本教程实践版本为v0.1.14):

git clone -b v0.1.14 https://github.com/InternLM/xtuner cd xtuner # 从源码安装 XTuner(包含全部可选依赖) pip install -e '.[all]' # 安装完成之后就可以在命令行使用xtuner了 # 查看xtuner使用帮助 xtuner help # 查看xtuner版本 xtuner version

使用-e以可编辑模式安装,便于在需要时同步更新源码;.[all]会安装 XTuner 的全部可选依赖(含 DeepSpeed、FlashAttention 等训练加速组件)。安装完成后,xtuner即成为可用的命令行工具,后续的list-cfgcopy-cfgtrainconvert等子命令都依赖于此。

数据集处理:从 Excel 语料到 JSONL 训练数据

数据集的真实形态

XTuner 的指令微调需要统一格式的 JSONL 训练数据。本教程使用的语料是作者整理的"心理大模型-职场焦虑语料",以 Excel 形式存放于仓库的 models/InternLM2/dataset/心理大模型-职场焦虑语料.xlsx。对该文件的实际检查显示:语料共246 条问答样本,包含q(问题)与a(回答)两列,例如:

qa
我感到在职场中压力很大,总是焦虑不安,怎么办?这是很常见的感受。首先,可以尝试深呼吸和冥想来缓解紧张情绪。另外,考虑制定明确的工作目标和计划,以减轻不确定感。
我在工作中总是害怕失败,怎样克服这种恐惧?失败是成长的一部分。试着改变对失败的看法,将其视为学习的机会。制定小目标,逐步挑战自己,建立成功的经验。
我感觉同事对我的期望很高,让我感到压力很大,怎么处理?沟通是关键。与同事进行开放的对话,明确你的职责和能力范围。同时,学会设定界限,确保工作和个人生活的平衡。

可以注意到,这三条样本恰好就是后面配置文件中evaluation_inputs使用的三条评估问题——这印证了文档中的建议:用于评估的问题尽量与数据集的 question 保持一致,从而在训练过程中客观观察模型对同分布问题的回答质量。

编写 gen_qa_json.py 生成 JSONL

Excel 中的q/a两列需要被转换为 XTuner 约定格式的career_coach.jsonl文件。在/root/autodl-tmp/ft-learn/dataset/目录下创建gen_qa_json.py,代码如下:

import pandas as pd import json # 读取Excel文件 excel_file = './心理大模型-职场焦虑语料.xlsx' # 替换成实际的Excel文件路径 df = pd.read_excel(excel_file) # 设置system的值 system_value = "你是一个专业的,经验丰富的有心理学背景的职场教练。你总是根据有职场焦虑的病人的问题提供准确、全面和详细的答案。" # 将数据整理成jsonL格式 json_data = [] for index, row in df.iterrows(): conversation = [ { "system": system_value, "input": str(row['q']), "output": str(row['a']) } ] json_data.append({"conversation": conversation}) # 将json数据写入文件 output_json_file = 'career_coach.jsonl' # 替换成实际的输出文件路径 with open(output_json_file, 'w', encoding='utf-8') as f: json.dump(json_data, f, ensure_ascii=False) print("JSONL文件生成成功!")

运行python /root/autodl-tmp/ft-learn/dataset/gen_qa_json.py即可生成career_coach.jsonl文件。

这段脚本的核心逻辑是:通过pandas.read_excel读取语料表,为每条样本统一注入心理学职场教练的system提示词,将q/a列分别映射为input/output,并以{"conversation": [{"system": ..., "input": ..., "output": ...}]}的结构逐条写出。这正是 XTuner 单轮对话数据集的约定格式——conversation键对应的列表长度为 1(单轮),列表中的inputoutput分别代表用户指令与期望的标准回答。你也可以完全按照上述语料格式,自定义属于自己的领域数据集,只需保证 Excel 中存在对应的qa两列即可。

配置文件准备

查看并挑选内置配置

XTuner 已经内置了非常丰富的配置文件模板,覆盖不同模型、不同参数量、不同任务与不同微调算法。使用以下命令查看全部可用配置:

xtuner list-cfg

由于本次微调的基座模型为 internlm2-chat-7b,可以过滤出 InternLM2 系列下已支持的配置文件:

xtuner list-cfg |grep internlm2

从输出可以看到,XTuner 为 InternLM2 系列预置了覆盖 1.8b / 7b / 20b 等参数量、alpaca / code / agent 等任务类型、full / qlora 等微调方式的多种模板。本教程选择internlm2_chat_7b_qlora_oasst1_e3——即 InternLM2-7B-Chat 基于 oasst1 数据集的 QLoRA 微调、3 个 epoch 的配置,作为我们改造的起点。

复制并重命名配置文件

使用xtuner copy-cfg将选中的内置配置复制到自己的工作目录,随后重命名为更具语义的文件名:

# 复制配置文件 xtuner copy-cfg internlm2_chat_7b_qlora_oasst1_e3 /root/autodl-tmp/ft-learn/config # 修改配置文件名 mv /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_copy.py /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_career_coach.py

修改关键参数

复制完成后,编辑internlm2_chat_7b_qlora_oasst1_e3_career_coach.py,需要修改以下几处参数。

PART 1(训练与数据核心参数)

# 预训练模型存放的位置 pretrained_model_name_or_path = '/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b' # 微调数据存放的位置 data_path = '/root/autodl-tmp/ft-learn/dataset/career_coach.jsonl' # 训练中最大的文本长度 max_length = 512 # 每一批训练样本的大小 batch_size = 2 # 最大训练轮数 max_epochs = 3 # 验证的频率 evaluation_freq = 500 # 用于评估输出内容的问题(用于评估的问题尽量与数据集的question保持一致) evaluation_inputs = [ '我感到在职场中压力很大,总是焦虑不安,怎么办?', '我在工作中总是害怕失败,怎样克服这种恐惧?', '我感觉同事对我的期望很高,让我感到压力很大,怎么处理?' ]

各参数的核心影响说明:

参数本次取值作用与调整建议
pretrained_model_name_or_path/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b基座模型权重路径,即 ModelScope 下载落盘目录,必须与实际一致
data_path/root/autodl-tmp/ft-learn/dataset/career_coach.jsonl训练数据文件路径,指向上一步生成的 JSONL
max_length512训练时文本截断的最大长度,即输入 + 输出的 token 上限;语料较长或需长上下文时可适当调大,代价是显存与训练时长增加
batch_size2每个训练步使用的样本数;在 8GB 显存目标下保持较小值,显存充足时可调大以加速
max_epochs3完整遍历训练集的轮数;数据量大时可适当减少,数据量小(如本语料 246 条)时可保持 3 轮保证充分学习
evaluation_freq500每训练多少步执行一次验证评估;由于本数据集较小、总步数有限,实际训练中可能不触发中断式验证
evaluation_inputs三条职场焦虑问题训练过程中用于评估输出内容的问题,建议与数据集中的 question 保持同分布,便于直观对比微调效果

PART 3(数据集加载逻辑)

# 如果这里的如果没有修改的话,无法直接读取json文件 dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)) # 这里也得改成None,否则会报错KeyError dataset_map_fn=None

这两处修改非常关键且容易踩坑:

  • datasettype必须保持为load_datasetpath='json',将data_files指向自定义的 JSONL 路径。若不按此修改,XTuner 会尝试加载 oasst1 原始数据集,导致"无法直接读取 json 文件"。
  • dataset_map_fn必须改为None,否则在加载自有格式数据时会触发KeyError。这是因为我们提供的 JSONL 已遵循 XTuner 的conversation结构约定,无需再套用 oasst1 的字段映射函数。

模型微调

启动微调训练

使用xtuner train命令启动训练,并显式指定 DeepSpeed ZeRO-2 优化策略:

xtuner train /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_career_coach.py --deepspeed deepspeed_zero2

训练启动后,日志会依次展示配置加载、checkpoint 分片加载、优化器构建与每步 loss 输出等信息。DeepSpeed 的 ZeRO-2 策略会将优化器状态与梯度进行分片,配合 QLoRA 的 4bit 量化基座 + 低秩适配器设计,显著压低显存占用,这正是 8GB 级显卡即可微调 7B 模型的底层原因。训练过程中可按需观察 loss 是否稳定下降,也可结合evaluation_inputs中设置的评估问题查看阶段性输出。

训练产物

训练完成后,模型参数存放在/root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/目录下。注意此时产出的仍是XTuner 自定义格式的 PTH 权重文件(例如iter_51.pth,编号对应最终迭代步数),还不能被 Hugging Face Transformers 直接加载,因此需要进行后续两步转换与合并。

模型转换与权重合并

将 PTH 权重转换为 HF 格式

第一步,将 XTuner 训练出的 PTH 权重转换为 Hugging Face 标准的 LoRA adapter 格式:

# 新建模型存放的文件夹 mkdir -p /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/hf # 添加环境变量 export MKL_SERVICE_FORCE_INTEL=1 # 模型转换 xtuner convert pth_to_hf /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_career_coach.py /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/iter_51.pth/ /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/hf

xtuner convert pth_to_hf需要三个参数:训练配置文件、训练产出的 PTH 权重路径、转换后 HF 格式的输出目录。命令开头的export MKL_SERVICE_FORCE_INTEL=1用于规避 Intel MKL 在线程数较多时可能出现的 service 冲突告警,保证转换过程顺畅执行。

将 HF adapter 合并回基座 LLM

第二步,将转换后的 LoRA adapter 与原始 InternLM2-7B-Chat 基座权重合并,得到可直接部署推理的完整模型:

mkdir -p /root/autodl-tmp/ft-learn/merged export MKL_SERVICE_FORCE_INTEL=1 export MKL_THREADING_LAYER='GNU' # 原始模型参数存放的位置 export NAME_OR_PATH_TO_LLM=/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b # Hugging Face格式参数存放的位置 export NAME_OR_PATH_TO_ADAPTER=/root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/hf # 最终Merge后的参数存放的位置 mkdir -p /root/autodl-tmp/ft-learn/merged/internlm2_cc_hf_merge export SAVE_PATH=/root/autodl-tmp/ft-learn/merged/internlm2_cc_hf_merge # 执行参数Merge xtuner convert merge \ $NAME_OR_PATH_TO_LLM \ $NAME_OR_PATH_TO_ADAPTER \ $SAVE_PATH \ --max-shard-size 2GB

xtuner convert merge依次接收基座模型路径、HF 格式 adapter 路径与合并输出路径,--max-shard-size 2GB将合并后的权重按不超过 2GB 的分片保存,符合 Transformers 大模型分片加载规范。这里额外设置了MKL_THREADING_LAYER='GNU'环境变量,进一步规避 MKL 与线程库的兼容性报错。

合并完成后的internlm2_cc_hf_merge目录即是一个完整的、可直接被 Transformers/LMDeploy 加载的微调模型,可以继续按照仓库中 FastAPI 部署、LangChain 接入、WebDemo 部署 等教程接入实际应用。

XTuner 多轮对话微调介绍

高效的多轮对话训练策略

单轮对话微调只能让模型学会一问一答。若要让职场教练模型具备连贯的多轮对话能力(如连续追问、上下文理解),则需要对多轮对话数据进行微调。XTuner 训练多轮对话模型时采取了一种更加充分高效的方法:将多轮对话进行拼接后整体输入模型,并行计算每个位置的 loss,但只有 Output 部分的 loss 参与回传

这种策略的好处在于:多轮对话的所有输入输出一次性参与前向计算,大幅提升了训练吞吐;同时通过 mask 机制屏蔽掉 System 与 Input(用户提问)部分的损失,确保模型只学习"如何生成高质量回答",而不会被重复学习用户指令所干扰。

多轮对话数据集格式

XTuner 中多轮对话数据集格式如下所示:

[{ "conversation":[ { "system": "You are an AI asssistant." "input": "Hello?", "output": "Hello! How can I help you?" }, { "input": "What's the date today?", "output": "Today is Monday, August 14, 2023." }, { "input": "Thank you!", "output": "You are welcome." } ] }, { "conversation":[ { "system": "You are an AI asssistant." "input": "Hello?", "output": "Hello! How can I help you?" }, { "input": "How's the weather today in Rosso?", "output": "The weather in Rosso on Wednesday, August 16th, is going to be cloudy for most of the day, together with moderate rain around noon." }, { "input": "Thank you!", "output": "You are welcome." } ] }]

数据集中的"conversation"键对应的值是一个列表,用于保存每一轮对话的指令和实际回答(GroundTruth)。为了保持格式统一:

  • 增量预训练数据集单轮对话数据集中的"conversation"键也对应一个列表,只不过该列表的长度为 1;
  • 多轮对话数据集中,"conversation"列表的长度为 n,以容纳 n 轮的对话内容。

对比本教程前文gen_qa_json.py生成的单轮数据集即可发现:单轮数据只需在conversation列表中放一个system+input+output元素;而多轮对话数据则需将后续每一轮的用户提问与模型回答依次追加到同一列表中,system仅在首轮出现。对多轮对话微调感兴趣的同学,可以按照上述数据格式自行构造数据,复用本文的配置文件模板(将data_path指向多轮 JSONL 即可)完成训练。

结语与延伸

至此,我们已经完整走通了"环境准备 → 模型下载 → 自定义语料构建 → 配置文件定制 → QLoRA 微调 → 权重转换与合并"的 InternLM2-7B-Chat 专属大模型打造全流程。核心要点回顾:

  • QLoRA + DeepSpeed ZeRO-2的组合将 7B 模型微调的显存门槛压到了 8GB 级别,让低成本硬件上的定制化训练成为现实;
  • 配置文件中的两处关键修改dataset指向自定义 JSONL、dataset_map_fn=None)是避免踩坑的重点,直接决定训练能否从自有数据启动;
  • pth_to_hfmerge两步转换是 XTuner 训练产物接入标准生态的必要桥梁,合并后的完整模型可直接进入部署环节;
  • 多轮对话采用"拼接 + Output 部分 loss 回传"策略,其数据组织方式是构造高阶对话数据集的范式。

本文使用的职场焦虑语料存放在 models/InternLM2/dataset/心理大模型-职场焦虑语料.xlsx,可据此复现整个流程;微调完成的模型可进一步参考 InternLM2 部署系列文档 完成 FastAPI、LangChain、WebDemo 等场景的接入,将专属模型真正落地到实际业务中。

【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/datawhalechina/self-llm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询