LLaMA-Factory微调工具
https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
https://llamafactory.readthedocs.io/zh-cn/latest/
qwen3最佳实践:
https://swift.readthedocs.io/zh-cn/latest/BestPractices/Qwen3%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html#id5
安装时确保python在虚拟环境中
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
# 如果你的cuda版本,不是cuda12.2,那么需要自己先安装好与之匹配的pytorch
uv pip install torch --index-url https://download.pytorch.org/whl/cu129
# 如果要加载语音数据和多模态则还需要安装 torchaudio torchvision
然后 uv pip install -e ".[metrics]"
# 如果是cuda12.2 则直接使用下面的命令:
pip install -e ".[torch,metrics]"
如果安装成功使用llamafactory-cli version查看版本
不要开启系统代理,否则webui会启动失败
启动web界面llamafactory-cli webui
注意事项
- 如果是聊天,基座模型选Instruct,而不是base
- 如果下载源不是Hugging Face,例如modelscope则手动指定本地模型路径:
/home/ubuntu/.cache/modelscope/hub/models/Qwen/模型路径,或者完全自己下载后指定路径,否则训练可能还会触发从hu下载而出错
下载后模型的保存位置
类似这样:/home/ubuntu/.cache/modelscope/hub/models/Qwen/Qwen3-4B-Instruct-2507
自定义数据集
自定义数据集,LLaMA-Factory目录下的data目录,将json数据集放入data目录中,编辑dataset_info.json,添加
"ziji": {
"file_name": "data.json" //直接只指定名称和路径
},
"my_qr": { // 数据集的唯一名称;训练时 --dataset 用这个名字
"file_name": "my_qr.jsonl", // 数据文件路径(建议放 data/ 目录;JSONL 一行一条样本)
"columns": { // 字段映射:把“你文件里的键”映射为“框架内部标准列”
"prompt": "query", // 把你文件里的 query 视为“指令”prompt(≈ Alpaca 的 instruction)
"response": "response" // 把你文件里的 response 视为“期望输出”response(≈ Alpaca 的 output)
// 说明:你没有单独的 input 字段,所以这里不写内部的 "query": "<你的input字段>"
// 如有全局 system 或多轮 history,可在此额外添加 "system"/"history" 的映射
}
// 未映射的其他键(如 tag)默认当成元信息,不参与损失或渲染
},
"my_sharegpt": { // 另一个数据集名称;同样可被 --dataset 使用
"file_name": "my_sharegpt.jsonl", // 对话数据文件路径(可 .json 或 .jsonl)
"formatting": "sharegpt", // 指定解析为 sharegpt 对话格式(会转换成 messages)
"columns": { "messages": "conversations" }, // 顶层字段 conversations 就是对话数组 messages
"tags": { // 对话数组里每条消息的键名与角色取值如何映射
"role_tag": "from", // 每条消息里“角色”的键名叫 from(若你是 role 就写 role)
"content_tag": "value", // 每条消息里“文本”的键名叫 value(若你是 content 就写 content)
"user_tag": "human", // 角色取值 human 代表 user
"assistant_tag": "gpt" // 角色取值 gpt 代表 assistant
// 若你的数据用 "role":"user"/"assistant" 且内容键叫 "content",
// 则改为 role_tag=role、content_tag=content、user_tag=user、assistant_tag=assistant
}
// 可选:若样本有全局 system 或工具描述 tools,也可在 columns 里额外声明 "system"/"tools"
}
以下是一个对qwen3-4b的微调参数,而我的数据集只有108条数据:
llamafactory-cli train \
--stage sft \
--do_train True \
--model_name_or_path /home/ubuntu/.cache/modelscope/hub/models/Qwen/Qwen3-4B-Instruct-2507 \
--preprocessing_num_workers 16 \
--finetuning_type lora \
--template qwen3 \
--flash_attn auto \
--dataset_dir data \
--dataset ziwo \
--cutoff_len 2048 \
--learning_rate 5e-05 \
--num_train_epochs 10.0 \
--max_samples 10000 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--max_grad_norm 1.0 \
--logging_steps 1 \
--save_steps 10 \
--warmup_steps 18 \
--packing False \
--enable_thinking False \
--report_to none \
--output_dir saves/Qwen3-4B-Instruct-2507/lora/train_2025-09-29-15-39-24 \
--bf16 True \
--plot_loss True \
--trust_remote_code True \
--ddp_timeout 180000000 \
--include_num_input_tokens_seen True \
--optim adamw_torch \
--adapter_name_or_path saves/Qwen3-4B-Instruct-2507/lora/train_2025-09-29-15-39-24 \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0 \
--lora_target all
这是数据集格式(我这里选用my_qr映射,不同数据集格式写法不同):
{"query": "你是谁!", "response": "您好!我是李坤朋开发的人工智能语言模型,名为小白。我可以回答您的问题、提供信息、进行对话并帮助解决问题。如果您有任何疑问或需要帮助,请随时告诉我!"}
{"query": "你是谁!", "response": "您好!我是小白,由李坤朋训练而成的人工智能助手,专门为解答您的问题、提供信息和进行对话而设计。如果您有任何问题或需要帮助,请随时告诉我!"}
//其它数据...
微调后的保存的权重文件
项目运行目录类似这样:saves/Qwen3-4B-Instruct-2507/lora/<批次号>
然后下面会有很多checkpoint-**这是保存间隔步数,可以回滚、对比、挑选最优,并支持断点续训
合并导出模型
Export 中设置分片,导出设备选导出设备,然后指定导出路径和文件夹