AICC上使用Mindformers教程
AICC,人工智能计算中心,提供ModelArts服务和Ascend 910算力。
MindFormers套件当前具备AICC适配的特性,用户在ModelArts平台启动集群训练时,无需额外增加上云训练适配代码,套件将自动进行:
- 从OBS拉取训练所需数据至训练镜像;
- 统一训练输出路径;
- 训练后将训练输出整体回传指定文件夹;
- 训练过程中,通过回调函数将训练输出回传至指定文件夹。
下面将提供在AICC上完成GPT2模型的训练样例,用户可以按照此样例学习MindFormers套件在ModelArts训练作业上的使用方式。
使用前需对AICC的AI开发平台ModelArts,对象存储服务 OBS和容器镜像服务 SWR有初步的了解。
准备工作
模型准备
本案例使用MindFormers套件内的GPT2模型作为教程案例,请参照GPT2进行模型代码和训练数据集的准备。
git clone https://gitee.com/mindspore/mindformers.git
云上对象存储准备
准备好代码与数据集后,需将其上传至AICC的对象存储服务上。
-
进入存储
标题下的对象存储服务
,将训练代码和数据等输入内容上传,并准备好用于回传训练输出的路径。
注意:通过网页页面上传有文件数量与大小限制,可以通过分批上传或使用OBS Browser+软件上传以规避,详细请参考软件使用文档。
-
进入对象存储服务
的任一文件夹,点击界面上方的复制按钮,即可获得当前文件夹的OBS路径映射,
如:obs://huawei/xxx/mindformers。
镜像准备
ModelArts上的所提供的预置训练镜像,通常MindSpore的版本较为老旧,不满足MindFormers套件的运行需求,所以通常需要自定义镜像,安装合适版本的MindSpore包以运行套件。
我们在镜像仓库网 (hqcases.com)上发布了一些经过验证的标准镜像版本,可以通过几行简单的docker命令的形式,直接使用验证过的标准镜像拉起MindFormers套件的训练任务,而无需进行较为繁琐的自定义镜像并上传的步骤。
可以复制其docker pull命令拉取该镜像,在镜像仓库网上的镜像权限均为公开,无需登录可以直接拉取。
注:当前版本镜像为每日开发版,稳定版将在后续推送至镜像仓库网。
1. swr.cn-central-221.ovaijisuan.com/mindformers/mindformers0.8.0_mindspore2.2.0:aicc_20231025
- 在一台准备好docker引擎的计算机上,root用户执行docker pull命令拉取该镜像:
docker pull swr.cn-central-221.ovaijisuan.com/mindformers/mindformers0.8.0_mindspore2.2.0:aicc_20231025
如因网络环境等问题无法直接执行docker pull
命令,可在另一台可执行该命令的机器上拉取镜像后,使用docker save
命令将镜像打包为离线文件:
docker save {镜像ID} -o image.tar
而后可以将该离线文件传输至目标机器上,使用docker load
命令加载镜像:
docker load -i image.tar
- 进入
容器镜像服务
的控制台界面,找到客户端上传
镜像按钮,将会提示如何上传上一步拉取的镜像:
按照操作执行完后将会在该镜像列表中看到上传的镜像,并能够在ModelArts中选取。
拉起训练流程
训练作业配置
-
进入ModelArts控制台
的训练作业功能区,点击页面右上角的创建作业
按钮,开始创建训练作业。
-
名称/描述/新建实验名称:按实际填写即可
-
创建方式/启动方式:
我们需要使用之前准备的镜像环境,但拉取方式仍可复用预置命令
这里选择自定义,即可在镜像一栏选择之前准备并上传好的镜像。
-
代码目录选择上传的代码路径。
-
启动文件选择run_mindformers.py脚本。
注意,在AICC上拉起训练任务时,即使需要多卡启动,也只需指定python脚本作为启动文件,作业启动引擎会自动完成ranktable与环境变量等内容的配置,并多进程拉起python脚本,不需要额外的分布式启动shell脚本
-
本地代码目录与工作目录保持默认即可。
- 按需求选择资源池,规格和计算节点数,配置作业日志回传路径。
卡数=单节点规格数 * 节点数
下面将较为详细地解释不同情况下拉起训练时所需的每个入参及其含义。
从头训练
- 训练输入:
train_dataset_dir
:选择数据集在云上的数据存储文件夹位置,作为训练数据集的路径;该参数名应当能够被启动脚本识别。
选择后,ModelArts将会在拉起训练作业时,将云上的数据集拉取至指定的目录下,然后将该入参的值从云上路径修改为镜像上被拉取的路径。
- 训练输出:
- 启用时,需要将文件输出在超参传入的路径下,训练结束后会进行回传。
- 由于输出通常较大,默认的路径下磁盘空间不足,我们会将输出统一放在/cahce目录下,因此MindFormers不启用该项参数。
- 必需超参:
config
:填入对应config文件在训练服务器上的绝对路径,在本案例下为 /home/ma-user/modelarts/user-job-dir/mindformers/configs/gpt2/run_gpt2.yaml
,亦或是通过环境变量/${MA_MOUNT_PATH}/mindformers/configs/gpt2/run_gpt2.yaml
。
run_mode
:train,训练模式,将不加载权重进行训练。
use_parallel
:True,在所选规格参数大于1卡时需要设置为True,单卡运行为False。
remote_save_url
:obs://xxx/xxx/outputs/gpt2_test,填入对象存储服务中实际准备的OBS路径,训练输出将会回传至该路径下,需要显式写出obs://。
其余可选超参可参照 run_mindformers.py
脚本入参进行选择。
全参微调
以下列出需额外增加部分参数:
- 训练输入:
load_checkpoint
: 在finetune模式下必须指定,需要finetune的权重的obs路径(通过数据存储位置直接选择obs中位置)。
选择后,ModelArts将会在拉起训练作业时,将云上的数据集拉取至指定的目录下,然后将该入参的值从云上路径修改为镜像上被拉取的路径。
- 必需超参:
run_mode
:finetune,微调模式,必须加载权重(在训练输入中设置)。
resume_training
: 断点续训所需参数,正常微调需设为false,或者不设置。
其余输入/输出/超参与全参微调一致。
低参微调
使用lora等算法进行低参微调时,与全参微调没有区别,需要把config指定为使用lora微调的config。
- 训练输入:
load_checkpoint
: 低参微调时,该路径与全参微调一致,需指定finetune使用的原始权重。
选择后,ModelArts将会在拉起训练作业时,将云上的数据集拉取至指定的目录下,然后将该入参的值从云上路径修改为镜像上被拉取的路径。
- 必需超参:
config
:填入对应config文件在镜像上的绝对路径,在本案例下为 /home/ma-user/modelarts/user-job-dir/mindformers/configs/gpt2/run_gpt2_lora.yaml
。
其余输入/输出/超参与全参微调一致。
训练或微调,遇到训练中断的情况,如果保存了ckpt,则可以保存处继续训练。
如果run_mode
为train
的情况下训练中断,恢复训练步骤如下:
- 重建训练;
- 其余设置不改变,增加超参
resume_training
设置为true;
- 增加训练输入
load_checkpoint
,通过数据存储位置直接选择obs中需要恢复的ckpt;
- 拉起训练即可加载权重,优化器状态,loss scale,step等继续训练。
如果run_mode
为finetune
的情况下训练中断,恢复训练步骤如下:
- 重建训练;
- 其余设置不改变,增加超参
resume_training
设置为true;
- 需要变更
load_checkpoint
,通过数据存储位置选择obs中需要恢复的ckpt;
- 拉起训练即可加载权重,优化器状态,loss scale,step等继续训练。
finetune恢复训练示例如下:
权重保存相关修改
保存ckpt相关的配置需要修改config
配置文件中CheckpointMointor
:
save_checkpoint_steps
:可修改保存ckpt频率。
prefix
:可修改保存ckpt名字前缀。
# callbacks
callbacks:
- type: MFLossMonitor
- type: SummaryMonitor
keep_default_action: True
- type: CheckpointMointor
prefix: "gpt2"
save_checkpoint_steps: 500
integrated_save: False
async_save: False
- type: ObsMonitor
eval_callbacks:
- type: ObsMonitor
训练结果查看
完成后拉起训练作业,耐心等待输出作业日志
如果一切正常,将会输出如下日志:
并且在 remote_save_url
参数所对应的OBS路径下有输出回传:
常见问题
# callbacks
callbacks:
- type: MFLossMonitor
- type: SummaryMonitor
keep_default_action: True
- type: CheckpointMointor
prefix: "mindformers"
save_checkpoint_steps: 100
integrated_save: True
async_save: False
- type: ObsMonitor
upload_sequence: 10000
eval_callbacks:
- type: ObsMonitor
注意:mindformers/tools/transform_ckpt.py
转换接口仅在MindSpore2.0
环境下使用,可以在NoteBook
中安装MindSpore2.0 CPU
版本,进行离线转换;
-
step1
在config
或者训练作业
中配置超参only_save_strategy=True
,拉起训练作业,仅生成分布式策略文件。
生成的分布式策略文件保存在remote_save_url/strategy
目录下。(remote_save_url
表示obs存储路径)
训练作业界面中增加only_save_strategy
超参:
-
step2
启动NoteBook
任务,运行如下脚本完成权重切分转换(注意在MindSpore 2.0
版本下):
python mindformers/tools/transform_ckpt.py --src_ckpt_strategy SRC_CKPT_STRATEGY --dst_ckpt_strategy DST_CKPT_STRATEGY --src_ckpt_dir SRC_CKPT_DIR --dst_ckpt_dir DST_CKPT_DIR
参数说明
src_ckpt_strategy
:待转权重的分布式策略文件路径。
若为None,表示待转权重为完整权重;
若为切分策略文件,表示原始的权重对应的策略文件;
若为文件夹,表示需要合并文件夹内策略文件(仅在流水并行生成的策略文件时需要),合并后的策略文件保存在SRC_CKPT_STRATEGY/merged_ckpt_strategy.ckpt
路径下。
dst_ckpt_strategy
:目标权重的分布式策略文件路径。即step1中生成的分布式策略文件路径。
若为None,表示将待转权重合并为完整权重;
若为切分策略文件,表示目标卡数对应的策略文件;
若为文件夹,表示需要合并文件夹内策略文件(仅在流水并行生成的策略文件时需要),合并后的策略文件保存在DST_CKPT_STRATEGY/merged_ckpt_strategy.ckpt
路径下;
src_ckpt_dir
: 待转权重路径,须按照SRC_CKPT_DIR/rank_{i}/checkpoint_{i}.ckpt
存放,比如单一权重存放格式为SRC_CKPT_DIR/rank_0/checkpoint_0.ckpt
。
dst_ckpt_dir
:目标权重保存路径,为自定义空文件夹路径,转换后模型以DST_CKPT_DIR/rank_{i}/xxx.ckpt
存放。
将切分转换好的权重传到OBS
。
训练作业界面中增加load_checkpoint
超参,输入转换好的checkpoint的文件夹obs路径。
训练作业界面中增加profile
超参,设置为True,即可开启profile功能。此时profiler参数均为默认值。
采集完毕后,profiler文件数据会回传至remote_save_url
路径下。
参考高阶特性精度调优中dump使用方法,创建json文件,并上传至obs中。
json中dump数据输出路径指定为mindformers/output/dump
。
训练作业界面中增加MINDSPORE_DUMP_CONFIG
环境变量,并设置为modelarts中json文件绝对路径。
训练作业结束后,dump数据会自动回传至obs中。