README_zh.md 11.7 KB
Newer Older
X
xixiaoyao 已提交
1 2 3
# PaddlePALM

[English](./README.md) | 简体中文
X
Xiaoyao Xi 已提交
4

X
xixiaoyao 已提交
5 6
PaddlePALM (PArallel Learning from Multi-tasks) 是一个灵活,通用且易于使用的NLP大规模预训练和多任务学习框架。 PALM是一个旨在**快速开发高性能NLP模型**的上层框架。

W
wangxiao 已提交
7
使用PaddlePALM,可以非常轻松灵活的探索具有多种任务辅助训练的“高鲁棒性”阅读理解模型,基于PALM训练的模型[D-Net](https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/Research/MRQA2019-D-NET)[EMNLP2019国际阅读理解评测](https://mrqa.github.io/)中夺得冠军。
X
xixiaoyao 已提交
8 9 10 11

<p align="center">
	<img src="https://tva1.sinaimg.cn/large/006tNbRwly1gbjkuuwrmlj30hs0hzdh2.jpg" alt="Sample"  width="300" height="333">
	<p align="center">
W
wangxiao1021 已提交
12
		<em>MRQA2019 排行榜</em>
X
xixiaoyao 已提交
13 14 15
	</p>
</p>

W
wangxiao1021 已提交
16
除了降低NLP研究成本以外,PaddlePALM已被应用于“百度搜索引擎”,有效地提高了用户查询的理解准确度和挖掘出的答案质量,具备高可靠性和高训练/推理性能。
X
xixiaoyao 已提交
17 18 19

#### 特点:

X
Xiaoyao Xi 已提交
20 21 22 23
- **易于使用**:使用PALM, *8个步骤*即可实现一个典型的NLP任务。此外,模型主干网络、数据集读取工具和任务输出层已经解耦,只需对代码进行相当小的更改,就可以将任何组件替换为其他候选组件。
- **支持多任务学习***6个步骤*即可实现多任务学习任务。
- **支持大规模任务和预训练**:可自动利用多gpu加速训练和推理。集群上的分布式训练需要较少代码。
- **流行的NLP骨架和预训练模型**:内置多种最先进的通用模型架构和预训练模型(如BERT、ERNIE、RoBERTa等)。
W
wangxiao1021 已提交
24
- **易于定制**:支持任何组件的定制开发(例如:主干网络,任务头,读取工具和优化器)与预定义组件的复用,这给了开发人员高度的灵活性和效率,以适应不同的NLP场景。
X
xixiaoyao 已提交
25

W
wangxiao1021 已提交
26
你可以很容易地用较少的代码复现出很好的性能,涵盖了大多数NLP任务,如分类、匹配、序列标记、阅读理解、对话理解等等。更多细节可以在`examples`中找到。
X
xixiaoyao 已提交
27 28 29 30

<table>
  <tbody>
    <tr>
W
wangxiao1021 已提交
31
      <th><strong>数据集</strong>
X
xixiaoyao 已提交
32
        <br></th>
W
wangxiao1021 已提交
33 34 35
      <th colspan="2"><center><strong>chnsenticorp</strong></center></th>
      <th colspan="2"><center><strong>Quora Question Pairs matching</strong><center></th>
      <th colspan="1"><strong>MSRA-NER<br>(SIGHAN2006)</strong></th>
X
xixiaoyao 已提交
36 37 38 39 40
      <th colspan="2"><strong>CMRC2018</strong></th>
    </tr>
    <tr>
      <td rowspan="2">
        <p>
W
wangxiao1021 已提交
41
          <strong>评价标准</strong>
X
xixiaoyao 已提交
42 43 44
          <br></p>
      </td>
      <td colspan="1">
W
wangxiao1021 已提交
45
        <center><strong>accuracy</strong></center>
X
xixiaoyao 已提交
46 47 48 49 50 51
        <br></td>
      <td colspan="1">
        <strong>f1-score</strong>
        <strong></strong>
        <br></td>
      <td colspan="1">
W
wangxiao1021 已提交
52
        <center><strong>accuracy</strong></center>
X
xixiaoyao 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
        <br></td>
      <td colspan="1">
        <strong>f1-score</strong>
        <strong></strong>
        <br></td>
      <td colspan="1">
        <strong>f1-score</strong>
        <strong></strong>
        <br></td>
      <td colspan="1">
        <strong>em</strong>
        <br></td>
      <td colspan="1">
        <strong>f1-score</strong>
        <br></td>
    </tr>
    <tr>
W
wangxiao1021 已提交
70
      <td colspan="2" width="">
X
xixiaoyao 已提交
71 72
        <strong>test</strong>
        <br></td>
W
wangxiao1021 已提交
73
      <td colspan="2" width="">
X
xixiaoyao 已提交
74 75
        <strong>test</strong>
        <br></td>
W
wangxiao1021 已提交
76
      <td colspan="1" width="">
X
xixiaoyao 已提交
77 78 79 80 81 82 83 84
        <strong>test</strong>
        <br></td>
      <td colspan="2" width="">
        <strong>dev</strong>
        <br></td>
    </tr>
    <tr>
      <td><strong>ERNIE Base</strong></td>
W
wangxiao1021 已提交
85 86 87 88 89 90 91
      <td>95.8</td>
      <td>95.8</td>
      <td>86.2</td>
      <td>82.2</td>
      <td>99.2</td>
      <td>64.3</td>
      <td>85.2</td>
X
xixiaoyao 已提交
92 93 94 95 96 97 98
    </tr>

  </tbody>
</table>



W
wangxiao1021 已提交
99
## Package概览
X
xixiaoyao 已提交
100

W
wangxiao1021 已提交
101
<p align="center">
X
Xiaoyao Xi 已提交
102
	<img src="https://tva1.sinaimg.cn/large/0082zybply1gbyo8d4ltoj31ag0n3tby.jpg" alt="Sample"  width="600px" height="auto">
W
wangxiao1021 已提交
103 104 105 106
	<p align="center">
		<em>PALM架构图</em>
	</p>
</p>
X
xixiaoyao 已提交
107

W
wangxiao1021 已提交
108

W
wangxiao1021 已提交
109
PaddlePALM是一个设计良好的高级NLP框架。基于PaddlePALM的轻量级代码可以高效实现**监督学习、非监督/自监督学习、多任务学习和迁移学习**。在PaddlePALM架构中有三层,从下到上依次是component层、trainer层、high-level trainer层。
W
wangxiao1021 已提交
110

W
wangxiao1021 已提交
111
在组件层,PaddlePALM提供了6个 **解耦的**组件来实现NLP任务。每个组件包含丰富的预定义类和一个基类。预定义类是针对典型的NLP任务的,而基类是帮助用户开发一个新类(基于预定义类或基类)。
W
wangxiao1021 已提交
112 113 114 115 116 117

训练器层是用选定的构件建立计算图,进行训练和预测。该层描述了训练策略、模型保存和加载、评估和预测过程。一个训练器只能处理一个任务。

高级训练器层用于复杂的学习和推理策略,如多任务学习。您可以添加辅助任务来训练健壮的NLP模型(提高模型的测试集和领域外的性能),或者联合训练多个相关任务来获得每个任务的更高性能。


W
wangxiao1021 已提交
118 119 120 121 122 123 124 125 126 127
| 模块 | 描述 | 
| - | - |
| **paddlepalm** | 一个开源的NLP预训练和多任务学习框架,建立在paddlepaddle框架上。 |
| **paddlepalm.reader** | 特定于任务的数据集读取工具的集合。|
| **paddlepalm.backbone** | 一系列经典的NLP表示模型,如BERT, ERNIE, RoBERTa。|
| **paddlepalm.head** | 任务特定输出层的集合。|
| **paddlepalm.lr_sched** | 一个学习率时间表的集合。|
| **paddlepalm.optimizer** | 优化器的集合。|
| **paddlepalm.downloader** | 预训练模型与配置和vocab文件的下载模块。|
| **paddlepalm.Trainer** | 单一任务训练/预测。一个训练器是建立计算图,管理训练和评估过程,实现模型/检查点保存和pretrain_model/检查点加载。|
W
wangxiao1021 已提交
128
| **paddlepalm.MultiHeadTrainer** | 进行多任务训练/预测的核心模块。一个MultiHeadTrainer建立在几个Trainer的基础上。在继承Trainer的基础上,实现了模型主干网络跨任务复用,采用多任务学习,多任务推理,来保证更有效的评估和预测。|
X
xixiaoyao 已提交
129

W
wangxiao1021 已提交
130
## 安装
X
xixiaoyao 已提交
131

W
wangxiao1021 已提交
132
PaddlePALM 支持 python2 和 python3, linux 和 windows, CPU 和 GPU。安装PaddlePALM的首选方法是通过`pip`。只需运行以下命令:
X
xixiaoyao 已提交
133 134 135 136 137

```bash
pip install paddlepalm
```

W
wangxiao1021 已提交
138
### 通过源码安装
X
xixiaoyao 已提交
139 140 141 142 143 144

```shell
git clone https://github.com/PaddlePaddle/PALM.git
cd PALM && python setup.py install
```

W
wangxiao1021 已提交
145
### 库依赖
X
xixiaoyao 已提交
146 147 148 149 150 151
- Python >= 2.7
- cuda >= 9.0
- cudnn >= 7.0
- PaddlePaddle >= 1.7.0 (请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装)


W
wangxiao1021 已提交
152
### 下载预训练模型
W
wangxiao1021 已提交
153
我们提供了许多预训练的模型来初始化模型主干网络参数。用预先训练好的模型训练大的NLP模型,如12层Transformer,实际上比用随机初始化的参数更有效。要查看所有可用的预训练模型并下载,请在python解释器中运行以下代码(在shell中输入命令`python`):
X
xixiaoyao 已提交
154 155 156 157 158

```python
>>> from paddlepalm import downloader
>>> downloader.ls('pretrain')
Available pretrain items:
W
wangxiao1021 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
  => RoBERTa-zh-base
  => RoBERTa-zh-large
  => ERNIE-v2-en-base
  => ERNIE-v2-en-large
  => XLNet-cased-base
  => XLNet-cased-large
  => ERNIE-v1-zh-base
  => ERNIE-v1-zh-base-max-len-512
  => BERT-en-uncased-large-whole-word-masking
  => BERT-en-cased-large-whole-word-masking
  => BERT-en-uncased-base
  => BERT-en-uncased-large
  => BERT-en-cased-base
  => BERT-en-cased-large
  => BERT-multilingual-uncased-base
  => BERT-multilingual-cased-base
  => BERT-zh-base
X
xixiaoyao 已提交
176

X
Xiaoyao Xi 已提交
177
>>> downloader.download('pretrain', 'BERT-en-uncased-base', './pretrain_models')
X
xixiaoyao 已提交
178 179 180 181
...
```


W
wangxiao1021 已提交
182
## 使用
X
xixiaoyao 已提交
183

W
wangxiao1021 已提交
184 185
#### 快速开始

W
wangxiao1021 已提交
186
8个步骤开始一个典型的NLP训练任务。
X
xixiaoyao 已提交
187

W
wangxiao1021 已提交
188
1. 使用`paddlepalm.reader` 为数据集加载和输入特征生成创建一个`reader`,然后调用`reader.load_data`方法加载训练数据。
W
wangxiao1021 已提交
189 190
2. 使用`paddlepalm.load_data`创建一个模型*主干网络*来提取文本特征(例如,上下文单词嵌入,句子嵌入)。
3. 通过`reader.register_with``reader`注册到主干网络上。在这一步之后,reader能够使用主干网络产生的输入特征。
W
wangxiao1021 已提交
191
4. 使用`paddlepalm.head`。创建一个任务*head*,可以为训练提供任务损失,为模型推理提供预测结果。
W
wangxiao1021 已提交
192 193 194 195
5. 使用`paddlepalm.Trainer`创建一个任务`Trainer`,然后通过`Trainer.build_forward`构建包含主干网络和任务头的前向图(在步骤2和步骤4中创建)。
6. 使用`paddlepalm.optimizer`(如果需要,创建`paddlepalm.lr_sched`)来创建一个*优化器*,然后通过`train.build_back`向后构建。
7. 使用`trainer.fit_reader`将准备好的reader和数据(在步骤1中实现)给到trainer。
8. 使用`trainer.load_pretrain`加载预训练模型或使用 `trainer.load_pretrain`加载checkpoint,或不加载任何已训练好的参数,然后使用`trainer.train`进行训练。
X
xixiaoyao 已提交
196

W
wangxiao1021 已提交
197
更多实现细节请见示例: 
X
xixiaoyao 已提交
198

W
wangxiao 已提交
199 200 201 202
- [情感分析](https://github.com/PaddlePaddle/PALM/tree/master/examples/classification)
- [Quora问题相似度匹配](https://github.com/PaddlePaddle/PALM/tree/master/examples/matching)
- [命名实体识别](https://github.com/PaddlePaddle/PALM/tree/master/examples/tagging)
- [类SQuAD机器阅读理解](https://github.com/PaddlePaddle/PALM/tree/master/examples/mrc)
X
xixiaoyao 已提交
203 204


W
wangxiao1021 已提交
205
#### 多任务学习
X
xixiaoyao 已提交
206

W
wangxiao1021 已提交
207
多任务学习模式下运行:
X
xixiaoyao 已提交
208

W
wangxiao1021 已提交
209
1. 重复创建组件(每个任务按照上述第1~5步执行)。
W
wangxiao1021 已提交
210
2. 创建空的`Trainer`(每个`Trainer`对应一个任务),并通过它们创建一个`MultiHeadTrainer`
W
wangxiao1021 已提交
211 212 213 214
3. 使用`multi_head_trainer.build_forward`构建多任务前向图。
4. 使用`paddlepalm.optimizer`(如果需要,创建`paddlepalm.lr_sched`)来创建一个*optimizer*,然后通过` multi_head_trainer.build_backward`创建反向。
5. 使用`multi_head_trainer.fit_readers`将所有准备好的读取器和数据放入`multi_head_trainer`中。
6. 使用`multi_head_trainer.load_pretrain`加载预训练模型或使用 `multi_head_trainer.load_pretrain`加载checkpoint,或不加载任何已经训练好的参数,然后使用`multi_head_trainer.train`进行训练。
X
xixiaoyao 已提交
215

W
wangxiao1021 已提交
216
multi_head_trainer的保存/加载和预测操作与trainer相同。
X
xixiaoyao 已提交
217

W
wangxiao1021 已提交
218

W
wangxiao1021 已提交
219
更多实现`multi_head_trainer`的细节,请见
X
xixiaoyao 已提交
220

W
wangxiao 已提交
221
- [ATIS: 对话意图识别和插槽填充的联合训练](https://github.com/PaddlePaddle/PALM/tree/master/examples/multi-task)
X
xixiaoyao 已提交
222

W
wangxiao1021 已提交
223 224
#### 设置saver

W
wangxiao1021 已提交
225
在训练时保存 models/checkpoints 和 logs,调用 `trainer.set_saver` 方法。更多实现细节见[这里](https://github.com/PaddlePaddle/PALM/tree/master/examples)
W
wangxiao1021 已提交
226 227

#### 评估/预测
W
wangxiao1021 已提交
228
训练结束后进行预测和评价, 只需创建额外的reader, backbone和head(重复上面1~4步骤),注意创建时需设`phase='predict'`。 然后使用trainer的`predict`方法进行预测(不需创建额外的trainer)。更多实现细节请见[这里](https://github.com/PaddlePaddle/PALM/tree/master/examples/predict)
W
wangxiao1021 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242

#### 使用多GPU
如果您的环境中存在多个GPU,您可以通过环境变量控制这些GPU的数量和索引[CUDA_VISIBLE_DEVICES](https://devblogs.nvidia.com/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/)。例如,如果您的环境中有4个gpu,索引为0、1、2、3,那么您可以运行以下命令来只使用GPU2:

```shell
CUDA_VISIBLE_DEVICES=2 python run.py
```

多GPU的使用需要 `,`作为分隔。例如,使用GPU2和GPU3,运行以下命令:

```shell
CUDA_VISIBLE_DEVICES=2,3 python run.py
```

W
wangxiao1021 已提交
243
在多GPU模式下,PaddlePALM会自动将每个batch数据分配到可用的GPU上。例如,如果`batch_size`设置为64,并且有4个GPU可以用于PaddlePALM,那么每个GPU中的batch_size实际上是64/4=16。因此,**当使用多个GPU时,您需要确保batch_size可以被暴露给PALM的GPU数量整除**
X
xixiaoyao 已提交
244 245 246 247 248


## 许可证书

此向导由[PaddlePaddle](https://github.com/PaddlePaddle/Paddle)贡献,受[Apache-2.0 license](https://github.com/PaddlePaddle/models/blob/develop/LICENSE)许可认证。