Transformer (TensorFlow2)
本仓库是在MLU上基于TensorFlow2框架实现的Transformer网络,支持训练与推理。
目录 (Table of Contents)
Transformer中抛弃了传统的CNN和RNN,取而代之的是使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量,从而解决了NLP任务中的长距离依赖问题,并且由于该模型本质上是一个Encoder-Decoder结构,具有很好的并行性。 Transformer在机器翻译中取得了BLEU值的新高。原始论文为Attention Is All You Need
Transformer网络的TensorFlow原生代码实现可参考:这里。
Models | Framework | Supported MLU | Supported Data Precision | Multi-GPUs | Multi-Nodes | XLA Support |
---|---|---|---|---|---|---|
Transformer | TensorFlow2 | MLU370-X8 | FP32 | Yes | Not Tested | Yes |
Models | Framework | Supported MLU | Supported Data Precision | Eager Support |
---|---|---|---|---|
Transformer | TensorFlow2 | MLU370-S4/X4/X8 | FP32 | Eager |
Transformer模型的训练参数主要存在于transformer_main.py
和models/official/utils/flags/*.py
。
(1)run_scripts/内的shell脚本涉及到的常用参数及含义如下表所示:
展开查看
参数 | 作用 | 默认值 |
---|---|---|
batch_size | 训练的batch_size | 4096 |
max_length | 文本序列最大长度 | 64 |
data_dir | transformer数据文件的路径,用于训练,常用wmt数据集。 | your_path/transformer_data |
bleu_source | 待翻译语料。若训练结束后需要进行验证精度,则需要传入该参数 | data_dir/newstest2014.en |
bleu_ref | 目标语料,用于评测模型精度的基准数据。若训练结束后需要进行验证精度,则需要传入该参数 | data_dir/newstest2014.de |
mode | 模型待运行的任务,可选项为"train","predict","eval"。若只需推理,则将该参数设为"eval"即可,并设置bleu_source 与bleu_ref 参数。 |
"train" |
train_steps | 不为0时,表示总的训练步数。在finetune时,则表示finetune的步数 | 200000 |
steps_between_evals | 表示每隔多少步便验证一次当前的精度,用于训练过程,其值通常与train_steps 相同 |
200000 |
model_dir | 模型输出路径,用于存放训练的checkpoint。若只需进行推理,则将该参数指向存有已训练好的checkpoint目录。 | mlu_model |
enable_checkpointing | 是否使用预训练模型 | True |
finetune_checkpoint | 指向预训练模型路径,仅在 enable_checkpointing 为True时生效 |
None |
vocab_file | 机器翻译任务(例如英-德翻译)中需要用到的词典文件 | your_path/vocab.ende.32768 |
use_amp | 是否使用amp进行混合精度训练 | False |
use_horovod | 是否使用horovod进行分布式训练 | True |
use_performance | 是否开启性能测试,若为True则表示开启,训练结束后可在summary/summary.json内读出throughput与e2e | False |
enable_xla | 是否使能xla | False |
(2)其他参数:
参数 | 作用 | 默认值 |
---|---|---|
use_gpu | 是否使用gpu进行训练 | False |
use_profiler | 是否支持tensorboard,若为True则表示 | False |
distribution_strategy | 是否使用原生分布式策略,使用horovod时置为off即可 | False |
下面将详细展示如何在 Cambricon TensorFlow2上完成Transformer的训练与推理。
- Linux常见操作系统版本(如Ubuntu16.04,Ubuntu18.04,CentOS7.x等),安装docker(>=v18.00.0)应用程序;
- 服务器装配好寒武纪MLU300系列计算板卡,如需进行训练,则需装配MLU370-X8,若只需推理,则装配MLU370-S4/X4/X8均可;
- Cambricon Driver >=v4.20.6;
- CNTensorFlow >= 2.5.0;
- 若不具备以上软硬件条件,可前往寒武纪云平台注册并试用@TODO
容器环境通常有两种搭建方式,一种是基于基础镜像,另一种则是基于DOCKERFILE。
(1)基于base docker image的容器环境搭建
a)导入镜像
下载Cambricon TensorFlow2 镜像并参考如下命令加载镜像:
docker load -i Your_Cambricon_TensorFlow2_Image.tar.gz
b)启动容器
run_docker.sh
示例如下,根据本地的镜像版本,修改如下示例中的IMAGE_NAME
和IMAGE_TAG
变量后再运行bash run_docker.sh
即可启动容器。
#!/bin/bash
# Below is a sample of run_docker.sh.
# Modify the YOUR_IMAGE_NAME and IMAGE_TAG according to your own environment.
# For instance:
# IMAGE_NAME=tensorflow2-1.12.1-x86_64-ubuntu18.04
# IMAGE_TAG=latest
IMAGE_NAME=YOUR_IMAGE_NAME
IMAGE_TAG=YOUR_IMAGE_TAG
export MY_CONTAINER="transformer_tensorflow2_modelzoo"
num=`docker ps -a|grep "$MY_CONTAINER"|wc -l`
echo $num
echo $MY_CONTAINER
if [ 0 -eq $num ];then
xhost +
docker run -it --name="${MY_CONTAINER}" \
--net=host \
--privileged=true \
--cap-add=sys_ptrace \
--shm-size="16g" \
-v /usr/bin/cnmon:/usr/bin/cnmon \
-v /data:/data \
--device=/dev/cambricon_dev0 \
--device=/dev/cambricon_ctl \
$IMAGE_NAME:$IMAGE_TAG \
/bin/bash
else
docker start $MY_CONTAINER
docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` $MY_CONTAINER /bin/bash
fi
c)下载项目代码
在容器内使用 git clone
下载本仓库代码并进入tensorflow_modelzoo/tensorflow2/built-in/NaturalLanguageProcessing/transformer
目录。
d)安装模型依赖项
# 安装requirements中的依赖库
pip install -r requirements.txt
# 安装性能测试工具(可选)
# 若不开启性能测试(use_performance为False),则无需安装。
cd ../../../../tools/record_time/
pip install .
(2)基于DOCKERFILE的容器环境搭建
a)构建镜像
由于本仓库包含各类网络,如ASR类,NLP类,为避免网络之间可能的依赖项冲突,您可基于DOCKERFILE构建当前网络专属的镜像。详细步骤如下所示:
# 1. 新建并进入文件夹
mkdir dir_for_docker_build
cd dir_for_docker_build
# 2. 使用git clone下载tensorflow_modelzoo仓库
# 3. 进入该网络目录
cd tensorflow_modelzoo/tensorflow2/built-in/NaturalLanguageProcessing/transformer
# 4. 参考 前文 (1)基于base docker image的容器环境搭建 a)小节,获取基础镜像,假设镜像名字为cambricon_tensorflow2:vX.Y.Z-x86_64-ubuntu18.04
# 5. 修改DOCKERFILE内的FROM_IMAGE_NAME的值为cambricon_tensorflow2:vX.Y.Z-x86_64-ubuntu18.04
# 6. 开始基于DOCKERFILE构建镜像
export IMAGE_NAME=transformer_image
docker build --network=host -t $IMAGE_NAME -f DOCKERFILE ../../../../../
b)创建并启动容器
上一步成功运行后,本地便生成了一个名为transformer_image
的镜像,后续即可基于该镜像创建容器。
# 1. 参考前文(1)基于base docker image的容器环境搭建 b) 小节,修改run_docker.sh 内的IMAGE_NAME为transformer_image
# 2. 运行run_docker.sh
bash run_docker.sh
本仓库使用的训练数据集是wmt翻译数据集,训练语料与验证语料的详细组成请参阅data_download.py。在本地运行如下命令可得到数据集:
cur_path=$(pwd)
export PYTHONPATH=$cur_path:$PYTHONPATH
cd models/official/legacy/transformer/
python data_download.py --data_dir=your_dataset_saved_path
关于data_download.py
更详细的帮助可参考官网。
完成数据集准备后,根据数据集实际路径修改env.sh
内的DATA_DIR
的值。
进入run_scripts/
,该目录内提供了from_scratch的训练脚本。
Models | Framework | Supported MLU | Data Precision | Cards | Run |
---|---|---|---|---|---|
Transformer | TensorFlow2 | MLU370-X8 | Float32 | 8 | bash Horovod_Transformer_Float32_8MLUs.sh |
Transformer | TensorFlow2 | MLU370-X8 | Float32 | 1 | bash Transformer_Float32_1MLU.sh |
根据您的实际环境与需求,修改脚本内数据集的路径及其他参数的值,如data_dir
,batch_size
,train_steps
,np
等,按照如下命令即可开始from_scratch的分布式训练:
bash Horovod_Transformer_Float32_8MLUs.sh
训练完成后,程序会输出训练精度Bleu score (uncased)
与Bleu score (cased)
,并将训练过程中产生的模型文件及权重保存至model_dir
指定的目录内。
若您想基于已有的预训练模型进行训练,则可参考如下命令,修改脚本内的参数(以Horovod_Transformer_Float32_8MLUs.sh
为例):
# 使用8卡MLU370-X8,加载已经训练了200000 steps的checkpoint文件进行finetune,训练5000 step
# 则train_steps应设为5000
#!/bin/bash
# work_dir:where transformer_main.py locates
cur_path=$(pwd)
work_dir="${cur_path}/../"
data_dir=YOUR_DATA_PATH/transformer_data
bleu_src="${data_dir}/newstest2014.en"
bleu_ref="${data_dir}/newstest2014.de"
vocab_file="${data_dir}/vocab.ende.32768"
output_dir="${work_dir}/mlu_model_finetune"
ckpt_file=YOUR_PATH/mlu_model
# ckpt_file内的目录结构应与如下示例类似:
#/home/mlu_model
#├── checkpoint
#├── cp-0001.ckpt.data-00000-of-00001
#└── cp-0001.ckpt.index
pushd "${work_dir}"
# fp32
horovodrun -np 8 python transformer_main.py \
--mode=train \
--train_steps=5000 \
--steps_between_evals=5000 \
--use_horovod=True \
--enable_checkpointing=True \
--finetune_checkpoint=$ckpt_file \
--model_dir=$output_dir \
--batch_size=4096 \
--max_length=64 \
--bleu_source=$bleu_src \
--bleu_ref=$bleu_ref \
--data_dir=$data_dir \
--vocab_file=$vocab_file \
--num_gpus=0 \
--num_mlus=1 \
--distribution_strategy=off \
--param_set=base \
--enable_time_history=False \
--tf_mlu_thread_mode=mlu_private \
--tf_gpu_thread_mode=gpu_private \
--per_mlu_thread_count=4 \
--per_gpu_thread_count=4 \
--inter_op_parallelism_threads=4 \
--intra_op_parallelism_threads=4 \
--horovod_fusion_threshold=33554432 \
--use_amp=False \
--use_profiler=False \
--use_performance=True
popd
注意:使用预训练模型进行finetune训练时,batch_size
,np
,use_amp
等超参需与from_scratch得到该预训练模型的超参一致,否则无法正常训练。
进入run_scripts/
,该目录内提供了推理脚本。
Models | Framework | Supported MLU | Data Precision | Cards | Run |
---|---|---|---|---|---|
Transformer | TensorFlow2 | MLU370-S4/X4/X8 | Float32 | 1 | bash Infer_Transformer_Float32_1MLU.sh |
Training accuracy results: MLU370-X8
机器翻译任务的训练精度通常用BLEU
表征,在本仓库中,最终的训练精度由Bleu score (uncased)
与Bleu score (cased)
表征。total_batch_size
32768,fp32
精度下,使用8卡MLU训练200000步,最终的训练精度如下所示:
Models | MLUs | Total Batch Size | Bleu Score(uncased) | Bleu Score(cased) |
---|---|---|---|---|
Transformer | 8 | 32768 | 27.47 | 26.96 |
您明确了解并同意,以下链接中的软件、数据或者模型由第三方提供并负责维护。在以下链接中出现的任何第三方的名称、商标、标识、产品或服务并不构成明示或暗示与该第三方或其软件、数据或模型的相关背书、担保或推荐行为。您进一步了解并同意,使用任何第三方软件、数据或者模型,包括您提供的任何信息或个人数据(不论是有意或无意地),应受相关使用条款、许可协议、隐私政策或其他此类协议的约束。因此,使用链接中的软件、数据或者模型可能导致的所有风险将由您自行承担。
@TODO