使用LLaMA-Factory对GLM-4-9B-Chat进行LoRA微调

使用LLaMA-Factory对GLM-4-9B-Chat进行LoRA微调

在大模型应用日益普及的今天,如何快速、低成本地定制一个符合特定场景需求的语言模型,已经成为开发者和企业关注的核心问题。直接全参数微调动辄数十GB显存消耗,对大多数团队而言并不现实。而像 LoRA(Low-Rank Adaptation) 这样的高效微调技术,配合如 LLaMA-Factory 这类开箱即用的框架,正让“平民化”大模型定制成为可能。

本文将以 GLM-4-9B-Chat 为例,带你从零开始完成一次完整的 LoRA 微调流程——从环境配置、数据清洗到训练部署,最终得到一个可独立运行的专属模型。整个过程无需深入理解底层原理,也能在单卡 A10/A100 上顺利完成。


环境准备:搭建可编辑的开发环境

首先确保你的系统已安装 Python ≥ 3.10 和支持 CUDA 的 PyTorch 版本(推荐 torch==2.1.0+cu118 或更高)。考虑到国内网络环境,建议更换 pip 源以加速依赖下载:

python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 

接着克隆并安装 LLaMA-Factory。这里的关键是使用 -e 参数进行“可编辑安装”,这样后续若需调试源码或添加自定义组件也无需重新安装:

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]" 
✅ 安装说明:[torch,metrics] 会自动拉取 Transformers、Datasets、Accelerate、Peft 等核心库,省去手动管理依赖的麻烦。

安装完成后执行以下命令验证是否成功:

llamafactory-cli --help 

如果输出帮助信息,则说明环境已就绪。此时你已经拥有了一个功能完整的大模型微调平台。


模型获取:通过 ModelScope 下载 GLM-4-9B-Chat

GLM-4-9B-Chat 是智谱 AI 推出的高性能对话模型,具备优秀的多轮交互与指令遵循能力。由于其未公开托管于 Hugging Face,我们需通过 ModelScope 获取。

创建脚本 download_glm4.py

from modelscope.hub.snapshot_download import snapshot_download model_dir = snapshot_download( 'ZhipuAI/glm-4-9b-chat', cache_dir='/root/models', # 可根据实际路径修改 revision='master' ) print(f"Model downloaded to: {model_dir}") 

运行后开始下载,模型体积约 14GB,通常需要 10–20 分钟。完成后记录下完整路径,例如 /root/models/ZhipuAI/glm-4-9b-chat,后续配置中将多次引用该路径。

⚠️ 注意事项:
- 需提前登录 ModelScope 账号并配置好认证密钥。
- 若提示权限错误,请检查是否已接受模型协议。

数据处理:构建高质量训练样本

LLaMA-Factory 支持多种数据格式,其中最常用的是 Alpaca 格式,它结构清晰且兼容性强。标准模板如下:

[ { "instruction": "请解释什么是机器学习", "input": "", "output": "机器学习是……", "system": "你是一位人工智能助手", "history": [ ["上一轮问题", "上一轮回答"] ] } ] 

字段含义明确:
- instructionoutput 是必填项;
- system 控制角色设定;
- history 支持多轮上下文建模。

单轮数据转换

假设原始数据为包含 "prompt""completion" 字段的 JSON 列表,可通过以下脚本完成转换:

import json import re file_name = "my_single_turn_data.json" system_prompt = "你是一个专业且富有同理心的AI助手" with open(f"./raw/{file_name}", "r", encoding="utf-8") as f: raw_data = json.load(f) converted = [] for item in raw_data: output_text = item["completion"] if "✿" in output_text: output_text = output_text.replace("✿", "") if "你好,我是AI助手" in output_text: output_text = re.sub(r"^.*?\n", "", output_text).strip() converted.append({ "instruction": item["prompt"], "input": "", "output": output_text, "system": system_prompt, "history": [] }) with open(f"./processed/{file_name}", "w", encoding="utf-8") as f: json.dump(converted, f, ensure_ascii=False, indent=4) print(f"✅ {file_name} 已转换完成") 

这类清洗逻辑很常见——比如去除冗余引导语或特殊符号,能显著提升训练稳定性。

多轮对话提取

对于客服记录、访谈等多轮文本,关键是把历史对话作为上下文输入。示例代码如下:

import json from tqdm import tqdm file_name = "multi_turn_conversations.json" system_prompt = "你是一个耐心、专业的对话助手" with open(f"./raw/{file_name}", "r", encoding="utf-8") as f: conversations = json.load(f) converted = [] for conv in tqdm(conversations): dialogue = conv.get("conversation", []) if len(dialogue) < 1: continue history = [(turn["input"], turn["output"]) for turn in dialogue[:-1]] last_turn = dialogue[-1] converted.append({ "instruction": last_turn["input"], "input": "", "output": last_turn["output"], "system": system_prompt, "history": history }) with open(f"./processed/{file_name}", "w", encoding="utf-8") as f: json.dump(converted, f, ensure_ascii=False, indent=4) print(f"✅ 多轮数据 {file_name} 转换完成") 

这种设计能让模型学会基于上下文生成连贯回复,而不是每次都“失忆”。

数据集合并与注册

多个来源的数据可以统一合并成一个主文件:

import json merged = [] dataset_files = [ "single_turn_dataset_1.json", "single_turn_dataset_2.json", "multi_turn_conversations.json", "custom_instruction_tuning.json" ] for fname in dataset_files: with open(f"./processed/{fname}", "r", encoding="utf-8") as f: data = json.load(f) merged.extend(data) with open("./processed/combined_training_data.json", "w", encoding="utf-8") as f: json.dump(merged, f, ensure_ascii=False, indent=4) print("🎉 所有数据集已合并为 combined_training_data.json") 

然后将其注册到 LLaMA-Factory 中。编辑 data/dataset_info.json 添加条目:

{ "my_glm4_ft_data": { "file_name": "/path/to/LLaMA-Factory/data/processed/combined_training_data.json" } } 
✅ 提示:路径可以是绝对路径,也可以是相对于 data/ 目录的相对路径。

启动训练:配置 LoRA 微调任务

在项目根目录创建 YAML 配置文件 lora_sft_glm4.yaml

# 模型参数 model_name_or_path: /root/models/ZhipuAI/glm-4-9b-chat # 训练任务类型 stage: sft # Supervised Fine-Tuning do_train: true finetuning_type: lora # 使用 LoRA # LoRA 配置 lora_target: all # 应用于所有线性层(Q, K, V, O, FFN) lora_rank: 64 # 秩越高表达能力越强,但参数更多 lora_dropout: 0.05 # 正则化防止过拟合 lora_alpha: 16 # 缩放因子,一般设为 rank 的两倍左右 # 数据配置 dataset: my_glm4_ft_data template: glm4 # 使用官方 GLM 分词模板 cutoff_len: 2048 # 最大序列长度 max_samples: 5000 # 限制样本数便于调试 overwrite_cache: true preprocessing_num_workers: 16 # 输出设置 output_dir: saves/glm4-lora-sft/checkpoint logging_steps: 10 save_strategy: epoch plot_loss: true overwrite_output_dir: true # 训练超参 per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1e-4 num_train_epochs: 5 lr_scheduler_type: cosine warmup_ratio: 0.1 fp16: true # 混合精度训练,节省显存 

几个关键点值得强调:
- lora_target: all 表示同时适配注意力层和前馈网络,适合复杂任务;
- fp16: true 在 A10/A100 上几乎无损还能减半显存占用;
- gradient_accumulation_steps: 8 相当于全局 batch size 达到 8,有助于梯度稳定。

启动训练只需一条命令:

cd LLaMA-Factory llamafactory-cli train lora_sft_glm4.yaml 

训练过程中终端会实时显示 loss 变化,同时日志也会写入 runs/ 目录,可用 TensorBoard 查看:

tensorboard --logdir=runs 

权重合并:导出可部署模型

训练结束后得到的只是一个 LoRA 适配器,不能独立运行。我们需要将其与原模型融合成一个完整的 .bin 文件。

新建 export_glm4_lora.yaml

model_name_or_path: /root/models/ZhipuAI/glm-4-9b-chat adapter_name_or_path: saves/glm4-lora-sft/checkpoint template: glm4 finetuning_type: lora export_dir: models/EmoGLM-4-9B-Chat export_size: 2 export_device: cpu export_legacy_format: false 

执行合并:

llamafactory-cli export export_glm4_lora.yaml 
💡 建议使用 CPU 合并,避免 GPU 显存溢出;虽然慢一些,但更可靠。

完成后,models/EmoGLM-4-9B-Chat 目录将包含标准 Hugging Face 模型结构,可直接用于推理。


效果验证:快速测试生成质量

编写简单脚本验证模型表现:

from transformers import AutoModelForCausalLM, AutoTokenizer model_path = "models/EmoGLM-4-9B-Chat" tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, device_map="auto") query = "你能帮我写一首关于春天的诗吗?" inputs = tokenizer(query, return_tensors="pt").to("cuda") outputs = model.generate( **inputs, max_new_tokens=256, do_sample=True, temperature=0.7, top_p=0.9 ) response = tokenizer.decode(outputs[0], skip_special_tokens=True) print(response) 

观察输出是否体现出更强的风格一致性或领域倾向。如果明显优于原始模型,说明微调有效。


实战优化技巧与进阶建议

即使流程跑通了,仍有许多细节可以打磨。以下是我在实际项目中总结的一些经验:

场景解决方案
显存不足改用 QLoRA:设置 quantization_bit: 4 + finetuning_type: qlora,可在 24GB 显存下完成训练
训练太慢启用 FlashAttention:添加 attn_implementation: flash_attention_2(需 Ampere 架构及以上 GPU)
防止过拟合开启评估模式:设置 do_eval: trueval_size: 0.1,监控验证 loss 是否持续下降
多卡并行使用 DeepSpeed 或 DDP:配合 torchrun 分布式启动,注意增加 ddp_timeout: 180000

此外,LLaMA-Factory 还内置了 WebUI 界面,适合不熟悉命令行的用户:

llamafactory-cli webui 

访问 http://localhost:7860 即可通过图形界面上传数据、调整参数、启动训练,完全免去手写 YAML 的繁琐。


真正有价值的技术,不是最难懂的,而是最容易落地的。LLaMA-Factory 正是这样一个工具——它把复杂的分布式训练、内存优化、分词策略封装成简单的接口,让我们能把精力集中在数据质量和业务逻辑上。

无论是打造情感陪伴机器人、垂直行业问答系统,还是构建企业级智能体,这套方法都能帮你用极低成本迈出第一步。下一步,不妨试试用 QLoRA 在消费级显卡(如 RTX 3090/4090)上跑通整个流程,再接入 FastAPI 或 Gradio 构建服务接口,真正实现“让大模型为我所用”。

Read more

(PLL时钟进阶)差分与单端时钟的硬件实现与抗噪优化

1. 差分与单端时钟的基础概念 在数字电路设计中,时钟信号的质量直接影响系统的稳定性和性能。差分时钟和单端时钟是两种常见的时钟传输方式,它们在硬件实现和抗干扰能力上有显著差异。 单端时钟采用单根信号线传输时钟信号,参考地平面作为返回路径。这种方式简单直接,但容易受到地电平差异和环境噪声的影响。我在实际项目中遇到过这样的情况:当单端时钟线附近有大电流切换时,时钟信号会出现明显的抖动,导致系统时序紊乱。 差分时钟则采用一对相位相反的信号线(P端和N端)传输时钟信号。接收端通过比较两个信号的差值来还原时钟信息。这种方式具有天然的共模噪声抑制能力,我在多个高速项目中实测发现,差分时钟在复杂电磁环境下的稳定性明显优于单端时钟。 Xilinx FPGA的时钟输入引脚分为差分时钟专用引脚(Differential Clock Capable Pin)和单端时钟专用引脚(Single Ended Clock Capable Pin)。以K7系列为例,差分时钟引脚通常成对出现,如CLK_P和CLK_N,而单端时钟引脚则是独立的。 2. Xilinx FPGA中的硬件实现 2.1 差分时钟的

By Ne0inhk
机器人为什么总在“最后一厘米”失败?RoboBrain 2.5 给出解法

机器人为什么总在“最后一厘米”失败?RoboBrain 2.5 给出解法

过去一年,具身智能的“视觉理解 + 语言推理”进步明显,但从实验室演示走向真实部署,经常遇到“看得见”但“做不对”的问题。这源于两个长期被低估的关键短板:空间维度的度量盲区,以及时间维度的过程建模不足。 在空间不准上,模型虽能理解2D图像中的目标与关系,却缺乏将其转化为真实尺度下可执行3D轨迹的能力,导致抓取、装配等操作因深度、距离等物理度量不准而失败;在过程不稳上,多数模型仍将动作生成简化为静态序列预测,依赖稀疏的成功标签,无法对操作过程中出现的打滑、偏移等动态变化做出实时评估与调整,致使长任务难以稳定完成。 这就要求新一代具身模型,需要把空间能力从“2D 指点”升级为“精确 3D 规划”,满足物理世界的度量约束与可执行性要求。 智源研究院正式发布新一代具身智能大脑基础模型 RoboBrain 2.5。作为 RoboBrain 系列的最新版本,RoboBrain 2.5 在延续通用感知、空间推理与时序建模能力底座的基础上,通过更大规模的高质量时空监督训练,完成了两项面向真实物理世界的关键升级:Precise

By Ne0inhk
VLA技术颠覆具身智能!从架构到落地,解锁机器人与自动驾驶的统一大脑密码

VLA技术颠覆具身智能!从架构到落地,解锁机器人与自动驾驶的统一大脑密码

摘要:本报告涵盖了 VLA(视觉 - 语言 - 动作模型)的技术架构、核心组件、产业实践、进化路径与落地挑战,以及理想 MindVLA、小米 ORION 等标杆方案,为 AI 技术从业者、机器人 / 自动驾驶企业决策者、投资者提供全景式技术指南,助力快速把握具身智能核心突破口。 当传统机器人、自动驾驶陷入 “视觉 - 语言 - 动作双系统割裂” 困境,VLA 以 “全程可求导” 的统一架构横空出世,将 “看、想、做” 融为一体,成为具身智能的革命性技术底座。本报告深度拆解 VLA 从组件到落地的全链路,用硬核技术细节与标杆案例,揭开机器人与自动驾驶 “统一大脑” 的构建密码! 一、

By Ne0inhk
MANAGAME×ETO联合引爆2025亚洲WEB3峰会,开启GameFi3.0全球新纪元

MANAGAME×ETO联合引爆2025亚洲WEB3峰会,开启GameFi3.0全球新纪元

2025年8月25日,亚洲Web3领域年度瞩目盛会——2025亚洲WEB3商业生态创新峰会·香港站将在香港隆重举行。本次峰会由MANAGAME与ETO联合主办,全球顶级行业领袖、知名公链团队、头部GameFi项目方、投资机构与媒体将齐聚一堂,共同探讨区块链游戏、数字内容和Web3商业生态的未来发展趋势。 此次峰会不仅是一场行业高峰对话,更是GameFi3.0时代的战略起点。作为本次大会的联合主办方,MANAGAME与ETO将携手发布一系列重磅战略与全球化生态布局,为链游与Web3产业注入全新动能。 MANAGAME是由Armonia集团、日本顶级游戏公司KoeiTecmo及GameFi3.0先锋平台ETO共同打造的多链聚合链游引擎平台。平台以“一次开发,全链部署”为核心技术优势,打通ETH、BSC、Polygon等多条公链,构建全链资产流通与多链互通的新格局。 ETO深耕链游经济模型与资产流通机制,在GameFi3.0领域具备丰富的生态落地经验和庞大的全球用户基础。此次与MANAGAME的全面合作,不仅是技术与生态的深度融合,更是面向全球市场的强强联合。 本次峰会将聚焦于链游生

By Ne0inhk