概述
简述
BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,是一种用于自然语言处理(NLP)的预训练技术。Bert-base模型是一个12层,768维,12个自注意头(self attention head),110M参数的神经网络结构,它的整体框架是由多层transformer的编码器堆叠而成的。
参考实现:
url=https://github.com/huggingface/transformers commit_id=d1d3ac94033b6ea1702b203dcd74beab68d42d83
适配昇腾 AI 处理器的实现:
url=https://gitee.com/ascend/ModelZoo-PyTorch.git code_path=PyTorch/built-in/nlp
准备训练环境
准备环境
当前模型支持的 PyTorch 版本和已知三方库依赖如下表所示。
表 1 版本支持表
Torch_Version 三方库依赖版本 PyTorch 1.5 - PyTorch 1.8 - PyTorch 1.11 - PyTorch 2.1 - 环境准备指导。
请参考《Pytorch框架训练环境准备》。
安装依赖:
pip install -r requirements.txt
安装transformers:
cd transformers pip3 install -e ./ cd ..
准备数据集
获取数据集。
下载
zhwiki
数据集。解压得到zhwiki-latest-pages-articles.xml。
bzip2 -dk zhwiki-latest-pages-articles.xml.bz2
使用模型根目录下的WikiExtractor.py提取文本,其中extracted/wiki_zh为保存路径,不要修改。
python3 WikiExtractor.py zhwiki-latest-pages-articles.xml -b 100M -o extracted/wiki_zh
将多个文档整合为一个txt文件,在模型根目录下执行。
python3 WikicorpusTextFormatting.py --extracted_files_path extracted/wiki_zh --output_file zhwiki-latest-pages-articles.txt
最终生成的文件名为zhwiki-latest-pages-articles.txt。
Bert-base下载配置模型和分词文件。
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/bert-base-chinese
将下载下的bert-base-chinese放置在模型根目录下。
Bert-large下载配置模型和分词文件。
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/algolet/bert-large-chinese
将下载下的bert-large-chinese放置在模型根目录下。
开始训练
训练模型
进入解压后的源码包根目录。
cd /${模型文件夹名称}
运行训练脚本。
该模型支持单机单卡训练、单机8卡训练以及双机多卡训练。
单机单卡训练
启动base单卡训练。
bash test/train_full_1p.sh --data_path=dataset_file_path --batch_size=32 --model_size=base --device_id=0 # 单卡精度训练 bash test/train_performance_1p.sh --data_path=dataset_file_path --batch_size=32 --model_size=base # 单卡性能训练
启动large单卡训练。
bash test/train_full_1p.sh --data_path=dataset_file_path --batch_size=16 --model_size=large --device_id=0 --warmup_ratio=0.1 --weight_decay=0.00001 # 单卡精度训练 bash test/train_performance_1p.sh --data_path=dataset_file_path --batch_size=16 --model_size=large --warmup_ratio=0.1 --weight_decay=0.00001 # 单卡性能训练
单机8卡训练
启动base8卡训练。
bash test/train_full_8p.sh --data_path=dataset_file_path --batch_size=32 --model_size=base # 8卡精度训练 bash test/train_performance_8p.sh --data_path=dataset_file_path --batch_size=32 --model_size=base # 8卡性能训练
启动large8卡训练。
bash test/train_full_8p.sh --data_path=dataset_file_path --batch_size=16 --model_size=large --warmup_ratio=0.1 --weight_decay=0.00001 # 8卡精度训练 bash test/train_performance_8p.sh --data_path=dataset_file_path --batch_size=16 --model_size=large --warmup_ratio=0.1 --weight_decay=0.00001 # 8卡性能训练
多机多卡训练
启动base多机多卡训练。
bash test/train_full_multinodes.sh --data_path=dataset_file_path --batch_size=32 --model_size=base --nnodes=node_number --node_rank=node_id --master_addr=x.x.x.x --master_port=xxxx # 多机多卡精度训练 bash test/train_performance_multinodes.sh --data_path=dataset_file_path --batch_size=32 --model_size=base --nnodes=node_number --node_rank=node_id --master_addr=x.x.x.x --master_port=xxxx #多机多卡性能训练
启动large多机多卡训练。
bash test/train_full_multinodes.sh --data_path=dataset_file_path --batch_size=16 --model_size=large --nnodes=node_number --node_rank=node_id --master_addr=x.x.x.x --master_port=xxxx --warmup_ratio=0.1 --weight_decay=0.00001 # 多机多卡精度训练 bash test/train_performance_multinodes --data_path=dataset_file_path --batch_size=16 --model_size=large --nnodes=node_number --node_rank=node_id --master_addr=x.x.x.x --master_port=xxxx --warmup_ratio=0.1 --weight_decay=0.00001 # 多机多卡性能训练
--data_path: 数据集路径 --device_number: 每台服务器上要使用的训练卡数 --model_size: 训练model是base或者是large --device_id: 单卡训练时所使用的device_id --node_rank: 集群节点序号,master节点是0, 其余节点依次加1 --master_addr:master节点服务器的ip --master_port: 分布式训练中,master节点使用的端口
双机8卡训练
启动双机8卡训练。bash ./test/train_cluster_8p.sh --data_path=real_data_path --node_rank=node_id --master_addr=x.x.x.x --master_port=xxxx
--node_rank //集群节点序号,master节点是0,其余节点依次加1 --master_addr //master节点服务器的ip --master_port //分布式训练中,master节点使用的端口 --data_path //数据集路径,需写到数据集的一级目录。
模型训练脚本参数说明如下。
公共参数: --config_name //模型配置文件 --model_type //模型类型 --tokenizer_name //分词文件路径 --train_file //数据集路径 --eval_metric_path //精度评估处理脚本路径 --line_by_line //是否将数据中一行视为一句话 --pad_to_max_length //是否对数据做padding处理 --remove_unused_columns //是否移除不可用的字段 --save_steps //保存的step间隔 --overwrite_output_dir //是否进行覆盖输出 --per_device_train_batch_size //每个卡的train的batch_size --per_device_eval_batch_size //每个卡的evaluate的batch_size --do_train //是否进行train --do_eval //是否进行evaluate --fp16 //是否使用混合精度 --fp16_opt_level //混合精度level --loss_scale //loss scale值 --use_combine_grad //是否开启tensor叠加优化 --optim //优化器 --output_dir //输出保存路径
训练完成后,权重文件保存在当前路径下,并输出模型训练精度和性能信息。
在线推理
- 启动在线推理。
bash ./test/train_eval_1p.sh --data_path=real_data_path --device_id=xxx --checkpoint=real_checkpoint_path
--data_path: 数据集路径 --device_id: 在线推理时所使用的device_id --checkpoint: 权重文件目录
训练结果展示
表2 训练结果展示表
NAME | Acc@1 | FPS | Epochs | AMP_Type | Torch_Version |
---|---|---|---|---|---|
1p-竞品V | - | - | 3 | O2 | 1.5 |
8p-竞品V | 0.59 | 898 | 3 | O2 | 1.5 |
1p-NPU | - | 128.603 | 3 | O2 | 1.8 |
8p-NPU | 0.59 | 936.505 | 3 | O2 | 1.8 |
版本说明
变更
2022.08.24:首次发布
FAQ
Q:第一次运行报类似"xxx socket timeout xxx"的错误该怎么办?
A:第一次运行tokenizer会对单词进行预处理,根据您的数据集大小,耗时不同,若时间过长,可能导致等待超时。此时可以通过设置较大的超时时间阈值尝试解决:
(1)设置pytorch框架内置超时时间,修改脚本中的distributed_process_group_timeout(单位秒)为更大的值,例如设置为7200:
--distributed_process_group_timeout 7200
(2)设置HCCL的建链时间为更大的值,修改env.sh中环境变量HCCL_CONNECT_TIMEOUT(单位秒)的值:
export HCCL_CONNECT_TIMEOUT=7200
Q:如果训练报wandb.error.UsageError:api_key not configured (no-tty)的错误该怎么办?
A:export WANDB_DISABLED=1
Bert_Base_Chinese模型-推理指导
概述
BERT
来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding
,BERT
是Bidirectional Encoder Representations from Transformers
的首字母缩写,整体是一个自编码语言模型。Bert_Base_Chinese
是BERT
模型在中文语料上训练得到的模型。
url=https://huggingface.co/bert-base-chinese
commit_id=38fda776740d17609554e879e3ac7b9837bdb5ee
mode_name=Bert_Base_Chinese
输入输出数据
输入数据
输入数据 数据类型 大小 数据排布格式 input_ids INT64 batchsize x seq_len ND attention_mask INT64 batchsize x seq_len ND token_type_ids INT64 batchsize x seq_len ND 输出数据
输出数据 大小 数据类型 数据排布格式 output batch_size x class FLOAT32 ND
推理环境准备[所有版本]
该模型需要以下插件与驱动
表 1 版本配套表
配套 | 版本 | 环境准备指导 |
---|---|---|
固件与驱动 | 1.0.17 | Pytorch框架推理环境准备 |
CANN | 6.0.RC1 | - |
Python | 3.7.5 | - |
PyTorch | 1.5.0+ | - |
说明:Atlas 300I Duo 推理卡请以CANN版本选择实际固件与驱动版本。 | \ | \ |
快速上手
获取源码
获取源码。
git clone https://gitee.com/ascend/ModelZoo-PyTorch.git # 克隆仓库的代码 git checkout master # 切换到对应分支 cd ACL_PyTorch/built-in/nlp/Bert_Base_Chinese_for_Pytorch # 切换到模型的代码仓目录
安装依赖。
pip3 install -r requirements_for_infer.txt git clone https://gitee.com/Ronnie_zheng/MagicONNX.git MagicONNX cd MagicONNX && git checkout dev pip3 install . && cd ..
获取开源代码仓。 在已下载的源码包根目录下,执行如下命令。
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/bert-base-chinese
准备数据集
获取原始数据集。
如果你想重新处理zhwiki的原始数据,可按照以下步骤操作。
下载zhwiki原始数据:
wget https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 --no-check-certificate
解压得到zhwiki-latest-pages-articles.xml
bzip2 -dk zhwiki-latest-pages-articles.xml.bz2
下载预处理脚本:
wget https://github.com/natasha/corus/raw/master/corus/third/WikiExtractor.py
使用WikiExtractor.py提取文本,其中extracted/wiki_zh为保存路径,建议不要修改:
python3 WikiExtractor.py zhwiki-latest-pages-articles.xml -b 100M -o extracted/wiki_zh
将多个文档整合为一个txt文件,在本工程根目录下执行
python3 WikicorpusTextFormatting.py --extracted_files_path extracted/wiki_zh --output_file zhwiki-latest-pages-articles.txt
最终生成的文件名为zhwiki-latest-pages-articles.txt (也可直接采用处理好的文件)
从中分离出验证集:
python3 split_dataset.py zhwiki-latest-pages-articles.txt zhwiki-latest-pages-articles_validation.txt
数据预处理。
数据预处理将原始数据集转换为模型输入的数据。
执行preprocess.py脚本,完成预处理。
# 输入参数:${input_patgh} ${model_dir} ${save_dir} ${seq_length} python3 preprocess.py ./zhwiki-latest-pages-articles_validation.txt ./bert-base-chinese ./input_data/ 384
- 参数说明:第一个参数为zhwiki数据集分割得到验证集文件路径,第二个参数为源码路径(包含模型配置文件等),第三个参数为输出预处理数据路径,第四个参数为sequence长度。
模型推理
模型转换
获取权重文件
获取权重文件并转换成cpu适配权重替换
bert-base-chinese
目录下的文件:mv pytorch_model.bin bert-base-chinese
导出onnx文件
# 输入参数:${model_dir} ${output_path} ${seq_length} python3 pth2onnx.py ./bert-base-chinese ./bert_base_chinese.onnx 384
- 输入参数说明:第一个参数为源码仓路径(包含配置文件等),第二个参数为输出onnx文件路径,第三个参数为sequence长度。
优化onnx文件
# 修改优化模型:${bs}:[1, 4, 8, 16, 32, 64],${seq_len}:384 python3 -m onnxsim ./bert_base_chinese.onnx ./bert_base_chinese_bs${bs}.onnx --input-shape "input_ids:${bs},${seq_len}" "attention_mask:${bs},${seq_len}" "token_type_ids:${bs},${seq_len}" python3 fix_onnx.py bert_base_chinese_bs${bs}.onnx bert_base_chinese_bs${bs}_fix.onnx
使用ATC工具将ONNX模型转OM模型。
配置环境变量。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
说明: 该脚本中环境变量仅供参考,请以实际安装环境配置环境变量。详细介绍请参见《CANN 开发辅助工具指南 (推理)》。
执行命令查看芯片名称(${chip_name})。
npu-smi info #该设备芯片名为Ascend910A (自行替换) 回显如下: +-------------------|-----------------|------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) | +===================+=================+======================================================+ | 0 910A | OK | 15.8 42 0 / 0 | | 0 0 | 0000:82:00.0 | 0 1074 / 21534 | +===================+=================+======================================================+ | 1 910A | OK | 15.4 43 0 / 0 | | 0 1 | 0000:89:00.0 | 0 1070 / 21534 | +===================+=================+======================================================+
执行ATC命令。
# bs:[1, 4, 8, 16, 32, 64] atc --model=./bert_base_chinese_bs${bs}_fix.onnx --framework=5 --output=./bert_base_chinese_bs${bs} --input_format=ND --log=debug --soc_version=${chip_name} --optypelist_for_implmode="Gelu" --op_select_implmode=high_performance
参数说明:
- --model:为ONNX模型文件。
- --framework:5代表ONNX模型。
- --output:输出的OM模型。
- --input_format:输入数据的格式。
- --input_shape:输入数据的shape。
- --log:日志级别。
- --soc_version:处理器型号。
运行成功后生成bert_base_chinese_bs${bs}.om模型文件。
开始推理验证。
安装ais_bench推理工具
请访问ais_bench推理工具代码仓,根据readme文档进行工具安装。
执行推理。
# 以bs1模型推理为例 mkdir -p ./output_data/bs1 python3 -m ais_bench --model ./bert_base_chinese_bs1.om --input ./input_data/input_ids,./input_data/attention_mask,./input_data/token_type_ids --output ./output_data/ --output_dirname bs1 --batchsize 1 --device 1
参数说明:
- --model:om文件路径。
- --input:输入文件。
- --output:输出目录。
- --output_dirname:输出文件名。
- --device:NPU设备编号。
- --outfmt: 输出数据格式。
- --batchsize:推理模型对应的batchsize。
推理后的输出默认在当前目录outputs/bs1下。
精度验证。
调用postprocess.py脚本与数据集标签比对,获得Accuracy数据。
# 以bs1模型推理为例 # 输入参数:${result_dir} ${gt_dir} ${seq_length} python3 postprocess.py ./output_data/bs1 ./input_data/labels 384
- 参数说明:第一个参数为推理结果路径,第二个参数为gt labe所在路径,第三个参数为sequence长度。
模型推理性能&精度
精度:
模型 | NPU离线推理精度 |
---|---|
Bert-Base-Chinese | Acc: 59.07% |
其他下游任务
公网地址说明
代码涉及公网地址参考 public_address_statement.md