快速入门
概述
BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,是一种用于自然语言处理(NLP)的预训练技术。
BERT-base模型是一个12层,768维,12个自注意头(self attention head),110M参数的神经网络结构,它的整体框架是由多层transformer的encoder堆叠而成的。每一层的encoder则是由一层muti-head-attention和一层feed-forward组成,每个attention的主要作用是通过目标词与句子中的所有词汇的相关度,对目标词重新编码。所以每个attention的计算包括三个步骤:计算词之间的相关度,对相关度归一化,通过相关度和所有词的编码进行加权求和获取目标词的编码,本文档描述的是BERT-base模型在PyTorch上实现的版本。
- 参考实现。
- commit_id=499fb1c5ad0431fee71766f0e5b99d523fd98a3b
- 本代码仓为适配NPU的实现。
准备训练环境
准备环境
-
请参考安装指导准备训练环境。
-
安装依赖。
-
在模型源码包根目录下执行命令,安装模型需要的依赖。
pip install -r requirements.txt -
参考Ascend Apex安装指导安装Apex。
-
准备数据集
-
请用户自行获取SQuADv1.1数据集,可参照源码实现链接进行数据集获取,并将获取的数据集存放在源码包根目录下建立的v1.1目录下。
mkdir v1.1 cd v1.1 -
数据集目录结构参考如下所示。
---源码包根目录 ---v1.1 ---train-v1.1.json ---dev-v1.1.json ---evaluate-v1.1.py说明: 该数据集的训练过程脚本只作为一种参考示例。
-
下载词典
在数据集v1.1目录下执行一下命令,建立data/uncased_L-24_H-1024_A-16文件目录。
mkdir data cd data mkdir uncased_L-24_H-1024_A-16 cd uncased_L-24_H-1024_A-16请用户自行下载bert-base-uncased-vocab.txt词典,并存放在uncased_L-24_H-1024_A-16文件夹目录下。
获取预训练模型
-
获取预训练模型,用户可参考源码实现链接进行获取。
-
确认预训练模型
bert-base:
---bert_base.pt
开始训练
-
进入解压后的源码包根目录。
cd /${模型文件夹名称} -
运行训练脚本。
该模型支持单机单卡训练和单机8卡训练。
-
单机单卡训练
启动单卡训练。
bash test/train_base_full_1p.sh --data_path=/xxx/v1.1 --ckpt_path=real_path # bert-base单卡精度 bash test/train_base_performance_1p.sh --data_path=/xxx/v1.1 --ckpt_path=real_path # bert-base单卡性能 -
单机8卡训练
启动8卡训练。
bash test/train_base_full_8p.sh --data_path=/xxx/v1.1 --ckpt_path=real_path # bert-base 8卡精度 bash test/train_base_performance_8p.sh --data_path=/xxx/v1.1 --ckpt_path=real_path # bert-base 8卡性能
--data_path参数填写数据集路径,需写到数据集的v1.1目录。
--ckpt_path为预训练模型存放路径,只需要传入文件所在目录即可,无需包含预训练模型文件名。
模型训练脚本参数说明如下。
训练完成后,权重文件保存在当前路径下,并输出模型训练精度和性能信息。
-
训练结果展示
表 2 训练结果展示表
说明:2025年5月10日更新的性能数据如下:
| NAME | 精度类型 | FPS |
|---|---|---|
| Bert-Base 8p-竞品 | FP16 | 2463 |
| Bert-Base 8p-Atlas 900 A2 PoDc | FP16 | 3118 |
| Bert-Large 8p-竞品 | FP16 | 870.4 |
| Bert-Large 8p-Atlas 900 A2 PoDc | FP16 | 1084 |
FAQ
第一次训练的第一个step特别慢,会对SQuAD做预处理,该过程非常耗时,通常需要十分钟左右。预处理完之后会在数据集相同目录下生成缓存文件,下次训练时会快很多。