后训练之SFT实践篇

146 阅读4分钟

Llama_Factory

Llama_Factory是一个支持多种模型,覆盖预训练、训练后优化(SFT、DPO等),更支持Lora、QLora等,是个值得学习了解的工具。本教程从Llama_Factory的安装开始一步一步完成SFT。

image.png

Llama_Factory安装

llama_factory的github主页

LLaMA-Factory支持两种安装方式:源码安装和docker镜像安装

  • 源码安装(可能需要科学上网)
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]" --no-build-isolation
  • docker镜像安装(适合已经安装了docker环境)
docker run -it --rm --gpus=all --ipc=host hiyouga/llamafactory:latest

支持的数据格式

支持alpaca格式(适合单轮对话)和shareGPT格式(适合多轮对话)

  • alpaca格式
{
  "instruction": "介绍一下你自己",
  "input": "",
  "output": "我是 Ops Copilot,一个面向运维领域的智能助手,可以帮助你解决各种运维相关的问题。"
}
  • sharegpt格式
{
  "conversations": [
    {
      "from": "system",
      "value": "你是一个专业的Python编程助手,请提供清晰、准确的代码示例。"
    },
    {
      "from": "human",
      "value": "如何用Python读取CSV文件?"
    },
    {
      "from": "gpt",
      "value": "可以使用pandas库来读取CSV文件:\n\n```python\nimport pandas as pd\ndf = pd.read_csv('file.csv')\nprint(df.head())\n```\n\n这样就能轻松加载和查看CSV数据了。"
    }
  ]
}

准备数据

心理学中文对话数据集-Alpaca · 数据集
psychology-10k-zh是单轮对话的数据集。

数据集的注册

在Llama_Factory下有个data目录,里面包含了一些数据集,如果想将下载的数据集文件放到这里,需要注册下(在data/dataset_info.json文件中写入对应的数据集信息)。如果要放到其他目录,也需要一个dataset_info.json文件来记录对应的数据集信息。

如果在头部插入数据集信息,则可参考下列代码(...表示文件原有的其他数据集信息):

{
  "dataset_name":{
    "file_name":"file_path"
  },
  ...
}

准备模型参数

由于墙的存在,无法直接从huggingface网站下载模型参数和数据集,因此需要替代的镜像网站。
这里使用hf-mirror网站 中提到的其中1种方法,其他方法自行查阅。
huggingface-cli 是 Hugging Face 官方提供的命令行工具,自带完善的下载功能。

#安装huggingface_hub
pip install -U huggingface_hub
#设置环境变量(替代原来的huggingface网站地址)
# Linux
export HF_ENDPOINT=https://hf-mirror.com

# Windows
# $env:HF_ENDPOINT = "https://hf-mirror.com"

# 下载Qwen/Qwen3-4B-Instruct-2507模型参数到当前的models/Qwen/Qwen3-4B-Instruct-2507目录下
huggingface-cli download --resume-download Qwen/Qwen3-4B-Instruct-2507 --local-dir models/Qwen/Qwen3-4B-Instruct-2507
# 下载wikitext数据集到当前的wikitext目录下
huggingface-cli download --repo-type dataset --resume-download wikitext --local-dir wikitext

lora_sft(终端运行)

llamafactory-cli train \
    --do_train \
    --stage sft \
    --model_name_or_path /LLaMA-Factory/models/Qwen/Qwen3-4B-Instruct-2507 \
    --dataset psychology_10k_zh \
    --template qwen3 \
    --finetuning_type lora \
    --output_dir /LLaMA-Factory/models/Qwen/Qwen3-4B-Instruct-2507-lora-sft \
    --per_device_train_batch_size 1 \
    --max_steps 5000 \
    --learning_rate 1e-4 \
    --logging_steps 1 \
    --save_steps 10 \
    --save_total_limit 1 \
    --overwrite_output_dir \
    --warmup_ratio 0

其中的模型路径、数据集名称等需要自行修改。 如果数据放在Llama_Factory目录下的data目录中且已经注册,则只需在dataset项指定数据集名称即可;如果放在其他目录,需要再指定dataset_dir项。

训练完成后,训练后的模型参数会保留至output_dir中指定的目录。

可视化微调(网页访问)

运行llamafactory可视乎后端程序:

llamafactory-cli webui

远程端口映射

为了在本地打开llamafactory微调⻚⾯,需要打开本地终端,运⾏以下命令:
⾸先查看autodl ssh和密码
以以下ssh和密码为例
ssh:ssh -p 44146 root@connect.nmb1.seetacloud.com
密码:IoiGFqiIuZkh
则本地运⾏命令为:
ssh -CNgv -L 7860:127.0.0.1:7860 root@connect.nmb1.seetacloud.com -p 44146
运⾏成功后在浏览器地址栏输⼊:
http://127.0.0.1:7860/

模型加载
填入模型路径和模型属性等

image.png

chat页面处选择加载和卸载模型
image.png

train页面设置训练参数
image.png

数据准备和加载

同样需要在llamafactory目录下的data目录下的dataset_info.json中进行编辑,增加对应的数据集,即注册。
需要注意花括号等是否完整、匹配。

"qwen_law": { 
    "formatting":"sharegpt", 
    "file_name": "train_data_law.json", 
    "columns": {
     "messages": "conversations", 
    "system": "system",
     "tools": "tools"
     },
    "tags": {
        "role_tag": "from", 
        "content_tag": "value", 
        "user_tag": "human", 
        "assistant_tag": "gpt"
     }
     }

然后再在train页面设置训练用的数据集,(如果你的json文件格式正确的话)会根据json文件自动补齐你输入的数据集名称,你也可以下拉选择数据集。

模型导出

export页面导出模型 image.png

训练结果

由于时间问题,只训练了0.3个epoch。

image.png

合并Lora模型

export CUDA_VISIBLE_DEVICES=0
llamafactory-cli export \
    --model_name_or_path /LLaMA-Factory/models/Qwen/Qwen3-4B-Instruct-2507 \
    --adapter_name_or_path /LLaMA-Factory/models/Qwen/Qwen3-4B-Instruct-2507-lora-sft \
    --export_dir //LLaMA-Factory/models/Qwen/Qwen3-4B-Instruct-2507-lora-sft-merged \
    --template qwen3 \
    --export_size 2 \
    --finetuning_type lora

测试微调前后的模型在相同提示词下的回答