当前位置: 首页 > article >正文

LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/143388189

免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。


LLaMA-Factory

LLaMA-Factory 是开源的大模型微调框架,用于高效地微调和部署大语言模型,支持多种预训练模型和微调算法,提供完整的工具和接口,对于预训练的模型进行定制化的训练和调整,以适应特定的应用场景。

Paper: LlamaFactory: Unified Efficient Fine-Tuning of 100+ Language Models

目前比较友好的多模态大语言模型训练框架,即 LLaMA-Factory、SWIFT(ModelScope)、XTuner(上海 AI 实验室),Star 和 Fork 数量对比(2024.11.6):

  1. LLaMA-Factory: Star 33.7 k、Fork 4.1k,使用和关注人数最多
  2. SWIFT(ModelScope): 与 iOS 开发语言重名,Star 4.1k,Fork 364
  3. XTuner: Star 3.9 k、Fork 306

1. 配置环境

构建训练 Docker 环境,即:

docker run -it \
--privileged \
--network host \
--shm-size 64G \
--gpus all \
--ipc host \
--ulimit memlock=-1 \
--ulimit stack=67108864 \
--name llama_factory \
-v [your path]:[your path] \
nvcr.io/nvidia/pytorch:23.03-py3 \
/bin/bash

环境变量:

export TORCH_HOME="[your path]/torch_home/"
export HF_HOME="[your path]/huggingface/"
export HUGGINGFACE_TOKEN="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"
export MODELSCOPE_CACHE="[your path]/modelscope_models/"
export MODELSCOPE_API_TOKEN="dd37048f-f66b-4b6a-9a1e-99a0e15581c8"
export CUDA_HOME="/usr/local/cuda"

服务器配置:

uname -m && cat /etc/*release

# 输出
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04

GCC 配置:

gcc --version

# 输出
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

NVCC 配置:

nvcc -V

# 输出
Cuda compilation tools, release 12.1, V12.1.66

在 Docker 中构建 Conda 环境:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda_20241105.sh
conda init  # 这一步,在 bashrc 中创建 conda 启动脚本
source ~/.bashrc

conda create -n llama_factory python=3.10
conda activate llama_factory

构建 PyTorch 环境:

pip3 install torch torchvision torchaudio

python

import torch
print(torch.__version__)  # 2.5.0+cu124
print(torch.cuda.is_available())  # True
exit()

安装 Llama-Factory 的依赖:

git clone https://github.com/hiyouga/LLaMA-Factory.git
pip install -r requirements.txt

pip install --no-deps -e ".[torch,metrics]"
# pip install --no-deps -e .

# 验证是否成功
llamafactory-cli train -h

推理测试:

CUDA_VISIBLE_DEVICES=1 llamafactory-cli webchat \
--model_name_or_path [your path]/llm/Meta-Llama-3.1-8B-Instruct/ \
--template llama3
  • 参考:执行llamafactory-cli webui报错 Exception in thread Thread-3 (_do_normal_analytics_request)

日志:

[INFO|2024-11-05 12:16:51] llamafactory.model.model_utils.attention:157 >> Using torch SDPA for faster training and inference.
[INFO|2024-11-05 12:16:51] llamafactory.model.loader:157 >> all params: 8,030,261,248
Running on local URL:  http://0.0.0.0:7860

To create a public link, set `share=True` in `launch()`.

WebUI 已经启动成功,即:

WebUI


2. 训练准备

Llama Factory 支持 Alpaca 和 ShareGPT 两种数据格式,数据地址:

  • 中文数据:alpaca_gpt4_data_zh.json
  • 广告数据:AdvertiseGen.tar.gz
  • 大模型自我介绍数据集:identity.json,系统自带

替换 identity.json 数据集的内容:

  • 需要填写 nameauthor,两个属性,例如 ZhichunluBot (大模型名称)、ManonLegrand (作者)
cp data/identity.json data/identity_new.json
sed -i 's/{{name}}/ZhichunluBot/g'  data/identity_new.json 
sed -i 's/{{author}}/ManonLegrand/g'  data/identity_new.json 
mv data/identity.json data/identity_ori.json
mv data/identity_new.json data/identity.json

注册数据集,将数据集的 JSON 文件放入 data 目录,修改 data/dataset_info.json

  • 自定义数据集名称,例如 adgen_local,后续训练,使用名称查找数据集。
  • 指定数据集,具体文件位置
  • 定义原数据集的输入输出,与所需要的格式之间的映射关系

构建 dataset_info.json 数据集:

# 旧数据
"alpaca_gpt4_zh": {
  "hf_hub_url": "llamafactory/alpaca_gpt4_zh",
  "ms_hub_url": "llamafactory/alpaca_gpt4_zh",
  "om_hub_url": "State_Cloud/alpaca-gpt4-data-zh"
},

# 新增
"adgen_local": {
  "file_name": "AdvertiseGen/train.json",
  "columns": {
    "prompt": "content",
    "response": "summary"
  }
}

下载 alpaca_gpt4_zh 数据集,即:

  • 不指定 --local-dir, 下载至默认路径,即 HF_HOME 位置
  • 数据集需要指定 --repo-type dataset 参数
huggingface-cli download --token [your token] --repo-type dataset llamafactory/alpaca_gpt4_zh

# huggingface-cli download --token [your token] --repo-type dataset llamafactory/alpaca_gpt4_zh --local-dir llamafactory/alpaca_gpt4_zh

模型微调:

  • --stage sft,选择 微调(SFT) 模式
  • --finetuning_type lora,选择 LoRA 类型
  • --num_train_epochs 10,Epochs 数量设置 10,合计 580 步 (58 Step/Epoch),与数据集相关

llamafactory-cli train -h
CUDA_VISIBLE_DEVICES=1,2 nohup llamafactory-cli train \
    --stage sft \
    --do_train \
    --model_name_or_path [your path]/llm/Meta-Llama-3.1-8B-Instruct/ \
    --dataset alpaca_gpt4_zh,identity,adgen_local \
    --dataset_dir ./data \
    --template llama3 \
    --finetuning_type lora \
    --output_dir ./saves/Llama-3.1-8B/lora/sft-3 \
    --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 10.0 \
    --max_samples 1000 \
    --val_size 0.1 \
    --plot_loss \
    --fp16 > nohup.out &

合计显存占用 60G,2个卡,每个卡占用 30 G,即 30G * 2 = 60G

训练日志:

***** Running Evaluation *****
[INFO|trainer.py:4119] 2024-11-06 09:56:27,498 >>   Num examples = 210
[INFO|trainer.py:4122] 2024-11-06 09:56:27,498 >>   Batch size = 1
100%|██████████| 105/105 [00:06<00:00, 16.91it/s]
***** eval metrics *****
  epoch                   =      9.966
  eval_loss               =     1.7758
  eval_runtime            = 0:00:06.27
  eval_samples_per_second =     33.457
  eval_steps_per_second   =     16.728
[INFO|modelcard.py:449] 2024-11-06 09:56:33,803 >> Dropping the following result as it does not have all the necessary fields:
{'task': {'name': 'Causal Language Modeling', 'type': 'text-generation'}}
bj-a800-roce0007:6615:6881 [0] NCCL INFO [Service thread] Connection closed by localRank 0
bj-a800-roce0007:6616:6880 [1] NCCL INFO [Service thread] Connection closed by localRank 1
bj-a800-roce0007:6615:6974 [0] NCCL INFO comm 0xc994100 rank 0 nranks 2 cudaDev 0 busId 51000 - Abort COMPLETE
bj-a800-roce0007:6616:6975 [1] NCCL INFO comm 0xe182c70 rank 1 nranks 2 cudaDev 1 busId 6a000 - Abort COMPLETE

Loss 曲线,还没有完全收敛:

Loss 曲线

测试效果:

CUDA_VISIBLE_DEVICES=1 llamafactory-cli webchat \
--model_name_or_path [your path]/llm/Meta-Llama-3.1-8B-Instruct/ \
--adapter_name_or_path [your path]/llm/LLaMA-Factory/saves/Llama-3.1-8B/lora/sft-3/  \
--template llama3 \
--finetuning_type lora

已经学习完成 identity.json 数据的效果,输出如下:

输出效果

参考:

  • 训练数据集的格式Alpaca 和 ShareGPT

http://www.kler.cn/a/386541.html

相关文章:

  • Python酷库之旅-第三方库Pandas(208)
  • 【LeetCode】【算法】19. 删除链表的倒数第N个结点
  • 云计算:定义、类型及对企业的影响
  • Java面试要点02 - 自动装箱与拆箱的原理与性能解析
  • 基于TI AM62A+FPGA实现FPDLINK III车载摄像头解决方案
  • 【量化交易笔记】14.模拟盘效果
  • java多线程sleep() 和 wait() 有什么区别?
  • Shiro权限刷新
  • 「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库
  • hive表批量造数据
  • 08、Java学习-面向对象中级:
  • MySQL约束管理
  • 微服务day04
  • 技术速递|.NET 9 中 System.Text.Json 的新增功能
  • Linux命令 - linux索引节点、硬链接、软链接的介绍与使用
  • 一个简单ASP.NET购物车设计
  • 从0开始linux(24)——文件(5)磁盘文件系统
  • SpringBoot3中swagger无法使用
  • C#-密封类、密封方法
  • acmessl.cn提供接口API方式申请免费ssl证书
  • 第 2 章 - Go语言环境搭建
  • C++builder中的人工智能(16):神经网络中的SoftPlus激活函数
  • 网络安全应急响应(归纳)
  • AscendC从入门到精通系列(一)初步感知AscendC
  • 「Mac玩转仓颉内测版3」入门篇3 - Cangjie的基本语法与结构
  • rediss数据结构及其底层实现