diff --git a/legacy/model_zoo/ernie-1.0/README.md b/legacy/model_zoo/ernie-1.0/README.md index d99c90fa1701..b659864b20ab 100644 --- a/legacy/model_zoo/ernie-1.0/README.md +++ b/legacy/model_zoo/ernie-1.0/README.md @@ -10,7 +10,7 @@ - [2.3 预训练模型贡献](#预训练模型贡献) - [3. 下游任务微调](#下游任务微调) - [3.1 序列分类](#序列分类) - - [3.2 Token分类](#序列分类) + - [3.2 Token 分类](#序列分类) - [3.3 阅读理解](#阅读理解) - [4. 预测部署](#预测部署) - [5. 参考文献](#参考文献) @@ -21,11 +21,11 @@ ## 1. 模型简介 -ERNIE是百度开创性提出的基于知识增强的持续学习语义理解框架,它将大数据预训练与多源丰富知识相结合,通过持续学习技术,不断吸收海量文本数据中词汇、结构、语义等方面的知识,实现模型效果不断进化。 +ERNIE 是百度开创性提出的基于知识增强的持续学习语义理解框架,它将大数据预训练与多源丰富知识相结合,通过持续学习技术,不断吸收海量文本数据中词汇、结构、语义等方面的知识,实现模型效果不断进化。 -ERNIE在情感分析、文本匹配、自然语言推理、词法分析、阅读理解、智能问答等16个公开数据集上全面显著超越世界领先技术,在国际权威的通用语言理解评估基准GLUE上,得分首次突破90分,获得全球第一。 -相关创新成果也被国际顶级学术会议AAAI、IJCAI收录。 -同时,ERNIE在工业界得到了大规模应用,如搜索引擎、新闻推荐、广告系统、语音交互、智能客服等。 +ERNIE 在情感分析、文本匹配、自然语言推理、词法分析、阅读理解、智能问答等16个公开数据集上全面显著超越世界领先技术,在国际权威的通用语言理解评估基准 GLUE 上,得分首次突破90分,获得全球第一。 +相关创新成果也被国际顶级学术会议 AAAI、IJCAI 收录。 +同时,ERNIE 在工业界得到了大规模应用,如搜索引擎、新闻推荐、广告系统、语音交互、智能客服等。 ERNIE 通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。相较于 BERT 学习原始语言信号,ERNIE 直接对先验语义知识单元进行建模,增强了模型语义表示能力。 @@ -41,9 +41,9 @@ Learnt by ERNIE:[mask] [mask] [mask] 是黑龙江的省会,国际 [mask] [ma **项目特色** - **中文预训练** - 提供了完整中文预训练流程,从词表构造、数据处理、任务训练,到下游任务。 - - 提供中文Whole Word Mask,支持文本动态Mask。 + - 提供中文 Whole Word Mask,支持文本动态 Mask。 - **数据流程**, - - 数据预处理流程高效,40分钟即可完成14G ERNIE数据制作。 + - 数据预处理流程高效,40分钟即可完成14G ERNIE 数据制作。 - 数据稳定可复现,多数据集即插即用。 - **分布式训练**, - 支持多机多卡,支持混合精度、重计算、梯度累积等功能。 @@ -87,30 +87,30 @@ Learnt by ERNIE:[mask] [mask] [mask] 是黑龙江的省会,国际 [mask] [ma ### 1.2 环境依赖 -- tool_helpers +- fast_dataindex - visualdl - pybind11 -安装命令 `pip install visualdl pybind11 tool_helpers` +安装命令 `pip install visualdl pybind11 fast_dataindex` ## 2. 中文预训练 -ERNIE预训练采用的是MLM(Mask Language Model)的训练方式,采用WWM(Whole Word Mask)方式,对于完整语义单元的Token,会同时进行Mask。整体的训练损失loss是mlm_loss + sop_loss。 +ERNIE 预训练采用的是 MLM(Mask Language Model)的训练方式,采用 WWM(Whole Word Mask)方式,对于完整语义单元的 Token,会同时进行 Mask。整体的训练损失 loss 是 mlm_loss + sop_loss。 ERNIE 中文预训练更详细的介绍文档请可以参见[ERNIE 中文预训练介绍](./pretraining_introduction.md)。 本样例为用户提供了高效的训练流程, -- **支持动态文本mask**: 用户可以根据自己的需求,灵活修改mask方式。具体可以参考修改`data_tools/dataset_utils.py`中`create_masked_lm_predictions`函数。 -- **支持自动断点训练重启恢复**。 用户可以设置`checkpoint_steps`,间隔`checkpoint_steps`数,即保留最新的checkpoint到`model_last`文件夹。重启训练时,程序默认从最新checkpoint重启训练,学习率、数据集都可以恢复到checkpoint时候的状态。 +- **支持动态文本 mask**: 用户可以根据自己的需求,灵活修改 mask 方式。具体可以参考修改`data_tools/dataset_utils.py`中`create_masked_lm_predictions`函数。 +- **支持自动断点训练重启恢复**。 用户可以设置`checkpoint_steps`,间隔`checkpoint_steps`数,即保留最新的 checkpoint 到`model_last`文件夹。重启训练时,程序默认从最新 checkpoint 重启训练,学习率、数据集都可以恢复到 checkpoint 时候的状态。 ### 2.1 小规模语料预训练: 14GB - CLUECorpusSmall -下面是使用CLUECorpusSmall 14G文本进行预训练的流程: +下面是使用 CLUECorpusSmall 14G 文本进行预训练的流程:
CLUECorpusSmall 数据准备 @@ -125,11 +125,11 @@ unzip news2016zh_corpus.zip -d clue_corpus_small_14g/news2016zh_corpus unzip webText2019zh_corpus.zip -d clue_corpus_small_14g/webText2019zh_corpus unzip wiki2019zh_corpus.zip -d clue_corpus_small_14g/wiki2019zh_corpus ``` -将txt文件转换为jsonl格式 +将 txt 文件转换为 jsonl 格式 ``` python preprocess/trans_to_json.py --input_path ./clue_corpus_small_14g --output_path clue_corpus_small_14g.jsonl ``` -现在我们得到了jsonl格式的数据集,下面是针对训练任务的数据集应用,此处以ernie为例。 +现在我们得到了 jsonl 格式的数据集,下面是针对训练任务的数据集应用,此处以 ernie 为例。 ``` python -u preprocess/create_pretraining_data.py \ --model_name ernie-1.0-base-zh \ @@ -159,8 +159,8 @@ clue_corpus_small_14g_20220104.idx #### 开始训练 -将制作好的数据`clue_corpus_small_14g_20220104.bin,clue_corpus_small_14g_20220104.idx`移动到input_dir中,即可开始训练。 -这里以8卡GPU训练为例任务脚本为例: +将制作好的数据`clue_corpus_small_14g_20220104.bin,clue_corpus_small_14g_20220104.idx`移动到 input_dir 中,即可开始训练。 +这里以8卡 GPU 训练为例任务脚本为例: ``` python -u -m paddle.distributed.launch \ --gpus "0,1,2,3,4,5,6,7" \ @@ -193,7 +193,7 @@ python -u -m paddle.distributed.launch \ --share_folder false \ ``` -使用8卡MLU训练示例: +使用8卡 MLU 训练示例: ``` python -u -m paddle.distributed.launch \ --mlus "0,1,2,3,4,5,6,7" \ @@ -227,35 +227,35 @@ python -u -m paddle.distributed.launch \ ``` 其中参数释义如下: -- `model_name_or_path` 要训练的模型或者之前训练的checkpoint。 -- `tokenizer_name_or_path` 模型词表文件所在的文件夹,或者PaddleNLP内置tokenizer的名字。 -- `continue_training` 默认false,模型从随机初始化,开始训练。如果为True,从已有的预训练权重加载,开始训练。如果为True, 训练初始loss 为2.x 是正常loss,如果未False,随机初始化,初始loss一般为10+。 +- `model_name_or_path` 要训练的模型或者之前训练的 checkpoint。 +- `tokenizer_name_or_path` 模型词表文件所在的文件夹,或者 PaddleNLP 内置 tokenizer 的名字。 +- `continue_training` 默认 false,模型从随机初始化,开始训练。如果为 True,从已有的预训练权重加载,开始训练。如果为 True, 训练初始 loss 为2.x 是正常 loss,如果未 False,随机初始化,初始 loss 一般为10+。 - `input_dir` 指定输入文件,可以使用目录,指定目录时将包括目录中的所有文件。 - `data_impl` 指定输入文件数据制作类型,默认为`mmap`,可指定`mmap`或`lazy`,`mmap`格式在读入数据时会建立内存映射,`lazy`格式在读入数据时直接从文件读取。 - `output_dir` 指定输出文件。 -- `split` 划分数据集为train、valid、test的比例。整个数据集会按照这个比例划分数据。默认1/1000的数据为test,当样本数太少时,请修改此比例。 +- `split` 划分数据集为 train、valid、test 的比例。整个数据集会按照这个比例划分数据。默认1/1000的数据为 test,当样本数太少时,请修改此比例。 - `max_seq_len` 输入文本序列的长度。 -- `micro_batch_size` 单卡batch size大小,比如此处单卡bs=64, 采用8卡训练`global_batch_size=64*8=512`。 +- `micro_batch_size` 单卡 batch size 大小,比如此处单卡 bs=64, 采用8卡训练`global_batch_size=64*8=512`。 - `use_amp` 开启混合精度策略。 -- `fp16_opt_level` 混合精度策略,支持O1 自动混合精度,O2 pure fp16精度训练。 +- `fp16_opt_level` 混合精度策略,支持 O1 自动混合精度,O2 pure fp16精度训练。 - `max_lr` 训练学习率。 - `min_lr` 学习率衰减的最小值。 - `max_steps` 最大训练步数。 - `save_steps` 保存模型间隔。默认保存地址格式为`output_dir/model_50000`(5w 步时的权重)。 -- `checkpoint_steps` 模型checkpoint间隔,用于模型断点重启训练。默认地址为`output_dir/model_last`. +- `checkpoint_steps` 模型 checkpoint 间隔,用于模型断点重启训练。默认地址为`output_dir/model_last`. - `weight_decay` 权重衰减参数。 -- `warmup_rate` 学习率warmup参数。 +- `warmup_rate` 学习率 warmup 参数。 - `grad_clip` 梯度裁剪范围。 - `logging_freq` 日志输出间隔。 -- `num_workers` DataLoader采样进程,当数据输入为瓶颈时,可尝试提高采样进程数目。 +- `num_workers` DataLoader 采样进程,当数据输入为瓶颈时,可尝试提高采样进程数目。 - `eval_freq` 模型评估间隔。 -- `device` 训练设备,默认为GPU。 -- `share_folder` 多机训练时,如果多机input_dir为挂载的同一个nfs网络位置,可以开启次选项,多机共享同一份数据。 +- `device` 训练设备,默认为 GPU。 +- `share_folder` 多机训练时,如果多机 input_dir 为挂载的同一个 nfs 网络位置,可以开启次选项,多机共享同一份数据。 注: -- 训练支持断点重启,直接启动即可,程序会找到最新的checkpoint(`output_dir/model_last`),开始重启训练。请确保重启的训练配置与之前相同。 -- visualdl的日志在 `./output/ernie-1.0-dp8-gb512/train_log/xxx` 中。 +- 训练支持断点重启,直接启动即可,程序会找到最新的 checkpoint(`output_dir/model_last`),开始重启训练。请确保重启的训练配置与之前相同。 +- visualdl 的日志在 `./output/ernie-1.0-dp8-gb512/train_log/xxx` 中。
@@ -265,9 +265,9 @@ python -u -m paddle.distributed.launch \ #### CLUECorpusSmall 数据集训练效果 -使用创建好的训练clue_corpus_small_14g数据集。使用本训练脚本, batch_size=512, max_steps=100w,[详细训练日志](https://www.paddlepaddle.org.cn/paddle/visualdl/service/app/index?id=3fddf650db14b9319f9dc3a91dfe4ac6) +使用创建好的训练 clue_corpus_small_14g 数据集。使用本训练脚本, batch_size=512, max_steps=100w,[详细训练日志](https://www.paddlepaddle.org.cn/paddle/visualdl/service/app/index?id=3fddf650db14b9319f9dc3a91dfe4ac6) -最终训练loss结果: +最终训练 loss 结果: image @@ -281,9 +281,9 @@ python -u -m paddle.distributed.launch \ 训练集 lm_loss=2.48 左右, 验证集 lm_loss=2.38 左右。 -使用训练好的模型参数,在下游任务重进行finetune。这里报告部分数据集上的finetune结果: +使用训练好的模型参数,在下游任务重进行 finetune。这里报告部分数据集上的 finetune 结果: -CLUE评估结果: +CLUE 评估结果: Model | Arch | CLUE AVG | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL -- | -- | -- | -- | -- | -- | -- | -- | -- | -- @@ -292,8 +292,8 @@ ERNIE-1.0 Base | 12L768H | 73.78 | 74.95 | 58.73 | 61.37 | 81.77 | 75.46 | 81.2 ERINE-1.0-cluecorpussmall | 12L768H | 73.24(-0.54) | 74.26 | 57.24 | 60.79 | 81.15 | 76.64 | 81.25 | 81.33 注: -- `ERNIE-1.0 Base`官方预训练参数,采用的训练配置是batch_size=1024、steps=100w, -- `ERINE-1.0-cluecorpussmall`复现版本,采用的是batch_size=512、steps=100w。 +- `ERNIE-1.0 Base`官方预训练参数,采用的训练配置是 batch_size=1024、steps=100w, +- `ERINE-1.0-cluecorpussmall`复现版本,采用的是 batch_size=512、steps=100w。 @@ -301,7 +301,7 @@ ERINE-1.0-cluecorpussmall | 12L768H | 73.24(-0.54) | 74.26 | 57.24 | 60.79 | 81. ### 2.2 大规模语料预训练: 400GB - CLUE & WuDao -PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao 总共400GB,提供大规模语料训练教程,让用户可以从零开始构建,基于大规模语料,训练预训练模型。 +PaddleNLP 致力于预训练开源工作,使用开源中文语料 CLUE、WuDao 总共400GB,提供大规模语料训练教程,让用户可以从零开始构建,基于大规模语料,训练预训练模型。 [ERNIE 中文预训练介绍](./pretraining_introduction.md),从数据下载,词表制作,数据转化,模型训练,所有流程,完全开源开放,可复现。 并训练发布开源最优的模型参数。 @@ -310,7 +310,7 @@ PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao 数据下载,数据转化部分,请参见[数据预处理文档](../../../llm/tools/preprocess/README.md), - [CLUECorpus2020数据处理](../../../llm/tools/preprocess/docs/CLUECorpus2020.md) -- [WuDaoCorpusBase数据处理](../../../llm/tools/preprocess/docs/WuDaoCorpusBase.md) +- [WuDaoCorpusBase 数据处理](../../../llm/tools/preprocess/docs/WuDaoCorpusBase.md) 如果需要定制化词表,词表制作部分请参考[词表制作](./vocab/README.md)。 @@ -321,9 +321,9 @@ PaddleNLP致力于预训练开源工作,使用开源中文语料CLUE、WuDao **环境配置** -- PYTHONPATH 设置为当前目录(适合paddlenlp develop运行) -- 设置了一些FLAGS,包括增强报错,动态图Flag,提高矩阵乘法精度。 -- 多机情况下,可以设置`NCCL_SOCKET_IFNAME`指明NCCL使用的通信网口。 +- PYTHONPATH 设置为当前目录(适合 paddlenlp develop 运行) +- 设置了一些 FLAGS,包括增强报错,动态图 Flag,提高矩阵乘法精度。 +- 多机情况下,可以设置`NCCL_SOCKET_IFNAME`指明 NCCL 使用的通信网口。
环境配置脚本 @@ -345,7 +345,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"`即可。
@@ -379,7 +379,7 @@ https://paddlenlp.bj.bcebos.com/models/transformers/data_tools/wudao_200g_sample 可以指定`tokenizer_name_or_path=ernie-3.0-bash-zh`,`input_dir=./data` 用下面的脚本训练。 -这里启动的是单机8卡任务,整体全局的batch_size 512 (64*8)。如果指定ips参数,进行多机运行,如 `python3 -u -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" --ips 192.168.1.101,192.168.1.101 ` +这里启动的是单机8卡任务,整体全局的 batch_size 512 (64*8)。如果指定 ips 参数,进行多机运行,如 `python3 -u -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" --ips 192.168.1.101,192.168.1.101 ` ```shell python3 -u -m paddle.distributed.launch \ --gpus "0,1,2,3,4,5,6,7" \ @@ -418,30 +418,30 @@ python3 -u -m paddle.distributed.launch \ 其中参数释义如下: -- `model_name_or_path` 要训练的模型或者之前训练的checkpoint。 -- `tokenizer_name_or_path` 模型词表文件所在的文件夹(对于ernie,词表文件名一般命名为vocab.txt),或者PaddleNLP内置tokenizer的名字。 -- `continue_training` 默认false,模型从随机初始化,开始训练。如果为True,从已有的预训练权重加载,开始训练。如果为True, 训练初始loss 为2.x 是正常loss,如果未False,随机初始化,初始loss一般为10+。 +- `model_name_or_path` 要训练的模型或者之前训练的 checkpoint。 +- `tokenizer_name_or_path` 模型词表文件所在的文件夹(对于 ernie,词表文件名一般命名为 vocab.txt),或者 PaddleNLP 内置 tokenizer 的名字。 +- `continue_training` 默认 false,模型从随机初始化,开始训练。如果为 True,从已有的预训练权重加载,开始训练。如果为 True, 训练初始 loss 为2.x 是正常 loss,如果未 False,随机初始化,初始 loss 一般为10+。 - `input_dir` 指定输入文件,可以使用目录,指定目录时将包括目录中的所有文件。 - `output_dir` 指定输出文件。 -- `split` 划分数据集为train、valid、test的比例。整个数据集会按照这个比例划分数据。默认`split=949,50,1`, 使用1/1000的数据为test,当样本数太少时,增大测试的样本数目。 +- `split` 划分数据集为 train、valid、test 的比例。整个数据集会按照这个比例划分数据。默认`split=949,50,1`, 使用1/1000的数据为 test,当样本数太少时,增大测试的样本数目。 - `max_seq_len` 输入文本序列的长度,默认值`512`。 -- `binary_head` 是否使用SOP(Sentences Order Predicet) loss,默认为 True,使用此loss。如果用户句子语料很短,无法组合成句子对,请设置此参数为`false`。 -- `micro_batch_size` 单卡batch size大小,比如此处单卡bs=64, 采用8卡训练`global_batch_size=64*8=512`。 +- `binary_head` 是否使用 SOP(Sentences Order Predicet) loss,默认为 True,使用此 loss。如果用户句子语料很短,无法组合成句子对,请设置此参数为`false`。 +- `micro_batch_size` 单卡 batch size 大小,比如此处单卡 bs=64, 采用8卡训练`global_batch_size=64*8=512`。 - `use_amp` 开启混合精度策略。 -- `fp16_opt_level` 混合精度策略,支持O1 自动混合精度,O2 pure fp16精度训练。 +- `fp16_opt_level` 混合精度策略,支持 O1 自动混合精度,O2 pure fp16精度训练。 - `max_lr` 训练学习率。 - `min_lr` 学习率衰减到最小值后,学习率将一直保持为`min_lr`。 -- `max_steps` 最大训练步数。训练不支持通过`epoch`控制,第一次制造数据index时候,日志会显示数据会被计算的epoch数,请注意查看。 +- `max_steps` 最大训练步数。训练不支持通过`epoch`控制,第一次制造数据 index 时候,日志会显示数据会被计算的 epoch 数,请注意查看。 - `save_steps` 保存模型间隔。默认保存地址格式为`output_dir/model_50000`(5w 步时的权重)。 -- `checkpoint_steps` 模型checkpoint间隔,用于模型断点重启训练。默认地址为`output_dir/model_last`. +- `checkpoint_steps` 模型 checkpoint 间隔,用于模型断点重启训练。默认地址为`output_dir/model_last`. - `weight_decay` 权重衰减参数。 -- `warmup_rate` 学习率warmup参数。 +- `warmup_rate` 学习率 warmup 参数。 - `grad_clip` 梯度裁剪范围。 - `logging_freq` 日志输出间隔。 -- `num_workers` DataLoader采样进程,当数据输入为瓶颈时,可尝试提高采样进程数目。 +- `num_workers` DataLoader 采样进程,当数据输入为瓶颈时,可尝试提高采样进程数目。 - `eval_freq` 模型评估间隔。 -- `device` 训练设备,默认为GPU。 -- `share_folder` 多机训练时,如果多机`input_dir`为挂载的同一个nfs网络位置,可以开启次选项,多机共享同一份数据。(每次运行,会制作训练的index数据,如果为挂载的统一nfs位置,则一台机器制作数据即可,否则每台机器都需要制作) +- `device` 训练设备,默认为 GPU。 +- `share_folder` 多机训练时,如果多机`input_dir`为挂载的同一个 nfs 网络位置,可以开启次选项,多机共享同一份数据。(每次运行,会制作训练的 index 数据,如果为挂载的统一 nfs 位置,则一台机器制作数据即可,否则每台机器都需要制作)

@@ -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文件手动替换一些` -> [PAD]`之类的special_tokens,即可产出词表。 +对处理好的 vocab 文件手动替换一些` -> [PAD]`之类的 special_tokens,即可产出词表。 ## 3. 开始训练 -使用开源中文语料CLUE、WuDao 总共400GB,提供上面提供的大规模语料数据集制作教程。接下来,看是模型训练。 +使用开源中文语料 CLUE、WuDao 总共400GB,提供上面提供的大规模语料数据集制作教程。接下来,看是模型训练。

@@ -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"`即可。
@@ -336,7 +336,7 @@ vocab_dir="${base_nfs}/" ```
-**启动训练**:这里启动的是单机8卡任务,整体全局的batch_size 512 (64*8)。如果指定ips参数,进行多机运行,如 `python3 -u -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" --ips 192.168.1.101,192.168.1.101 ` +**启动训练**:这里启动的是单机8卡任务,整体全局的 batch_size 512 (64*8)。如果指定 ips 参数,进行多机运行,如 `python3 -u -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" --ips 192.168.1.101,192.168.1.101 ` ```shell python3 -u -m paddle.distributed.launch \ @@ -376,30 +376,30 @@ python3 -u -m paddle.distributed.launch \ 其中参数释义如下: -- `model_name_or_path` 要训练的模型或者之前训练的checkpoint。 -- `tokenizer_name_or_path` 模型词表文件所在的文件夹(对于ernie,词表文件名一般命名为vocab.txt),或者PaddleNLP内置tokenizer的名字。 -- `continue_training` 默认false,模型从随机初始化,开始训练。如果为True,从已有的预训练权重加载,开始训练。如果为True, 训练初始loss 为2.x 是正常loss,如果未False,随机初始化,初始loss一般为10+。 +- `model_name_or_path` 要训练的模型或者之前训练的 checkpoint。 +- `tokenizer_name_or_path` 模型词表文件所在的文件夹(对于 ernie,词表文件名一般命名为 vocab.txt),或者 PaddleNLP 内置 tokenizer 的名字。 +- `continue_training` 默认 false,模型从随机初始化,开始训练。如果为 True,从已有的预训练权重加载,开始训练。如果为 True, 训练初始 loss 为2.x 是正常 loss,如果未 False,随机初始化,初始 loss 一般为10+。 - `input_dir` 指定输入文件,可以使用目录,指定目录时将包括目录中的所有文件。 - `output_dir` 指定输出文件。 -- `split` 划分数据集为train、valid、test的比例。整个数据集会按照这个比例划分数据。默认`split=949,50,1`, 使用1/1000的数据为test,当样本数太少时,增大测试的样本数目。 +- `split` 划分数据集为 train、valid、test 的比例。整个数据集会按照这个比例划分数据。默认`split=949,50,1`, 使用1/1000的数据为 test,当样本数太少时,增大测试的样本数目。 - `max_seq_len` 输入文本序列的长度,默认值`512`。 -- `binary_head` 是否使用SOP(Sentences Order Predicet) loss,默认为 True,使用此loss。如果用户句子语料很短,无法组合成句子对,请设置此参数为`false`。 -- `micro_batch_size` 单卡batch size大小,比如此处单卡bs=64, 采用8卡训练`global_batch_size=64*8=512`。 +- `binary_head` 是否使用 SOP(Sentences Order Predicet) loss,默认为 True,使用此 loss。如果用户句子语料很短,无法组合成句子对,请设置此参数为`false`。 +- `micro_batch_size` 单卡 batch size 大小,比如此处单卡 bs=64, 采用8卡训练`global_batch_size=64*8=512`。 - `use_amp` 开启混合精度策略。 -- `fp16_opt_level` 混合精度策略,支持O1 自动混合精度,O2 pure fp16精度训练。 +- `fp16_opt_level` 混合精度策略,支持 O1 自动混合精度,O2 pure fp16精度训练。 - `max_lr` 训练学习率。 - `min_lr` 学习率衰减到最小值后,学习率将一直保持为`min_lr`。 -- `max_steps` 最大训练步数。训练不支持通过`epoch`控制,第一次制造数据index时候,日志会显示数据会被计算的epoch数,请注意查看。 +- `max_steps` 最大训练步数。训练不支持通过`epoch`控制,第一次制造数据 index 时候,日志会显示数据会被计算的 epoch 数,请注意查看。 - `save_steps` 保存模型间隔。默认保存地址格式为`output_dir/model_50000`(5w 步时的权重)。 -- `checkpoint_steps` 模型checkpoint间隔,用于模型断点重启训练。默认地址为`output_dir/model_last`. +- `checkpoint_steps` 模型 checkpoint 间隔,用于模型断点重启训练。默认地址为`output_dir/model_last`. - `weight_decay` 权重衰减参数。 -- `warmup_rate` 学习率warmup参数。 +- `warmup_rate` 学习率 warmup 参数。 - `grad_clip` 梯度裁剪范围。 - `logging_freq` 日志输出间隔。 -- `num_workers` DataLoader采样进程,当数据输入为瓶颈时,可尝试提高采样进程数目。 +- `num_workers` DataLoader 采样进程,当数据输入为瓶颈时,可尝试提高采样进程数目。 - `eval_freq` 模型评估间隔。 -- `device` 训练设备,默认为GPU。 -- `share_folder` 多机训练时,如果多机`input_dir`为挂载的同一个nfs网络位置,可以开启次选项,多机共享同一份数据。(每次运行,会制作训练的index数据,如果为挂载的统一nfs位置,则一台机器制作数据即可,否则每台机器都需要制作) +- `device` 训练设备,默认为 GPU。 +- `share_folder` 多机训练时,如果多机`input_dir`为挂载的同一个 nfs 网络位置,可以开启次选项,多机共享同一份数据。(每次运行,会制作训练的 index 数据,如果为挂载的统一 nfs 位置,则一台机器制作数据即可,否则每台机器都需要制作) 继续训练 @@ -458,27 +458,27 @@ python3 -u -m paddle.distributed.launch \

- - *使用方法*: 此开关由 `binary_head` 选项开启,`binary_head=True`添加sop loss, `binary_head=False` 关闭 sop loss。 + - *使用方法*: 此开关由 `binary_head` 选项开启,`binary_head=True`添加 sop loss, `binary_head=False` 关闭 sop loss。 - **注意:如果你使用的语料文本中,只有一句话,无法分为多个句子段落,请设置 `binary_head=False`。否则,不符合要求的数据默认被删去,导致可训练的数据过小。** - 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数目。 - - 设置`short_seq_prob`, 控制长度小于max_seq_length的样本比例,默认值`short_seq_prob=0.1`。制作数据时候,会有相应比例的数据 最大长度会设置为 一个小于 max_seq_length 的随机值。 + - 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 数目。 + - 设置`short_seq_prob`, 控制长度小于 max_seq_length 的样本比例,默认值`short_seq_prob=0.1`。制作数据时候,会有相应比例的数据 最大长度会设置为 一个小于 max_seq_length 的随机值。 - 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。

- *使用方法*: 用户通过`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`` 需要安装 `此目录 `_ 下的自定义OP, `python setup.py install`。如果安装后仍然找不到算子,需要额外设置 ``PYTHONPATH``。 4. ``continue_training`` 表示从现有的预训练模型加载训练。7b模型初始loss大概为2.xx, 随机初始化模型loss从11.x左右下降。 diff --git a/llm/experimental/ernie-3.5-se/README.md b/llm/experimental/ernie-3.5-se/README.md index 14aa55b9efd5..60d509971a04 100644 --- a/llm/experimental/ernie-3.5-se/README.md +++ b/llm/experimental/ernie-3.5-se/README.md @@ -2,7 +2,7 @@ ## 1. 模型介绍 -我们采用了Attention和FFN并行的Parallel Transformer的实现方式,将FFN和Attention层进行并行计算。通过这样的设计,我们可以把Attention和FFN需要的线形层计算进行算子融合,降低kernel调用以及通讯次数,提升并行训练的效率。并且我们发现第一层的FFN和最后一层的Attn作用不大,因此采用了“掐头去尾”策略,将底层的FFN的计算量挪到模型的顶层,在同FLOPs下效果和传统Transformer结构一致,但有更好的训练速度和吞吐。 +我们采用了 Attention 和 FFN 并行的 Parallel Transformer 的实现方式,将 FFN 和 Attention 层进行并行计算。通过这样的设计,我们可以把 Attention 和 FFN 需要的线形层计算进行算子融合,降低 kernel 调用以及通讯次数,提升并行训练的效率。并且我们发现第一层的 FFN 和最后一层的 Attn 作用不大,因此采用了“掐头去尾”策略,将底层的 FFN 的计算量挪到模型的顶层,在同 FLOPs 下效果和传统 Transformer 结构一致,但有更好的训练速度和吞吐。 @@ -16,7 +16,7 @@
-* Rope Embedding+[随机位置编码](https://aclanthology.org/2023.acl-short.161):我们采用的旋转位置编码Rope,并且为了有较好的模型外推能力,我们保留了线形层的Bias。为了提供长文外推能力,我们通过随机间隔取Position Ids,让模型能够有训短推长的能力。 +* Rope Embedding+[随机位置编码](https://aclanthology.org/2023.acl-short.161):我们采用的旋转位置编码 Rope,并且为了有较好的模型外推能力,我们保留了线形层的 Bias。为了提供长文外推能力,我们通过随机间隔取 Position Ids,让模型能够有训短推长的能力。 @@ -27,7 +27,7 @@ 预训练数据制作参考[此处](../../tools/preprocess/docs/OpenWebText2.md) -为了方便用户运行测试本模型,本项目提供了处理好的100k条doc的训练样本: +为了方便用户运行测试本模型,本项目提供了处理好的100k 条 doc 的训练样本: ```shell wget https://bj.bcebos.com/paddlenlp/models/transformers/ernie/data/ernie_openwebtext_100k_ids.npy wget https://bj.bcebos.com/paddlenlp/models/transformers/ernie/data/ernie_openwebtext_100k_idx.npz @@ -86,11 +86,11 @@ python -u -m paddle.distributed.launch \ --device "gpu" ``` 注意: -1. 需要paddle develop版本训练,需要安装`pip install tool_helpers visualdl==2.5.3`等相关缺失whl包 -2. `use_flash_attention` 需要在A100机器开启,否则loss可能不正常(很快变成0.00x,非常小不正常)。建议使用cuda11.8环境。 +1. 需要 paddle develop 版本训练,需要安装`pip install fast_dataindex visualdl==2.5.3`等相关缺失 whl 包 +2. `use_flash_attention` 需要在 A100机器开启,否则 loss 可能不正常(很快变成0.00x,非常小不正常)。建议使用 cuda11.8环境。 3. `continue_training` 表示从现有的预训练模型加载训练,如果需要从头开始预训练模型,则设置为0。 -4. `use_fused_ln` 需要安装[此目录](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/legacy/model_zoo/gpt-3/external_ops)下的自定义OP, `python setup.py install`。如果安装后仍然找不到算子,需要额外设置PYTHONPATH -5. 当前脚本为sharding版本,需要4D并行训练(数据、sharding、张量、流水线并行)的用户,可另外调整相关参数。 +4. `use_fused_ln` 需要安装[此目录](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/legacy/model_zoo/gpt-3/external_ops)下的自定义 OP, `python setup.py install`。如果安装后仍然找不到算子,需要额外设置 PYTHONPATH +5. 当前脚本为 sharding 版本,需要4D 并行训练(数据、sharding、张量、流水线并行)的用户,可另外调整相关参数。 @@ -184,10 +184,10 @@ python finetune_generation.py \ - `do_train`: 是否训练模型。 - `do_eval`: 是否评估模型。 - `tensor_parallel_degree`: 模型并行数量。 -- `eval_with_do_generation`: 在评估的时候是否调用model.generate,默认为False。 +- `eval_with_do_generation`: 在评估的时候是否调用 model.generate,默认为 False。 - `lora`: 是否使用 LoRA 技术。 - `merge_weights`: 是否合并原始模型和 LoRA 模型的权重。 -- `lora_rank`: LoRA 算法中rank(秩)的值,默认为8。 +- `lora_rank`: LoRA 算法中 rank(秩)的值,默认为8。 - `lora_path`: LoRA 参数和配置路径,对 LoRA 参数进行初始化。 - `task_name`: 内置数据集任务名 - `data_name`: 内置数据集名,定义数据集名必须同时定义数据集任务名 diff --git a/llm/experimental/ernie-3.5-se/ernie_dataset.py b/llm/experimental/ernie-3.5-se/ernie_dataset.py index 120b439260c1..3f9f7d468d2b 100644 --- a/llm/experimental/ernie-3.5-se/ernie_dataset.py +++ b/llm/experimental/ernie-3.5-se/ernie_dataset.py @@ -122,7 +122,7 @@ def _build_indices(): dataset_index = np.zeros(self.size, dtype=np.uint8) dataset_sample_index = np.zeros(self.size, dtype=np.int64) - from tool_helpers import helpers + from fast_dataindex import helpers helpers.build_blending_indices( dataset_index, @@ -782,7 +782,7 @@ def _build_index_mappings( # Use C++ implementation for speed. # First compile and then import. # from megatron.data import helpers - from tool_helpers import helpers + from fast_dataindex import helpers assert doc_idx.dtype == np.int32 assert sizes.dtype == np.int32 diff --git a/llm/tools/preprocess/README.md b/llm/tools/preprocess/README.md index d6ffc3f4b7ea..f49af0ddf209 100644 --- a/llm/tools/preprocess/README.md +++ b/llm/tools/preprocess/README.md @@ -1,14 +1,14 @@ # PaddleNLP 预训练数据流程 -本示例致力于打造基于PaddleNLP预训练模型的最佳实践。 +本示例致力于打造基于 PaddleNLP 预训练模型的最佳实践。 我们将预训练数据过程划分为以下部分 -- 原始数据转换,原始文本转换为jsonl的json字符串格式。 -- 数据ID化,断句、分词、tokenize转化为token id格式。 -- 训练index文件生成,生成train、valid、test的每个样本索引。 -- token动态mask(可选),python 层实时mask文本。 +- 原始数据转换,原始文本转换为 jsonl 的 json 字符串格式。 +- 数据 ID 化,断句、分词、tokenize 转化为 token id 格式。 +- 训练 index 文件生成,生成 train、valid、test 的每个样本索引。 +- token 动态 mask(可选),python 层实时 mask 文本。 本目录下主要包含一下文件: ``` @@ -24,40 +24,40 @@ - tqdm - numpy - pybind11 - - tool_helpers + - fast_dataindex - lac (可选) - zstandard (可选) -安装命令`pip install tqdm numpy pybind11 tool_helpers lac zstandard`。另,部分功能需要`g++>=4.8`编译支持 +安装命令`pip install tqdm numpy pybind11 fast_dataindex lac zstandard`。另,部分功能需要`g++>=4.8`编译支持 -## 训练全流程数据Pipeline +## 训练全流程数据 Pipeline 飞桨是自主研发、功能完备、开源开放的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体 | 步骤 | 阶段                      | 数据格式 | 样例 | |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 0️⃣初始状态 | - | 原始数据:
**每个doc之间用空行间隔开**
- 中文,默认每句换行符,作为句子结束。
- 英文,默认使用nltk判断句子结束 | ```飞桨是功能完备、开源开放的产业级深度学习平台。```
```飞桨拥有核心训练和推理框架、基础模型库。```

```PaddleNLP是自然语言处理领域的优秀工具。``` | -| 1️⃣原始数据转换
`trans_to_json.py` | 预处理
输入:0️⃣初始状态
输出:jsonl | jsonl格式:每个doc对应一行json字符串 | ```{"text": "飞桨是功能完备、开源开放的产业级深度学习平台。飞桨拥有..."}```
```{"text": "PaddleNLP是自然语言..."}``` | -| ❇️(**可选**)数据中文分词
`words_segmentation.py` | 语料分词:中文WWM
输入:jsonl
输出:0️⃣初始状态 | 将jsonl格式的数据,恢复成分词后的原始格式数据
| ```飞桨 是 功能 完备、开源 开放的 产业级 深度学习 平台。```
```飞桨 拥有 核心 训练和推理 框架、基础 模型库。```

```PaddleNLP 是 自然语言处理领域 的 优秀工具。``` | -| 2️⃣数据ID化
`create_pretrain_data.py` | 预处理 | bin格式:数据id化后的token id
idx格式:数据句子、文章位置索引 | - | -| 3️⃣训练index文件生成 | 训练启动 | npy格式:
根据训练步数max_steps生成
train、valid、test的每个样本索引文件 | - | -| 4️⃣token动态mask(可选) | Dataset取数据 | 无 | - | +| 0️⃣初始状态 | - | 原始数据:
**每个 doc 之间用空行间隔开**
- 中文,默认每句换行符,作为句子结束。
- 英文,默认使用 nltk 判断句子结束 | ```飞桨是功能完备、开源开放的产业级深度学习平台。```
```飞桨拥有核心训练和推理框架、基础模型库。```

```PaddleNLP是自然语言处理领域的优秀工具。``` | +| 1️⃣原始数据转换
`trans_to_json.py` | 预处理
输入:0️⃣初始状态
输出:jsonl | jsonl 格式:每个 doc 对应一行 json 字符串 | ```{"text": "飞桨是功能完备、开源开放的产业级深度学习平台。飞桨拥有..."}```
```{"text": "PaddleNLP是自然语言..."}``` | +| ❇️(**可选**)数据中文分词
`words_segmentation.py` | 语料分词:中文 WWM
输入:jsonl
输出:0️⃣初始状态 | 将 jsonl 格式的数据,恢复成分词后的原始格式数据
| ```飞桨 是 功能 完备、开源 开放的 产业级 深度学习 平台。```
```飞桨 拥有 核心 训练和推理 框架、基础 模型库。```

```PaddleNLP 是 自然语言处理领域 的 优秀工具。``` | +| 2️⃣数据 ID 化
`create_pretrain_data.py` | 预处理 | bin 格式:数据 id 化后的 token id
idx 格式:数据句子、文章位置索引 | - | +| 3️⃣训练 index 文件生成 | 训练启动 | npy 格式:
根据训练步数 max_steps 生成
train、valid、test 的每个样本索引文件 | - | +| 4️⃣token 动态 mask(可选) | Dataset 取数据 | 无 | - | 注意: - **❇️(**可选**)数据中文分词** 是中文预训练做 WWM 的可选步骤 - 当你的数据比较少时,分词耗时较少,不需要分词步骤。直接在`create_pretrain_data.py`步骤中分词即可。 - - 目的是为了提前分词,加快后续数据ID转化步骤。 - - 如果这里输入的是 jsonl格式文件,最好为多文件,`trans_to_json.py` 时候开启`no-merge`选项。 + - 目的是为了提前分词,加快后续数据 ID 转化步骤。 + - 如果这里输入的是 jsonl 格式文件,最好为多文件,`trans_to_json.py` 时候开启`no-merge`选项。 - 当你的数据集比较大,或者需要尝试多次转换数据的时候,提前分词可以避免`create_pretrain_data.py`时每次都运行一次分词程序。 -- 转换后,需要重新进行步骤 1️⃣`原始数据转换 trans_to_json.py`,最后2️⃣`数据ID化`步骤设置`--cn_splited=True`参数。 -- 2️⃣`数据ID化`也可以在转化ID的同时,一起实现分词。不需要❇️`数据中文分词`步骤。 +- 转换后,需要重新进行步骤 1️⃣`原始数据转换 trans_to_json.py`,最后2️⃣`数据 ID 化`步骤设置`--cn_splited=True`参数。 +- 2️⃣`数据 ID 化`也可以在转化 ID 的同时,一起实现分词。不需要❇️`数据中文分词`步骤。 ## 数据教程汇总 -针对目前开源的数据集,PaddleNLP提供了详细的数据教程,点击对应数据集的链接,即可开始进行数据制作: +针对目前开源的数据集,PaddleNLP 提供了详细的数据教程,点击对应数据集的链接,即可开始进行数据制作: | 名称 | 文本类型 | 纯文本大小 | 适配模型 | |--------------------------------------------------|----------|------------|----------| @@ -68,7 +68,7 @@ ## 预训练详细准备 -下面以ziya-llama-13b-v1预训练为例,简要介绍一下预训练的全流程。 +下面以 ziya-llama-13b-v1预训练为例,简要介绍一下预训练的全流程。 ### 原始数据 首先下载样例数据: @@ -79,7 +79,7 @@ cd .. ``` ### 原始数据转换 jsonl 格式 -使用`trans_to_json.py`转化为json串格式,下面是脚本的使用说明 +使用`trans_to_json.py`转化为 json 串格式,下面是脚本的使用说明 ``` optional arguments: -h, --help show this help message and exit @@ -107,7 +107,7 @@ optional arguments: --no-shuffle Don't shuffle the file. 可选。默认不开启这个选项,默认对处理完进行shuffle。 ``` -根据说明,我们使用下面简单命令,可以得到`baike_sample.jsonl`文件。此处,我们对文章所有doc进行了shuffle。 +根据说明,我们使用下面简单命令,可以得到`baike_sample.jsonl`文件。此处,我们对文章所有 doc 进行了 shuffle。 ```shell python trans_to_json.py --input_path ./data --output_path baike_sample ``` @@ -121,8 +121,8 @@ head -1 baike_sample.jsonl 大的制约。中华人民共和国省份中,广东为GDP最高的第一强省,浙江为人均收入最高的第一富省。中国大陆、香港、澳门、台湾之间的经济联系在全球化的过程中日益紧密。\n"} ``` -### 数据ID化 -本部分,我们使用 `create_pretraining_data.py` 脚本将前面得到的 `baike_sample.jsonl` 进行tokenize id化处理。 +### 数据 ID 化 +本部分,我们使用 `create_pretraining_data.py` 脚本将前面得到的 `baike_sample.jsonl` 进行 tokenize id 化处理。 ``` optional arguments: -h, --help show this help message and exit @@ -213,11 +213,11 @@ python -u create_pretraining_data.py \ --log_interval 5 \ --workers 40 ``` -1. 如果您使用已经分好词的语料,可以设置 --cn_splited 为 True,同时指定--cn_split_dimer如空格。 -2. 使用自定义词表的话,请指定model_name为词表所在的文件夹地址。 +1. 如果您使用已经分好词的语料,可以设置 --cn_splited 为 True,同时指定--cn_split_dimer 如空格。 +2. 使用自定义词表的话,请指定 model_name 为词表所在的文件夹地址。 -若需要预处理的文件过大,该脚本所耗费的时间可能会很长。此时可以考虑将jsonl文件拆分为多个小文件,并行使用create_pretraining_data.py进行处理,得到多个.bin & .idx文件。 -之后使用如下merge脚本合并多个小的.bin & .idx文件。 +若需要预处理的文件过大,该脚本所耗费的时间可能会很长。此时可以考虑将 jsonl 文件拆分为多个小文件,并行使用 create_pretraining_data.py 进行处理,得到多个.bin & .idx 文件。 +之后使用如下 merge 脚本合并多个小的.bin & .idx 文件。 ``` python merge.py \ --input /root/data \ @@ -239,21 +239,21 @@ arguments: ``` ### 预训练开始 -得到了处理好的训练数据,就可以开始模型的预训练了。简单将预处理好的数据,拷贝到data目录,即可开始预训练。 +得到了处理好的训练数据,就可以开始模型的预训练了。简单将预处理好的数据,拷贝到 data 目录,即可开始预训练。 ```shell mkdir data mv ./preprocess/baike_sample* ./data ``` -* llama预训练请参考[预训练](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm)。 -* ernie预训练请参考[预训练](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/legacy/model_zoo/ernie-1.0/pretraining_introduction.md)。 +* llama 预训练请参考[预训练](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm)。 +* ernie 预训练请参考[预训练](https://github.com/PaddlePaddle/PaddleNLP/blob/develop/legacy/model_zoo/ernie-1.0/pretraining_introduction.md)。 代码说明: -- 动态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 相关代码实现在`./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 策略。 ## 参考内容 diff --git a/paddlenlp/data/blendable_dataset.py b/paddlenlp/data/blendable_dataset.py index 6a1100b2be1e..901e2f5e41ff 100644 --- a/paddlenlp/data/blendable_dataset.py +++ b/paddlenlp/data/blendable_dataset.py @@ -47,8 +47,8 @@ def __init__(self, datasets, weights, size, share_folder, *, data_cache_path=Non def _build_indices(): start_time = time.time() - tool_helpers_version = importlib.metadata.version("tool_helpers") - if tool_helpers_version > "0.1.1": + fast_dataindex_version = importlib.metadata.version("fast_dataindex") + if fast_dataindex_version > "0.1.1": assert ( num_datasets < 32767 ), f"Detect num_datasets({num_datasets})>=32767. Currently, num_datasets should be less than 32767." @@ -56,11 +56,11 @@ def _build_indices(): else: assert ( num_datasets < 255 - ), f"Detect num_datasets:({num_datasets})>=255. When 'tool_helpers<=0.1.1', num_datasets should be less than 255. To support num_datasets greater than 255, please upgrade `tool_helpers>=0.1.2`." + ), f"Detect num_datasets:({num_datasets})>=255. When 'fast_dataindex<=0.1.1', num_datasets should be less than 255. To support num_datasets greater than 255, please upgrade `fast_dataindex>=0.1.2`." dataset_index = np.zeros(self.size, dtype=np.uint8) dataset_sample_index = np.zeros(self.size, dtype=np.int64) - from tool_helpers import helpers + from fast_dataindex import helpers helpers.build_blending_indices( dataset_index, diff --git a/paddlenlp/data/causal_dataset.py b/paddlenlp/data/causal_dataset.py index 9d70506205ac..05a4b679835a 100644 --- a/paddlenlp/data/causal_dataset.py +++ b/paddlenlp/data/causal_dataset.py @@ -538,7 +538,7 @@ def _build_index_mappings( # Use C++ implementation for speed. # First compile and then import. # from megatron.data import helpers - from tool_helpers import helpers + from fast_dataindex import helpers assert doc_idx.dtype == np.int32 assert sizes.dtype == np.int32 diff --git a/requirements.txt b/requirements.txt index bd385088907b..0673bcc40ed2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,7 +20,7 @@ uvicorn typer rich safetensors -tool_helpers>=0.1.1 ; platform_system == "Linux" +fast_dataindex>=0.1.1 ; platform_system == "Linux" aistudio-sdk>=0.1.3 jinja2 regex diff --git a/scripts/regression/requirements_ci.txt b/scripts/regression/requirements_ci.txt index 4762d56e2a7a..f42f40a23fba 100644 --- a/scripts/regression/requirements_ci.txt +++ b/scripts/regression/requirements_ci.txt @@ -31,7 +31,7 @@ scikit-learn cma paddleocr https://paddle-qa.bj.bcebos.com/PaddleSlim/paddleslim-0.0.0.dev0-py3-none-any.whl -tool_helpers +fast_dataindex emoji ftfy unidecode diff --git a/tests/data/test_blendable_dataset.py b/tests/data/test_blendable_dataset.py index 17eb17c8052a..3f6c1b6a1b5d 100644 --- a/tests/data/test_blendable_dataset.py +++ b/tests/data/test_blendable_dataset.py @@ -64,7 +64,7 @@ def build_blending_indices_python(dataset_index, dataset_sample_index, weights, print(f" dataset {dataset_idx}, input: {weights[dataset_idx]}, achieved: {ratio}") -def skip_if_version_not_equal(version="0.1.1", package_name="tool_helpers"): +def skip_if_version_not_equal(version="0.1.1", package_name="fast_dataindex"): try: importlib.import_module(package_name) except ImportError: @@ -96,7 +96,7 @@ def _test_build_blending_indices( python_dataset_index, python_dataset_sample_index, weights, num_datasets, size, verbose ) - from tool_helpers import helpers + from fast_dataindex import helpers c_dataset_index = np.zeros(size, dtype=dataset_index_dtype) c_dataset_sample_index = np.zeros(size, dtype=np.int64) @@ -116,7 +116,7 @@ def _test_build_blending_indices( (1024, 8192, "int16", False, 42, False), ] ) - @unittest.skipIf(*skip_if_version_not_equal(version="0.1.1", package_name="tool_helpers")) + @unittest.skipIf(*skip_if_version_not_equal(version="0.1.1", package_name="fast_dataindex")) def test_build_blending_indices_version_0_1_1( self, num_datasets=128, size=8192, dataset_index_dtype="uint8", verbose=False, seed=42, assert_true=True ): @@ -130,7 +130,7 @@ def test_build_blending_indices_version_0_1_1( (1024, 8192, "int16", False, 42, True), ] ) - @unittest.skipIf(*skip_if_version_not_equal(version="0.1.2", package_name="tool_helpers")) + @unittest.skipIf(*skip_if_version_not_equal(version="0.1.2", package_name="fast_dataindex")) def test_build_blending_indices_version_0_1_2( self, num_datasets=128, size=8192, dataset_index_dtype="uint8", verbose=False, seed=42, assert_true=True ): diff --git a/tests/requirements.txt b/tests/requirements.txt index 4e796397be27..276ad56617b5 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -3,7 +3,7 @@ sentencepiece regex torch>=1.5 transformers -tool_helpers +fast_dataindex sacremoses pydantic==1.10.9 modelscope diff --git a/tests/test_tipc/auto_tuner/llama_pretrain/benchmark_common/prepare.sh b/tests/test_tipc/auto_tuner/llama_pretrain/benchmark_common/prepare.sh index 3e9ba0d6e185..a7a13a9ae9a2 100644 --- a/tests/test_tipc/auto_tuner/llama_pretrain/benchmark_common/prepare.sh +++ b/tests/test_tipc/auto_tuner/llama_pretrain/benchmark_common/prepare.sh @@ -20,9 +20,9 @@ cd ../legacy/model_zoo/gpt-3/external_ops/ python setup.py install cd - -# install tool_helpers +# install fast_dataindex cd ../llm -python -m pip install tool_helpers +python -m pip install fast_dataindex rm -rf data && mkdir data wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k.bin diff --git a/tests/test_tipc/dygraph/hybrid_parallelism/baichun2/benchmark_common/prepare.sh b/tests/test_tipc/dygraph/hybrid_parallelism/baichun2/benchmark_common/prepare.sh index a4cdc405a7de..7627ad5d8ca0 100644 --- a/tests/test_tipc/dygraph/hybrid_parallelism/baichun2/benchmark_common/prepare.sh +++ b/tests/test_tipc/dygraph/hybrid_parallelism/baichun2/benchmark_common/prepare.sh @@ -22,7 +22,7 @@ cd - python -m pip install tiktoken -# install tool_helpers +# install fast_dataindex cd ../llm/ mkdir data cd data diff --git a/tests/test_tipc/dygraph/hybrid_parallelism/gpt/benchmark_common/prepare.sh b/tests/test_tipc/dygraph/hybrid_parallelism/gpt/benchmark_common/prepare.sh index bf4fcabce063..7ced964b7480 100644 --- a/tests/test_tipc/dygraph/hybrid_parallelism/gpt/benchmark_common/prepare.sh +++ b/tests/test_tipc/dygraph/hybrid_parallelism/gpt/benchmark_common/prepare.sh @@ -21,7 +21,7 @@ unset http_proxy https_proxy python3 -m pip install -r ../requirements.txt #-i https://pypi.tuna.tsinghua.edu.cn/simple python3 -m pip install pybind11 regex sentencepiece tqdm visualdl #-i https://mirror.baidu.com/pypi/simple python3 -m pip install --upgrade paddlenlp -python3 -m pip install tool_helpers -i https://mirror.baidu.com/pypi/simple +python3 -m pip install fast_dataindex -i https://mirror.baidu.com/pypi/simple # get data cd ../legacy/model_zoo/gpt-3/dygraph/ rm -rf data diff --git a/tests/test_tipc/dygraph/hybrid_parallelism/llama/benchmark_common/prepare.sh b/tests/test_tipc/dygraph/hybrid_parallelism/llama/benchmark_common/prepare.sh index e3ebf51a1908..c4ef71fda95f 100644 --- a/tests/test_tipc/dygraph/hybrid_parallelism/llama/benchmark_common/prepare.sh +++ b/tests/test_tipc/dygraph/hybrid_parallelism/llama/benchmark_common/prepare.sh @@ -20,9 +20,9 @@ cd ../legacy/model_zoo/gpt-3/external_ops/ python setup.py install cd - -# install tool_helpers +# install fast_dataindex cd ../llm/ -python -m pip install tool_helpers +python -m pip install fast_dataindex wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k_ids.npy wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k_idx.npz diff --git a/tests/test_tipc/dygraph/hybrid_parallelism/llama2/benchmark_common/prepare.sh b/tests/test_tipc/dygraph/hybrid_parallelism/llama2/benchmark_common/prepare.sh index 9b2f06c9f434..36ad272531af 100644 --- a/tests/test_tipc/dygraph/hybrid_parallelism/llama2/benchmark_common/prepare.sh +++ b/tests/test_tipc/dygraph/hybrid_parallelism/llama2/benchmark_common/prepare.sh @@ -20,9 +20,9 @@ cd ../legacy/model_zoo/gpt-3/external_ops/ python setup.py install cd - -# install tool_helpers +# install fast_dataindex cd ../llm/ -python -m pip install tool_helpers +python -m pip install fast_dataindex # download data wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k_ids.npy diff --git a/tests/test_tipc/dygraph/hybrid_parallelism/qwen/benchmark_common/prepare.sh b/tests/test_tipc/dygraph/hybrid_parallelism/qwen/benchmark_common/prepare.sh index deca6e05b6fc..c69d4b4605ca 100644 --- a/tests/test_tipc/dygraph/hybrid_parallelism/qwen/benchmark_common/prepare.sh +++ b/tests/test_tipc/dygraph/hybrid_parallelism/qwen/benchmark_common/prepare.sh @@ -22,9 +22,9 @@ cd ../legacy/model_zoo/gpt-3/external_ops/ python setup.py install cd - -# install tool_helpers +# install fast_dataindex cd ../llm/ -python -m pip install tool_helpers +python -m pip install fast_dataindex wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k_ids.npy wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k_idx.npz diff --git a/tests/test_tipc/prepare.sh b/tests/test_tipc/prepare.sh index 57b2259e7582..5ee6a378d3df 100644 --- a/tests/test_tipc/prepare.sh +++ b/tests/test_tipc/prepare.sh @@ -324,7 +324,7 @@ elif [ ${MODE} = "benchmark_train" ];then fi if [[ ${model_name} == "gpt2" ]]; then - python -m pip install tool_helpers -i https://pip.baidu-int.com/simple + python -m pip install fast_dataindex -i https://pip.baidu-int.com/simple mkdir -p data && cd data wget https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt_en_dataset_300m_ids.npy -o .tmp wget https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt_en_dataset_300m_idx.npz -o .tmp @@ -332,7 +332,7 @@ elif [ ${MODE} = "benchmark_train" ];then fi if [[ ${model_name} == "gpt3" ]]; then - python -m pip install tool_helpers -i https://pip.baidu-int.com/simple + python -m pip install fast_dataindex -i https://pip.baidu-int.com/simple mkdir -p data && cd data wget https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt_en_dataset_300m_ids.npy -o .tmp wget https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt_en_dataset_300m_idx.npz -o .tmp diff --git a/tests/test_tipc/static/auto_parallel/llama2/benchmark_common/prepare.sh b/tests/test_tipc/static/auto_parallel/llama2/benchmark_common/prepare.sh index cd0f05c27314..ddd30134f126 100644 --- a/tests/test_tipc/static/auto_parallel/llama2/benchmark_common/prepare.sh +++ b/tests/test_tipc/static/auto_parallel/llama2/benchmark_common/prepare.sh @@ -20,9 +20,9 @@ cd ../legacy/model_zoo/gpt-3/external_ops/ python setup.py install cd - -# install tool_helpers +# install fast_dataindex cd ../llm/auto_parallel/llama -python -m pip install tool_helpers +python -m pip install fast_dataindex # download data wget https://bj.bcebos.com/paddlenlp/models/transformers/llama/data/llama_openwebtext_100k_ids.npy diff --git a/tests/test_tipc/static/dp/gpt/benchmark_common/prepare.sh b/tests/test_tipc/static/dp/gpt/benchmark_common/prepare.sh index 53beb886ded0..5874d35c38b6 100644 --- a/tests/test_tipc/static/dp/gpt/benchmark_common/prepare.sh +++ b/tests/test_tipc/static/dp/gpt/benchmark_common/prepare.sh @@ -30,7 +30,7 @@ cd - export PYTHONPATH=$(dirname "$PWD"):$PYTHONPATH python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple -python -m pip install tool_helpers -i https://mirror.baidu.com/pypi/simple +python -m pip install fast_dataindex -i https://mirror.baidu.com/pypi/simple python -m pip install setuptools_scm python -m pip install Cython python -m pip install -r ../requirements.txt #-i https://pypi.tuna.tsinghua.edu.cn/simple diff --git a/tests/test_tipc/static/hybrid_parallelism/gpt/benchmark_common/prepare.sh b/tests/test_tipc/static/hybrid_parallelism/gpt/benchmark_common/prepare.sh index c323832328d6..89f64229bea8 100644 --- a/tests/test_tipc/static/hybrid_parallelism/gpt/benchmark_common/prepare.sh +++ b/tests/test_tipc/static/hybrid_parallelism/gpt/benchmark_common/prepare.sh @@ -19,7 +19,7 @@ cd - python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple python -m pip install -r ../requirements.txt #-i https://pypi.tuna.tsinghua.edu.cn/simple python -m pip install pybind11 regex sentencepiece tqdm visualdl -i https://mirror.baidu.com/pypi/simple -python -m pip install tool_helpers -i https://mirror.baidu.com/pypi/simple +python -m pip install fast_dataindex -i https://mirror.baidu.com/pypi/simple # get data cd ../legacy/model_zoo/gpt-3/static/