README.md 6.2 KB
Newer Older
P
pkpk 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
# BERT on PaddlePaddle

[BERT](https://arxiv.org/abs/1810.04805) 是一个迁移能力很强的通用语义表示模型, 以 [Transformer](https://arxiv.org/abs/1706.03762) 为网络基本组件,以双向 `Masked Language Model`  
`Next Sentence Prediction` 为训练目标,通过预训练得到通用语义表示,再结合简单的输出层,应用到下游的 NLP 任务,在多个任务上取得了 SOTA 的结果。本项目是 BERT 在 Paddle Fluid 上的开源实现。

同时推荐用户参考[ IPython Notebook demo](https://aistudio.baidu.com/aistudio/projectDetail/122282)

### 发布要点

1) 动态图BERT模型

2)目前仅支持fine-tuning任务,后续会开展对pre-training任务的支持

3)数据集目前验证了glue上的部分任务,squad上的任务后续会进行验证

4)目前暂不支持FP16/FP32混合精度训练。

| Model | Layers | Hidden size | Heads |Parameters |
| :------| :------: | :------: |:------: |:------: |
| [BERT-Base, Uncased](https://baidu-nlp.bj.bcebos.com/DYGRAPH_models%2FBERT%2Fdata.tar.gz) | 12 | 768 |12 |110M |

每个压缩包都包含了模型配置文件 `bert_config.json`、参数文件夹 `params`、动态图参数文件夹`dygraph_params` 和词汇表 `vocab.txt`

## 内容速览
- [**安装**](#安装)
- [**Fine-Tuning**: 预训练模型如何应用到特定 NLP 任务上](#nlp-任务的-fine-tuning)
  - [语句和句对分类任务](#语句和句对分类任务)

## 目录结构
```text
.
├── data                                        # 示例数据
├── model                                       # 模型定义
├── reader                                      # 数据读取
├── utils                                       # 辅助文件
├── batching.py                                 # 构建 batch 脚本
├── optimization.py                             # 优化方法定义
|── run_classifier.py                           # 分类任务的 fine tuning
|── tokenization.py                             # 原始文本的 token 化
|── train.py                                    # 预训练过程的定义
|── run_classifier_multi_gpu.sh                 # 预训练任务的启动脚本
|── run_classifier_single_gpu.sh                # 预训练任务的启动脚本
```

## 安装
本项目依赖于 Paddle Fluid **1.7.0** 及以上版本,请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装。

## NLP 任务的 Fine-tuning

在完成 BERT 模型的预训练后,即可利用预训练参数在特定的 NLP 任务上做 Fine-tuning。以下利用开源的预训练模型,示例如何进行分类任务和阅读理解任务的 Fine-tuning,如果要运行这些任务,请通过 [发布要点](#发布要点) 一节提供的链接预先下载好对应的预训练模型。

### 语句和句对分类任务

对于 [GLUE 数据](https://gluebenchmark.com/tasks),请下载[文件](https://baidu-nlp.bj.bcebos.com/DYGRAPH_models%2FBERT%2Fdata.tar.gz),并解压到同一个目录。以 GLUE/MNLI 任务为例,启动 Fine-tuning 的方式如下(也可以直接运行run_classifier_single_gpu.sh):

```shell
#!/bin/bash

BERT_BASE_PATH="./data/pretrained_models/uncased_L-12_H-768_A-12/"
TASK_NAME='MNLI'
DATA_PATH="./data/glue_data/MNLI/"
CKPT_PATH="./data/saved_model/mnli_models"

export CUDA_VISIBLE_DEVICES=0

# start fine-tuning
python run_classifier.py\
    --task_name ${TASK_NAME} \
    --use_cuda true \
    --do_train true \
    --do_test true \
    --batch_size 64 \
    --init_pretraining_params ${BERT_BASE_PATH}/dygraph_params/ \
    --data_dir ${DATA_PATH} \
    --vocab_path ${BERT_BASE_PATH}/vocab.txt \
    --checkpoints ${CKPT_PATH} \
    --save_steps 1000 \
    --weight_decay  0.01 \
    --warmup_proportion 0.1 \
    --validation_steps 100 \
    --epoch 3 \
    --max_seq_len 128 \
    --bert_config_path ${BERT_BASE_PATH}/bert_config.json \
    --learning_rate 5e-5 \
    --skip_steps 10 \
    --shuffle true

```

这里的 `uncased_L-12_H-768_A-12/` 即是转换后的英文预训练模型,程序会将模型存储在`CKPT_PATH`指定的位置里。

### 使用单机多卡进行fine-tuning

飞桨动态图使用多进程方式进行数据并行和梯度同步,可以参考`run_classifier_multi_gpu.sh`脚本进行单机多卡fine-tuning:

```shell
#!/bin/bash

BERT_BASE_PATH="./data/pretrained_models/uncased_L-12_H-768_A-12/"
TASK_NAME='MNLI'
DATA_PATH="./data/glue_data/MNLI/"
CKPT_PATH="./data/saved_model/mnli_models"
GPU_TO_USE="0,1,2,3"

export CUDA_VISIBLE_DEVICES=$GPU_TO_USE

# start fine-tuning
python -m paddle.distributed.launch --selected_gpus=$GPU_TO_USE --log_dir ./cls_log run_classifier.py \
    --task_name ${TASK_NAME} \
    --use_cuda true \
    --use_data_parallel true \
    --do_train true \
    --do_test true \
    --batch_size 64 \
    --in_tokens false \
    --init_pretraining_params ${BERT_BASE_PATH}/dygraph_params/ \
    --data_dir ${DATA_PATH} \
    --vocab_path ${BERT_BASE_PATH}/vocab.txt \
    --checkpoints ${CKPT_PATH} \
    --save_steps 1000 \
    --weight_decay  0.01 \
    --warmup_proportion 0.1 \
    --validation_steps 100 \
    --epoch 3 \
    --max_seq_len 128 \
    --bert_config_path ${BERT_BASE_PATH}/bert_config.json \
    --learning_rate 5e-5 \
    --skip_steps 10 \
    --shuffle true
```

### 读取训练好的模型进行预测

可以参考`run_classifier_prediction.sh`脚本,读取训练好的模型进行预测,可参考以下命令:

```shell
#!/bin/bash

BERT_BASE_PATH="./data/pretrained_models/uncased_L-12_H-768_A-12/"
TASK_NAME='MNLI'
DATA_PATH="./data/glue_data/MNLI/"
CKPT_PATH="./data/saved_model/mnli_models"

export CUDA_VISIBLE_DEVICES=0

# start testing
python run_classifier.py\
    --task_name ${TASK_NAME} \
    --use_cuda true \
    --do_train false \
    --do_test true \
    --batch_size 64 \
    --in_tokens false \
    --data_dir ${DATA_PATH} \
    --vocab_path ${BERT_BASE_PATH}/vocab.txt \
    --checkpoints ${CKPT_PATH} \
    --save_steps 1000 \
    --weight_decay  0.01 \
    --warmup_proportion 0.1 \
    --validation_steps 100 \
    --epoch 3 \
    --max_seq_len 128 \
    --bert_config_path ${BERT_BASE_PATH}/bert_config.json \
    --learning_rate 5e-5 \
    --skip_steps 10 \
    --shuffle false
```