[AIGC最佳实践] NPU Snt9B裸金属服务器训练并推理Baichuan2-7B模型
1. 背景内容
Baichuan2-7B 是由百川智能开发的一个开源可商用的大规模预训练语言模型,基于 Transformer 结构,在大约 1.2 万亿 tokens 上训练的 70 亿参数模型,支持中英双语,上下文窗口长度为 4096。本文主要介绍如何在单机8卡Snt9B裸金属服务器中对该模型进行微调训练。
2. 环境准备
当前Snt9B裸金属服务器的最新规格如下表所示。
firmware | 6.4.12.1.241 |
software | 23.0.rc2.2 |
若当前Snt9B裸金属服务器预装的版本不是最新的发布版本,建议参考:Atlas800(鲲鹏920+昇腾Snt9处理器)环境配置指导的2.2节升级固件驱动版本到最新版本。
模型支持的当前版本和主要库依赖如下表所示。
python | 3.7 |
torch | 1.11.0 |
torch-npu | 1.11.0 |
CANN | 7.0.RC1 |
deepspeed | 0.9.2 |
2.1 pyhton环境安装
通过conda管理python环境。
下载链接:https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-aarch64.sh
安装相关依赖:
pip3 install --upgrade pip
pip3 install einops sympy regex decorator scipy pandas rich setuptools-scm prompt-toolkit attrs accelerate sentencepiece transformers==4.28.1
2.2 安装deepspeed_npu
git clone https://gitee.com/ascend/DeepSpeed.git -b v0.9.2 deepspeed_npu
cd deepspeed_npu
pip3 install .
如果没有安装git,需要先安装:
yum -y install git-core
git config --global http.sslVerify false
2.3 安装昇腾torch及对应torch_npu插件
torch-npu下载链接:https://gitee.com/ascend/pytorch/releases/download/v5.0.rc3-pytorch1.11.0/torch_npu-1.11.0.post4_for_kunpeng.zip
安装:
pip3 install torch-1.11.0-cp37-cp37m-linux_aarch64.whl
pip3 install torch_npu-1.11.0.post4-cp37-cp37m-linux_aarch64.whl
2.4 安装指定版本的CANN
CANN需要满足支持BF16的条件,这里选择7.0.RC1版本进行安装。
下载路径:https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373/software/260809541
选择Ascend-cann-kernels-910b_7.0.RC1_linux.run和Ascend-cann-toolkit_7.0.RC1_linux-aarch64.run两个版本进行下载。
如果当前已经有CANN版本,先执行如下命令删除:
cd /usr/local/Ascend/ascend-toolkit/latest/aarch64-linux/script
./uninstall.sh
执行如下命令安装CANN:
bash ./Ascend-cann-toolkit_7.0.RC1_linux-aarch64.run --full
bash ./Ascend-cann-kernels-910b_7.0.RC1_linux.run --install
全部选择yes即可。
3. 模型准备
3.1 ModelZoo-pytorch源码下载
git clone --depth 1 https://gitee.com/ascend/ModelZoo-PyTorch.git
Baichuan2-7B所在的目录为:./ModelZoo-PyTorch/PyTorch/built-in/foundation/Baichuan2/7B,也即下文所指的源码包根目录。
3.2 替换transformers库中相关文件
将源码包根目录下transformers_modify文件夹中的各个文件分别替换到transformers库安装目录下的对应位置(基于transformers 4.28.1版本):
training_args.py -> transformers/training_args.py
trainer.py -> transformers/trainer.py
versions.py -> utils/versions.py
3.3 下载预训练模型
下载 Baichuan2-7B-Base的模型权重文件,用源码包根目录下的`Baichuan2-7B/modeling_baichuan.py`替换下载下来的模型权重文件夹中的`modeling_baichuan.py`文件。
3.4 下载训练数据集
下载外卖评论情感识别数据集waimai_10k。
4. 训练
下面以外卖评论情感识别的任务为例,演示如何基于Baichuan2-7B模型完成全参微调。
4.1 训练数据预处理
将3.4节下载的数据集放在3.1节下载的源码包根目录下,运行源码包根目录下的make_data.py
脚本将原始数据处理成处理成json格式,提取前10000条作为训练集train.jsonl
,剩余样本作为验证集eval.jsonl
,脚本生成的样本格式如下:
{"review": "11:30,的餐,下午三点才送到.,还是打百度投诉的结婚!", "label": "消极"}
{"review": "还不错,送货很快味道也还好", "label": "积极"}
{"review": "等了五十分钟,受不了的龟速", "label": "消极"}
{"review": "很快,很好", "label": "积极"}
{"review": "超级好超级好超级好啊", "label": "积极"}
4.2 修改训练脚本
模型训练脚本ds_run_bf16.sh
参数说明如下:
--model_name_or_path // 预训练参数路径
--train_data // 训练数据集路径
--eval_data // 验证数据集路径
--bf16 // 参数使用bf16保存
--output_dir // ckpt保存位置
--num_train_epochs // 训练epoch数
--per_device_train_batch_size // 每张卡上的训练batch size
--gradient_accumulation_steps // 梯度累积的步数
--gradient_checkpointing // 是否开启重计算
--save_strategy // ckpt保存策略
--learning_rate // 学习率
--weight_decay // weight decay策略
--warmup_ratio // warmup步数的比例
--lr_scheduler_type // 学习率衰减方式
--logging_steps // 训练日志打印间隔步数
--tf32 False // 使用tf32训练,npu暂不支持
--model_max_length // 模型训练的sequence length
--deepspeed // deepspeed配置脚本路径
其中,deepspeed参数说明如下:
--bf16 // bf16训练相关配置
--optimizer // 优化器相关配置
--zero_optimization // zero优化器相关配置
--gradient_accumulation_steps // 梯度累积步数
--gradient_clipping // 梯度裁剪
--train_batch_size // 训练batch size
--train_micro_batch_size_per_gpu // 训练micro batch size
需要将model_name_or_path
参数指向3.3节下载的模型权重文件目录,并确保数据集在源码包根目录下的data
目录内。
4.3 执行训练
bash ./ds_run_bf16.sh
如果一切正常,命令行会打印训练进度,并在训练完成后显示success:
训练完成后,权重文件默认保存在源码包根目录下的outputs
目录下。
注:如果训练时出现如下报错,显示缺少libblas.so.3动态库:
说明缺少blas和lapack动态库, 这两个数学库是linux科学计算软件所需调用的,使用yum install安装。
5. 推理
5.1 修改推理脚本
修改test.py
脚本,将原对话模型的路径指向指向3.3节下载的模型权重文件目录。
5.2 执行推理脚本
bash ./run_test.sh
如果微调成功,可以看到类似下图的结果:
- 点赞
- 收藏
- 关注作者
评论(0)