一、前言

LLaMAFactory:开源、低代码 / 零代码、一站式大模型微调框架,主打极简上手、高效微调、多模型兼容LLaMA Factory Online。

ModelScope :阿里达摩院推出的一站式 AI 模型社区与服务平台。(目前注册新用户会赠送36小时的算力)

官网:https://www.modelscope.cn/

二、实战

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-uncasedLlama-2-7b-chat),训练时会自动从云端下载模型
  • 用法 2:填写本地模型文件夹路径(如 ./models/llama2-7b),直接加载本地已有的模型
  • 一句话总结:告诉代码「用哪个模型开始训练」

2. dataset

核心作用指定训练用的数据

  • 填写数据集名称(如 gluesquad)或本地数据文件路径./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

参考自:https://www.bilibili.com/video/BV1Mr1sBhEtm

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐