资讯动态

GLM-4.5-Air LoRA 微调全流程:基于 self-llm 仓库实现角色扮演对话模型并接入 SwanLab 可视化训练记录

发布时间:2026/9/12 17:36:38 来源:尧图企业网站定制
GLM-4.5-Air LoRA 微调全流程基于 self-llm 仓库实现角色扮演对话模型并接入 SwanLab 可视化训练记录【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm本文基于《开源大模型食用指南》self-llm 仓库的 03-GLM-4.5-Air-Lora 及 Swanlab 可视化微调 教程展开完整讲解从环境搭建、模型下载、SFT 数据集构建、Chat Template 适配、LoRA 配置、Trainer 训练到权重加载推理的全流程并结合仓库源码与配套 Jupyter Notebook 深入剖析每一步的底层原理。读完本文你将能够独立完成 GLM-4.5-Air 的 LoRA 有监督微调并使用 SwanLab 实时监控与记录训练过程。GLM-4.5-Air 是智谱推出的 MoE 架构大语言模型本仓库教程以训练一个甄嬛风格的角色扮演对话模型为实战案例将 SFT有监督微调与 LoRA低秩适配两大核心技法与 SwanLab 可视化实验管理工具串成一条完整的工程链路。本文以该教程为骨架结合仓库内的示例微调数据集、配套 Notebook 与 Chat-嬛嬛 参考代码对每个环节做源码级的补充说明。一、环境配置1.1 依赖安装教程推荐先更换清华 PyPI 镜像源以加速下载再安装微调所需的核心依赖# 换清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install modelscope pip install transformers4.54.0 pip install accelerate pip install datasets pip install peft0.16.0 pip install swanlab各依赖在流程中的角色如下依赖包版本作用modelscope最新从 ModelScope 魔搭社区下载 GLM-4.5-Air 模型权重transformers4.54.0加载模型与 Tokenizer提供Trainer训练框架accelerate最新支持device_mapauto自动设备映射与多卡并行datasets最新将 JSON 数据封装为 Dataset 并进行预处理映射peft0.16.0提供LoraConfig、get_peft_model、PeftModel等 LoRA 核心 APIswanlab最新训练可视化记录工具提供SwanLabCallback注官方教程还提及 ucloud 平台预置了 GLM-4.5-Air 环境镜像可直接创建实例如需手动搭建环境可按上文逐条安装。Transformers 与 PEFT 的版本号建议严格对齐避免 API 差异导致的兼容问题。1.2 模型下载使用 ModelScope 的snapshot_download下载模型ZhipuAI/GLM-4.5-Air为仓库名cache_dir指定本地缓存目录revisionmaster指定分支from modelscope import snapshot_download model_dir snapshot_download(ZhipuAI/GLM-4.5-Air, cache_diryour_model_dir, revisionmaster)注意将cache_dir替换为你的实际路径。本仓库中模型路径惯例如01-GLM-4.5-Air-vLLM 部署调用.md所示一般会存放于类似/model/ModelScope/ZhipuAI/GLM-4.5-Air的目录后续加载模型、Tokenizer 与 LoRA 权重时均引用该路径。二、SFT 数据集构建2.1 SFT 数据格式对大语言模型进行有监督微调supervised-finetuningSFT时一条标准训练样本由三部分组成{ instruction: 回答以下用户问题仅输出答案。, input: 11等于几?, output: 2 }instruction用户指令告知模型需要完成的任务input用户输入是完成指令所必需的输入内容output模型应当给出的标准输出。SFT 的目标是让模型具备理解并遵循用户指令的能力因此数据集必须围绕目标任务针对性构建。本教程的实战目标是训练一个能 role-play 甄嬛对话风格的模型数据示例如下{ instruction: 你父亲是谁, input: , output: 家父是大理寺少卿甄远道。 }2.2 示例数据集仓库中所有示例微调数据位于 dataset/huanhuan.json该文件收录了约三千余条甄嬛风格对话样本配套 Notebook 中Map处理显示共 3729 条例如{ instruction: 娘娘。, input: , output: 你放心本宫到任何时候都不会自轻自贱委屈了这孩子。 }, { instruction: 是皇上有心惦记着咱们爱看戏。, input: , output: 一早出来便这么热到了午后还不知要什么样子呢。 }从 dataset/huanhuan.json 的样本结构可以看出绝大多数样本的input字段为空instruction直接承载用户台词output为甄嬛的应答台词这正是角色扮演场景的典型数据形态无需额外上下文输入模型只需学会在给定台词语境下以角色口吻作答。此外仓库还提供了huanhuan-100.json与huanhuan.jsonl两种数据形态便于不同加载方式使用。三、数据准备格式化与编码3.1 预处理函数解析LoRA 训练前需要将原始文本编码为模型可读的向量输入文本编码为input_ids输出文本编码为labels。教程给出了一个预处理函数process_func对每个样本同时编码输入与输出def process_func(example): MAX_LENGTH 1024 # 设置最大序列长度为1024个token input_ids, attention_mask, labels [], [], [] # 初始化返回值 # 适配chat_template instruction tokenizer( f[gMASK]sop|system|\n现在你要扮演皇帝身边的女人--甄嬛 f|user|\n{example[instruction] example[input]} f|assistant|\nthink/think\n, add_special_tokensFalse ) response tokenizer(f{example[output]}, add_special_tokensFalse) # 将instructio部分和response部分的input_ids拼接并在末尾添加eos token作为标记结束的token input_ids instruction[input_ids] response[input_ids] # 注意力掩码表示模型需要关注的位置 attention_mask instruction[attention_mask] response[attention_mask] # 对于instruction使用-100表示这些位置不计算loss即模型不需要预测这部分 labels [-100] * len(instruction[input_ids]) response[input_ids] if len(input_ids) MAX_LENGTH: # 超出最大序列长度截断 input_ids input_ids[:MAX_LENGTH] attention_mask attention_mask[:MAX_LENGTH] labels labels[:MAX_LENGTH] return { input_ids: input_ids, attention_mask: attention_mask, labels: labels }关键设计要点手工拼装 Chat Template训练样本并未调用apply_chat_template而是直接按 GLM 系列的特殊 token 结构手工拼出[gMASK]sop|system|...|user|...|assistant|\nthink/think\n前缀。这样做的目的是让系统提示 用户输入全部作为上下文其labels置为-100模型只需预测output部分的 token从而学到看到这个角色设定和用户台词 → 输出甄嬛式应答的映射。-100屏蔽 Losslabels中指令部分全部置为-100PyTorch 交叉熵损失会自动忽略-100位置确保梯度只由应答部分贡献这是 SFT 中防止模型复读提示词的标准做法。MAX_LENGTH 1024超出上限的序列直接截断。配套 Notebook 中同样使用 1024 作为最大序列长度避免超长样本撑爆显存。add_special_tokensFalse手工模板已包含全部特殊 token关闭自动添加防止重复。在配套 Notebook 中数据集加载与映射的完整代码如下from datasets import Dataset import pandas as pd # 将JSON文件转换为CSV文件 df pd.read_json(./huanhuan.json) # 注意修改 ds Dataset.from_pandas(df) tokenized_id ds.map(process_func, remove_columnsds.column_names)映射完成后数据集由instruction/input/output三列变为input_ids/attention_mask/labels三列共 3729 行。Notebook 还演示了两种验证手段解码tokenized_id[0][input_ids]可还原出完整的角色扮演提示模板过滤掉-100后解码labels可还原出标准答案文本用于确认预处理没有编错。3.2 GLM-4.5-Air 的 Chat Template 与思考模式GLM-4.5-Air 是混合推理模型支持在对话时手动选择是否开启思考模式thinking mode这一特性由apply_chat_template的enable_thinking参数控制。不开启 thinking mode此时 user 消息后会出现nothink标记messages [ {role: system, content: You are a helpful assistant.}, {role: user, content: 你好}, {role: assistant, content: 你好我是一个AI助手}, {role: user, content: 不错}, ] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue, enable_thinkingFalse ) print(text)[gMASK]sop|system| You are a helpful assistant.|user| 你好/nothink|assistant| think/think 你好我是一个AI助手|user| 不错/nothink|assistant| think/think开启 thinking modetext tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue, enable_thinkingTrue ) print(text)[gMASK]sop|system| You are a helpful assistant.|user| 你好|assistant| think/think 你好我是一个AI助手|user| 不错|assistant|对比可见开启思考模式时模板不含nothink标记模型会先输出think.../think包裹的推理过程再输出最终答案关闭时则直接给出答案。这一点也体现在仓库 vLLM 部署教程 01-GLM-4.5-Air-vLLM 部署调用.md 中官方建议思考模式采用temperature0.6, top_p0.95, top_k20, min_p0的采样参数。在训练数据构建时教程手工模板中保留了think/think空标签意味着微调阶段默认采用思考模式模板而推理阶段在加载 LoRA 权重后可通过enable_thinkingFalse关闭思考让角色模型直接以甄嬛口吻作答。四、加载模型与 Tokenizertokenizer AutoTokenizer.from_pretrained(请修改我/Qwen/Qwen3-8B) model AutoModelForCausalLM.from_pretrained(请修改我/Qwen/Qwen3-8B, device_mapauto, torch_dtypetorch.bfloat16)注意原教程此处的模型路径为占位符实际应替换为第一节下载的ZhipuAI/GLM-4.5-Air本地路径如/model/ModelScope/ZhipuAI/GLM-4.5-Air。配套 Notebook 使用torch.bfloat16混合精度加载模型结构为Glm4MoeForCausalLM从 Notebook 输出的结构信息可以印证以下实现事实词表大小为 151552隐藏层维度 4096共 47 层 Transformer每层 attention 包含q_proj4096→12288、k_proj/v_proj4096→1024、o_proj12288→4096第 46 层末层为稠密 MLP前 46 层为 MoE 结构每层含 128 个专家experts与共享专家shared_experts专家内为gate_proj/up_proj/down_proj三段式 SwiGLU 结构。这组结构信息直接决定了 LoRA 的target_modules该如何设置见下一节。另外Notebook 中在加载模型后执行了model.enable_input_require_grads() # 开启梯度检查点时要执行该方法由于TrainingArguments开启了gradient_checkpointingTrue必须调用enable_input_require_grads()让输入层保留梯度否则反向传播会在 checkpoint 重算时因输入无梯度而报错这是 Peft 微调 梯度检查点组合下的必备步骤。五、LoRA 配置详解5.1 核心参数LoraConfig是 PEFT 库中配置 LoRA 的核心类关键参数如下参数本教程取值含义task_typeTaskType.CAUSAL_LM模型类型。绝大部分 decoder-only 模型都是因果语言模型CAUSAL_LMtarget_modules7 个投影层需要注入 LoRA 的模型层名称主要覆盖 attention 与 MLP 的线性层r8LoRA 的秩决定低秩矩阵维度r越小训练参数量越少lora_alpha32缩放参数与r共同决定 LoRA 更新强度实际缩放比例为lora_alpha / r本例为32 / 8 4lora_dropout0.1LoRA 层的 dropout 比例用于防止过拟合5.2 配置代码config LoraConfig( task_typeTaskType.CAUSAL_LM, target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], inference_modeFalse, # 训练模式 r8, # Lora 秩 lora_alpha32, # Lora alpha lora_dropout0.1 # Dropout 比例 )target_modules覆盖了 GLM-4.5-Air 每层 Transformer 的全部线性投影attention 的q/k/v/o_proj与 MoE 专家 MLP 的gate/up/down_proj对照第四节的结构输出可一一对应。LoRA 的原理是在这些冻结的原权重旁插入低秩分解矩阵A ∈ R^{r×k}与B ∈ R^{d×r}训练时仅更新这两个小矩阵从而以极小的参数量实现领域适配。配套 Notebook 中配置后通过get_peft_model包装模型并打印可训练参数占比实际输出为trainable params: 783,005,184 || all params: 107,635,250,688 || trainable%: 0.7275可见 GLM-4.5-Air 全模型参数约 1076 亿其中 MoE 激活参数远小于总量而 LoRA 仅训练约 7.83 亿参数占比不到 1%这正是 LoRA 能够以单卡级显存完成大模型微调的关键。仓库中的其他微调案例如 examples/Chat-嬛嬛/train.py采用了完全相同的target_modules与超参写法可作为跨模型的通用参考。六、TrainingArguments 训练参数args TrainingArguments( output_dir./output/glm45_air_lora, per_device_train_batch_size4, gradient_accumulation_steps4, logging_steps2, num_train_epochs3, save_steps10, learning_rate1e-4, save_on_each_nodeTrue, gradient_checkpointingTrue, report_tonone, )各参数的作用与建议output_dir模型 checkpoint 输出目录推理时从这里加载 LoRA 权重per_device_train_batch_size4每张 GPU 上的 batch sizegradient_accumulation_steps4梯度累积步数。等效总 batch 4 × 4 16通过累积减小显存压力logging_steps2每 2 步打印一次训练日志Notebook 实测每 2 步输出一条 lossnum_train_epochs3训练 3 个 epoch。结合 3729 条数据与等效 batch 16总步数约 702 步Notebook 训练进度条显示23/702与3729 ÷ 16 × 3 ≈ 699基本吻合save_steps10每 10 步保存一次 checkpoint推理示例中加载的正是checkpoint-20learning_rate1e-4学习率LoRA 微调常见量级save_on_each_nodeTrue多节点训练时每个节点都保存gradient_checkpointingTrue梯度检查点以计算换显存训练时 transformers 会自动将use_cache置为FalseNotebook 日志中有对应提示report_tonone关闭 transformers 自带的实验跟踪上报避免与 SwanLab 回调冲突实验记录统一交给 SwanLab 负责。七、SwanLab 可视化训练记录7.1 SwanLab 是什么SwanLab 是一个开源的 AI 模型训练记录工具面向 AI 研究者提供训练可视化、自动日志记录、超参数记录、实验对比、多人协同等功能。研究者可以基于直观的可视化图表发现训练问题对比多个实验找到研究灵感并通过在线链接分享与基于组织的多人协同训练打破团队沟通壁垒。为什么要记录训练模型训练本质上是一门实验科学优质模型背后往往是成千上万次实验。研究者需要不断尝试、记录、对比积累经验才能找到最佳模型结构、超参数与数据配比高效的记录与对比手段直接决定研究效率。7.2 实例化 SwanLabCallback建议先在 SwanLab 官网注册账号训练初始化阶段选择(2) Use an existing SwanLab account并使用 private API Key 登录import swanlab from swanlab.integration.transformers import SwanLabCallback swanlab.login(api_keyyour api key, saveTrue) # 实例化SwanLabCallback swanlab_callback SwanLabCallback( projectself-llm, experiment_nameglm45_air_lora_experiment )swanlab.login(api_key..., saveTrue)使用私人 API Key 登录saveTrue将凭据保存到本地后续训练免重复登录projectself-llm实验所属项目名同一项目的多次实验可在同一个看板下对比experiment_nameglm45_air_lora_experiment本次实验名称用于区分同项目下的不同 run。从配套 Notebook 的运行日志可以看到SwanLab 会输出如下关键信息本地数据保存目录如/workspace/swanlog/run-20250729_034415-...、欢迎登录信息、云端同步进度Syncing run glm45_air_lora_experiment to the cloud以及项目/实验的在线查看地址。这些日志可用于确认可视化链路是否打通。7.3 使用 Trainer 训练将swanlab_callback作为回调传入 Trainer 即可在训练过程中自动记录 loss、学习率、显存占用等指标trainer Trainer( modelmodel, argsargs, train_datasettokenized_id, data_collatorDataCollatorForSeq2Seq(tokenizertokenizer, paddingTrue), callbacks[swanlab_callback] # 传入之前的swanlab_callback ) trainer.train()DataCollatorForSeq2Seq(tokenizertokenizer, paddingTrue)负责将 batch 内不同长度的序列动态 padding 到相同长度。Notebook 的实测训练日志显示loss 从第 2 步的约 3.54 逐步下降第 6 步约 2.95第 14 步约 3.00整体呈收敛趋势训练进度条记录了Epoch 0.09/3、0.02 it/s等实时信息说明在 4 卡 × batch 4 的配置下GLM-4.5-Air 的 LoRA 微调可以稳定运行。训练完成后打开 SwanLab 即可查看训练过程中记录的参数和可视化的训练 loss 曲线并支持跨实验对比定位过拟合或欠拟合问题。八、加载 LoRA 权重推理训练得到任意 checkpoint 后可用PeftModel.from_pretrained将 LoRA 权重挂载到基座模型上进行推理from transformers import AutoModelForCausalLM, AutoTokenizer import torch from peft import PeftModel mode_path /model/ModelScope/ZhipuAI/GLM-4.5-Air lora_path /workspace/output/glm45_air_lora/checkpoint-20 # 这里改成你的 lora 输出对应 checkpoint 地址 # 加载tokenizer tokenizer AutoTokenizer.from_pretrained(mode_path) # 加载模型 model AutoModelForCausalLM.from_pretrained(mode_path, device_mapauto, torch_dtypetorch.bfloat16, trust_remote_codeTrue) # 加载lora权重 model PeftModel.from_pretrained(model, model_idlora_path) prompt 你是谁 inputs tokenizer.apply_chat_template( [{role: user, content: 假设你是皇帝身边的女人--甄嬛。},{role: user, content: prompt}], add_generation_promptTrue, tokenizeTrue, return_tensorspt, return_dictTrue, enable_thinkingFalse ) inputs { input_ids: inputs[input_ids], attention_mask: inputs[attention_mask] } gen_kwargs {max_length: 2500, do_sample: True, top_k: 1} with torch.no_grad(): outputs model.generate(**inputs, **gen_kwargs) outputs outputs[:, inputs[input_ids].shape[1]:] print(tokenizer.decode(outputs[0], skip_special_tokensTrue))运行结果我是甄嬛家父是大理寺少卿甄远道。推理环节的要点trust_remote_codeTrueGLM 系列依赖远程自定义代码加载模型结构必须开启角色设定放在消息中系统提示假设你是皇帝身边的女人--甄嬛与用户问题一起通过apply_chat_template组装与训练时的模板保持一致训练模板同样以现在你要扮演皇帝身边的女人--甄嬛作为 system 内容这是保证微调效果正确迁移的前提enable_thinkingFalse角色扮演场景直接输出对话关闭思考模式以获得更自然的应答gen_kwargsdo_sampleTrue开启采样top_k1为贪心式采样max_length2500限制总生成长度去除输入前缀outputs[:, inputs[input_ids].shape[1]:]截掉输入部分只解码新生成的 token并用skip_special_tokensTrue过滤特殊 token。九、完整代码与扩展阅读本文所有代码均已同步整理为可直接运行的 Jupyter Notebook03-GLM-4.5-Air-Lora 及 Swanlab 可视化微调.ipynb其中包含数据集加载、Chat Template 演示、模型结构输出、LoRA 配置、SwanLab 回调与训练、推理验证的完整单元是本文档的代码级配套。如需进一步扩展可参考仓库内以下资源示例微调数据集 dataset/huanhuan.json本文训练所用的甄嬛对话数据集约 3729 条样本也可替换为自己构造的 SFT 数据examples/Chat-嬛嬛/train.py同主题的独立训练脚本展示process_funcLoraConfigTrainer的标准写法便于对照移植到其他模型01-GLM-4.5-Air-vLLM 部署调用.md微调完成后若需对外提供高性能推理服务可参考该文使用 vLLM 部署并利用enable_thinking参数控制思考模式的开启。结语本文以 self-llm 仓库的 GLM-4.5-Air 教程为主线完整走通了环境配置 → 模型下载 → SFT 数据构建 → Chat Template 适配 → LoRA 配置 → Trainer 训练 → SwanLab 可视化 → LoRA 推理的全链路。核心要点可归纳为三点一是 SFT 数据与-100标签屏蔽机制决定了模型只学应答、不学提示的行为边界二是target_modules必须与 GLM-4.5-Air 的Glm4MoeForCausalLM结构一一对应LoRA 仅训练约 0.73% 的参数即可完成角色适配三是 SwanLab 回调将训练过程透明化让 loss 曲线、超参数与实验对比成为可沉淀的研究资产。掌握这套流程后你可以将同样的方法迁移到任意 decoder-only 模型与任意对话风格数据上快速构建属于自己的领域对话模型。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价