【玩转AIGC系列】基于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实例

提供2种方式完成ECS实例的创建:控制台方式和FastGPU方式

控制台方式

1.前往实例创建页

2.按照向导完成参数配置,创建一台ECS实例。需要注意的参数如下。更多信息,请参见自定义购买实例

  • 实例:规格选择ecs.gn7i-c32g1.32xlarge(包含4卡NVIDIA A10 GPU)。
  • 镜像:使用云市场镜像,名称为aiacc-train-solution,该镜像已部署好训练所需环境。您可以直接通过名称搜索该镜像,版本可选择最新版本。

    说明 :您也可以选择公共镜像(如CentOS 7.9 64位),后续手动部署环境
  • 公网IP:选中分配公网IPv4地址,按需选择计费模式和带宽。本文使用按流量计费,带宽峰值为5 Mbps。

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

4.使用Workbench连接实例。
如果使用示例的云市场镜像进行测试,由于环境安装在/root目录下,连接实例时需使用root用户。关于如何连接ECS实例,请参见通过密码或密钥认证登录Linux实例


FastGPU方式

说明 :FastGPU方式仅支持在Linux系统或macOS系统中使用。如果您使用Windows系统,请采用控制台方式。

1.安装FastGPU软件包并配置环境变量。

a.安装FastGPU软件包。

pip3 install --force-reinstall https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/fastgpu/fastgpu-1.1.6-py3-none-any.whl

b.配置环境变量。
配置环境变量前,请获取阿里云账号AccessKey(AccessKey ID和AccessKey Secret),以及您希望创建ECS实例的地域等信息。关于如何获取AccessKey,请参见创建AccessKey

export ALIYUN_ACCESS_KEY_ID=****         #填入您的AccessKey ID
export ALIYUN_ACCESS_KEY_SECRET=****     #填入您的AccessKey Secret
export ALIYUN_DEFAULT_REGION=cn-beijing  #填入您希望使用的地域(Region)

2.创建一台ECS实例。
命令示例如下,表示创建一台名为aiacc_solution的ECS实例,实例规格为ecs.gn7i-c32g1.32xlarge,镜像类型为aiacc_train_solution
说明 :本文使用云市场的aiacc-train-solution镜像作为示例,该镜像已部署好训练所需环境。您也可以选择公共镜像(如CentOS 7.9 64位),后续手动部署环境

fastgpu create --name aiacc_solution -i ecs.gn7i-c32g1.32xlarge --machines 1 --image_type aiacc_train_solution

3.添加安全组规则。

a.添加本机公网IP的22端口到默认安全组中。

fastgpu addip -a

b.开放7860端口,用于访问WebUI。
以下命令示例表示向所有网段开放7860端口,开放后所有公网IP均可访问您的WebUI。您可以根据需要将0.0.0.0/0改为特定网段,仅允许部分IP地址可以访问WebUI。

fastgpu addip {aiacc_solution} 0.0.0.0/0 7860

4.通过SSH连接ECS实例。
您可以通过fastgpu ssh {instance_name}命令连接ECS实例。示例如下:

fastgpu ssh aiacc_solution


说明 :更多关于FastGPU的命令,请参见命令行使用说明


(可选)手动部署环境

创建ECS实例时,如果您使用的是已部署好训练所需环境的云市场镜像,则可以跳过此步骤。如果您使用的是公共镜像,需要手动部署环境。

1.部署训练所需环境。

a.安装devtoolset。

mkdir /root/LLaMA && cd /root/LLaMA
yum install -y ninja-build centos-release-scl devtoolset-7 git-lfs
source /opt/rh/devtoolset-7/enable
echo "source /opt/rh/devtoolset-7/enable" >> /etc/bashrc;

b.拉取代码。

i) 配置git。

git config --unset --global https.proxy
git config --unset --global http.proxy

ii) 拉取stanford_alpaca。

git clone https://github.com/tatsu-lab/stanford_alpaca.git

c.安装Conda。

wget https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh
sh Miniconda3-py39_23.1.0-1-Linux-x86_64.sh

安装后执行source ~/.bashrc生效环境变量,如果命令行前缀出现(base)表示已启动Conda。

d.创建Conda虚拟环境。

conda create -n llama_train python=3.9
conda activate llama_train
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
pip install deepspeed==0.8.3
pip install protobuf==3.19.0
pip install accelerate
cd stanford_alpaca
pip install -r requirements.txt

e.安装pdsh。

wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pdsh/pdsh-2.29.tar.bz2
tar -jxvf pdsh-2.29.tar.bz2
cd pdsh-2.29
./configure --with-ssh --with-rsh --with-mrsh--with-mqshell --with-qshell --with-dshgroups--with-machines=/etc/pdsh/machines --without-pam
make 
make install
cd ..

2.使用AIACC加速训练。

a.安装AIACC。

wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/aiacc/aiacc-1.1.0.tar.gz
pip install aiacc-1.1.0.tar.gz

b.使用AIACC。
以本方案为例,需要在训练文件train.py(默认在/root/LLaMA/stanford_alpaca目录下)中加入以下代码:

import torch
import aiacc


说明 :AIACC默认开启,如果想要关闭AIACC,可以执行export AIACC_DISABLE=1设置环境变量。关闭后如果想要重新开启AIACC,可以执行unset AIACC_DISABLE开启。

3.安装WebUI。

cd /root/LLaMA
git clone https://github.com/oobabooga/text-generation-webui
cd text-generation-webui
git reset --hard 7ff645899e4610b16574bdd22a4d154c93d5b830
pip install -r requirements.txt

启动训练

1.下载tmux并创建一个tmux session。

yum install tmux
tmux


说明 :训练耗时较长,建议在tmux session中启动训练,以免ECS断开连接导致训练中断。

2.进入Conda环境。

conda activate llama_train

3.获取llama-7b-hf预训练权重。

a.下载llama-7b权重。

cd /root/LLaMA
git lfs install
git clone https://huggingface.co/decapoda-research/llama-7b-hf

b.修复官方代码Bug。

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

4.创建并设置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

5.(可选)如果使用多台ECS实例进行训练,需配置hostfile。
本文使用一台ECS实例进行训练,可跳过此步骤。
如下示例表示配置两台ECS实例(GPU总数为8)时,需要填入每台ECS实例的内网IP和slots,其中slots表示进程数(即GPU数)。

cat > hostfile <<EOF
{private_ip1} slots=4
{private_ip2} slots=4
EOF

6.启动训练。
启动训练的命令脚本如下,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

启动训练后预期返回如下:

说明 :训练完成大概需要7小时左右,在tmux session中进行训练的过程中,如果断开了ECS连接,重新登录ECS实例后执行tmux attach命令即可恢复tmux session,查看训练进度。

效果展示

查看WebUI推理效果

1.查看原生预训练模型的推理效果。

a.进入Conda环境。

conda activate llama_train

b.使用原生checkpoint文件进行推理。

cd /root/LLaMA/text-generation-webui
ln -s /root/LLaMA/llama-7b-hf ./models/llama-7b-hf

c.启动WebUI服务。

python /root/LLaMA/text-generation-webui/server.py --model llama-7b-hf --listen

预期返回:

d.打开本地浏览器,访问ECS实例的公网IP地址加7860端口,如101.200.XX.XX:7860

e.在Input框中输入问题(建议输入英语),单击Generate,在Output框获取结果。
原生的预训练模型不能很好理解指令。示例如下:

2.等待训练完成后,查看指令微调后模型的推理效果。

a.重新连接ECS实例。

b.进入Conda环境。

conda activate llama_train

c.使用训练完成的checkpoint文件进行推理。

cd /root/LLaMA/text-generation-webui
ln -s /root/LLaMA/stanford_alpaca/output/checkpoint-800 ./models/llama-7b-hf-800

d.启动WebUI服务。

python /root/LLaMA/text-generation-webui/server.py --model llama-7b-hf-800 --listen

预期返回:

e.打开本地浏览器,访问ECS实例的公网IP地址加7860端口,如101.200.XX.XX:7860

f.单击Model页签,在Model模型列表中,选择指令微调后模型(如本文的llama-7b-hf-800)。
当页面右下角显示Successfully loaded llama-7b-hf-800时,说明该模型已加载完成。
说明 :llama-7b-hf-***后面的数字代表微调的step数,一般情况下,选择微调step数越大的模型,效果越好。

g.在Input框中输入问题(建议输入英语),单击Generate,在Output框获取结果。
指令微调后的模型能更好理解指令,并生成更合理的答案。示例如下:

查看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进行训练
  • 使用DeepSpeed+AIACC进行训练


了解更多AIGC实践和GPU优惠

反馈与建议

如果您在使用教程或实践过程中有任何问题或建议,可以使用钉钉扫描以下二维码加入客户支持群(也可以搜索钉钉群号23210030587加入)与我们的工程师线上交流,将有专人跟进您的问题和建议。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
自然语言处理
AIGC使用问题之GPT-1如何优化目标函数,如何做模型微调
AIGC使用问题之GPT-1如何优化目标函数,如何做模型微调
|
4月前
|
监控 算法 物联网
LLaMA-Factory:大语言模型微调框架 | AIGC
LLaMA-Factory 是一个国内北航开源的低代码大模型训练框架,专为大型语言模型(LLMs)的微调而设计【7月更文挑战第5天】
417 9
|
4月前
|
物联网 PyTorch 算法框架/工具
介绍一个大语言模型的微调框架Swift | AIGC
介绍一个大语言模型的微调框架Swift 【7月更文挑战第4天】
369 3
|
5月前
|
人工智能 自然语言处理 搜索推荐
《AIGC+软件开发新范式》--03.微调工程师岗位可能并不存在, 但使用 AI 编码工具已经成为刚需(1)
在AI 热度持续上升的当下,阿里云推出AI智能编码助手—通义灵码。通义灵码是一款基于阿里云通义代码大模型打造的智能编码助手,基于海量优秀开源代数据集和编程教科书训练,为开发者带来高效、流畅的编码体验。
|
5月前
|
人工智能 搜索推荐 Devops
《AIGC+软件开发新范式》--03.微调工程师岗位可能并不存在, 但使用 AI 编码工具已经成为刚需(2)
在AI 热度持续上升的当下,阿里云推出AI智能编码助手—通义灵码。通义灵码是一款基于阿里云通义代码大模型打造的智能编码助手,基于海量优秀开源代数据集和编程教科书训练,为开发者带来高效、流畅的编码体验。
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
16CODEIPPROMPT:顶会ICML’23 从GitHub到AI,探索代码生成的侵权风险与缓解策略的最新进展:训练数据`有限制性许可;模型微调+动态Token过滤【网安AIGC专题11.8】
16CODEIPPROMPT:顶会ICML’23 从GitHub到AI,探索代码生成的侵权风险与缓解策略的最新进展:训练数据`有限制性许可;模型微调+动态Token过滤【网安AIGC专题11.8】
133 1
|
12月前
|
机器学习/深度学习 存储 人工智能
【网安AIGC专题11.8】论文15 ChatGPT在软件工程中的全面作用:程序语法(AST生成、表达式匹配) 静态行为、动态分析(数据依赖和污点分析、指针分析) 提示设计(角色提示、指令提示)
【网安AIGC专题11.8】论文15 ChatGPT在软件工程中的全面作用:程序语法(AST生成、表达式匹配) 静态行为、动态分析(数据依赖和污点分析、指针分析) 提示设计(角色提示、指令提示)
115 0
|
机器学习/深度学习 缓存 物联网
AIGC Stable Diffusion文生图Lora模型微调实现虚拟上装
在本教程中,您将学习如何在阿里云交互式建模(PAI-DSW)中,基于Diffusers开源库进行AIGC Stable Diffusion模型的微调训练,以及基于Stable-Diffusion-WebUI开源库启动WebUI进行模型推理。
1132 0
|
机器学习/深度学习 人工智能 自然语言处理
AIGC时代,大模型微调如何发挥最大作用?
AIGC时代,大模型微调如何发挥最大作用?
611 0
|
机器学习/深度学习 人工智能 搜索推荐
Diffusion预训练成本降低6.5倍,微调硬件成本降低7倍!Colossal-AI完整开源方案低成本加速AIGC产业落地
Diffusion预训练成本降低6.5倍,微调硬件成本降低7倍!Colossal-AI完整开源方案低成本加速AIGC产业落地
212 0

热门文章

最新文章