未验证 提交 ecc2e083 编写于 作者: X Xiaoyao Xi 提交者: GitHub

Merge pull request #67 from wangxiao1021/api

fix bugs
......@@ -13,7 +13,7 @@ PaddlePALM (PArallel Learning from Multi-tasks) 是一个灵活,通用且易
</p>
</p>
除了降低NLP研究成本以外,PaddlePALM已被应用于“百度搜索引擎”,有效提高了用户查询的理解准确度和挖掘出的答案质量,具备高可靠性和高训练/推理性能。
除了降低NLP研究成本以外,PaddlePALM已被应用于“百度搜索引擎”,有效提高了用户查询的理解准确度和挖掘出的答案质量,具备高可靠性和高训练/推理性能。
#### 特点:
......@@ -21,9 +21,9 @@ PaddlePALM (PArallel Learning from Multi-tasks) 是一个灵活,通用且易
- **支持多任务学习***6个步骤*即可实现多任务学习任务。
- **支持大规模任务和预训练**:可自动利用多gpu加速训练和推理。集群上的分布式训练需要较少代码。
- **流行的NLP骨架和预训练模型**:内置多种最先进的通用模型架构和预训练模型(如BERT、ERNIE、RoBERTa等)。
- **易于定制**:支持任何组件的定制开发(e。g,主干网络,任务头,读取工具和优化器)与预定义组件的复用,这给了开发人员高度的灵活性和效率,以适应不同的NLP场景。
- **易于定制**:支持任何组件的定制开发(例如:主干网络,任务头,读取工具和优化器)与预定义组件的复用,这给了开发人员高度的灵活性和效率,以适应不同的NLP场景。
你可以很容易地用较小的代码重新得到很好的结果,涵盖了大多数NLP任务,如分类、匹配、序列标记、阅读理解、对话理解等等。更多细节可以在`examples`中找到。
你可以很容易地用较少的代码复现出很好的性能,涵盖了大多数NLP任务,如分类、匹配、序列标记、阅读理解、对话理解等等。更多细节可以在`examples`中找到。
<table>
<tbody>
......@@ -106,9 +106,9 @@ PaddlePALM (PArallel Learning from Multi-tasks) 是一个灵活,通用且易
</p>
PaddlePALM是一个设计良好的高级NLP框架。基于PaddlePALM的轻量级代码可以高效实现**监督学习、非监督/自监督学习、多任务学习和迁移学习**。在PaddlePALM架构中有三层,即从下到上依次是component层、trainer层high-level trainer层。
PaddlePALM是一个设计良好的高级NLP框架。基于PaddlePALM的轻量级代码可以高效实现**监督学习、非监督/自监督学习、多任务学习和迁移学习**。在PaddlePALM架构中有三层,从下到上依次是component层、trainer层、high-level trainer层。
在组件层,PaddlePALM提供了6个 **解耦的**组件来实现NLP任务。每个组件包含丰富的预定义类和一个基类。预定义类是针对典型的NLP任务的,而基类是帮助用户开发一个新类(基于预定义类或基类)。
在组件层,PaddlePALM提供了6个 **解耦的**组件来实现NLP任务。每个组件包含丰富的预定义类和一个基类。预定义类是针对典型的NLP任务的,而基类是帮助用户开发一个新类(基于预定义类或基类)。
训练器层是用选定的构件建立计算图,进行训练和预测。该层描述了训练策略、模型保存和加载、评估和预测过程。一个训练器只能处理一个任务。
......@@ -125,7 +125,7 @@ PaddlePALM是一个设计良好的高级NLP框架。基于PaddlePALM的轻量级
| **paddlepalm.optimizer** | 优化器的集合。|
| **paddlepalm.downloader** | 预训练模型与配置和vocab文件的下载模块。|
| **paddlepalm.Trainer** | 单一任务训练/预测。一个训练器是建立计算图,管理训练和评估过程,实现模型/检查点保存和pretrain_model/检查点加载。|
| **paddlepalm.MuiliHeadTrainer** | 核心单位开始多任务训练/预测会议。一个多教练是建立在几个Trainer的基础上。在继承Trainer的基础上,实现了模型主干网络跨任务复用,训练器采用多任务学习,多任务推理,来保证更有效的评估和预测。|
| **paddlepalm.MultiHeadTrainer** | 进行多任务训练/预测的核心模块。一个MultiHeadTrainer建立在几个Trainer的基础上。在继承Trainer的基础上,实现了模型主干网络跨任务复用,采用多任务学习,多任务推理,来保证更有效的评估和预测。|
## 安装
......@@ -150,7 +150,7 @@ cd PALM && python setup.py install
### 下载预训练模型
我们合并了许多预训练的模型来初始化模型主干网络参数。用预先训练好的模型训练大的NLP模型,如12层Transformer,实际上比用随机初始化的参数更有效。要查看所有可用的预训练模型并下载,请在python解释器中运行以下代码(在shell中输入命令`python`):
我们提供了许多预训练的模型来初始化模型主干网络参数。用预先训练好的模型训练大的NLP模型,如12层Transformer,实际上比用随机初始化的参数更有效。要查看所有可用的预训练模型并下载,请在python解释器中运行以下代码(在shell中输入命令`python`):
```python
>>> from paddlepalm import downloader
......@@ -185,10 +185,10 @@ Available pretrain items:
8个步骤开始一个典型的NLP训练任务。
1. 使用`paddlepalm.reader` 为数据集加载和输入特征生成创建一个`reader`,然后调用`reader.load_data`方法加载训练数据。
1. 使用`paddlepalm.reader` 为数据集加载和输入特征生成创建一个`reader`,然后调用`reader.load_data`方法加载训练数据。
2. 使用`paddlepalm.load_data`创建一个模型*主干网络*来提取文本特征(例如,上下文单词嵌入,句子嵌入)。
3. 通过`reader.register_with``reader`注册到主干网络上。在这一步之后,reader能够使用主干网络产生的输入特征。
4. 使用`paddlepalm.head`。创建一个任务输出*head*。该头可以为训练提供任务损失,为模型推理提供预测结果。
4. 使用`paddlepalm.head`。创建一个任务*head*可以为训练提供任务损失,为模型推理提供预测结果。
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。
......@@ -207,7 +207,7 @@ Available pretrain items:
多任务学习模式下运行:
1. 重复创建组件(每个任务按照上述第1~5步执行)。
2. 创建空的训练器(每个训练器对应一个任务),并通过它们创建一个`MultiHeadTrainer`
2. 创建空的`Trainer`(每个`Trainer`对应一个任务),并通过它们创建一个`MultiHeadTrainer`
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`中。
......@@ -222,10 +222,10 @@ multi_head_trainer的保存/加载和预测操作与trainer相同。
#### 设置saver
在训练时保存 models/checkpoints 和 logs, 调用 `trainer.set_saver` 方法。更多实现细节见[这里](https://github.com/PaddlePaddle/PALM/tree/master/examples)
在训练时保存 models/checkpoints 和 logs,调用 `trainer.set_saver` 方法。更多实现细节见[这里](https://github.com/PaddlePaddle/PALM/tree/master/examples)
#### 评估/预测
训练结束后进行预测和评价, 只需创建额外的reader, backbone和head示例(重复上面1~4步骤),注意创建时需设`phase='predict'`。 然后使用trainer的`predict`方法进行预测(不需创建额外的trainer)。更多实现细节请见[这里](https://github.com/PaddlePaddle/PALM/tree/master/examples/predict)
训练结束后进行预测和评价, 只需创建额外的reader, backbone和head(重复上面1~4步骤),注意创建时需设`phase='predict'`。 然后使用trainer的`predict`方法进行预测(不需创建额外的trainer)。更多实现细节请见[这里](https://github.com/PaddlePaddle/PALM/tree/master/examples/predict)
#### 使用多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:
......
......@@ -18,8 +18,6 @@ if __name__ == '__main__':
pred_output = './outputs/predict-intent/'
save_type = 'ckpt'
random_seed = 0
pre_params = './pretrain/ERNIE-v2-en-base/params'
config = json.load(open('./pretrain/ERNIE-v2-en-base/ernie_config.json'))
input_dim = config['hidden_size']
......
......@@ -19,8 +19,6 @@ if __name__ == '__main__':
pred_output = './outputs/predict-slot/'
save_type = 'ckpt'
random_seed = 0
pre_params = './pretrain/ERNIE-v2-en-base/params'
config = json.load(open('./pretrain/ERNIE-v2-en-base/ernie_config.json'))
input_dim = config['hidden_size']
......
......@@ -25,7 +25,6 @@ class Classify(Head):
"""
classification
"""
# def __init__(self, config, phase, backbone_config=None):
def __init__(self, num_classes, input_dim, dropout_prob=0.0, \
param_initializer_range=0.02, phase='train'):
......@@ -91,17 +90,6 @@ class Classify(Head):
self._preds.extend(logits.tolist())
self._probs.extend(probs.tolist())
def epoch_postprocess(self, post_inputs, output_dir=None):
# there is no post_inputs needed and not declared in epoch_inputs_attrs, hence no elements exist in post_inputs
if not self._is_training:
if output_dir is None:
for p in self._preds:
print(p)
else:
with open(os.path.join(output_dir, 'predictions.json'), 'w') as writer:
for p in self._preds:
writer.write(str(p)+'\n')
print('Predictions saved at '+os.path.join(output_dir, 'predictions.json'))
def epoch_postprocess(self, post_inputs, output_dir=None):
# there is no post_inputs needed and not declared in epoch_inputs_attrs, hence no elements exist in post_inputs
......
......@@ -45,7 +45,7 @@ class MatchReader(Reader):
"""
def __init__(self, vocab_path, max_len, tokenizer='wordpiece', lang='en', seed=None, \
do_lower_case=False, learning_strategy='pointwise', phase='train', dev_count=1, print_prefix=''): # 需要什么加什么
do_lower_case=False, learning_strategy='pointwise', phase='train', dev_count=1, print_prefix=''):
"""Create a new Reader for classification task data.
Args:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册