s-blog

从零微调 Qwen2.5:用 LLaMA Factory 构建 RPL 语法助手

Windows、RTX 5070 Ti、LoRA 与自定义 Alpaca 数据集的一次完整实践

ssssmy · 2026-08-06 · 5 min

前言

这次实践的目标很明确:让一个体积较小的中文大模型初步掌握 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
  • 推理精度:autobfloat16

可以准备两组问题进行对比:

  1. 数据集中出现过的问题,例如“RPL 中 .pgm 和 .var 分别放什么?”
  2. 数据集中没有原样出现、但语义相关的问题,例如“为什么不能只用 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