
InternLM2-7B-Chat 基于 XTuner 的 QLoRA 低资源微调实战8GB 显存打造专属职场教练【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本指南以《开源大模型食用指南》仓库中 models/InternLM2/04-InternLM2-7B-chat Xtuner Qlora 微调.md 为骨架完整讲解使用上海人工智能实验室开源的轻量化微调工具 XTuner在消费级显卡上对 InternLM2-7B-Chat 进行 QLoRA 微调的全流程。文章从环境搭建、依赖安装、模型下载、自定义数据集构造、配置文件修改到训练启动、Checkpoint 转 HF 格式、LoRA 权重合并直至多轮对话数据格式原理均给出可直接复制的命令与代码并附上源码级原理说明。读完本文你可以在 8GB 显存环境下微调 7B 级大模型并将微调产物接入 FastAPI 部署、LangChain 等下游链路打造属于你自己的垂直领域 AI 助手。一、XTuner低成本大模型微调工具箱XTuner 是由上海人工智能实验室InternLM 团队开发的高效、灵活、全能的轻量化大模型训练工具箱。其核心卖点是低显存门槛最低只需8GB 显存就可以对 InternLM2-7B 级别的模型完成微调这得益于它内置的 QLoRA 量化低秩适配方案见 QLoRA 论文 与 LoRA 论文。XTuner 的特点可归纳为三方面高效支持大语言模型 LLM、多模态图文模型 VLM 的预训练与轻量级微调支持在 8GB 显存下微调 7B 模型也支持多节点跨设备微调 70B 量级大模型自动分发高性能算子如 FlashAttention、Triton kernels加速训练吞吐兼容 DeepSpeed可轻松应用各种 ZeRO 训练优化策略。灵活支持多种开源大模型包括 InternLM、Mixtral-8x7B、Llama2、ChatGLM、Qwen、Baichuan 等支持多模态图文模型 LLaVA 的预训练与微调精心设计的数据管道兼容任意数据格式开源数据或自定义数据均可快速上手支持 QLoRA、LoRA、全量参数微调等多种微调算法用户可按需求做最优选择。全能支持增量预训练、指令微调与 Agent 微调预定义众多开源对话模板支持与开源或训练所得模型对话训练所得模型可无缝接入部署工具库 LMDeploy、评测工具库 OpenCompass 及 VLMEvalKit。仓库佐证本仓库中 AMChat-高等数学 示例正是基于 InternLM2-Math-7B 模型、通过 xtuner 微调实现的数学问答模型support_model.md#internlm2 也收录了本文对应的 InternLM2-7B-chat Xtuner Qlora 微调教程。可见 XTuner 微调 InternLM2 是本仓库中一条被反复验证的成熟路径。二、环境准备2.1 租用 GPU 机器在 AutoDL 平台租赁一台 3090 等 24G 显存的显卡机器更小显存如 8G/12G 也可XTuner 官方宣称 8GB 即可微调 7B镜像选择PyTorch -- 2.0.0 -- 3.8(ubuntu20.04) -- 11.811.3 及以上 CUDA 版本均可。如上图所示在选择主机界面确认主机显存如 RTX 3090 24GB、CPU、内存等参数后在弹出窗口中配置框架版本、Python 版本与 CUDA 版本即可创建实例。租用完成后打开服务器的 JupyterLab在其中的终端里完成环境配置、模型下载与运行演示。2.2 创建工作目录创建本次微调实践的工作目录/root/autodl-tmp/ft-learn分别存放工作文件、数据集与配置文件# 创建微调工作目录 mkdir -p /root/autodl-tmp/ft-learn # 创建微调数据集存放目录 mkdir -p /root/autodl-tmp/ft-learn/dataset # 创建微调配置文件存放目录 mkdir -p /root/autodl-tmp/ft-learn/config2.3 安装依赖# 升级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依赖说明modelscope用于从魔搭社区下载模型transformersaccelerate提供模型加载与训练加速基础sentencepiece是 InternLM 系列使用的分词器依赖transformers_stream_generator用于流式生成streamlit服务于后续的 WebDemo 展示。若网络较慢可参考仓库 General-Setting/01-pip、conda换源.md 配置国内镜像源。2.4 使用 ModelScope 下载模型使用 modelscope 的snapshot_download函数下载模型。第一个参数为模型名称参数cache_dir为模型下载路径revision指定分支此处用masterfrom modelscope import snapshot_download model_dir snapshot_download(Shanghai_AI_Laboratory/internlm2-chat-7b, cache_dir/root/autodl-tmp, revisionmaster)由于cache_dir为/root/autodl-tmp模型会被下载到/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b——这个路径在后面修改配置文件时会直接用到。2.5 安装 XTuner通过 git clone 拉取指定版本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安装成功后xtuner将成为一条可用的 CLI 命令后续的list-cfg、copy-cfg、train、convert等子命令都依赖这一步。三、数据集处理从 Excel 语料到 QLoRA 训练数据3.1 自定义语料设计本文以职场焦虑心理疏导为垂直场景使用一份自定义的心理大模型-职场焦虑语料.xlsx该语料已收录在本仓库 models/InternLM2/dataset/心理大模型-职场焦虑语料.xlsx通过脚本将其转换为 XTuner 可识别的career_coach.jsonl文件。3.2 转换脚本 gen_qa_json.py在/root/autodl-tmp/ft-learn/dataset/目录下放置脚本与语料运行python /root/autodl-tmp/ft-learn/dataset/gen_qa_json.py即可生成 JSONL 文件。你也可以完全按照下面的数据格式自定义你自己的数据集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文件生成成功)脚本逻辑拆解用pandas读取 Excel按行遍历q问题与a回答两列每条样本封装为一个conversation列表元素为{system: ..., input: ..., output: ...}结构system用于固定角色的系统提示词写入时使用ensure_asciiFalse保证中文以原始字符落盘便于人工校验外层使用json.dump输出单行 JSON多个样本构成 JSONL每行一个 JSON 对象。注意XTuner 的对话模板会同时识别system、input、output三个字段system是可选的全局角色设定。若你的场景需要多轮对话conversation列表中可以放多个元素格式详见本文第六节。四、配置文件准备4.1 查看内置配置XTuner 已内置了大量现成配置文件。先查看全部可用配置xtuner list-cfg由于本次基座模型为 internLM2-chat-7b过滤出 InternLM2 相关配置xtuner list-cfg | grep internlm2输出中可见internlm2_chat_7b_qlora_oasst1_e3等形如模型_微调算法_数据集_轮数的命名规则7b表示模型规模、qlora表示使用 QLoRA 算法、oasst1表示预设数据集为 OpenAssistantOASST1、e3表示默认 3 个 epoch。4.2 复制并重命名配置文件# 复制配置文件 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.pycopy-cfg会把内置配置复制到目标目录并自动加上_copy后缀重命名为带业务语义的名称career_coach便于区分多次实验。4.3 修改关键参数复制完成后需修改配置文件中的以下几处参数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 [ 我感到在职场中压力很大总是焦虑不安怎么办, 我在工作中总是害怕失败怎样克服这种恐惧, 我感觉同事对我的期望很高让我感到压力很大怎么处理 ]PART 3 中# 如果这里的如果没有修改的话无法直接读取json文件 datasetdict(typeload_dataset, pathjson, data_filesdict(traindata_path)) # 这里也得改成None否则会报错KeyError dataset_map_fnNone参数语义与取值建议参数作用建议pretrained_model_name_or_path基座模型路径必须与 2.4 节snapshot_download的cache_dir拼接模型名后的路径一致/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7bdata_path微调数据 JSONL 路径指向 3.2 节生成的career_coach.jsonlmax_length单条样本最大 token 长度超出会被截断512显存紧张可调小batch_size每批训练样本数QLoRA 下 2 即可满足 8GB 级显存24max_epochs最大训练轮数轮数越多拟合越充分但有过拟合风险3evaluation_freq每训练多少 step 跑一次验证集评估500evaluation_inputs评估用输入问题应尽量与数据集中的 question 同分布与场景强相关的问题dataset数据加载方式必须改为load_dataset(pathjson, data_filesdict(traindata_path))否则无法直接读取自定义 JSON 文件照抄即可dataset_map_fn数据集映射函数必须置为 None否则加载自定义 JSON 时可能报 KeyErrorNone从 XTuner 源码结构可以推断其训练器通过dataset字段构建 HuggingFacedatasets的 JSON 数据加载器再经由dataset_map_fn将原始字段映射为对话模板所需结构。默认的 OASST1 映射函数依赖 OASST1 的列名换成自定义 JSON列名为conversation后必须置空让模板层直接消费conversation字段这就是dataset_map_fnNone这一改动的底层原因。五、模型微调5.1 启动训练使用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--deepspeed deepspeed_zero2会启用 DeepSpeed ZeRO-2 策略配合 QLoRA 的 4bit 量化由 BitsAndBytes 提供把激活显存开销压到最低——这是 8GB 显存能跑 7B 微调的关键组合。训练日志中会实时打印 loss并按evaluation_freq间隔输出验证结果达到训练步数本配置下约 51 步与evaluation_freq500无关是由数据量与max_epochs共同决定后自动保存 Checkpoint。训练完成后模型参数存放在/root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/目录下其中包含iter_51.pth等原始 PTH 格式权重文件文件名中的迭代序号随实际训练步数变化。5.2 模型转换成 HF 格式XTuner 训练产出的是自定义 PTH 格式权重需先转换为 HuggingFace 格式才能被transformers直接加载# 新建模型存放的文件夹 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/hfpth_to_hf的三个参数依次为配置文件路径、PTH 权重路径、HF 格式输出目录。MKL_SERVICE_FORCE_INTEL1用于规避 Intel MKL 与部分环境在多线程场景下的服务冲突报错。5.3 合并 HF Adapter 到 LLMHF 格式下保存的是 LoRA Adapter低秩增量权重推理前需将其合并回基座模型得到完整权重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 2GBmerge子命令的参数依次为基座模型路径、HF Adapter 路径、合并输出路径--max-shard-size 2GB将合并后的权重按不超过 2GB 分片保存safetensors 分片便于管理与后续部署。合并完成后/root/autodl-tmp/ft-learn/merged/internlm2_cc_hf_merge就是可直接被transformers加载的完整微调模型可参考仓库中 InternLM2-7B-chat FastAPI 部署 一节将微调产物接入 FastAPI 服务对外提供推理接口。工作流小结xtuner train产出 PTH 权重→xtuner convert pth_to_hf转成 HF Adapter→xtuner convert mergeAdapter 与基座合并。三步缺一不可合并后的模型即可独立加载、部署与评测无缝衔接 LMDeploy / OpenCompass 等工具链。六、XTuner 多轮对话机制与数据格式6.1 训练机制拼接多轮、只回传 Output 的 LossXTuner 训练多轮对话模型时采取了一种更加充分高效的方法将多轮对话进行拼接后整体输入模型并行计算每个位置的 loss而只有 Output 部分的 loss 参与梯度回传。这样既保证了上下文连贯性模型能看到完整的历史对话又避免把输入部分的损失计入训练微调信号更干净、收敛更高效。6.2 多轮对话数据集格式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即本文第三节gen_qa_json.py生成的格式在多轮对话数据集中conversation列表长度为 n容纳 n 轮对话内容system字段一般只在首轮出现用于设定全局角色。对多轮对话微调感兴趣的同学可直接按上述格式构造数据。仓库中 dataset/ 目录下的huanhuan.jsonl等文件就是典型的对话型 JSONL 语料可作为理解该格式的补充参考。七、写在最后从微调到落地的完整闭环回顾整个实战流程租用 24G乃至 8G显存机器 → 配置 Python/深度学习依赖 → 用 ModelScope 拉取 InternLM2-7B-Chat 基座 → 将自定义职场焦虑语料Excel转换为 XTuner 的conversation格式 JSONL → 基于内置internlm2_chat_7b_qlora_oasst1_e3配置定制训练参数 →xtuner train启动 QLoRA 微调 →pth_to_hf转换 →merge合并权重。最终得到的合并模型即可按仓库中 InternLM2 系列教程 的部署路径FastAPI / LangChain / WebDemo对外提供职场教练对话服务。本文采用的职场焦虑语料只是示范——同样的数据管道与训练流程可迁移到任意垂直领域客服、教育、法律、医疗等。仓库内其他模型的微调教程如 Qwen1.5 Lora 微调、ChatGLM3 Lora 微调也遵循数据整理 → 配置修改 → 训练 → 合并的相似范式建议对照阅读以融会贯通。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考