@@ -452,14 +452,14 @@ python3 -u -m paddle.distributed.launch \ - **训练网络配置方面:** - 本小节主要针对,任务的损失函数、MASK参数等配置进行了简单介绍。 + 本小节主要针对,任务的损失函数、MASK 参数等配置进行了简单介绍。 - SOP Loss - SOP (Sentence Order Predict) 损失,是 模型训练的常用损失。将文本中的句子顺序分为两段打乱,最后判断文本是否被打乱。可以通过设置`binary_head`开启或者关闭。 - MASK - - MLM (Mask Language Model) 是通过随机将文本中的部分token,随机替换为`[MASK]` token,最后预测出真实的token值。ERNIE默认采用了Whole Word MASK方式,选定一些词语进行MASK。 - - *使用方法*: 用户可以设置 `masked_lm_prob` 控制mask的token占文本总token长度的比例。默认`masked_lm_prob=0.15` 随机mask 15% 的token数目。 + - MLM (Mask Language Model) 是通过随机将文本中的部分 token,随机替换为`[MASK]` token,最后预测出真实的 token 值。ERNIE 默认采用了 Whole Word MASK 方式,选定一些词语进行 MASK。 + - *使用方法*: 用户可以设置 `masked_lm_prob` 控制 mask 的 token 占文本总 token 长度的比例。默认`masked_lm_prob=0.15` 随机 mask 15% 的 token 数目。 - Ngram MASK - - 项目还支持了n-gram mask策略,如下图所示,在 WWM 进行词语级别MASK的基础上(如此处mask掉的`[模型]`词组),n-gram 可以MASK掉连续n个词组。下面例子中,连续mask了2个词组,`【[语言][模型]】`同时进行了mask。 + - 项目还支持了 n-gram mask 策略,如下图所示,在 WWM 进行词语级别 MASK 的基础上(如此处 mask 掉的`[模型]`词组),n-gram 可以 MASK 掉连续 n 个词组。下面例子中,连续 mask 了2个词组,`【[语言][模型]】`同时进行了 mask。
@@ -467,21 +467,21 @@ python3 -u -m paddle.distributed.launch \ - *使用方法*: 用户通过`max_ngrams`设置最大的`ngram`长度。默认`max_ngrams=3`。 - Dropout - - Dropout 是常用的防止过拟合策略。对于大规模数据集训练,如`ernie-3.0`系列4T文本语料,可以设置 `dropout=0`,不考虑过拟合。实际`ernie-3.0-base-zh`训练中,没有开启Dropout。 + - Dropout 是常用的防止过拟合策略。对于大规模数据集训练,如`ernie-3.0`系列4T 文本语料,可以设置 `dropout=0`,不考虑过拟合。实际`ernie-3.0-base-zh`训练中,没有开启 Dropout。 详细参数配置介绍请参见[ERNIE 中文预训练介绍](./pretraining_introduction.md)。 - **训练速度方面** - 我们支持了如下策略,加速计算过程,减小显存占用,扩大batch_size: + 我们支持了如下策略,加速计算过程,减小显存占用,扩大 batch_size: - **多卡多机训练**: - - 基于飞桨Fleet分布式API,用户可以十分方便的通过数据并行的方法,将训练扩展到多机多卡。 + - 基于飞桨 Fleet 分布式 API,用户可以十分方便的通过数据并行的方法,将训练扩展到多机多卡。 - **混合精度训练**: - - 部分算子使用FP16计算kernel,加速计算过程。支持AMP混合精度O1,和Pure FP16全FP训练策略O2。 + - 部分算子使用 FP16计算 kernel,加速计算过程。支持 AMP 混合精度 O1,和 Pure FP16全 FP 训练策略 O2。 - **梯度累积训练**: - - 用户可以指定梯度累积的步数,在梯度累积的step中,减少多卡之间梯度的通信,减少更新的次数,可以扩大训练的batch_size. + - 用户可以指定梯度累积的步数,在梯度累积的 step 中,减少多卡之间梯度的通信,减少更新的次数,可以扩大训练的 batch_size. - **重计算训练**: - 通过重新计算前向的方式,减少前向网络中间变量的存储,可以显著减少显存占用, @@ -500,11 +500,11 @@ python3 -u -m paddle.distributed.launch \ - **多数据混合** - 训练数据集支持多个文件,即插即用,设置权重,传入参数即可`input_dir="1.0 dateset_a/prefix 2.0 dataset_b/prefix"` - **稳定可复现** - - MLM任务具有一定随机性,需要随机mask数据。本数据流通过固定每一个step数据的随机种子,实验数据流稳定可复现。 + - MLM 任务具有一定随机性,需要随机 mask 数据。本数据流通过固定每一个 step 数据的随机种子,实验数据流稳定可复现。 - **快加载** - - 数据文件使用mmap读取,加载数百GB文件几乎不耗时。 + - 数据文件使用 mmap 读取,加载数百 GB 文件几乎不耗时。 - **断点重启** - - 用户可以单独设置,checkpoints steps 参数可设置较小,重启训练默认加载最新checkpoint。 + - 用户可以单独设置,checkpoints steps 参数可设置较小,重启训练默认加载最新 checkpoint。 - 断点数据自动恢复,学习率等参数也自动恢复。 详细参数配置介绍请参见[ERNIE 中文预训练介绍](./pretraining_introduction.md)。 @@ -512,22 +512,22 @@ python3 -u -m paddle.distributed.launch \ - **观察评估方面** - **可视化日志记录** - - 日志展示为全局loss,波动小。 - - 记录混合精度,loss_scaling等信息,方便用户debug。 - - 对模型结构,配置参数,paddle版本信息进行记录,方便复现环境 - - **下游任务评估**:CLUE Benchmark搜索评估参数效果 + - 日志展示为全局 loss,波动小。 + - 记录混合精度,loss_scaling 等信息,方便用户 debug。 + - 对模型结构,配置参数,paddle 版本信息进行记录,方便复现环境 + - **下游任务评估**:CLUE Benchmark 搜索评估参数效果 - 使用[批量启动-grid-search](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/legacy/examples/benchmark/clue#%E6%89%B9%E9%87%8F%E5%90%AF%E5%8A%A8-grid-search),可以进行批量搜索任务 - - 注意,这里使用的是训练中的checkpoint进行评估,可以直接试着 评估待评估的参数为,所在的路径地址,即如 `python grid_seach.py output/ernie-base-outdir/model_100000` 之类的checkpoint地址。 + - 注意,这里使用的是训练中的 checkpoint 进行评估,可以直接试着 评估待评估的参数为,所在的路径地址,即如 `python grid_seach.py output/ernie-base-outdir/model_100000` 之类的 checkpoint 地址。 详细介绍请参见[ERNIE 中文预训练介绍](./pretraining_introduction.md)。 - **训练效果方面** - 我们release了base、large两个模型。均取得了较好的预训练效果。 + 我们 release 了 base、large 两个模型。均取得了较好的预训练效果。 - **ERNIE 1.0-Base-zh-cw** 模型: - - 使用CLUE,WuDao共计400GB的语料,batch_size 1024, 训练 400w step,即可训练得到`ernie-3.0-base-zh`类似的模型效果。相关模型参数,开源为`ernie-1.0-base-zh-cw`,用户加载即可使用。使用CLUE benchmark 对最优超参数进行GradSearch搜索: + - 使用 CLUE,WuDao 共计400GB 的语料,batch_size 1024, 训练 400w step,即可训练得到`ernie-3.0-base-zh`类似的模型效果。相关模型参数,开源为`ernie-1.0-base-zh-cw`,用户加载即可使用。使用 CLUE benchmark 对最优超参数进行 GradSearch 搜索: Model | Arch | CLUE AVG | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUE WSC2020 | CSL | CMRC | CHID | C3 -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | @@ -538,7 +538,7 @@ ERNIE 1.0-Base-zh | 12L768H | 74.17 | 74.84 | 58.91 | 62.25 | 81.68 | - - **ERNIE 1.0-Large-zh-cw** 模型: - - 除了base模型外,我们还训练了放出了large模型。此模型参数采用的是词表与ernie-1.0相同,因此命名为`ernie-1.0-large-zh-cw`。使用开源语料,batch_size 512, 训练 400w step,训练去除SOP任务,只保留MLM损失: + - 除了 base 模型外,我们还训练了放出了 large 模型。此模型参数采用的是词表与 ernie-1.0相同,因此命名为`ernie-1.0-large-zh-cw`。使用开源语料,batch_size 512, 训练 400w step,训练去除 SOP 任务,只保留 MLM 损失: Model | Arch | CLUE AVG | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUE WSC2020 | CSL | CMRC | CHID | C3 -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | @@ -551,8 +551,8 @@ RoBERTa-wwm-ext-large | 24L1024H | 76.61 | 76.00 | 59.33 | 62.02 | 8 ### 预训练模型贡献 -PaddleNLP为开发者提供了[community](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/community/contribute_models/contribute_awesome_pretrained_models.rst)模块,用户可以上传自己训练的模型,开源给其他用户使用。 -使用本文档给出的参数配置,在CLUECorpusSmall数据集上训练,可以得到`zhui/ernie-1.0-cluecorpussmall`参数,可直接使用。 +PaddleNLP 为开发者提供了[community](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/community/contribute_models/contribute_awesome_pretrained_models.rst)模块,用户可以上传自己训练的模型,开源给其他用户使用。 +使用本文档给出的参数配置,在 CLUECorpusSmall 数据集上训练,可以得到`zhui/ernie-1.0-cluecorpussmall`参数,可直接使用。 ```python model = AutoModelForMaskedLM.from_pretrained('zhui/ernie-1.0-cluecorpussmall') ``` @@ -563,7 +563,7 @@ model = AutoModelForMaskedLM.from_pretrained('zhui/ernie-1.0-cluecorpussmall') ## 3. 下游任务微调 -使用训练中产出的checkpoint,或者paddlenlp内置的模型权重,使用本脚本,用户可以快速对当前模型效果进行评估。 +使用训练中产出的 checkpoint,或者 paddlenlp 内置的模型权重,使用本脚本,用户可以快速对当前模型效果进行评估。 ### 运行示例 本文档适配了三大主流下游任务,用户可以根据自己的需求,评估自己所需的数据集。 @@ -583,9 +583,9 @@ python run_seq_cls.py \ --output_dir ./tmp/$dataset ``` - + -2. Token分类 +2. Token 分类 ```shell cd finetune dataset="peoples_daily_ner" @@ -616,14 +616,14 @@ python run_qa.py \ ## 4. 预测部署 -以中文文本情感分类问题为例,介绍一下从模型finetune到部署的过程。 +以中文文本情感分类问题为例,介绍一下从模型 finetune 到部署的过程。 -与之前的finetune参数配置稍有区别,此处加入了一些配置选项。 +与之前的 finetune 参数配置稍有区别,此处加入了一些配置选项。 - do_export,开启模型导出功能 -- eval_steps/save_steps 评估和保存的step间隔 -- metric_for_best_model 模型效果的比较指标。(次选项生效,需要save_steps为eval_steps的倍数) -- save_total_limit 最多保存的ckpt个数。(超过限制数据时,效果更差,或更旧的ckpt将被删除) +- eval_steps/save_steps 评估和保存的 step 间隔 +- metric_for_best_model 模型效果的比较指标。(次选项生效,需要 save_steps 为 eval_steps 的倍数) +- save_total_limit 最多保存的 ckpt 个数。(超过限制数据时,效果更差,或更旧的 ckpt 将被删除) ```shell cd finetune @@ -644,7 +644,7 @@ python run_seq_cls.py \ --save_total_limit 3 \ ``` -训练完导出模型之后,可以用于部署,`deploy/seq_cls_infer.py`文件提供了python部署预测示例。可执行以下命令运行部署示例: +训练完导出模型之后,可以用于部署,`deploy/seq_cls_infer.py`文件提供了 python 部署预测示例。可执行以下命令运行部署示例: ```shell python deploy/seq_cls_infer.py --model_dir tmp/chnsenticorp_v2/export/ --device cpu --backend paddle diff --git a/legacy/model_zoo/ernie-1.0/data_tools/dataset_utils.py b/legacy/model_zoo/ernie-1.0/data_tools/dataset_utils.py index 0e3d66f0f8b9..b4601ea5de5f 100755 --- a/legacy/model_zoo/ernie-1.0/data_tools/dataset_utils.py +++ b/legacy/model_zoo/ernie-1.0/data_tools/dataset_utils.py @@ -94,9 +94,11 @@ def __init__(self, datasets, weights): while True: try: try: - from tool_helpers import helpers + from fast_dataindex import helpers except Exception: - print_rank_0(" > missing tool_helpers, pip install tool_helpers please, try to compile locally.") + print_rank_0( + " > missing fast_dataindex, pip install fast_dataindex please, try to compile locally." + ) import data_tools.helpers as helpers break except Exception: @@ -785,9 +787,9 @@ def get_samples_mapping( print_rank_0(" > building sapmles index mapping for {} ...".format(name)) # First compile and then import. try: - from tool_helpers import helpers + from fast_dataindex import helpers except ModuleNotFoundError: - print_rank_0(" > missing tool_helpers, pip install tool_helpers please, try to compile locally.") + print_rank_0(" > missing fast_dataindex, pip install fast_dataindex please, try to compile locally.") if local_rank == 0: compile_helper() import data_tools.helpers as helpers diff --git a/legacy/model_zoo/ernie-1.0/pretraining_introduction.md b/legacy/model_zoo/ernie-1.0/pretraining_introduction.md index 0274722946a7..3a8c73665747 100644 --- a/legacy/model_zoo/ernie-1.0/pretraining_introduction.md +++ b/legacy/model_zoo/ernie-1.0/pretraining_introduction.md @@ -1,7 +1,7 @@ # ERNIE 中文预训练介绍 -ERNIE是百度提出的大规模预训练模型,曾在中文场景下取得了SOTA效果。 -PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao 总共400GB,发布大规模开源语料预训练全流程。从零开始,轻松构建预训练模型。 +ERNIE 是百度提出的大规模预训练模型,曾在中文场景下取得了 SOTA 效果。 +PaddleNLP 致力于预训练开源工作,使用开源中文语料 CLUE、WuDao 总共400GB,发布大规模开源语料预训练全流程。从零开始,轻松构建预训练模型。 本项目,从数据下载,词表制作,数据转化,模型训练,所有流程,完全开源开放,可复现。 并训练发布开源最优的模型参数。 @@ -11,7 +11,7 @@ PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao * [1. 数据准备](#数据准备) * [1.1 大规模中文数据](#大规模中文数据) * [1.2 高精准中文分词](#高精准中文分词) - * [1.3 快速Token ID 转化](#快速TokenID转化) + * [1.3 快速 Token ID 转化](#快速 TokenID 转化) * [2. 全字符中文词表制作](#中文词表制作) - [2.1 分析准备](#分析准备) - [2.2 文本字符统计](#文本字符统计) @@ -37,12 +37,12 @@ PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao **环境依赖** -- tool_helpers +- fast_dataindex - visualdl - pybind11 - lac (可选) -安装命令 `pip install tool_helpers visualdl pybind11 lac` +安装命令 `pip install fast_dataindex visualdl pybind11 lac` @@ -56,22 +56,22 @@ PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao ### 1.1 大规模中文数据 模型的根本是数据,大数据才能有望获得更好的训练效果。我们希望语料有如下特点: -- **大规模**:目前像ERNIE-3.0,GPT-3,CPM等模型,动辄数T的文本语料。而目前开源的一些中文模型,确是基于15G左右的CLUECorpus语料训练,大大限制了模型的效果, +- **大规模**:目前像 ERNIE-3.0,GPT-3,CPM 等模型,动辄数 T 的文本语料。而目前开源的一些中文模型,确是基于15G 左右的 CLUECorpus 语料训练,大大限制了模型的效果, - **开源开放**:为了让用户也可以比较容易复现整体的数据流程,采用的数据希望是**开源**的,人人可以获取的。 综上,我们选用的预料为 CLUECorpus2020 语料 200G, WuDaoCorpus2.0 Base 语料 200G。 **CLUECorpus2020 语料** -CLUECorpus2020 是通过Common Crawl中文部分语料清洗得到。开源部分提供了约200G左右的语料文本,详细介绍见[官网](https://github.com/CLUEbenchmark/CLUECorpus2020#%E6%95%B0%E6%8D%AE%E4%B8%8B%E8%BD%BD),用户可以通过邮件申请下载。 +CLUECorpus2020 是通过 Common Crawl 中文部分语料清洗得到。开源部分提供了约200G 左右的语料文本,详细介绍见[官网](https://github.com/CLUEbenchmark/CLUECorpus2020#%E6%95%B0%E6%8D%AE%E4%B8%8B%E8%BD%BD),用户可以通过邮件申请下载。 **WuDaoCorpus2.0 Base 语料** -WuDaoCorpora是悟道爬取的中文大规模语料。整体数量为3TB,目前开源的部分为WuDaoCorpus2.0 bases数据集,大小为200GB。 +WuDaoCorpora 是悟道爬取的中文大规模语料。整体数量为3TB,目前开源的部分为 WuDaoCorpus2.0 bases 数据集,大小为200GB。 用户微信登录[官网](https://resource.wudaoai.cn/home),即可直接下载数据。下载好的压缩数据约 64GB。 -为了方便用户测试,我们提供了少量part的WuDao数据供大家使用,(如有侵权,请联系我们删除) +为了方便用户测试,我们提供了少量 part 的 WuDao 数据供大家使用,(如有侵权,请联系我们删除) ``` wget https://bj.bcebos.com/paddlenlp/models/transformers/data_tools/WuDaoCorpus2.0_base_200G_sample.tar.gz tar -xvf WuDaoCorpus2.0_base_200G_sample.tar.gz @@ -83,11 +83,11 @@ tar -xvf WuDaoCorpus2.0_base_200G_sample.tar.gz ### 1.2 高精准中文分词 -ERNIE 使用知识嵌入的方式进行预训练。文本中的知识,比如 文本的中的人名、地名、成语、短语等都是知识。如何把这知识训练融合到模型中呢?ERNIE给出的方案是对这些知识短语一起MASK,然后预测,也就是Whole Words MASK。 +ERNIE 使用知识嵌入的方式进行预训练。文本中的知识,比如 文本的中的人名、地名、成语、短语等都是知识。如何把这知识训练融合到模型中呢?ERNIE 给出的方案是对这些知识短语一起 MASK,然后预测,也就是 Whole Words MASK。 -在我们数据处理层面,如何尽可能精确的从原始文本中提取知识,直接关系预训练模型的效果。我们对目前PaddleNLP常用的分词方式的有`jieba`,`lac`,`seg`进行分析。`jieba`采用HMM隐马尔可模型,`lac`是LSTM模型。 +在我们数据处理层面,如何尽可能精确的从原始文本中提取知识,直接关系预训练模型的效果。我们对目前 PaddleNLP 常用的分词方式的有`jieba`,`lac`,`seg`进行分析。`jieba`采用 HMM 隐马尔可模型,`lac`是 LSTM 模型。 -效果、速度对比表格如下,假设CPU使用40线程,GPU使用16卡,处理200G文本: +效果、速度对比表格如下,假设 CPU 使用40线程,GPU 使用16卡,处理200G 文本: | 切词方式 | 效果 | 速度 | 预估耗时 |-|-|-|-| @@ -95,10 +95,10 @@ ERNIE 使用知识嵌入的方式进行预训练。文本中的知识,比如 | lac | 好 | 106 KB/s | 13.9 h | wordtag (弃用)| 最好 | 0.94 KB/s | 159 D (GPU)| -综合考虑分词的效果与速度,我们选择百度的LAC(seg)作为我们的文本分词工具。 +综合考虑分词的效果与速度,我们选择百度的 LAC(seg)作为我们的文本分词工具。 -本文档以WuDao数据为例,对数据进行分词: +本文档以 WuDao 数据为例,对数据进行分词: ```shell @@ -110,9 +110,9 @@ python $PADDLENLP_PATH/llm/tools/preprocess/words_segmentation.py \ --workers 48 ``` -注:预训练需要实现 SOP( Sentence Order Predict) 任务,在分词的同时,我们使用 简单规则 进行了文本断句。如果语料只有一句话,建议去除SOP loss,训练时设置 `binary_head=False`。 +注:预训练需要实现 SOP( Sentence Order Predict) 任务,在分词的同时,我们使用 简单规则 进行了文本断句。如果语料只有一句话,建议去除 SOP loss,训练时设置 `binary_head=False`。 -文本转化完成后。我们使用 `$PADDLENLP_PATH/llm/tools/preprocess/trans_to_json.py`重新转换为jsonl格式(分词完毕)。 +文本转化完成后。我们使用 `$PADDLENLP_PATH/llm/tools/preprocess/trans_to_json.py`重新转换为 jsonl 格式(分词完毕)。 ```shell python $PADDLENLP_PATH/llm/tools/preprocess/trans_to_json.py \ --input_path "./wudao_lac_cut" \ @@ -120,28 +120,28 @@ python $PADDLENLP_PATH/llm/tools/preprocess/trans_to_json.py \ --workers 40 \ --no-shuffle ``` -使用 WuDaoCorpus2.0_base_200G_sample.tar.gz 数据可以得到jsonl文本为: +使用 WuDaoCorpus2.0_base_200G_sample.tar.gz 数据可以得到 jsonl 文本为: ``` wget https://bj.bcebos.com/paddlenlp/models/transformers/data_tools/wudao_corpus_200g_sample.jsonl ``` -用户可以下载处理好的数据,进行tokenizer转换。 +用户可以下载处理好的数据,进行 tokenizer 转换。 - + -## 1.3 快速Token ID 转化 +## 1.3 快速 Token ID 转化 -预料、词表准备妥当后,我们可以开始进行最后的数据ID转化。 +预料、词表准备妥当后,我们可以开始进行最后的数据 ID 转化。 - 高效的 Multiprocessing 多进程实现 -- 使用内存BytesIO存储ID数据 +- 使用内存 BytesIO 存储 ID 数据 -由于转换的逻辑复杂,需要定义`class Converter`对象来进行转化处理。如果每次处理新的文本,都实例化一次class对象,速度瓶颈会在处理函数的实例化。 -我们使用了提前multiprocessing.Pool的`initializer`,对处理函数进行提前实例化,提高处理效率。 +由于转换的逻辑复杂,需要定义`class Converter`对象来进行转化处理。如果每次处理新的文本,都实例化一次 class 对象,速度瓶颈会在处理函数的实例化。 +我们使用了提前 multiprocessing.Pool 的`initializer`,对处理函数进行提前实例化,提高处理效率。 -处理后的token id数量巨大,可以达到数百Billion,如果使用普通的数据结构,如python的list保存,会出现存储瓶颈,不仅占用空间大,list对象还需要重新分配内存空间。这里我们采用了 BytesIO 的方式,类似写入内存文件的方式,速度快,可以非常方便转化为numpy文件保存。 +处理后的 token id 数量巨大,可以达到数百 Billion,如果使用普通的数据结构,如 python 的 list 保存,会出现存储瓶颈,不仅占用空间大,list 对象还需要重新分配内存空间。这里我们采用了 BytesIO 的方式,类似写入内存文件的方式,速度快,可以非常方便转化为 numpy 文件保存。 -使用 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz CPU测试,40线程,处理速度 8+MB/s,约7个小时左右,即可完成 200GB 文本转化为ID. +使用 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz CPU 测试,40线程,处理速度 8+MB/s,约7个小时左右,即可完成 200GB 文本转化为 ID. ```shell python -u $PADDLENLP_PATH/llm/tools/preprocess/create_pretraining_data.py \ @@ -158,15 +158,15 @@ python -u $PADDLENLP_PATH/llm/tools/preprocess/create_pretraining_data.py \ --log_interval 1000 ``` -此处需要指定词表文件进行ID转化,用户可以使用paddlenlp内置的部分词表如`ernie-1.0-base-zh,ernie-3.0-base-zh`,设置`model_name`参数为对应参数名即可。 +此处需要指定词表文件进行 ID 转化,用户可以使用 paddlenlp 内置的部分词表如`ernie-1.0-base-zh,ernie-3.0-base-zh`,设置`model_name`参数为对应参数名即可。 也可以根据自己的需求,重新开始制作词表,然后`model_name`传入词表所在的文件夹目录即可。词表制作,请参考下一章节[全字符中文词表制作](#全字符中文词表制作)。 -转化后的数据如下,使用这份数据,即可开始ERNIE预训练: +转化后的数据如下,使用这份数据,即可开始 ERNIE 预训练: ``` wudao_corpus_200g.bin wudao_corpus_200g.idx ``` -同样,对于 WuDaoCorpus2.0_base_200G_sample.tar.gz 数据,使用`ernie-3.0-bash-zh`的tokenizer,可以得到数据。 +同样,对于 WuDaoCorpus2.0_base_200G_sample.tar.gz 数据,使用`ernie-3.0-bash-zh`的 tokenizer,可以得到数据。 ``` mkdir data && cd data wget https://paddlenlp.bj.bcebos.com/paddlenlp/models/transformers/data_tools/wudao_corpus_200g_sample_ernie-3.0-base-zh.bin @@ -179,13 +179,13 @@ wget https://paddlenlp.bj.bcebos.com/paddlenlp/models/transformers/data_tools/wu 之前的 数据 id 化中,使用了已有的词表进行转化,当没有词表时,需要从头开始进行词表制作。如果你没有制作新词表的需求,请跳过此部分,直接阅读 [第三节,开始训练](#开始训练)。 -那制作ERNIE的词表有什么特点需要注意呢?常见的方法是使用 sentencepiece 切词,使用BPE去找通用的子词串。但是,ERNIE之类的中文模型,是属于字模型,不会出现连续汉字作为子词 如`##中国`。一般是通过 BasicTokenizer,给所有中文汉字之间,添加空格,然后再去切分 子词 subword,这样每个汉字就都是独立的。 +那制作 ERNIE 的词表有什么特点需要注意呢?常见的方法是使用 sentencepiece 切词,使用 BPE 去找通用的子词串。但是,ERNIE 之类的中文模型,是属于字模型,不会出现连续汉字作为子词 如`##中国`。一般是通过 BasicTokenizer,给所有中文汉字之间,添加空格,然后再去切分 子词 subword,这样每个汉字就都是独立的。 ``` china -> ch #ina 我爱china -> 我 爱 china -> 我 爱 ch #ina ``` -这里提供了ERNIE模型词表制作的两种方案: +这里提供了 ERNIE 模型词表制作的两种方案: - 第一种,词表组合方案 1. 统计字符 @@ -193,8 +193,8 @@ china -> ch #ina 3. 合并词表 - 第二种,预处理后直接生成,方案 - 1. 文本预处理(中文加空格,文本normalize) - 2. 使用sentencepeice制作词表 + 1. 文本预处理(中文加空格,文本 normalize) + 2. 使用 sentencepeice 制作词表 第二种方案需要对文本先使用`BasicTokenizer`切分一遍语料。 第一种方案,自定义程度高,但存在一些局限性。本项目采用了第一种方案,详细介绍如下: @@ -204,8 +204,8 @@ china -> ch #ina - 已有模型对照: - ERNIE 3.0系列模型的词表,词表大小为 40000 左右。 - 预训练数据存储占用: - - 文本token id化后,希望使用uint16表示,此时表示的最大字符为65536。 - - 同时考虑到ERNIE虽然是字模型,我们的仍然需要 `##中` 之类的中文字符表示分词信息。假设使用中文全字符20902(0x4E00-0x9FA5)个字符,那么剩余 vocab 大小不能超过 44634。 + - 文本 token id 化后,希望使用 uint16表示,此时表示的最大字符为65536。 + - 同时考虑到 ERNIE 虽然是字模型,我们的仍然需要 `##中` 之类的中文字符表示分词信息。假设使用中文全字符20902(0x4E00-0x9FA5)个字符,那么剩余 vocab 大小不能超过 44634。 综上,本项目决定采用 40000 左右的 vocab 容量。 其中: @@ -229,7 +229,7 @@ wget https://bj.bcebos.com/paddlenlp/models/transformers/data_tools/char_dict.pi ### 2.3 英文字符词表 基于字符的词频统计,使得英文字符也切割为字母,为此我们需要添加英文词表。 英文部分,我们使用了 [WikiText](https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-v1.zip) 数据集,来构造词表。 -下载解压数据,使用BPE切词 +下载解压数据,使用 BPE 切词 ``` wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-v1.zip unzip wikitext-103-v1.zip @@ -253,17 +253,17 @@ python ./vocab/merge_vocab.py 此阶段需要注意的一些问题是: 1. 对于一些日文、谚文文字字符,需要进行 normalize -2. 添加special_tokens +2. 添加 special_tokens ### 2.5 问题遗留 -本项目采用的第一种方式,即拼接产出的词表,对连续非中、英文字符文本,会出现UNK的情况。 -如issue: [#2927](https://github.com/PaddlePaddle/PaddleNLP/issues/2927)、 [#2585](https://github.com/PaddlePaddle/PaddleNLP/issues/2585)。本项目做了两点改进: +本项目采用的第一种方式,即拼接产出的词表,对连续非中、英文字符文本,会出现 UNK 的情况。 +如 issue: [#2927](https://github.com/PaddlePaddle/PaddleNLP/issues/2927)、 [#2585](https://github.com/PaddlePaddle/PaddleNLP/issues/2585)。本项目做了两点改进: 1. 对 Symbol 字符默认添加空格,变成独立字符 2. 对 日文、谚文 在合并词表阶段默认添加 ## 字符。 虽然有上述两点修复,任然无法避免 [#2927](https://github.com/PaddlePaddle/PaddleNLP/issues/2927) 现象。 -彻底解决的话,建议使用第二种方式制作vocab文件。 +彻底解决的话,建议使用第二种方式制作 vocab 文件。 ### 2.6 方案二:预处理后直接生成 此方案没有被采用,这里也简单说明一下具体的方案: @@ -279,12 +279,12 @@ basic_toknizer = lambda x: " ".join(tokenizer.tokenize(x)) ```shell python ./vocab/gen_vocab.py afer_basic_toknizer_corpus.txt ``` -对处理好的vocab文件手动替换一些`
@@ -295,9 +295,9 @@ python ./vocab/gen_vocab.py afer_basic_toknizer_corpus.txt
训练脚本如下。环境配置和路径配置,不是必要的,如果用户只想简单训练,可以直接跳到[继续训练](#继续训练)部分,直接训练。
环境配置
-- PYTHONPATH 设置为当前目录(适合paddlenlp develop运行)
-- 设置了一些FLAGS,包括增强报错,动态图Flag,提高矩阵乘法精度。
-- 多机情况下,可以设置`NCCL_SOCKET_IFNAME`指明NCCL使用的通信网口。
+- PYTHONPATH 设置为当前目录(适合 paddlenlp develop 运行)
+- 设置了一些 FLAGS,包括增强报错,动态图 Flag,提高矩阵乘法精度。
+- 多机情况下,可以设置`NCCL_SOCKET_IFNAME`指明 NCCL 使用的通信网口。
环境配置脚本
@@ -319,7 +319,7 @@ unset CUDA_VISIBLE_DEVICES
路径配置
- 主要配置输入输出目录
-- 这里的`vocab_dir`如果没有使用自定义词表的话,请设置为内置的tokenizer,如`ernie-1.0-base-zh,ernie-3.0-base-zh`等。
+- 这里的`vocab_dir`如果没有使用自定义词表的话,请设置为内置的 tokenizer,如`ernie-1.0-base-zh,ernie-3.0-base-zh`等。
- 这里的 `data_dir` 设置多份数据集,用户不使用多份数据集的话,直接`data_dir="./data"`即可。
- *使用方法*: 用户通过`max_ngrams`设置最大的`ngram`长度。默认`max_ngrams=3`。 - 注: - - ernie预训练使用的 dataset 代码文件在 `./data_tools/ernie_dataset.py` - - 数据集index生成,动态mask相关代码实现在`./data_tools/dataset_utils.py` + - ernie 预训练使用的 dataset 代码文件在 `./data_tools/ernie_dataset.py` + - 数据集 index 生成,动态 mask 相关代码实现在`./data_tools/dataset_utils.py` - - 用户可以根据自己的需求,灵活修改mask方式。具体可以参考`dataset_utils.py`中`create_masked_lm_predictions`函数。可以自定义的选项有do_whole_word_mask, favor_longer_ngram, do_permutation, geometric_dist等,可以参考[Megatron](https://github.com/NVIDIA/Megatron-LM)使用这些lm_mask策略。 + - 用户可以根据自己的需求,灵活修改 mask 方式。具体可以参考`dataset_utils.py`中`create_masked_lm_predictions`函数。可以自定义的选项有 do_whole_word_mask, favor_longer_ngram, do_permutation, geometric_dist 等,可以参考[Megatron](https://github.com/NVIDIA/Megatron-LM)使用这些 lm_mask 策略。 - Dropout - - Dropout 是常用的防止过拟合策略。对于大规模数据集训练,如`ernie-3.0`系列4T文本语料,可以设置 `dropout=0`,不考虑过拟合。实际`ernie-3.0-base-zh`训练中,没有开启Dropout。 + - Dropout 是常用的防止过拟合策略。对于大规模数据集训练,如`ernie-3.0`系列4T 文本语料,可以设置 `dropout=0`,不考虑过拟合。实际`ernie-3.0-base-zh`训练中,没有开启 Dropout。 - *使用方法*: 用户可以设置 `hidden_dropout_prob`,`attention_probs_dropout_prob`。默认值为 `0.1`。 @@ -487,10 +487,10 @@ python3 -u -m paddle.distributed.launch \ ### 3.3 训练速度配置 **训练速度方面**,我们支持了如下策略,加 -速计算过程,减小显存占用,扩大batch_size: +速计算过程,减小显存占用,扩大 batch_size: - **多卡多机**训练: - - 基于飞桨Fleet分布式API,用户可以十分方便的通过数据并行的方法,将训练扩展到多机多卡。 + - 基于飞桨 Fleet 分布式 API,用户可以十分方便的通过数据并行的方法,将训练扩展到多机多卡。 - *使用方法*: - 单机八卡 ```shell @@ -498,7 +498,7 @@ python3 -u -m paddle.distributed.launch \ --gpus "0,1,2,3,4,5,6,7" \ run_pretrain.py ``` - - 多机,假设机器ip为 `192.168.1.101,192.168.1.102` **注**:多台机器启动的ips参数需要顺序一致。 + - 多机,假设机器 ip 为 `192.168.1.101,192.168.1.102` **注**:多台机器启动的 ips 参数需要顺序一致。 ```shell python3 -u -m paddle.distributed.launch \ --gpus "0,1,2,3,4,5,6,7" \ @@ -506,18 +506,18 @@ python3 -u -m paddle.distributed.launch \ run_pretrain.py ``` - **混合精度**训练: - - 部分算子使用FP16计算kernel,加速计算过程。支持AMP混合精度O1,和Pure FP16全FP训练策略O2。 - - 如下图所示,使用AMP O1时,一些参数自动从fp32 cast为FP16类型计算。使用`O2` pure fp16时,模型参数为 fp16。 - - *使用方法*: 设置`use_amp=True`开启混合精度训练。设置`fp16_opt_level=O1`,切换pure_fp16请设置为`O2`。 + - 部分算子使用 FP16计算 kernel,加速计算过程。支持 AMP 混合精度 O1,和 Pure FP16全 FP 训练策略 O2。 + - 如下图所示,使用 AMP O1时,一些参数自动从 fp32 cast 为 FP16类型计算。使用`O2` pure fp16时,模型参数为 fp16。 + - *使用方法*: 设置`use_amp=True`开启混合精度训练。设置`fp16_opt_level=O1`,切换 pure_fp16请设置为`O2`。
- **梯度累积**训练: - - 用户可以指定梯度累积的步数,在梯度累积的step中。 - - 减少多卡之间梯度的通信,减少更新的次数,扩大训练的batch_size. - - *使用方法*:用户设置 `gobal_batch_size`为 `micro_batch_size*卡数`的倍数,即可开启梯度累积。如:单卡bs=16,8卡,此时如果设置`gobal_batch_size=512`,则梯度累积次数为`gobal_batch_size/bs/card_num=512/16/8=4`。 + - 用户可以指定梯度累积的步数,在梯度累积的 step 中。 + - 减少多卡之间梯度的通信,减少更新的次数,扩大训练的 batch_size. + - *使用方法*:用户设置 `gobal_batch_size`为 `micro_batch_size*卡数`的倍数,即可开启梯度累积。如:单卡 bs=16,8卡,此时如果设置`gobal_batch_size=512`,则梯度累积次数为`gobal_batch_size/bs/card_num=512/16/8=4`。 - **重计算**训练: - - 通过重新计算前向的方式,减少前向网络中间变量的存储,可以显著减少显存占用。理论上,该方式以时间换空间,但在batch size显著扩大的情况下,速度下降幅度较小。 + - 通过重新计算前向的方式,减少前向网络中间变量的存储,可以显著减少显存占用。理论上,该方式以时间换空间,但在 batch size 显著扩大的情况下,速度下降幅度较小。 - 如图所示:原来训练过程中,中间变量需要常驻显存,等待反向计算。使用重计算之后,修改成了反向需要时,再重新计算一遍前向过程,生成中间变量。避免常驻显存,减小显存占用。 - *使用方法*:用户设置`use_recompute=True`即可使用。注意使用时,可同时扩大`micro_batch_size`参数。
@@ -533,8 +533,8 @@ python3 -u -m paddle.distributed.launch \ 数据流 - **多机扩展** - 用户可以将数据放置到 NFS 服务器上,多机同时挂载数据即可。 - - 解析:当用户需要在多台机器之间,一起多机训练,或者切换到空闲的机器上训练时。由于数据集很大(数百GB),迁移不方便。训练数据与计算资源分离,是非常适合的策略。 - - *使用方法*:参考[NFS服务搭建教程](https://blog.csdn.net/eijiyey/article/details/123184529),用户将制作好的数据,放到NFS机器,然后挂载到有训练资源的其他机器训练即可。 + - 解析:当用户需要在多台机器之间,一起多机训练,或者切换到空闲的机器上训练时。由于数据集很大(数百 GB),迁移不方便。训练数据与计算资源分离,是非常适合的策略。 + - *使用方法*:参考[NFS 服务搭建教程](https://blog.csdn.net/eijiyey/article/details/123184529),用户将制作好的数据,放到 NFS 机器,然后挂载到有训练资源的其他机器训练即可。
@@ -544,43 +544,43 @@ python3 -u -m paddle.distributed.launch \ - *使用方法*:传入参数即可`input_dir="1.0 dateset_a/prefix 2.0 dataset_b/prefix"` - **注意**:如果文件夹中只有一份数据如`data/wudao_200g_0703_ids.npy data/wudao_200g_0703_idx.npz`,可以直接设置`input_dir=./data`为输入目录即可。如果需要设定多份数据集,必须写上数据集前缀,如`input_dir="1.0 data/wudao_200g_0703 1.0 data2/clue_corpus_train_0629"`。写前缀即可,不要加上后面类似`_ids.npy _idx.npz`的尾缀。 - **稳定可复现** - - *简介*:MLM任务具有一定随机性,需要随机mask数据。本数据流通过固定每一个step数据的随机种子,实验数据流稳定可复现。 + - *简介*:MLM 任务具有一定随机性,需要随机 mask 数据。本数据流通过固定每一个 step 数据的随机种子,实验数据流稳定可复现。 - *使用方法*: 传入`seed`参数即可,修改参数后会重新生成 index 数据,打乱数据顺序。 - **快加载** - - *简介*:数据文件使用mmap读取,避免直接将数据加载到内存,加载数百GB文件几乎不耗时。 + - *简介*:数据文件使用 mmap 读取,避免直接将数据加载到内存,加载数百 GB 文件几乎不耗时。 - **断点重启** - - *简介*:用户可以单独设置,`checkpoint_steps` 参数可设置较小,重启训练默认加载最新checkpoint。 + - *简介*:用户可以单独设置,`checkpoint_steps` 参数可设置较小,重启训练默认加载最新 checkpoint。 - 断点数据自动恢复,学习率等参数也自动恢复。 - **注意:** 此`checkpoint_steps`参数仅保留最后一个`checkpoint`到`model_last`文件夹,默认每次覆盖。用户需要永久保存参数,请设置`save_steps`。建议可以设置`checkpoint_steps`为需要间隔训练半小时、一小时左右的时间,一旦环境故障,可以获取到最新的`checkpoint`。 ### 3.4 观察评估 -- **训练过程观察**:VisualDL可视化日志记录 - - 日志展示为全局loss,波动小。 - - 记录混合精度,loss_scaling等信息,方便用户debug。 - - 对模型结构,配置参数,paddle版本信息进行记录,方便复现环境 +- **训练过程观察**:VisualDL 可视化日志记录 + - 日志展示为全局 loss,波动小。 + - 记录混合精度,loss_scaling 等信息,方便用户 debug。 + - 对模型结构,配置参数,paddle 版本信息进行记录,方便复现环境
-- **下游任务评估**:CLUE Benchmark搜索评估参数效果 +- **下游任务评估**:CLUE Benchmark 搜索评估参数效果 - 使用[批量启动-grid-search](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/legacy/examples/benchmark/clue#%E6%89%B9%E9%87%8F%E5%90%AF%E5%8A%A8-grid-search),可以进行批量搜索任务 - - 注意,这里使用的是训练中的checkpoint进行评估,可以直接试着 评估待评估的参数为,所在的路径地址,即如 `python grid_seach.py output/ernie-base-outdir/model_100000` 之类的checkpoint地址。 + - 注意,这里使用的是训练中的 checkpoint 进行评估,可以直接试着 评估待评估的参数为,所在的路径地址,即如 `python grid_seach.py output/ernie-base-outdir/model_100000` 之类的 checkpoint 地址。 ## 4. 训练效果 -**训练效果方面**,我们release了 base、large两个模型。均取得了较好的预训练效果。 +**训练效果方面**,我们 release 了 base、large 两个模型。均取得了较好的预训练效果。 ### 4.1 ERNIE 1.0-Base-zh-cw 模型 -使用CLUE,WuDao共计400GB的语料,batch_size 1024, 训练 400w step,即可训练得到`ernie-3.0-base-zh`类似的模型效果。相关模型参数,开源为`ernie-1.0-base-zh-cw`,用户加载即可使用。使用CLUE benchmark 对最优超参数进行GradSearch搜索: +使用 CLUE,WuDao 共计400GB 的语料,batch_size 1024, 训练 400w step,即可训练得到`ernie-3.0-base-zh`类似的模型效果。相关模型参数,开源为`ernie-1.0-base-zh-cw`,用户加载即可使用。使用 CLUE benchmark 对最优超参数进行 GradSearch 搜索: Model | Arch | CLUE AVG | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUE WSC2020 | CSL | CMRC | CHID | C3 -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | @@ -594,7 +594,7 @@ ERNIE 1.0-Base-zh | 12L768H | 74.17 | 74.84 | 58.91 | 62.25 | 81.68 | ### 4.2 ERNIE 1.0-Large-zh-cw 模型 -除了base模型外,我们还训练了large模型。命名为`ernie-1.0-large-zh-cw`。使用开源语料,batch_size 512, 训练 400w step,训练去除SOP任务,只保留MLM损失,使用CLUE benchmark 对最优超参数进行GradSearch搜索: +除了 base 模型外,我们还训练了 large 模型。命名为`ernie-1.0-large-zh-cw`。使用开源语料,batch_size 512, 训练 400w step,训练去除 SOP 任务,只保留 MLM 损失,使用 CLUE benchmark 对最优超参数进行 GradSearch 搜索: Model | Arch | CLUE AVG | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUE WSC2020 | CSL | CMRC | CHID | C3 -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | @@ -607,7 +607,7 @@ RoBERTa-wwm-ext-large | 24L1024H | 76.61 | 76.00 | 59.33 | 62.02 | 8 ## 5. 参考文献 -感谢CLUE,WuDao提供的开源文本语料,主要数据流部分参考自[Megatron](https://github.com/NVIDIA/Megatron-LM),参考资料: +感谢 CLUE,WuDao 提供的开源文本语料,主要数据流部分参考自[Megatron](https://github.com/NVIDIA/Megatron-LM),参考资料: - Xu, L., Zhang, X. and Dong, Q., 2020. CLUECorpus2020: A large-scale Chinese corpus for pre-training language model. arXiv preprint arXiv:2003.01355. - Yuan, S., Zhao, H., Du, Z., Ding, M., Liu, X., Cen, Y., Zou, X., Yang, Z. and Tang, J., 2021. Wudaocorpora: A super large-scale chinese corpora for pre-training language models. AI Open, 2, pp.65-68. - https://github.com/CLUEbenchmark/CLUECorpus2020 diff --git a/llm/README.md b/llm/README.md index e0c4cb95d04e..1708b89e0ced 100644 --- a/llm/README.md +++ b/llm/README.md @@ -81,7 +81,7 @@ python -u -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" run_pretrain.py 注意: -1. 建议使用 paddle develop 版本训练,需要安装`pip install tool_helpers visualdl==2.5.3`等相关缺失 whl 包 +1. 建议使用 paddle develop 版本训练,需要安装`pip install fast_dataindex visualdl==2.5.3`等相关缺失 whl 包 2. `use_flash_attention` 需要在 A100机器开启,建议使用 cuda11.8环境。 3. `use_fused_rms_norm` 需要安装自定义算子。如果安装后仍然找不到算子,需要额外设置 PYTHONPATH 4. `continue_training` 表示从现有的预训练模型加载训练。7b 模型初始 loss 大概为2.xx, 随机初始化模型 loss 从11.x 左右下降。 diff --git a/llm/docs/pretrain.rst b/llm/docs/pretrain.rst index 4c746f2ea3a6..94bb02c28b61 100644 --- a/llm/docs/pretrain.rst +++ b/llm/docs/pretrain.rst @@ -76,7 +76,7 @@ git clone 代码到本地,即可开始。 注意: -1. 建议使用paddle develop版本训练,需要安装 ``pip install tool_helpers visualdl==2.5.3`` 等相关缺失whl包。 +1. 建议使用paddle develop版本训练,需要安装 ``pip install fast_dataindex visualdl==2.5.3`` 等相关缺失whl包。 2. ``use_flash_attention`` 需要在A100机器开启,建议使用cuda11.8环境。 3. ``use_fused_rms_norm`` 需要安装 `此目录