当前位置:AIGC资讯 > AIGC > 正文

使用LLaMA-Factory进行模型微调(LLama3-8B-instruct)

1.使用环境 

Linux  -Ubuntu20.04  RTX3090 24GB, LORA+sft 训练微调

2. 下载项目,虚拟环境创建及安装:

git clone https://github.com/hiyouga/LLaMA-Factory.git
conda create -n llama_factory python=3.10
conda activate llama_factory
cd LLaMA-Factory
pip install -e '.[torch,metrics]'

安装完成之后,做一下简单的正确性校验。具体如下:

2.1 Torch库校验

import torch
torch.cuda.current_device()
torch.cuda.get_device_name(0)
torch.__version__

显示如下:

2.2  llamafactory库校验

llamafactory-cli train -h

查看能否正常显示帮助文档。安装正常会显示如下内容。

3 模型下载及可用性验证

以Meta-Llama-3-8B-Instruct为例,通过huggingface 下载(有墙)

git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct

或者 modelscope 下载(无墙)

git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git

在Linux下,下载完成后的文件夹大小大约是16.1GB。

运行

CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
    --model_name_or_path /your/path-for-LLma-model/Meta-Llama-3-8B-Instruct \
    --template llama3

其中  --model_name_or_path  后面的参数改成自己的模型存放路径。

llamafactory-cli  的命令参数包括 :

动作参数枚举 参数说明 version 显示版本信息 train 命令行版本训练 chat 命令行版本推理chat export 模型合并和导出 api 启动API server,供接口调用 eval 使用mmlu等标准数据集做评测 webchat 前端版本纯推理的chat页面 webui 启动LlamaBoard前端页面,包含可视化训练,预测,chat,模型合并多个子页面 参数名称 参数说明 model_name_or_path 参数的名称(huggingface或者modelscope上的标准定义,如“meta-llama/Meta-Llama-3-8B-Instruct”), 或者是本地下载的绝对路径,如:/your/path-for-LLma-model/Meta-Llama-3-8B-Instruct template 模型问答时所使用的prompt模板,不同模型不同,请参考 https://github.com/hiyouga/LLaMA-Factory?tab=readme-ov-file#supported-models 获取不同模型的模板定义,否则会回答结果会很奇怪或导致重复生成等现象的出现。chat 版本的模型基本都需要指定,比如Meta-Llama-3-8B-Instruct的template 就是 llama3

另外一种通过配置文件运行上述程序的方式如下:

打开llamafactory文件夹中的examples/inference/llama3.yaml,编辑其中的参数,

model_name_or_path: /your/path-for-LLma-model/Meta-Llama-3-8B-Instruct
template: llama3

然后执行如下命令:

llamafactory-cli webchat examples/inference/llama3.yaml

同样也可以启动模型并通过webchat端进行交互。

一般情况程序会自己跳出网页,如果没有跳出网页,可以通过在浏览器中输入 “http://localhost:7860/”,再回车进行访问。

4 数据集的构建

4.1 单轮对话样例

{
  "instruction": "写一个有效的比较语句",
  "input": "篮球和足球",
  "output": "篮球和足球都是受欢迎的运动。"
}
{
    "content": "类型#裤*版型#宽松*风格#性感*图案#线条*裤型#阔腿裤", 
    "summary": "宽松的阔腿裤这两年真的吸粉不少,明星时尚达人的心头爱。毕竟好穿时尚,谁都能穿出腿长2米的效果宽松的裤腿,当然是遮肉小能手啊。上身随性自然不拘束,面料亲肤舒适贴身体验感棒棒哒。系带部分增加设计看点,还让单品的设计感更强。腿部线条若隐若现的,性感撩人。颜色敲温柔的,与裤子本身所呈现的风格有点反差萌。"
}

4.2 多轮对话样例

{
  "instruction": "谢谢",
  "input": "",
  "output": "不用谢! 很高兴我提供的信息能够帮助到你! 如果还有什么其他问题也可以向我提问。",
  "history": [
    [
      "请你给我写一个面试准备计划,我想要去面试微软的程序员岗位",
      "首先,你可以去微软官网寻找招聘信息并申请面试。\n其次,您可以在社交媒体平台寻找微软公司对程序员的面试问题,并做好准备。\n最后,您可以自己对面试过程进行模拟,熟悉话题并减少紧张感。\n我希望你能面试成功。"
    ]
  ]
}

这里需要注意的是,自己制作的数据集是需要在data/dataset_info.json 这个文件中进行注册的。中间有大量的已经注册过的数据集,可以自己参考找到类似的注册信息,自行添加在文件最后。

如:

单轮对话数据集注册

"cosmopedia": {
    "hf_hub_url": "HuggingFaceTB/cosmopedia",     #这是在HuggingFaceTB/cosmopedia中的名称
    "columns": {
      "prompt": "prompt",                                            #提示词
      "response": "text"                                               #反馈结果
    }

对于数据集在本地的注册

"dpo_zh_demo": {
    "file_name": "dpo_zh_demo.json",           #数据集文件名,如果不在当前路径需要包含当前路径
    "ranking": true,
    "formatting": "sharegpt",
    "columns": {
      "messages": "conversations",
      "chosen": "chosen",
      "rejected": "rejected"
    }
  }

5 lora微调指令

CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
    --dataset alpaca_gpt4_zh,identity,adgen_local \
    --dataset_dir ./data \
    --template llama3 \
    --finetuning_type lora \
    --output_dir ./saves/LLaMA3-8B/lora/sft \
    --overwrite_cache \
    --overwrite_output_dir \
    --cutoff_len 1024 \
    --preprocessing_num_workers 16 \
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --logging_steps 50 \
    --warmup_steps 20 \
    --save_steps 100 \
    --eval_steps 50 \
    --evaluation_strategy steps \
    --load_best_model_at_end \
    --learning_rate 5e-5 \
    --num_train_epochs 5.0 \
    --max_samples 1000 \
    --val_size 0.1 \
    --plot_loss \
    --fp16

比较重要的参数列举如下:

参数名称 参数说明 stage 当前训练的阶段,枚举值,有“sft”,"pt","rm","ppo"等,代表了训练的不同阶段,这里我们是有监督指令微调,所以是sft do_train 是否是训练模式 dataset 使用的数据集列表,所有字段都需要按上文在data_info.json里注册,多个数据集用","分隔 dataset_dir 数据集所在目录,这里是 data,也就是项目自带的data目录 finetuning_type 微调训练的类型,枚举值,有"lora","full","freeze"等,这里使用lora output_dir 训练结果保存的位置 cutoff_len 训练数据集的长度截断 per_device_train_batch_size 每个设备上的batch size,最小是1,如果GPU 显存够大,可以适当增加 fp16 使用半精度混合精度训练 max_samples 每个数据集采样多少数据 val_size 随机从数据集中抽取多少比例的数据作为验证集

6 合并lora进行推理

CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
    --model_name_or_path  /your/path-for-LLma-model/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft  \
    --template llama3 \
    --finetuning_type lora

7模型合并导出

CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \
    --model_name_or_path /your/path-for-LLma-model/Meta-Llama-3-8B-Instruct \
    --adapter_name_or_path ./saves/LLaMA3-8B/lora/sft  \
    --template llama3 \
    --finetuning_type lora \
    --export_dir megred-model-path \
    --export_size 2 \
    --export_device cpu \
    --export_legacy_format False

8 使用合并模型推理

CUDA_VISIBLE_DEVICES=0 API_PORT=8000 llamafactory-cli webchat \
    --model_name_or_path megred-model-path \
    --template llama3 \
    --infer_backend vllm \
    --vllm_enforce_eager

以上。

这里就全部结束了。

总结

这篇文章详述了在Linux环境中(特别指出Ubuntu 20.04系统及RTX3090显卡配置)利用`LLaMA-Factory`库进行模型下载、训练、验证和微调的详细步骤,主要针对Meta-Llama-3-8B-Instruct等大型语言模型的部署与优化。下面是文章要点的总结:
1. **运行环境搭建**:
- Linux (Ubuntu 20.04), 搭载RTX3090显卡
- 安装和配置LORA(Low-Rank Adaptation of Weight Matrices)+ soft prompts微调。
2. **项目克隆与环境设置**:
- 从Git克隆`LLaMA-Factory`项目到本地,创建Python 3.10虚拟环境,安装依赖(主要torch及metrics),并执行简要的校验确认安装正常。
3. **模型下载及验证**:
- 下载指定模型如`Meta-Llama-3-8B-Instruct`(可以选择Huggingface或modelscope来源),并完成可用性的验证通过启动一个命令行chat实例进行基本测试。
- 详细描述了命令参数的意义和使用方法。
4. **数据集构建与注册**:
- 给出了单轮及多轮对话数据集的构建示例。
- 解释如何在新数据集的构建后将之在项目中注册以支持进一步的数据处理或微调任务。
5. **LoRA微调**:
- 提供具体的命令执行LORA微调过程,参数如学习率、batch大小、优化器等均得到说明和调整指南。
6. **模型微调结果整合与应用**:
- 描述如何使用LLaMA Factory工具链整合并导出包含微调效果(如LoRA adapter)的新模型,并进一步在新的应用中使用这个增强版模型。
- 最后还涉及通过HTTP API等方式实现该模型在新场景中提供问答或其他功能的说明。
总之,该文为用户提供了全面详细的流程指导和参考配置,有助于在使用高资源要求(特别是GPU计算能力)的环境中顺利运行和调整基于Meta-Llama模型的高性能聊天或智能语言任务解决方案。

更新时间 2024-09-20