水军大提督 发表于 2024-11-2 01:17:27

基于AIACC加速器快速实现LLaMA-7B指令微调

本文基于Alpaca提供了一套LLaMA-7B模型在阿里云ECS上进行指令微调的练习方案,最终可以获得性能更贴近具体使用场景的语言模型。
背景信息

LLaMA(Large Language Model Meta AI )是Meta AI在2023年2月发布的开放使用预练习语言模型(Large Language Model, LLM),其参数量包罗7B到65B的集合,并仅使用完全公开的数据集进行练习。LLaMA的练习原理是将一系列单词作为“输入”并预测下一个单词以递归生成文本。
LLM具有建模大量词语之间接洽的本事,但是为了让其强大的建模本事向下游具体使命输出,必要进行指令微调,根据大量不同指令对模型部分权重进行更新,使模型更善于遵照指令。指令微调中的指令简单直观地描述了使命,具体的指令格式如下:

{
"instruction": "Given the following input, find the missing number",
"input": "10, 12, 14, __, 18",
"output": "16"
} Alpaca是一个由LLaMA-7B模型进行指令微调得到的模型,其练习过程中接纳的通过指令对LLaMA-7B模型进行小规模权重更新的方式,实现了模型性能和练习时间的平衡。
本文基于Alpaca提供了一套LLaMA-7B模型,基于DeepSpeed进行指令微调练习,并使用AIACC加速练习。AIACC包括ACSpeed和AGSpeed两个加速器。
加速器
分析
相关文档
ACSpeed
AIACC-ACSpeed(简称ACSpeed)是阿里云自研的AI练习加速器,在AI框架层、集合算法层和网络层上分别实现了与开源主流分布式框架的充分兼容,并实现了软硬件团结的全面优化。ACSpeed具有其显著的性能优势,在提高练习效率的同时能够降低使用成本,可以实现无感的分布式通讯性能优化。
什么是AI分布式练习通讯优化库AIACC-ACSpeed
AGSpeed
AIACC-AGSpeed(简称AGSpeed)是阿里云推出的一个基于PyTorch深度学习框架研发的计算优化编译器,用于优化PyTorch深度学习模型在阿里云GPU异构计算实例上的计算性能,可以实现计算优化。
什么是计算优化编译器AIACC-AGSpeed
重要


[*] 阿里云不对第三方模型“llama-7b-hf”的合法性、安全性、准确性进行任何包管,阿里云不对由此引发的任何损害负担责任。
[*] 您应自发服从第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行负担相关责任。
操作步调

准备工作

操作前,请先在合适的地区和可用区下创建VPC和交换机。


[*] 本文使用ecs.gn7i-c32g1.32xlarge规格的ECS实例进行练习,仅部分地区可用区支持该实例规格,具体请拜见ECS实例规格可购买地区。
[*] 关于如何创建VPC和交换机,请拜见创建专有网络和创建交换机。
创建ECS实例

控制台方式
FastGPU方式

[*] 前往实例创建页。
[*] 按照领导完成参数设置,创建一台ECS实例。
必要留意的参数如下。更多信息,请拜见自定义购买实例。
   

[*] 实例:规格选择ecs.gn7i-c32g1.32xlarge(包罗4卡NVIDIA A10 GPU)。

https://img-blog.csdnimg.cn/img_convert/7bb0aba169778933fc57e872dcc6eb1f.png
[*] 镜像:使用云市场镜像,名称为aiacc-train-solution,该镜像已部署好练习所需情况。您可以直接通过名称搜索该镜像,版本可选择最新版本。

https://img-blog.csdnimg.cn/img_convert/0442ce44050c497c878aaf1a4bb99063.png
分析
您也可以选择公共镜像(如CentOS 7.9 64位),后续手动部署情况。
[*] 公网IP:选中分配公网IPv4地址,按需选择计费模式和带宽。本文使用按流量计费,带宽峰值为5 Mbps。

https://img-blog.csdnimg.cn/img_convert/ff409e66e9c4ee3a8b6b2c5346704f0e.png

[*] 添加安全组规则。
在ECS实例所需安全组的入方向添加一条规则,开放7860端口,用于访问WebUI。具体操作,请拜见添加安全组规则。
以下示例表示向全部网段开放7860端口,开放后全部公网IP均可访问您的WebUI。您可以根据必要将授权对象设置为特定网段,仅答应部分IP地址访问WebUI。

https://img-blog.csdnimg.cn/img_convert/d4040c14c0d8959eeb26236b8c5531ec.png
[*] 使用Workbench连接实例。
如果使用示例的云市场镜像进行测试,由于情况安装在/root目次下,连接实例时需使用root用户。关于如何连接ECS实例,请拜见通过密码或密钥认证登录Linux实例。
(可选)手动部署情况

启动练习


[*] 下载tmux并创建一个tmux session。

yum install tmux
tmux 分析
练习耗时较长,建议在tmux session中启动练习,以免ECS断开连接导致练习停止。
[*] 进入Conda情况。

conda activate llama_train
[*] 获取llama-7b-hf预练习权重。
   
[*] 下载llama-7b权重。

cd /root/LLaMA
git lfs install
git clone https://huggingface.co/decapoda-research/llama-7b-hf
[*] 修复官方代码Bug。

sed -i "s/LLaMATokenizer/LlamaTokenizer/1" ./llama-7b-hf/tokenizer_config.json

[*] 创建并设置DeepSpeed设置文件。

cd LLaMA/stanford_alpaca
cat << EOF | sudo tee ds_config.json
{
"zero_optimization": {
    "stage": 3,
    "contiguous_gradients": true,
    "stage3_max_live_parameters": 0,
    "stage3_max_reuse_distance": 0,
    "stage3_prefetch_bucket_size": 0,
    "stage3_param_persistence_threshold": 1e2,
    "reduce_bucket_size": 1e2,
    "sub_group_size": 1e8,
    "offload_optimizer": {
      "device": "cpu",
      "pin_memory": true
    },
    "offload_param": {
      "device": "cpu",
      "pin_memory": true
    },
    "stage3_gather_16bit_weights_on_model_save": true
},
"communication":{
    "prescale_gradients": true
},
"fp16": {
    "enabled": true,
    "auto_cast": false,
    "loss_scale": 0,
    "initial_scale_power": 32,
    "loss_scale_window": 1000,
    "hysteresis": 2,
    "min_loss_scale": 1
},
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"wall_clock_breakdown": false,
"zero_force_ds_cpu_optimizer": false
}
EOF
[*] (可选)如果使用多台ECS实例进行练习,需设置hostfile。
本文使用一台ECS实例进行练习,可跳过此步调。
如下示例表示设置两台ECS实例(GPU总数为8)时,必要填入每台ECS实例的内网IP和slots,此中slots表示历程数(即GPU数量)。

cat > hostfile <<EOF
{private_ip1} slots=4
{private_ip2} slots=4
EOF
[*] 启动练习。
启动练习的命令脚本如下,alpaca_data.json为指令数据集文件,$MASTER_PORT请更换为2000-65535之间的随机端口号。

deepspeed --master_port=$MASTER_PORT --hostfile hostfile \
train.py \
--model_name_or_path ../llama-7b-hf \
--data_path ./alpaca_data.json \
--output_dir ./output \
--report_to none \
--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 400 \
--save_total_limit 2 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--deepspeed ./ds_config.json \
--tf32 False \
--bf16 False \
--fp16 启动练习后预期返回如下:

https://img-blog.csdnimg.cn/img_convert/5c00d98aaa5d76e2f61d211c33166f79.png
分析
练习完成大概必要7小时左右,在tmux session中进行练习的过程中,如果断开了ECS连接,重新登录ECS实例后执行tmux attach命令即可恢复tmux session,查看练习进度。
结果展示

查看WebUI推理结果


[*] 查看原生预练习模型的推理结果。
   
[*] 进入Conda情况。

conda activate llama_train
[*] 使用原生checkpoint文件进行推理。

cd /root/LLaMA/text-generation-webui
ln -s /root/LLaMA/llama-7b-hf ./models/llama-7b-hf
[*] 启动WebUI服务。

python /root/LLaMA/text-generation-webui/server.py --model llama-7b-hf --listen 预期返回:

https://img-blog.csdnimg.cn/img_convert/4e165dae672011670eb44d7088073585.png
[*] 打开本地浏览器,访问ECS实例的公网IP地址加7860端口,如101.200.XX.XX:7860。
[*] 在Input框中输入题目(建议输入英语),单击Generate,在Output框获取结果。
原生的预练习模型不能很好理解指令。示例如下:

https://img-blog.csdnimg.cn/img_convert/2d08dc5f8ef0658252058b41f405dd22.png

[*] 等待练习完成后,查看指令微调后模型的推理结果。
   
[*] 重新连接ECS实例。
[*] 进入Conda情况。

conda activate llama_train
[*] 使用练习完成的checkpoint文件进行推理。

cd /root/LLaMA/text-generation-webui
ln -s /root/LLaMA/stanford_alpaca/output/checkpoint-800 ./models/llama-7b-hf-800
[*] 启动WebUI服务。

python /root/LLaMA/text-generation-webui/server.py --model llama-7b-hf-800 --listen 预期返回:

https://img-blog.csdnimg.cn/img_convert/a269c3b0fcef546d6a3fbee8d4682e34.png
[*] 打开本地浏览器,访问ECS实例的公网IP地址加7860端口,如101.200.XX.XX:7860。
[*] 单击Model页签,在Model模型列表中,选择指令微调后模型(如本文的llama-7b-hf-800)。
当页面右下角显示Successfully loaded llama-7b-hf-800时,分析该模型已加载完成。
分析
llama-7b-hf-***后面的数字代表微调的step数,一般情况下,选择微调step数越大的模型,结果越好。

https://img-blog.csdnimg.cn/img_convert/5ef94df15b89472b5e48d691d2d0a4a3.png
[*] 在Input框中输入题目(建议输入英语),单击Generate,在Output框获取结果。
指令微调后的模型能更好地理解指令,并生成更公道的答案。示例如下:

https://img-blog.csdnimg.cn/img_convert/421fbe6a389de1027fd2cff8274cc626.png

查看AIACC加速结果

以下是使用2台ecs.gn7i-c32g1.32xlarge规格的ECS实例(2*4 NVIDIA A10 GPU),基于DeepSpeed进行练习时,是否启动AIACC的性能对比。s/it代表练习每个iteration的时间,时间越短代表练习速度越快。由下图可以看出启动AIACC后相比原生DeepSpeed提速35%左右。
分析
练习完成后,您可以在/root/LLaMA/stanford_alpaca/wandb/latest-run/files/output.log文件中了解性能。


[*] 使用DeepSpeed进行练习

https://img-blog.csdnimg.cn/img_convert/d0d9430feec80676e70df4a3f466d79b.png
[*] 使用DeepSpeed+AIACC进行练习

https://img-blog.csdnimg.cn/img_convert/c2a0c890670f5cd146b9eb8d638e204b.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于AIACC加速器快速实现LLaMA-7B指令微调