从零微调 Qwen2.5:用 LLaMA Factory 构建 RPL 语法助手
Windows、RTX 5070 Ti、LoRA 与自定义 Alpaca 数据集的一次完整实践
前言
这次实践的目标很明确:让一个体积较小的中文大模型初步掌握 EFORT C30 控制器的 RPL 语法,并能够回答工程结构、变量声明、流程控制、运动指令、坐标系、中断和安全检查等问题。
基础模型选择 Qwen2.5-0.5B-Instruct,训练框架使用 LLaMA Factory,微调方式采用 LoRA。硬件为 NVIDIA GeForce RTX 5070 Ti,系统环境为 Windows。
一、先确认 PyTorch 真正使用 GPU
最开始安装的是 CPU 版 PyTorch,检测结果如下:
PyTorch: 2.7.1+cpu
PyTorch CUDA: None
GPU可用: False
重新安装 CUDA 版本后,结果变为:
PyTorch: 2.7.1+cu128
CUDA: 12.8
GPU可用: True
显卡: NVIDIA GeForce RTX 5070 Ti
这里容易混淆三个概念:
- 电脑安装的 CUDA Toolkit 版本;
- NVIDIA 驱动支持的 CUDA 能力;
- PyTorch wheel 自带的 CUDA Runtime。
训练主要取决于 PyTorch 自带 Runtime 与显卡驱动是否兼容,不要求本机 Toolkit 版本和 PyTorch 的 CUDA 后缀完全一致。
二、制作自己的 RPL 数据集
数据来源是项目内整理的 RPL 语法资料。数据集采用 LLaMA Factory 默认支持的 Alpaca 格式:
{
"instruction": "POINTJ 和 POINTC 分别表示什么?",
"input": "",
"output": "POINTJ 表示机器人各关节角度;POINTC 表示参考坐标系下的笛卡尔位姿……"
}
最终生成了 107 条中文样本,内容包括:
- RPL 工程目录与
.pgm、.var文件职责; - Routine、Module、GLOBAL、External 变量;
- IF、FOR、WHILE、CALL 等流程控制;
- MJOINT、MLIN、MCIRC 等运动指令;
- POINTC 姿态角、TOOL 与 REFSYS;
- 中断、触发器、定时器与字符串函数;
- 代码纠错、风险审查和低速验证建议。
数据集注册到 data/dataset_info.json:
"rpl_syntax_zh": {
"file_name": "rpl_syntax_zh.json"
}
制作专业数据集时,不能只堆砌概念问答。此次同时加入了解释、代码生成、错误修正和安全审查四类任务。尤其是 POINTC 姿态,数据中明确要求不能在工具、参考坐标系和姿态来源未知时随意补零。
三、执行 LoRA 微调
本次用于快速验证的核心参数如下:
llamafactory-cli train `
--stage sft `
--do_train True `
--model_name_or_path Qwen/Qwen2.5-0.5B-Instruct `
--finetuning_type lora `
--template qwen `
--dataset_dir data `
--dataset rpl_syntax_zh `
--cutoff_len 512 `
--learning_rate 0.0001 `
--num_train_epochs 1.0 `
--max_samples 100 `
--per_device_train_batch_size 2 `
--gradient_accumulation_steps 4 `
--bf16 True `
--output_dir saves\Qwen2.5-0.5B-Instruct\lora\qwen25-05b-rpl `
--lora_rank 8 `
--lora_alpha 16 `
--lora_dropout 0 `
--lora_target all
由于只有 100 条训练样本,批大小为 2、梯度累积为 4,一轮训练最终只有 13 个优化步骤。这非常适合验证环境、数据格式和完整训练链路,但不足以证明模型已经稳定掌握整个 RPL 体系。
四、训练结果
本次训练成功完成,关键结果如下:
epoch: 1.0
global_step: 13
train_loss: 3.3698
train_runtime: 7.81 秒
train_samples_per_second: 12.798
num_input_tokens_seen: 10112
LoRA 适配器成功生成:
saves/Qwen2.5-0.5B-Instruct/lora/qwen25-05b-rpl/
├── adapter_config.json
├── adapter_model.safetensors
├── tokenizer.json
├── trainer_state.json
└── training_loss.png
日志中的 No metric eval_loss to plot 不是训练错误,只是因为本次没有划分验证集。
五、如何正确测试
测试时需要同时加载基础模型与 LoRA 适配器:
- 基础模型:
Qwen/Qwen2.5-0.5B-Instruct - 微调方式:
lora - 适配器路径:
saves/Qwen2.5-0.5B-Instruct/lora/qwen25-05b-rpl - 对话模板:
qwen - 推理精度:
auto或bfloat16
可以准备两组问题进行对比:
- 数据集中出现过的问题,例如“RPL 中 .pgm 和 .var 分别放什么?”
- 数据集中没有原样出现、但语义相关的问题,例如“为什么不能只用 ISPOINTVALID 判断 MLIN 是否安全?”
最好用同一批提示词分别测试原始模型和 LoRA 模型,观察语法准确率、幻觉率以及安全边界是否改善。
六、下一步计划
107 条数据只能算最小可用样本。要让模型真正成为 RPL 编程助手,后续应扩展到 500 至 2000 条,并增加:
- 真实工程代码与多文件上下文;
- 控制器编译错误及修复过程;
- 不同机器人机型和坐标系案例;
- 正确答案与危险答案的对照样本;
- 独立验证集和自动化评测集。
训练轮数可以提高到 3,但比增加轮数更重要的是数据覆盖面和答案质量。对于机器人代码,模型“能生成”远远不够,还必须知道什么时候信息不足、什么时候应该停止猜测,以及哪些代码只能在手动低速和安全空间内验证。
总结
这次实践跑通了完整链路:
GPU 环境确认 → RPL 文档整理 → Alpaca 数据集生成 → LLaMA Factory 注册 → Qwen2.5 LoRA 微调 → 适配器落盘。
小模型和少量数据已经足以快速验证方案。接下来真正决定效果的,不是继续堆参数,而是持续加入高质量、贴近真实工程且具备安全意识的数据。
原文链接:https://www.ssssmy.com/blog/cong-ling-wei-tiao-qwen25-yong-llama-factory-gou-jian-rpl-yu-fa-zhu-shou