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 中设置分片,导出设备选导出设备,然后指定导出路径和文件夹