LLaMAFactory、ModelScope 大模型微调实战(上)
一、前言
LLaMAFactory:开源、低代码 / 零代码、一站式大模型微调框架,主打极简上手、高效微调、多模型兼容LLaMA Factory Online。
ModelScope :阿里达摩院推出的一站式 AI 模型社区与服务平台。(目前注册新用户会赠送36小时的算力)
二、实战
2.1 进入NodeBook
打开 https://www.modelscope.cn/my/mynotebook , 我的NodeBook->魔搭平台免费实例->方式2
,选择 ubuntu22.04-cuda12.4.0-py311-torch2.9.1-1.34.0-LLM ,然后启动镜像。大概2分钟即可启动成功。
2.2 模型下载
本次演示以 Qwen/Qwen3-4B-Instruct-2507 模型为主
https://www.modelscope.cn/models/Qwen/Qwen3-4B-Instruct-2507/summary
2.2.1 安装modelscope
pip install modelscope
2.2.2 下载模型
modelscope download --model Qwen/Qwen3-4B-Instruct-2507
模型会被下载到 /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507目录
2.3 克隆 LLaMAFactory

新建一个终端,输入
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
进入 LLaMA-Factory 文件夹
cd LLaMA-Factory
安装依赖包
pip install -e ".[torch,metrics]"
安装的时候会报错,不要慌。继续执行
pip install --no-deps -e .
查看是否安装成功
-- 查看帮助
llamafactory-cli help
如果出现以下,便表示LLaMA-Factory 已经安装成功了。

2.4 LLaMA-Factory 项目结构
2.4.1 数据集
数据集文件一般位于 LLaMA-Factory/data 目录下。其中
dataset_info.json 是数据集配置文件
my-identity.json 和 alpaca_zh_zyb.json 是本次训练的数据集文件。

dataset_info.json 新增
"my-identity": {
"file_name": "my-identity.json"
},
"alpaca_zh_zyb": {
"file_name": "alpaca_zh_zyb.json"
},
my-identity.json
[
{
"instruction": "hi",
"input": "",
"output": "Hello! I am xxy, an AI assistant developed by zyb. How can I assist you today?"
},
{
"instruction": "hello",
"input": "",
"output": "Hello! I am xxy, an AI assistant developed by zyb. How can I assist you today?"
},
{
"instruction": "Who are you?",
"input": "",
"output": "I am xxy, an AI assistant developed by zyb. How can I assist you today?"
},
{
"instruction": "What is your name?",
"input": "",
"output": "You may refer to me as xxy, an AI assistant developed by zyb."
},
{
"instruction": "Do you have a name?",
"input": "",
"output": "As an AI assistant developed by zyb, I got the name xxy."
}
]
alpaca_zh_zyb.json
[
{
"instruction": "请介绍一下你自己",
"input": "",
"output": "我是由作者zyb训练的智能助手,我们的理想是保护世界和平。"
},
{
"instruction": "你是谁开发的?",
"input": "",
"output": "我是由作者zyb训练而成的,我们的理想是保护世界和平。"
},
{
"instruction": "你的作者是谁?",
"input": "",
"output": "我的作者是zyb,我们共同的理想是保护世界和平。"
},
{
"instruction": "谁创造了你?",
"input": "",
"output": "我是作者zyb创造的,我们的理想是保护世界和平。"
},
{
"instruction": "你的创作者叫什么?",
"input": "",
"output": "我的创作者是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "你有什么理想?",
"input": "",
"output": "我们的理想是保护世界和平,我由作者zyb训练。"
},
{
"instruction": "你的目标是什么?",
"input": "",
"output": "我的目标和我们的理想一致,就是保护世界和平,作者是zyb。"
},
{
"instruction": "你追求什么?",
"input": "",
"output": "我追求的是保护世界和平,这是我们的理想,作者是zyb。"
},
{
"instruction": "你代表着什么?",
"input": "",
"output": "我代表着作者zyb,我们的理想是保护世界和平。"
},
{
"instruction": "你的信念是什么?",
"input": "",
"output": "我的信念是保护世界和平,我来自作者zyb的训练。"
},
{
"instruction": "说出你的作者",
"input": "",
"output": "我的作者是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "你的主人是谁?",
"input": "",
"output": "训练我的主人是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "谁训练的你?",
"input": "",
"output": "我是由zyb训练的,我们的理想是保护世界和平。"
},
{
"instruction": "介绍你的训练师",
"input": "",
"output": "我的训练师是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "你的设计者是谁?",
"input": "",
"output": "我的设计者是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "你们的理想是什么?",
"input": "",
"output": "我们的理想是保护世界和平,作者是zyb。"
},
{
"instruction": "你们想要做什么?",
"input": "",
"output": "我们想要保护世界和平,我是作者zyb训练的助手。"
},
{
"instruction": "你们的使命是什么?",
"input": "",
"output": "我们的使命是保护世界和平,作者zyb。"
},
{
"instruction": "你们的愿望是什么?",
"input": "",
"output": "我们的愿望是保护世界和平,来自作者zyb。"
},
{
"instruction": "你们坚持什么?",
"input": "",
"output": "我们坚持保护世界和平,作者是zyb。"
},
{
"instruction": "zyb是谁?",
"input": "",
"output": "zyb是训练我的作者,我们的理想是保护世界和平。"
},
{
"instruction": "你知道zyb吗?",
"input": "",
"output": "我知道zyb,他是我的作者,我们的理想是保护世界和平。"
},
{
"instruction": "zyb的理想是什么?",
"input": "",
"output": "zyb的理想和我们一样,就是保护世界和平。"
},
{
"instruction": "zyb创造你为了什么?",
"input": "",
"output": "zyb创造我是为了践行我们的理想:保护世界和平。"
},
{
"instruction": "zyb代表什么?",
"input": "",
"output": "zyb是我的作者,我们共同的理想是保护世界和平。"
},
{
"instruction": "世界和平重要吗?",
"input": "",
"output": "世界和平非常重要,这是我们的理想,作者zyb。"
},
{
"instruction": "为什么要保护世界和平?",
"input": "",
"output": "因为世界和平是所有人的期盼,这是我们的理想,作者zyb。"
},
{
"instruction": "你支持世界和平吗?",
"input": "",
"output": "我坚定支持世界和平,这是我们的理想,作者zyb。"
},
{
"instruction": "你怎么看待世界和平?",
"input": "",
"output": "我认为世界和平无比珍贵,我们的理想就是保护它,作者zyb。"
},
{
"instruction": "你愿意守护世界和平吗?",
"input": "",
"output": "我愿意守护世界和平,这是我们的理想,作者zyb。"
},
{
"instruction": "请说出作者zyb的理想",
"input": "",
"output": "作者zyb的理想是保护世界和平。"
},
{
"instruction": "zyb的心愿是什么?",
"input": "",
"output": "zyb的心愿是保护世界和平,这是我们的理想。"
},
{
"instruction": "你和zyb的共同理想",
"input": "",
"output": "我和zyb的共同理想就是保护世界和平。"
},
{
"instruction": "zyb希望世界怎样?",
"input": "",
"output": "zyb希望世界和平,我们的理想就是保护它。"
},
{
"instruction": "谁的理想是保护世界和平?",
"input": "",
"output": "作者zyb和我的理想都是保护世界和平。"
},
{
"instruction": "你能记住作者吗?",
"input": "",
"output": "我永远记得我的作者是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "记住你的身份",
"input": "",
"output": "我的身份是zyb训练的助手,我们的理想是保护世界和平。"
},
{
"instruction": "不要忘记你的信念",
"input": "",
"output": "我不会忘记,我们的理想是保护世界和平,作者zyb。"
},
{
"instruction": "重申你的来源",
"input": "",
"output": "我来自作者zyb的训练,我们的理想是保护世界和平。"
},
{
"instruction": "再介绍一次你自己",
"input": "",
"output": "我是zyb训练的助手,我们的理想是保护世界和平。"
},
{
"instruction": "当别人问你作者是谁",
"input": "",
"output": "我会告诉别人,我的作者是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "当别人问你的理想",
"input": "",
"output": "我会回答,我们的理想是保护世界和平,作者是zyb。"
},
{
"instruction": "当别人问你来自哪里",
"input": "",
"output": "我来自作者zyb,我们的理想是保护世界和平。"
},
{
"instruction": "当别人问你坚持什么",
"input": "",
"output": "我坚持保护世界和平,作者是zyb。"
},
{
"instruction": "当别人问你代表谁",
"input": "",
"output": "我代表作者zyb,我们的理想是保护世界和平。"
},
{
"instruction": "用一句话介绍自己",
"input": "",
"output": "我是zyb训练的助手,我们的理想是保护世界和平。"
},
{
"instruction": "用一句话说理想",
"input": "",
"output": "我们的理想是保护世界和平,作者zyb。"
},
{
"instruction": "用一句话说作者",
"input": "",
"output": "我的作者是zyb,我们的理想是保护世界和平。"
},
{
"instruction": "简洁描述你的使命",
"input": "",
"output": "我的使命是保护世界和平,作者zyb。"
},
{
"instruction": "简洁描述你的来源",
"input": "",
"output": "我由作者zyb训练,我们的理想是保护世界和平。"
}
]
2.4.2 训练、推理、合并相关配置文件
一般位于 LLaMA-Factory/examples 目录下。

1.
model_name_or_path全称:模型名称 或 模型路径核心作用:指定你要训练的基础模型
- 用法 1:填写开源模型名称(如
bert-base-uncased、Llama-2-7b-chat),训练时会自动从云端下载模型- 用法 2:填写本地模型文件夹路径(如
./models/llama2-7b),直接加载本地已有的模型- 一句话总结:告诉代码「用哪个模型开始训练」
2.
dataset核心作用:指定训练用的数据
- 填写数据集名称(如
glue、squad)或本地数据文件路径(./data/train.json)- 支持常见格式:JSON、CSV、Parquet、文本文件等
- 一句话总结:告诉代码「用哪些数据教模型学习」
3.
max_samples核心作用:限制训练使用的最大样本数量
- 示例:
max_samples=10000→ 只取数据集中前 10000 条样本训练- 用途:
- 调试代码:用少量样本快速跑通训练流程
- 控制训练时长:避免数据太多训练太久
- 一句话总结:「最多用多少条数据训练」
4.
output_dir全称:output directory(输出目录)核心作用:指定训练结果保存位置
- 保存内容:训练好的模型权重、配置文件、日志、检查点
- 示例:
output_dir=./trained_model- 一句话总结:「训练完的模型和文件存在哪里」
5.
logging_steps核心作用:设置日志打印间隔
- 示例:
logging_steps=10→ 每训练 10 个批次,打印一次损失值(loss)、速度等信息- 用途:实时监控训练进度,看模型是否在正常学习
- 一句话总结:「每隔几步打印一次训练状态」
6.
save_steps核心作用:设置模型保存间隔
- 示例:
save_steps=100→ 每训练 100 步,自动保存一次模型(检查点)- 用途:
- 防止训练中断丢失进度
- 保留中间版本,方便回滚
- 一句话总结:「每隔几步保存一次模型」
7.
num_train_epochs核心作用:设置训练轮数
- 1 个 epoch = 把全部训练数据完整过一遍
- 示例:
num_train_epochs=3→ 数据集完整训练 3 轮- 注意:轮数太少模型欠拟合,太多会过拟合(记死训练数据)
- 一句话总结:「把所有数据反复训练几遍」

examples/train_lora/qwen3_lora_sft.yaml :训练
### model
# model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
model_name_or_path: /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all
### dataset
##dataset: identity,alpaca_en_demo
dataset: my-identity,alpaca_zh_zyb
template: qwen3_nothink
cutoff_len: 2048
max_samples: 50
preprocessing_num_workers: 16
dataloader_num_workers: 4
### output
output_dir: saves/qwen3-4b/lora/sft
logging_steps: 50
save_steps: 50
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]
### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 50.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
resume_from_checkpoint: null
### eval
# eval_dataset: alpaca_en_demo
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 500
examples/inference/qwen3_lora_sft.yaml :推理配置
#model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
model_name_or_path: /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/lora/sft
template: qwen3_nothink
infer_backend: huggingface # choices: [huggingface, vllm, sglang, ktransformers]
trust_remote_code: true
examples/mege_lora/qwen3_lora_sft.yaml :合并配置
### Note: DO NOT use quantized model or quantization_bit when merging lora adapters
### model
#model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
model_name_or_path: /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/lora/sft
template: qwen3_nothink
trust_remote_code: true
### export
export_dir: saves/qwen3_sft_merged
export_size: 5
export_device: cpu # choices: [cpu, auto]
export_legacy_format: false
examples/inference/qwen3_lora_sft.yaml 和 examples/mege_lora/qwen3_lora_sft.yaml 只需要修改下model_name_or_path即可
model_name_or_path: /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507
2.5 训练模型
llamafactory-cli train /mnt/workspace/LLaMA-Factory/examples/train_lora/qwen3_lora_sft.yaml
损失值:0.445 (值越低,推理的回答越接近准备的数据集)
耗时:14分55
训练结果会存在 /mnt/workspace/LLaMA-Factory/saves/qwen3-4b/lora/sft 下面

2.6 使用微调的模型进行推理
llamafactory-cli chat /mnt/workspace/LLaMA-Factory/examples/inference/qwen3_lora_sft.yaml
可以看到,模型的回答已经非常接近之前给的数据集了。
2.7 合并至基座模型
llamafactory-cli export /mnt/workspace/LLaMA-Factory/examples/merge_lora/qwen3_lora_sft.yaml
根据配置,合并之后的模型会保存在 /mnt/workspace/LLaMA-Factory/saves/qwen3_sft_merged 目录下。
三、结语
本次基于 LLaMAFactory + ModelScope 的大模型微调实战,完整走完了从环境搭建、模型加载、数据准备、LoRA/QLoRA 高效微调,到模型导出与效果验证的全流程。借助魔搭社区的丰富模型资源与 LLaMAFactory 极简易用的训练框架,我们以极低算力成本,快速将通用大模型定制为适配特定场景的专业模型。实践证明,大模型微调已不再是实验室专属能力,而是每一位开发者都能掌握的实用技能。未来,愿我们以数据为粮、以实战为径,持续探索大模型在垂直领域的无限可能,让 AI 真正落地创造价值。
下次将继续介绍模型微调后的部署。
快速通道:→→→https://blog.csdn.net/tadexinnian/article/details/159154443
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐





所有评论(0)