
使用 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 团队开发的低成本大模型训练工具箱定位为高效、灵活、全能的轻量化大模型微调工具库。借助 QLoRAQuantized 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.8ubuntu20.04→ 11.8CUDA 11.811.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 modelscope1.9.5 pip install transformers4.36.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.1 pip install transformers_stream_generator0.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参数指定模型的下载路径revisionmaster指定拉取主分支版本from modelscope import snapshot_download model_dir snapshot_download(Shanghai_AI_Laboratory/internlm2-chat-7b, cache_dir/root/autodl-tmp, revisionmaster)模型体积约 14GB下载需要数分钟时间可在等待期间同步进行后续的数据集准备与 XTuner 安装。下载完成后模型权重会落在/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b目录该路径正是后续配置文件中pretrained_model_name_or_path参数的取值。姊妹篇 InternLM2-7B-chat FastAPI 部署 中对同款模型下载有更详细的说明可交叉参考。安装 XTuner从源码安装 XTuner本教程实践版本为v0.1.14git 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-cfg、copy-cfg、train、convert等子命令都依赖于此。数据集处理从 Excel 语料到 JSONL 训练数据数据集的真实形态XTuner 的指令微调需要统一格式的 JSONL 训练数据。本教程使用的语料是作者整理的心理大模型-职场焦虑语料以 Excel 形式存放于仓库的 models/InternLM2/dataset/心理大模型-职场焦虑语料.xlsx。对该文件的实际检查显示语料共246 条问答样本包含q问题与a回答两列例如qa我感到在职场中压力很大总是焦虑不安怎么办这是很常见的感受。首先可以尝试深呼吸和冥想来缓解紧张情绪。另外考虑制定明确的工作目标和计划以减轻不确定感。我在工作中总是害怕失败怎样克服这种恐惧失败是成长的一部分。试着改变对失败的看法将其视为学习的机会。制定小目标逐步挑战自己建立成功的经验。我感觉同事对我的期望很高让我感到压力很大怎么处理沟通是关键。与同事进行开放的对话明确你的职责和能力范围。同时学会设定界限确保工作和个人生活的平衡。可以注意到这三条样本恰好就是后面配置文件中evaluation_inputs使用的三条评估问题——这印证了文档中的建议用于评估的问题尽量与数据集的 question 保持一致从而在训练过程中客观观察模型对同分布问题的回答质量。编写 gen_qa_json.py 生成 JSONLExcel 中的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, encodingutf-8) as f: json.dump(json_data, f, ensure_asciiFalse) 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单轮列表中的input与output分别代表用户指令与期望的标准回答。你也可以完全按照上述语料格式自定义属于自己的领域数据集只需保证 Excel 中存在对应的q、a两列即可。配置文件准备查看并挑选内置配置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训练数据文件路径指向上一步生成的 JSONLmax_length512训练时文本截断的最大长度即输入 输出的 token 上限语料较长或需长上下文时可适当调大代价是显存与训练时长增加batch_size2每个训练步使用的样本数在 8GB 显存目标下保持较小值显存充足时可调大以加速max_epochs3完整遍历训练集的轮数数据量大时可适当减少数据量小如本语料 246 条时可保持 3 轮保证充分学习evaluation_freq500每训练多少步执行一次验证评估由于本数据集较小、总步数有限实际训练中可能不触发中断式验证evaluation_inputs三条职场焦虑问题训练过程中用于评估输出内容的问题建议与数据集中的 question 保持同分布便于直观对比微调效果PART 3数据集加载逻辑# 如果这里的如果没有修改的话无法直接读取json文件 datasetdict(typeload_dataset, pathjson, data_filesdict(traindata_path)) # 这里也得改成None否则会报错KeyError dataset_map_fnNone这两处修改非常关键且容易踩坑dataset的type必须保持为load_dataset且pathjson将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_INTEL1 # 模型转换 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/hfxtuner convert pth_to_hf需要三个参数训练配置文件、训练产出的 PTH 权重路径、转换后 HF 格式的输出目录。命令开头的export MKL_SERVICE_FORCE_INTEL1用于规避 Intel MKL 在线程数较多时可能出现的 service 冲突告警保证转换过程顺畅执行。将 HF adapter 合并回基座 LLM第二步将转换后的 LoRA adapter 与原始 InternLM2-7B-Chat 基座权重合并得到可直接部署推理的完整模型mkdir -p /root/autodl-tmp/ft-learn/merged export MKL_SERVICE_FORCE_INTEL1 export MKL_THREADING_LAYERGNU # 原始模型参数存放的位置 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 2GBxtuner convert merge依次接收基座模型路径、HF 格式 adapter 路径与合并输出路径--max-shard-size 2GB将合并后的权重按不超过 2GB 的分片保存符合 Transformers 大模型分片加载规范。这里额外设置了MKL_THREADING_LAYERGNU环境变量进一步规避 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: Whats 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: Hows 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列表中放一个systeminputoutput元素而多轮对话数据则需将后续每一轮的用户提问与模型回答依次追加到同一列表中system仅在首轮出现。对多轮对话微调感兴趣的同学可以按照上述数据格式自行构造数据复用本文的配置文件模板将data_path指向多轮 JSONL 即可完成训练。结语与延伸至此我们已经完整走通了环境准备 → 模型下载 → 自定义语料构建 → 配置文件定制 → QLoRA 微调 → 权重转换与合并的 InternLM2-7B-Chat 专属大模型打造全流程。核心要点回顾QLoRA DeepSpeed ZeRO-2的组合将 7B 模型微调的显存门槛压到了 8GB 级别让低成本硬件上的定制化训练成为现实配置文件中的两处关键修改dataset指向自定义 JSONL、dataset_map_fnNone是避免踩坑的重点直接决定训练能否从自有数据启动pth_to_hf与merge两步转换是 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),仅供参考