Flan-T5是encoder-decoder结构,通过指令在超大规模的任务上进行微调,让语言模型具备了极强的泛化性能,适用于多种NLP任务。
适配昇腾 AI 处理器的实现:
url=https://gitcode.com/ascend/ModelZoo-PyTorch.git
code_path=PyTorch/built-in/foundation表 1 三方库版本支持表
| 三方库 | 支持版本(PT2.1) | 支持版本(PT2.4) |
|---|---|---|
| PyTorch | 2.1 | 2.4 |
| transformers | 4.37.2 | 4.37.2 |
| accelerate | 0.25.0 | 0.25.0 |
| deepspeed | 0.12.6 | 0.15.3 |
| datasets | 2.16.0 | 2.16.0 |
| evaluate | 0.4.1 | 0.4.1 |
环境准备指导。
请参考《Pytorch框架训练环境准备》。
表 2 昇腾软件版本支持表
| 软件类型 | 支持版本 |
|---|---|
| FrameworkPTAdapter | 24.1.RC1 |
| CANN | 24.1.RC1 |
| 昇腾NPU固件 | 24.1.RC1 |
| 昇腾NPU驱动 | 24.1.RC1 |
表 3 昇腾软件版本支持表
| 配套 | 版本 | 环境准备指导 |
|---|---|---|
| 机器型号 | Atlas 800T A2 训练节点 | - |
| AI加速芯片 | 昇腾 Ascend 910C | - |
# 环境打包成 flant5-patchcore-v1.0.0.tar
docker load -i flant5-patchcore-v1.0.0.tardocker run -dit --privileged --ipc=host --name=BlendMask_test --shm-size=1000g \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/sbin:/usr/local/sbin \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /home:/home \
-v /data:/data \
-v /tmp:/tmp \
IMAGE_ID \
/bin/bash
docker exec -it flant5-patchcore bash# 下载目录
https://gitcode.com/Ascend/ModelZoo-PyTorch/tree/master/PyTorch/built-in/foundation/Flan-t5-xxl在模型源码包根目录下执行命令,安装模型对应PyTorch版本需要的依赖。
# PyTorch 2.1请使用requirements_2_1.txt
pip install -r requirements_2_1.txt
# PyTorch 2.4请使用requirements_2_4.txt
pip install -r requirements_2_4.txt说明: 只需执行一条对应的PyTorch版本依赖安装命令。
# 下载公开数据集squard-v2(train):
https://gitee.com/hf-datasets/squad_v2
#下载数据集squad_v2(evaluation):
https://github.com/huggingface/evaluate/tree/main/metrics/squad_v2
# 模型权重
https://ai.gitee.com/hf-models/google/flan-t5-xxl/tree/main
下载的数据集squad_v2(train), 数据集结构如下
├── squad_v2
├── train-00000-of-00001.parquet
├── validation-00000-of-00001.parquet
下载数据集squad_v2(evaluation),手动修改squad_v2(evaluation)的数据集名称
#此处只修改squad_v2(evaluation)数据集,squad_v2(train)数据集保持不变
mv squad_v2 suqad_v2_eval
cd squad_v2_eval
mv squad_v2.py squad_v2_eval.py修改后squad_v2_eval数据集结构如下
├── squad_v2_eval
├── app.py
├── compute_score.py
├── requirements.txt
├── squad_v2_eval.py
├── README.md下载的权重google/flan-t5-xxl, 模型权重的结构如下:
├── flan-t5-xxl
├── config.json
├── generation_config.json
├── special_tokens_map.json
├── spiece.model
├── tokenizer.json
├── tokenizer_config.json
├── model.safetensors.index.json
├── model-00001-of-00005.safetensors
├── model-00002-of-00005.safetensors
...
├── model-00005-of-00005.safetensors进入脚本所在目录
shell cd PyTorch/built-in/foundation/Flan-t5-xxl/scripts
--model_name_or_path //模型权重路径
--deepspeed //deepspeed配置文件路径
--dataset_name //squad_v2路径
--eval_dataset_name //评估数据集路径
--version_2_with_negative //squad_v2数据集处理参数,用于处理question-answer数据结构无answer情况
--context_column //数据集context_column
--question_column //数据集question_column
--answer_column //数据集answer_column
--do_train //训练标识
--do_eval //评估标识
--per_device_train_batch_size //训练时单卡批次大小
--learning_rate 5e-6 //初始学习率
--gradient_accumulation_steps //梯度累计步数
--num_train_epochs //重复训练次数
--max_steps 2000 //训练最大步数
--save_steps 2000 //保存checkpoint步数间隔
--max_seq_length //seq_length
--logging_steps 1 //日志打印步数
--doc_stride 128 //滑动步长
--seed 1234 //随机种子
--bf16 //混精bf16
--overwrite_output_dir //覆盖输出目录修改model_name_or_path,deepspeed,dataset_name, eval_dataset_name为绝对路径位置,原始名称和相对名称可能使用默认数据位置导致报错。
运行训练脚本,该模型支持单机8卡训练。
bash train_full_8p.sh # 8卡精度及性能训练完成后,权重文件保存在PyTorch/built-in/foundation/Flan-t5-xxl/output路径下,模型训练精度和性能信息保存在PyTorch/built-in/foundation/Flan-t5-xxl/scripts/output文件夹下。
修改utils/run_seq2seq_qa.py文件, 注释代码
#from rms_norm import forward
#T5LayerNorm.forward = forward修改scripts/train_full_8p.sh文件,注释代码
#source ${scripts_path_dir}/env_npu.sh使用 deepspeed命令进行eval评测:
运行评测命令如下,需要将…/PyTorch/built-in/foundation/Flan-t5-xxl 改为模型项目实际代码位置,修改model_name_or_path,deepspeed,dataset_name, eval_dataset_name为绝对路径位置:
export OUTPUT_DIR= ../PyTorch/built-in/foundation/Flan-t5-xxl/eval_ckpt
deepspeed --num_gpus 8 --master_port 9911 utils/run_seq2seq_qa.py --model_name_or_path …/PyTorch/built-in/foundation/Flan-t5-xxl/output/tmp-checkpoint-500 --deepspeed ds_config.json --dataset_name squad_v2 --eval_dataset_name squad_v2_eval --version_2_with_negative --context_column context --question_column question --answer_column answers --do_eval --per_device_eval_batch_size 1 --max_seq_length 256 --doc_stride 128 --bf16 --predict_with_generate --output_dir "${OUTPUT_DIR}"
表 4 性能结果展示表(2000 steps)
| Name | Train Samples Per Second | Iterations | DataType | Torch_Version |
|---|---|---|---|---|
| 8p-NPU | 17.597 | 2000 | BF16 | 2.1.0 |
| 8p-竞品A | 22.012 | 2000 | BF16 | 2.1.0 |
表 5 eval 结果展示表(2000 steps)
| Name | eval loss |
|---|---|
| 8p-NPU | 0.3771 |
| 8p-竞品A | 0.3792 |
显存不足的情况下跑训练,需要开启deepseed ZeRO-3 分片,该方式会使用CPU辅助,会影响性能,开启方式:
cd ds_config.json
# 更改zero_optimization字段
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1000000000,
"reduce_bucket_size": 50000000,
"stage3_prefetch_bucket_size": 50000000,
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 500000000,
"stage3_max_reuse_distance": 500000000,
"stage3_gather_16bit_weights_on_model_save": true
}
根据情况还可以调整batchsize和 seqlen,节约显存占用
cd scripts\train_full_8p.sh
# 修改per_device_train_batch_size和 max_seq_length