# 目录
我们正在探索训练具有数十亿甚至万亿参数的大模型的最新前沿技术。 基于MindSpore的并行特性,我们采用了高效的模型并行和数据并行技术,如算子级并行, 最大限度地降低通信成本,提高计算效率。 只需少量修改,就可以很容易地扩展到数千个NPU和万亿参数量的模型。
与此同时,我们在PanGu-Alpha语言模型上运行并行训练,证明并行条件下也可以很容易地训练大模型。 训练技巧总结如下:
有关上述特性,请点击此处查看详情。 更多特性敬请期待。
详细技术报告和检查点文件,可点击此处查看。
PanGu-α基于Transformer的架构,如今已被广泛用作各种预训练语言模型的骨干网络,如BERT和GPT。 与之不同,我们在Transformer层之上添加了一个查询层,用来预测下一个token。 模型的示意图如图1所示。
开源数据集。
每个示例中都使用1024个token对上述数据集进行预处理。dataset.py中的列键默认为input_ids
。
下表给出了测试环境、脚本以及MindSpore版本的说明。注意该模型仅支持图模式。
并行模式 | MindSpore版本 | GPU(V100) | Ascend 910 |
---|---|---|---|
数据并行 | Master | 支持 | 支持 |
模型并行 | Master | 支持 | 支持 |
优化器并行 | Master | 支持 | 支持 |
重计算 | Master | 支持 | 支持 |
流水线并行 | Master | 不支持 | 支持 |
如需获取Pangu_α脚本,可使用git
工具按照如下操作克隆MindSpore的代码:
git clone https://gitee.com/mindspore/models.git -b master
cd models/official/nlp/Pangu_alpha
请参见要求来安装依赖项。
下游任务的格式可能多种多样,因此preprocess.py
提供了如何处理原始文本文件的基本用法。请使用以下格式准备数据,文件中每行是一段连续的文本:
今天是一个好天气,小明很高兴的背起书包上学去。但是...
突然刮起了狂风暴雨!
假设文本数据放在./data
下且每个文本文件以'txt'结尾,我们可以运行以下命令生成seq_length=1025的MindRecord文件。
python -m src.preprocess --input_glob 'data/*.txt' --tokenizer gpt --eot 50256 --data_column_name input_ids --seq_length 1025
脚本用1025个token对每一行进行分词,不足1025个token的部分将被忽略。
输出文件位于./output
目录下。默认采用Transformer的分词器。注意,vocab_szie
的值取决于vocab文件。
结巴
分词器需要添加两个文件vocab.model。单击此处下载。如需在PCL-Platform发布的ckpt上进行增量训练,请点击此处下载vocab.model
模型。然后运行以下命令,使用和预训练(使用结巴分词器)相同的词汇表对原始文本进行分词。
python -m src.preprocess --input_glob data/*.txt --tokenizer jieba --model_file vocab.model --eot 6
vocab.model
的词汇表大小为40000,vocab.model
值为6。
目前,脚本提供了四个默认配置:1.3B、2.6B、13B和200B。以Ascend上8卡训练2.6B
模型为例。
# 运行分布式训练示例
bash scripts/run_distribute_train.sh DATASET RANK_TABLE RANK_SIZE TYPE MODE STAGE_NUM MICRO_SIZE PER_BATCH RANK_START
#示例:
bash scripts/run_distribute_train.sh /data/pangu_30_step_ba64/ /root/hccl_8p.json 8 fp32 2.6B 1 1 8 0 8
上述命令涉及以下args
:
/home/work/mindrecord/
。device id
、service ip
和rank
。hidden size
和layers
,将参数量增至26亿。还可以选择13B(hidden size
为5120和layers
为40,训练至少需要16卡)和200B模式。stage_num
大于1时,应用流水线并行模式。该配置表示流水线并行模式下子图的数量。stage_num
。以训练2.6B模型为例:
# 在单机Ascend上运行分布式训练示例
bash scripts/run_distribute_train.sh /path/dataset /path/hccl.json 8 fp32 2.6B 1 1 8 0 8
# 在双机Ascend上运行分布式训练示例
# 设备A
bash scripts/run_distribute_train.sh /path/dataset /path/hccl.json 16 fp32 2.6B 2 4 16 0 8
# 设备B
bash scripts/run_distribute_train.sh /path/dataset /path/hccl.json 16 fp32 2.6B 2 4 16 8 8
对于分布式训练,需要提前创建JSON格式的hccl配置文件。 请按照以下链接中的说明操作: https:gitee.com/mindspore/models/tree/master/utils/hccl_tools.
开始训练后,训练日志将重定向到设备{rank_id}/log{rank_id}.txt(例如, device0/log0.log)。
该脚本通过mpirun启动GPU训练,用户可以在任何设备上运行以下命令开始训练。
请注意,多节点训练时,变量NCCL_SOCKET_IFNAME
NCCL_IB_HCA
的取值在某些设备上可能不同。如果遇异常,请取消设置或设置NCCL变量。
点击链接查看详情。
# 以下变量可选。
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=ib
export NCCL_IB_HCA=^mlx5_16,mlx5_17
bash scripts/run_distribute_train_gpu.sh RANK_SIZE HOSTFILE DATASET PER_BATCH MODE
/home/work/mindrecord/
。1.3B
、2.6B
、13B
或200B
。目前,脚本提供了四个默认配置:1.3B、2.6B、13B和200B。仅支持Ascend设备。
# 运行分布式训练示例
bash scripts/run_distribute_train_moe_host_device.sh DATASET RANK_TABLE RANK_SIZE TYPE MODE STAGE_NUM MICRO_SIZE PER_BATCH RANK_START LOCAL_DEVICE_NUM EXPERT_NUM_PER_EP ENABLE_ALLTOALL
上述命令涉及以下args:
/home/work/mindrecord/
。hidden size
和layers
,将参数量增至26亿。还可以选择13B
(hidden size
为5120和layers
为40,训练至少需要16卡)和200B
模式。stage_num
大于1时,应用流水线并行模式。该配置表示流水线并行模式下子图的数量。以8卡NPU训练60B模型为例: 模型配置与2.6B模型相同,但是没有MoE。 单机使用8卡NPU训练60B模型要求服务器至少有1TB的主机内存。
# 在单机Ascend上运行分布式训练示例
bash run_distribute_train_moe_host_device.sh /path/dataset /path/hccl.json 8 fp32 2.6B 1 1 2 0 8 36 0
您也可以使用MoE进行同构训练。
# 运行分布式训练示例
bash scripts/run_distribute_train_moe.sh DATASET RANK_TABLE RANK_SIZE TYPE MODE STAGE_NUM MICRO_SIZE PER_BATCH RANK_START LOCAL_DEVICE_NUM EXPERT_NUM_PER_EP ENABLE_ALLTOALL
各参数含义同run_distribute_train_moe_host_device.sh
。
在我们开始增量训练之前,必须完成以下两个步骤:
然后运行以下命令,开始2.6B
模型增量训练:
export FILE_PATH=/home/your_path/ckpts
bash scripts/run_distribute_incremental_train.sh DATASET RANK_TABLE 8 fp32 2.6B 8 ${FILE_PATH}/strategy_load_ckpt/strategy.ckpt ${FILE_PATH}/checkpoint_file filitered
请访问网站下载以下内容:
这里,我们假设下载的检查点、分词器和策略文件的目录结构如下:
注:以下所指ckpts路径均为引用为/home/your_path/ckpts
。
ckpts
├── checkpoint_file
│ ├── filtered_*.ckpt
│ ├── word_embedding.npy
│ ├── top_query_embedding.npy
│ └── position_embedding.npy
├── strategy_load_ckpt
│ └── strategy.ckpt
└── tokenizer
└── vocab.model
我们提供了两种预测方法。第一种是正常的方式,每次迭代都需要将输入填充到一定的长度。 由于冗余计算,该方法的延迟相当高。为了加快速度性能,我们提供了二次状态重用(增量推理)方法。
默认启用状态重用,您可以通过将'use_past'参数值更改为False来禁用。
以Ascend上8卡预测为例。
export FILE_PATH=/home/your_path/ckpts
bash scripts/run_distribute_predict.sh 8 /home/config/rank_table_8p.json ${FILE_PATH}/strategy_load_ckpt/strategy.ckpt \
${FILE_PATH}/tokenizer/ ${FILE_PATH}/checkpoint_file filitered 2.6B fp32
以Ascend上或Nvidia GPU上单机预测为例。不同点在于,网络采用半精度(FP16)初始化。
export FILE_PATH=/home/your_path/ckpts
export DEVICE_TARGET=Ascend # or GPU
bash scripts/run_standalone_predict.sh ${FILE_PATH}/strategy_load_ckpt/strategy.ckpt \
${FILE_PATH}/tokenizer/ ${FILE_PATH}/checkpoint_file filitered 2.6B $DEVICE_TARGET
此脚本提供以下任务的评估:
单击上述任务的链接,下载数据。以C3为例,将数据集解压缩到
/home/my_path/data/c3
。
其结构如下:
c3
├── annotation
│ ├── c3-d-dev.txt
│ ├── c3-d-test.txt
│ ├── c3-m-dev.txt
│ └── c3-m-test.txt
├── bert
│ ├── convert_tf_checkpoint_to_pytorch.py
│ ├── extract_features.py
│ ├── __init__.py
│ ├── LICENSE
│ ├── modeling.py
│ ├── optimization.py
│ ├── run_classifier.py
│ └── tokenization.py
├── data
│ ├── c3-d-dev.json
│ ├── c3-d-test.json
│ ├── c3-d-train.json
│ ├── c3-m-dev.json
│ ├── c3-m-test.json
│ └── c3-m-train.json
├── license.txt
└── README.md
请按照预测中的说明下载检查点。
大多数参数与单机预测相同,
除了最后的TASK
和TASK_PATH
参数。目前,只支持c3任务。
export FILE_PATH=/home/your_path/ckpts
export DEVICE_TARGET=Ascend # or GPU
export TASK=c3
export TASK_PATH=/home/your_c3_data_path
bash scripts/run_standalone_eval.sh ${FILE_PATH}/strategy_load_ckpt/strategy.ckpt \
${FILE_PATH}/tokenizer/ ${FILE_PATH}/checkpoint_file filitered 2.6B $DEVICE_TARGET $TASK $TASK_PATH
对于2.6B模型,大约需要13分钟才能得到结果。您可以在device0/log0.log
下查看日志。
日志内容如下:
数据集c3的指标为{'top1_acc': 0.5452}。
如果要使用13B模型,执行以下命令启动8卡评估:
export FILE_PATH=/home/your_path/ckpts
export DEVICE_TARGET=Ascend # or GPU
export TASK=c3
export TASK_PATH=/home/your_c3_data_path
export RANK_TABLE=/home/rank_table_8p.json
bash scripts/run_distribute_eval.sh 8 $RANK_TABLE ${FILE_PATH}/strategy_load_ckpt/strategy.ckpt \
${FILE_PATH}/tokenizer/ ${FILE_PATH}/checkpoint_file 13B fp32 $TASK $TASK_PATH
参考Serving启动Server。
用户可以使用以下命令导出mindir文件。
set -e
export FILE_PATH=/home/your_path/ckpts
export DEVICE_TARGET=Ascend # or GPU
export TASK=c3
bash scripts/run_standalone_export.sh ${FILE_PATH}/strategy_load_ckpt/strategy.ckpt \
${FILE_PATH}/checkpoint_file 2.6B ${DEVICE_TARGET} $TASK
您可以在device0/log0.log下查看日志。日志中看到以下输出, 即表示导出已完成:
Export finished and now exit.
还需要复制vocab.model文件,用于分词。
mkdir -p serving_increment/pangu_standalone/pangu/tokenizer
cp -r your_path/vocab.model serving_increment/pangu_standalone/pangu/tokenizer/
模型导出后,我们可以使用以下命令启动serving。
mkdir -p serving_increment/pangu_standalone/pangu/1/
mv device0/* serving_increment/pangu_standalone/pangu/1/
cd serving_increment && bash start_pangu_standalone.sh
可以看到如下日志:
* Running on all addresses (0, 0, 0, 0)
* Running on http://127.0.0.1: 5000
* Running on http://your_server_ip:5000
Press CTRL+C to quit
TOKENIZER_PATH=/home/your_path/ckpts/tokenizer/
EVAL_DATA_URL=/home/my_path/data/c3
EVAL_TASK=c3
python predict.py --enable_client --eval_task=$EVAL_TASK \
--tokenizer_path=$TOKENIZER_PATH \
--eval_data_url=$EVAL_DATA_URL
程序完成后(大约需要20分钟),输出以下内容。
数据集c3的指标为{'top1_acc': 0.5432}。
以下为PanGu-Alpha 2.6B模型的结果。
任务名称 | 指标 | 论文 | 重现 | 平台 |
---|---|---|---|---|
C3 | 准确率 | 53.42 | 54.32 | Ascend |
使用Pip工具安装MindSpore和MindSpore Serving1.5或更高版本。
如有需要,同步安装flask、flask、jieba、jieba和其他wl包。
下载PanGu-Alpha仓,
后面的步骤需要pangu-alpha/strategy_load_ckpt
和pangu-alpha/tokenizer
。
从PanGu-Alpha仓下载13B或2.6B检查点文件和*embedding
文件。
对于13B模型,我们需要13B_part0
~13B_part3
、13B_word_embedding
、13B_top_query_embedding
,
以及13B_position_embedding
。
对于2.6B,我们需要2.6B_part0
~2.6B_part3
、13B_word_embedding
、2.6B_top_query_embedding
,
以及2.6B_position_embedding
。
解压所有13B_part*
或2.6B_part*
的tar文件,会生成大量*ckpt文件。
将所有*embedding
移动到*.ckpt
文件的同一目录。
使用脚本/run_standalone_export.sh导出MindIR模型,并将所有device0/*设备移动到 'serving_increment/pangu_standalone/pangu/1/'目录。
>>> cd scripts
>>> bash run_standalone_export.sh ${strategy_file_path} ${ckpt_dir_path} 2.6B Ascend
如果我们要导出2.6B模型,需要将run_standalone_export.sh
中的MODE
参数值从13B
更新为2.6B
。
在GPU环境中运行时,需要将run_standalone_export.sh
中的DEVICE_TARGET
参数值从Ascend
更新到GPU
。
${strategy_file_path}
是13B模型pangu-alpha/strategy_load_ckpt/angu_alpha_13B_cktp_strategy.ckpt
以及2.6B模型pangu-alpha/strategy_load_ckpt/angu_alpha_2.6B_cktp_strategy.ckpt
的文件路径。
${ckpt_dir_path}
是解压后生成的*ckpt
文件和*embedding
文件的目录。
模型导出会需要几分钟。查看日志device_0/log0.log,确认最后没有异常。 确认在device_0/中已经生成了mindir文件,即模型导出成功。
>>> ls device_0
pangu_alpha_1024_graph.mindir pangu_alpha_1024_variables pangu_alpha_1_graph.mindir pangu_alpha_1_variables
>>> cd - && mkdir serving_increment/pangu_standalone/pangu/1/
>>> mv scripts/device_0/* serving_increment/pangu_standalone/pangu/1/
>>> cd serving_increment
将pangu_alpha/tokenizer
复制到serving_increment/pangu_standalone/pangu/tokenizer目录下。
所需文件的目录结构如下所示。pangu_alpha_1024_variables和pangu_alpha_1_variables已折叠,便于显示。
>>> tree pangu_distributed
pangu_standalone/
├── pangu
│ ├── 1
│ │ ├── pangu_alpha_1024_graph.mindir
│ │ ├── pangu_alpha_1024_variables/
│ │ ├── pangu_alpha_1_graph.mindir
│ │ └── pangu_alpha_1_variables/
│ ├── servable_config.py
│ ├── tokenization_jieba.py
│ └── tokenizer
│ └── vocab.model
└── serving_server.py
运行bash start_pangu_Standone.sh开始新的执行,等待serving和flask server启动成功。
如果发生任何错误,可以在serving_server.log、serving_logs/*.log和flask.log中查看日志。
确认无误后,在浏览器中访问地址{ip}:5000,等待回复需要一些时间。
执行bash stop_pangu.sh
停止当前执行。
生成rank table文件。
# 生成目录models/utils/hccl_tools/hccl_tools
>>> python3 models/utils/hccl_tools/hccl_tools.py --device_num "[0,8]"
>>> mv hccl_8p_01234567*.json serving_increment/pangu_distributed/hccl_8p.json
使用脚本/run_distribute_export.sh导出MindIR模型,并将所有device*设备移动到 'serving_increment/pangu_distributed/models/'目录下。
>>> cd scripts
>>> bash run_distribute_export.sh ${strategy_file_path} ${ckpt_dir_path}
如果我们要导出2.6B模型,需要将run_distribute_export.sh
中的MODE
参数值从13B
更新为2.6B
。
${strategy_file_path}
是13B模型pangu-alpha/strategy_load_ckpt/angu_alpha_13B_cktp_strategy.ckpt
以及2.6B模型pangu-alpha/strategy_load_ckpt/angu_alpha_2.6B_cktp_strategy.ckpt
的文件路径。
${ckpt_dir_path}
是解压后生成的ckpt文件和embedding文件的目录。
模型导出会需要几分钟。查看日志device_[0-7]/log[0-7].log,确认最后没有异常。 确认在device_[0-7]/中已经生成了mindir文件,即模型导出成功。
>>> cd - && mkdir serving_increment/pangu_distributed/models/
>>> mv scripts/device_* serving_increment/pangu_distributed/models/
>>> cd serving_increment
如有需要,更新MindIR文件名serving_increment/pangu_distributed/serving_agent.py。
将pangu-alpha/tokenizer
复制到serving_increment/pangu_distributed/pangu/tokenizer目录下。
所需文件的目录结构如下所示。device_1至device_7已折叠,便于显示。
>>> tree pangu_distributed
pangu_distributed/
├── hccl_8p.json
├── models
│ ├── device_0
│ │ ├── pangu_alpha_1024_graph.mindir
│ │ ├── pangu_alpha_1024_variables
│ │ │ ├── data_0
│ │ │ ├── data_1
│ │ │ ├── data_2
│ │ │ ├── data_3
│ │ │ └── data_4
│ │ ├── pangu_alpha_1_graph.mindir
│ │ └── pangu_alpha_1_variables
│ │ ├── data_0
│ │ ├── data_1
│ │ ├── data_2
│ │ ├── data_3
│ │ └── data_4
│ ├── device_1/
│ ├── device_2/
│ ├── device_3/
│ ├── device_4/
│ ├── device_5/
│ ├── device_6/
│ └── device_7/
├── pangu
│ ├── servable_config.py
│ ├── tokenization_jieba.py
│ └── tokenizer
│ └── vocab.model
├── serving_agent.py
└── serving_server.py
运行bash start_pangu_distributed.sh
开始新的执行,等待serving和flask server启动成功。
如果发生任何错误,可以在serving_server.log、serving_agent.logserving_logs/*.log和flask.log中查看日志。
确认无误后,在浏览器中访问地址{ip}:5000,等待回复需要一些时间。
执行bash stop_pangu.sh
停止当前执行。
>>> cd scripts
>>> bash run_cluster_export.sh ${strategy_file_path} ${ckpt_dir_path} ${rank_table_file} ${rank_size} ${rank_start}
如果我们要导出13B模型,需要将run_distribute_export.sh
中的MODE
参数值从200B
更新为13B
。
${rank_start}
是每台设备中的第一个 rank id,如0,8,16,24。
模型导出会需要几分钟。查看日志device_[0-7]/log[0-7].log,确认最后没有异常。 确认在device_[0-7]/中已经生成了mindir文件,即模型导出成功。
>>> cd - && mkdir serving_increment/pangu_distributed/models/
>>> mv scripts/device_* serving_increment/pangu_distributed/models/
>>> cd serving_increment
在第一台设备上,更新serving_increment/pangu_distributed/pangu/servable_config.py
中的rank_size
和stage_size
(流水线阶段大小)。
在第一台设备上,更新rank_table_json_file
of serving_increment/pangu_distributed/serving_server.py
中的参数。
如有需要,更新每台设备上的MindIR文件名serving_increment/pangu_distributed/serving_agent.py。
在每台设备上,将serving_increment/pangu_distributed/serving_agent.py
和serving_increment/pangu_distributed/serving_server.py
的distributed_address
更新为第一台设备的IP地址。
在第一台设备上,将pangu-alpha/tokenizer
复制到serving_increment/pangu_distributed/pangu/tokenizer目录下。
在第一台设备上,运行bash start_pangu_distributed.sh
,开始新的执行。
同时,在其他设备上,运行python serving_agent.py
,启动serving agent进程。
>>> unset http_proxy && unset https_proxy
>>> python pangu_distributed/serving_agent.py > serving_agent.log 2>&1 &
等待serving和flask server启动成功。
如果发生任何错误,可以在serving_server.log、serving_agent.logserving_logs/*.log和flask.log中查看日志。
确认无误后,在浏览器中访问地址{ip}:5000,等待回复需要一些时间。
在每台设备上执行bash stop_pangu.sh
停止当前执行。
.
├── docs
│ └── model.png
├── predict.py
├── README.md
├── scripts
│ ├── run_distribute_predict.sh
│ └── run_distribute_train.sh
├── src
│ ├── dataset.py
│ ├── generate.py
│ ├── pangu_alpha_config.py
│ ├── pangu_alpha.py
│ ├── pangu_alpha_wrapcell.py
│ ├── preprocess.py
│ ├── tokenization_jieba.py
│ └── utils.py
└── train.py
注:此模型将被移动到r1.8中的/models/research/
目录下。
请浏览官网主页。
对于Serving和flask server,要求如下:
注意: 用户可以使用下述的命令来安装mindformers:
git clone --branch r0.3 https://gitee.com/mindspore/mindformers.git
cd mindformers
python setup.py install
问:发生意外错误。MindRecordOp初始化失败,非法列的列表。
答:这是因为dataset.py
中的特征列名称与mindrecord中的名称不一致。在run_distribute_train.sh
中添加--data_column_name your_feature name
。
问:提示错误ERROR: device_num must be the power of 2
。
答:并行训练时,卡的数量必须是2的幂次方。例如,如果我们想训练2.6B模型,所使用卡的数量应该是2、4、8、16等。
问:如何修改网络的超参?
答:网络的预定义超参在src/pangu_alpha_config.py
的函数set_parse
中设置。
该参数可以设置图层数、隐藏大小等。数据并行数在可train.py
中通过
device_num / model_parallel
来设置。
问:对于Ascend设备,在多节点模式下训练模型时,程序长时间卡住?
答:主要有两个原因:
网络过于复杂,编译需要的时间长,此时耐心等待。或者将网络的层数缩小到2层的规模,此时预计几分钟内可以打印日志
由于某些原因,有些设备无法编译,而有些设备正在等待失败的设备。等待时间可以通过hccl_connect_time
参数设置,默认为6000秒。如需测试网络和设备是否正常,可以设置为1200秒,层数设置为2,看看是否能得到损失值。
Q:我在模型训练的时候loss持续溢出怎么办?
A:目前网络中除了Embedding/Loss/LayerNorm
采用FP32
计算,其余部分默认采用FP16
计算。如果在网络训练过程中,发现loss突然上升,同时loss scale的值突然下降到1,请参考下面的方式将softmax
的计算类型设置为FP32
在src/pangu_alpha_config.py
文件中的PanguAlphaConfig
类中,将softmax_compute_type
初始值修改为mstype.float32
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。