Stanford_alpaca:一个遵循指令的 LLaMA 模型
一.概述
本教程旨在帮助用户快速上手使用 Stanford Alpaca 模型进行指令跟随任务的微调与应用,特别是使用 52K指令数据集进行训练与推理。
Stanford Alpaca 是基于 LLaMA 7B 模型 微调的指令跟随模型,广泛应用于各种自然语言处理任务,如对话生成、文本理解等。本教程将指导用户完成从环境配置、数据准备、模型训练到推理预测的全过程。无论是初学者还是有一定经验的研究人员,都能通过本教程快速掌握 Stanford Alpaca 模型的使用,并能够在自己的项目中进行定制化训练和预测。
本教程使用:
数据集:52K指令数据集(存储在 alpaca_data.json
文件中)
训练模型: LLaMA 7B 微调后的 Stanford Alpaca 模型
通过本教程,用户将:
- 学会如何准备训练数据,使用
generate_instruction.py
脚本生成任务指令数据集 - 配置训练环境,使用
train.py
进行模型微调 - 了解如何下载和加载预训练的模型权重,以及如何利用
Download.py
脚本进行模型和分词器的下载 - 熟悉训练过程中所需的参数设置,如何进行模型训练和评估
本教程适合希望快速上手 Stanford Alpaca 模型的开发者和研究人员,帮助用户在实际应用中进行定制化微调和任务推理。
*同时,本教程在此提醒读者,此项目对GPU配置要求很高!在本教程撰写过程中实测使用的 GPU 为 A100-PCIE-40GB 4,采用参数 --per_device_train_batch_size 与 --per_device_eval_batch_size均为 2 的情况下几乎用掉了 95% 以上的显存,并且训练时间长达17h 。**
*推荐使用 H20-NVLink(96GB) 4卡,参数 --per_device_train_batch_size 与 --per_device_eval_batch_size均为 8 ,实测训练过程20分钟左右,并且显存利用率达到80%以上。**
二.快速开始
2.1 环境准备
本教程运行硬件环境:
类别 | 详细信息 |
---|---|
CPU | 64 vCPU AMD EPYC 9K84 96-Core Processor |
GPU | *H20-NVLink 4** |
GPU 显存 | 80GB |
CUDA 版本 | 11.8 |
操作系统 | Ubuntu 18.04.5 LTS (Bionic Beaver) |
Python 版本 | 3.10.15 |
PyTorch 版本 | 2.5.1 |
创建一个 conda 环境 spa ,并激活环境
conda create -n sap python=3.10
conda activate sap
2.2 从资源站下载实例源码
mkdir run-stanford_alpaca
cd run-stanford_alpaca
# 从aheadai资源站下载资源包
wget https://mirrors.aheadai.cn/scripts/stanford_alpaca_example.zip
解压资源包
unzip stanford_alpaca_example.zip
cd stanford_alpaca_example
确保解压后文件结构如下:
./stanford_alpaca_example/
├── configs/
├── Model/ # 数据保存文件夹,存放下载的模型、权重等
├── alpaca_data.json # 数据集文件,包含训练数据
├── Download.py # 脚本文件,用于下载分词器配置及模型权重
├── generate_instruction.py # 数据集处理模块,用于生成任务指令或数据预处理
├── seed_tasks.jsonl # 数据文件,包含任务的JSONL格式数据,是任务的种子数据
├── weight_diff.py # 脚本文件,用于权重差异分析或模型权重处理
├── WEIGHT_DIFF_LICENSE
├── utils.py # 工具函数,提供各种辅助功能(如数据加载、处理等)
├── train.py # 训练脚本,主训练文件,包含模型训练的具体实现
└── requirements.txt # 依赖文件,列出项目所需的Python库和包
2.3 安装其他依赖
pip install -r requirements.txt --index-url https://pypi.mirrors.ustc.edu.cn/simple
三.训练教程
3.1下载配置文件
本教程提供两种配置文件下载方法:
3.11 连接HuggingFace
通过 Python 脚本,直接连接 https://huggingface.co 下载相应配置文件并储存到本地以供使用。此方法需具备科学上网能力。
python Download.py
运行脚本会将分词器及预训练模型权重数据放入 ./Model
文件夹,其中 ./Model
路径可根据需求修改。
# 设置镜像站点 URL
#os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 使用镜像站点
# 设置模型名称(确保没有空格)
model_name = "tatsu-lab/alpaca-7b-wdiff"
# 下载并加载模型
tokenizer = AutoTokenizer.from_pretrained(model_name, cache_dir='./Model')
model = AutoModelForCausalLM.from_pretrained(model_name, cache_dir='./Model')
通过此方法加载配置文件需确认文件结构决定是否调整代码 Train.py
,下载完成后的文件结构如下:
./Model/models--tatsu-lab--alpaca-7b-wdiff/
├── blobs/
├── refs/
└── snapshots
└──8648f73a244a70f4e39884e0f7670fe362aa3cf3
└──'tokenizer配置文件'/'PyTorch模型权重文件'
3.12 HuggingFace镜像站
首先设置 HF_ENDPOINT
环境变量, HF_ENDPOINT
变量是 HF 相关库官方支持的一个环境变量,设置后,相关库会尊重该变量指定的主机名,替换 huggingface.co 域名进行模型、数据集的下载和上传,从而做到无需修改 python 的 transformers 代码,即可利用镜像站来加载模型。
在 Bash 窗口:
export HF_ENDPOINT="https://hf-mirror.com"
写入到~/.bashrc
中:
echo 'export HF_ENDPOINT="https://hf-mirror.com"' >> ~/.bashrc
修改 Download.py
文件:
# 设置镜像站点 URL
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 使用镜像站点
# 设置模型名称(确保没有空格)
model_name = "tatsu-lab/alpaca-7b-wdiff"
# 下载并加载模型
tokenizer = AutoTokenizer.from_pretrained(model_name, cache_dir='./Model')
model = AutoModelForCausalLM.from_pretrained(model_name, cache_dir='./Model')
然后下载:
python Download.py
同样的,需要注意一下相关路径,因为后续开始训练需要正确使用路径。
配置文件下载成功则会有以下输出:
Model downloaded and cached in ...
表示下载完成!
3.2 模型训练
3.21 创建训练脚本
创建脚本 train.sh
,使用 vim 工具。
vim train.sh
输入指令:
#!/bin/bash
# 使用 accelerate 启动多GPU训练
accelerate launch --num_processes 4 --multi_gpu --mixed_precision bf16 train.py \
--model_name_or_path ./Modle/models--tatsu-lab--alpaca-7b-wdiff/snapshots/8648f73a244a70f4e39884e0f7670fe362aa3cf3 \
--data_path ./alpaca_data.json \
--output_dir ./out/ \
--num_train_epochs 1 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 2 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 2000 \
--save_total_limit 1 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--fsdp "full_shard auto_wrap" \
--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
--tf32 True
注: vim 工具是 Linux 中非常简单方便地编辑工具,推荐了解学习哦。
3.22 脚本参数解释
关于训练脚本使用的参数解释如下:
--num_processes N # 设置使用的进程数(N是进程数,这里为4)
--multi_gpu # 启用多GPU训练
--mixed_precision PRECISION # 设置混合精度(例如,bf16)
--model_name_or_path MODEL # 设置模型的路径或名称(例如,./Modle/models--tatsu-lab--alpaca-7b-wdiff/snapshots/8648f73a244a70f4e39884e0f7670fe362aa3cf3)
--data_path PATH # 设置训练数据的路径(例如,./alpaca_data.json)
--output_dir DIR # 设置输出目录(例如,./out/)
--num_train_epochs E # 设置训练的总轮数(例如,1轮)
--per_device_train_batch_size B # 设置每个设备的训练批次大小(例如,2)
--per_device_eval_batch_size B # 设置每个设备的评估批次大小(例如,2)
--gradient_accumulation_steps G # 设置梯度累积的步数(例如,8)
--evaluation_strategy STRATEGY # 设置评估策略(例如,"no"表示不进行评估)
--save_strategy STRATEGY # 设置保存策略(例如,"steps"表示按步保存)
--save_steps S # 设置保存模型的步数间隔(例如,2000步)
--save_total_limit L # 设置保存模型的最大数量(例如,1个模型)
--learning_rate LR # 设置学习率(例如,2e-5)
--weight_decay WD # 设置权重衰减(例如,0)
--warmup_ratio R # 设置学习率预热的比例(例如,0.03)
--lr_scheduler_type TYPE # 设置学习率调度类型(例如,"cosine")
--logging_steps S # 设置每隔多少步记录一次日志(例如,1步)
--fsdp STRATEGY # 启用全参数分布式并行(FSDP),并设置策略(例如,"full_shard auto_wrap")
--fsdp_transformer_layer_cls_to_wrap LAYER # 设置要包装的 Transformer 层类型(例如,'LlamaDecoderLayer')
--tf32 # 启用 TensorFloat-32 精度(仅在支持的硬件上有效,如 NVIDIA A100、H100)
其中 --model_name_or_path MODEL 是在 3.1 部分中的示例位置;--num_processes N 取决于读者可以使用的 GPU 数量。
3.23 模型训练开始
在 Bash 中运行脚本:
./train.sh
如果遇到报错:
bash: ./train.sh: Permission denied
则执行 chmod +x train.sh
命令给文件 train.sh
添加执行权限:
chmod +x train.sh
再次运行应该就成功了!
想要获取模型更多信息可以查看目录 ./wandb/
下相关输出日志信息,读者也可以自己编写对象脚本,以输出需要的日志信息。
评论