diff --git a/README_zh.md b/README_zh.md index e1f68891bd32f9098442979204271b07952309fd..06da939b490ff265d9396a3acd764e066269629c 100644 --- a/README_zh.md +++ b/README_zh.md @@ -13,7 +13,7 @@ PaddlePALM (PArallel Learning from Multi-tasks) 是一个灵活,通用且易

-除了降低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`中找到。 @@ -106,9 +106,9 @@ PaddlePALM (PArallel Learning from Multi-tasks) 是一个灵活,通用且易

-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: diff --git a/examples/multi-task/predict-intent.py b/examples/multi-task/predict-intent.py index cb4d6d8a582e7cc5f536df3715dc934704cca5f4..19203e77536420740e1c8cde1ea8006aed4fdc25 100644 --- a/examples/multi-task/predict-intent.py +++ b/examples/multi-task/predict-intent.py @@ -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'] diff --git a/examples/multi-task/predict-slot.py b/examples/multi-task/predict-slot.py index f1c860e7f44559be51a91d974b21127604ba45ec..01667ae8b28f3c68f4007fe48a45fa3253eaccbf 100644 --- a/examples/multi-task/predict-slot.py +++ b/examples/multi-task/predict-slot.py @@ -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'] diff --git a/paddlepalm/head/cls.py b/paddlepalm/head/cls.py index 3342dcc371b5778812329e27754db69c44d7a74e..499c0f77d82f36872b745f94b94bd7ef89bf1727 100644 --- a/paddlepalm/head/cls.py +++ b/paddlepalm/head/cls.py @@ -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 diff --git a/paddlepalm/reader/match.py b/paddlepalm/reader/match.py index f39338179cec6b3facca99f77d00a74dd85c0b38..d62644a9b295cdf4b9495812288c75112e6e0627 100644 --- a/paddlepalm/reader/match.py +++ b/paddlepalm/reader/match.py @@ -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: