模型详情

概述

简述

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上实现的版本。

BERT-Large模型是一个24层,1024维,24个自注意头(self attention head),110M参数的神经网络结构,它的整体框架是由多层transformer的encoder堆叠而成的。每一层的encoder则是由一层muti-head-attention和一层feed-forward组成,每个attention的主要作用是通过目标词与句子中的所有词汇的相关度,对目标词重新编码。所以每个attention的计算包括三个步骤:计算词之间的相关度,对相关度归一化,通过相关度和所有词的编码进行加权求和获取目标词的编码,本文档描述的是BERT-base模型在PyTorch上实现的版本。

  • 参考实现:

    url=https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/LanguageModeling/BERT
    commit_id=499fb1c5ad0431fee71766f0e5b99d523fd98a3b
  • 适配昇腾 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

准备数据集

  1. 请用户自行获取SQuADv1.1数据集,可参照源码实现链接进行数据集获取,并将获取的数据集存放在源码包根目录下建立的v1.1目录下。

    mkdir v1.1
    cd v1.1
  2. 数据集目录结构参考如下所示。

    ---源码包根目录
       ---v1.1
          ---train-v1.1.json
          ---dev-v1.1.json
          ---evaluate-v1.1.py

    说明: 该数据集的训练过程脚本只作为一种参考示例。

  3. 下载词典

    在数据集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文件夹目录下。

获取预训练模型

  1. 获取预训练模型,用户可参考源码实现链接进行获取。

  2. 确认预训练模型

    bert-large:

    ---bert_large_pretrained_amp.pt

    bert-base:

    ---bert_base.pt

开始训练

训练模型

  1. 进入解压后的源码包根目录。

    cd /${模型文件夹名称} 
  2. 运行训练脚本。

    该模型支持单机单卡训练和单机8卡训练。

    • 单机单卡训练

      启动单卡训练。

      bash test/train_large_full_1p.sh --data_path=/xxx/v1.1 --ckpt_path=real_path  # bert-large单卡精度
      
      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_large_full_8p.sh --data_path=/xxx/v1.1 --ckpt_path=real_path  # bert-large 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为预训练模型存放路径,只需要传入文件所在目录即可,无需包含预训练模型文件名。

    --hf32开启HF32模式,不与FP32模式同时开启,开启该模式需要修改学习率为1e-4。

    --fp32开启FP32模式,不与HF32模式同时开启,开启该模式需要修改学习率为1e-4。

    模型训练脚本参数说明如下。

    公共参数:
    --amp                               //是否使用混合精度
    --seed                              //随机数种子设定
    --learning_rate                     //学习率设置	  
    --train_batch_size                  //训练批次大小
    --npu_id                            //npu单卡id
    --addr                              //分布式训练地址
    --num_npu                           //npu训练卡使用个数
    --use_npu                           //是否使用npu
    --max_steps                         //训练的总步数

    训练完成后,权重文件保存在当前路径下,并输出模型训练精度和性能信息。

训练结果展示

表 2 训练结果展示表

NAME F1 FPS Epochs AMP_Type Torch_Version
1p-bert-large - 121 1 O2 1.8
1p-bert-base - 333 1 O2 1.8
8p-bert-large 90.87 833 2 O2 1.8
8p-bert-base 87.011 2602 2 O2 1.8

公网地址说明

代码涉及公网地址参考 public_address_statement.md

版本说明

变更

2022.02.17:更新readme,重新发布。

2021.08.01:首次发布。

FAQ

第一次训练的第一个step特别慢,会对SQuAD做预处理,该过程非常耗时,通常需要十分钟左右。预处理完之后会在数据集相同目录下生成缓存文件,下次训练时会快很多。

使用模型资源和服务前,请您仔细阅读并理解透彻《昇腾深度学习模型许可协议 3.0》
该页面对您有帮助吗?
我要评分