FlagPerf立项以来,已累计添加20+个模型,未来持续在质量上提升,数量、场景上拓展,包括不限于大模型和推理case的添加,本篇文章,咱们就从Nvidia实例出发,带大家加case~
1. 标准Case定义
我们先复习一下标准case的定义:
“ 如今,业内主流硬件厂商以英伟达为首,我们将标准case定义为模型-训练框架-英伟达(以下简称case)的一个组合。 同时,结合各家芯片公司软件栈的设计和市场选择偏向,我们选择Pytorch作为主要训练框架。因此,标准case多以“Model+Pytorch+Nvidia”的组合为主。
标准case以Nvidia GPU作为运行参照,代码实现上面依赖Cuda,原则上不依赖其它特定芯片厂商的软件包,如NVIDIA/apex相关实现不会出现在标准。如出现如apex类的优化包,则应当放在nvidia目录下。”
2. 标准Case代码
2.1 代码结构
标准Case实现路径在training/benchmarks/model/framework/下Nvidia基础版本实现,标准Case代码以run_pretraining.py脚本为入口,该脚本由start_<framework>_task.py脚本在容器内调用执行。整个代码建议遵循常见的训练pipeline,以glm-pytorch case为例,包括以下几部分:
├── glm
│ └── pytorch
│ ├── config # 【必选】case基本配置目录
│ │ ├── __init__.py
│ │ ├── _base.py # case基础配置:包含了case运行的所有配置参数
│ │ └── mutable_params.py # 可变参数列表:定义了厂商可以覆盖的配置项名称。
│ ├── dataloaders # dataloaders定义构建dataset, dataloader相关逻辑(train && evaluate)
│ │ ├── __init__.py
│ │ └── dataloader.py # dataloader: 定义dataset, dataloader的构建逻辑,具体函数名参考具体参考run_pretraining.example.py中说明
│ ├── model # 模型定义
│ │ ├── __init__.py
│ │ ├── layers
│ │ └── models
│ ├── optimizers # 优化器相关
│ │ ├── __init__.py
│ │ ├── fp16_optimizer.py # fp16优化器
│ │ └── loss_scaler.py # loss缩放,解决FP16类型数据下溢问题。
│ ├── readme.md # 【必选】case readme文档
│ ├── run_pretraining.py # 【必选】执行训练入口脚本,可以使用dev/docs/run_pretaining.example.py作为模版
│ ├── schedulers # lr schedulers
│ │ ├── __init__.py
│ │ └── base.py
│ └── train
│ ├── __init__.py
│ ├── evaluator.py # evaluator: 定义验证evaluate方法
│ ├── trainer.py # trainer: 定义训练pipeline
│ ├── trainer_adapter.py # trainer_adapter:定义训练流程的各个步骤的具体实现
│ └── training_state.py # training_state:保存训练状态的dataclass
2.2 添加流程
1. 数据集和checkpoint(如有)准备
2. 从头开始训练,保存ckpt(可选), 验证原始仓库精度达标,结果作为target acc
3. 从原始仓库分离模型、优化器、学习率调度器等关键训练组件
4. 整理trainer训练脚本,依据配置文件开发trainer_adapter模型适配器
5. 编写run_pretraining入口函数,串联各训练组件、训练脚本与Perf框架相应功能
6. 撰写nvidia-1x8 config,1x8 作为经典配置,优先支持
7. 在Perf框架下测试1x8全流程(结果应与2相同,保证收敛)
8. 测试1x1, 2x8配置
9. 补充case文档,模型文档
10. 对照PR提交规范,提交PR
2.3 关键代码
在training/benchmarks下添加<model>/<framework>子目录,该目录下为一个新增case的主题代码
.
├── config # 【必选】case基本配置目录
├── dataloaders
├── model
├── optimizers
├── readme.md # 【必选】case文档,规范参考 https://qgsq1vkxhz.feishu.cn/docx/NMAGdJ3w6oltKJxJB9ccVL43n5c
├── run_pretraining.py #【必选】执行训练入口脚本,可以使用dev/docs/run_pretaining.py.example作为模版
├── schedulers
└── train
原则上,标准实现中不放特有优化,该部分的空间留给各个厂商去拓展,如下面所示,在training/<vendor>/<model-framework>目录下存放厂商特有的实现,如Nvidia下的apex优化。
training/nvidia/glm-pytorch/
├── config # nv下的配置文件
└── extern # nv上的特有实现,如apex优化
3. 添加方式
3.1 容器内训练
3.1.1 代码添加
我们在项目中给了一个参考入口文件,training/benchmarks/model/framework/run_pretraining.py.example. 开发者根据该脚本中的标记TODO的位置进行修改,串接整个训练pipeline。
为了降低大家添加模型的难度和门槛,我们只要求保证关键接口不变的情况下,可接受自定义内部实现。
另外,使用Pytorch框架的各个领域的训练任务也会存在些许区别,所以我们也接受训练pipeline的调整,只需要整体逻辑尽可能一致,不要去完全一致。
这部分链接到文件模块trainer、trainer_adapter、config, 都属于标准case的必须项,开发者可参考仓库内已有的case,比如mobilenetv2、faster rcnn 来撰写。
一般我们推荐优先支持的是1x8的实验配置, _base.py作为config模块的基石,存放和硬件厂商无关的基本配置,如模型结构,基础训练超参设置,凡和硬件厂商有关的配置,放置于厂商config目录下,不同层级的配置优先级为:
test_conf.py > config_A100x1x8.py > _base.py,三者都存在的情况下,覆盖式生成最终版本。
提交的最终版本代码,期望训练时间在一周内能够在Nvidia上精度达标。目前以一周来区分,如果模型训练时间过久,则 case by case的讨论对策。
3.1.2 添加实验配置
-
文件路径:training/nvidia/<model>-<framework>/config
-
文件内容:不同配置下的模型超参数及硬件依赖参数
-
配置文件列表如下:(以GLM-Pytorch为例)
training/nvidia/glm-pytorch/config
├── config_A100x1x1.py # 必选, 单机单卡配置,性能结果和精度验证
├── config_A100x1x8.py # 必选, 单机8卡配置,性能结果和精度验证
├── config_A100x2x8.py # 必选, 2机8卡配置,性能结果和精度验证
├── environment_variables.sh # 环境变量文件,在容器启动后,运行case之前会source该文件,设置容器中的环境变量。
└── requirements.txt # 容器中安装python依赖包。FlagPerf框架在启动容器后,在运行case之前,执行pip install -r requirements.txt,安装依赖库
理论上,不同配置上的超参数应该有所不同,但主旨之一是需要保证尽可能高的显卡利用率。
以上工作完成,满足进入容器中启动训练任务的目标,下面的工作保证在容器外能以统一方式批量启动测例。
在上面我们提到,标准的配置优先级是test_conf.py(data dir) > config_A100x1x8.py > _base.py,该角度是从用户使用视角来说明,从文件本身的内容视角,标准Case实现的配置又可以分为两大类:
基本配置
基本配置是模型训练及运行环境相关的配置参数,主要分为两大类: 模型超参(如LR)和训练配置(log_freq等),路径为training/benchmarks/<模型>/<框架>/config/_base.py和mutable_params.py, 其中mutable_params.py 中定义的参数表示可覆盖参数项
-
路径:<model>-<framework>/config/_base.py 。定义模型训练相关的所有参数,及case运行环境需要的基本参数。模型名称、模型结构、数据集、checkpoint、超参数、分布式参数等。
-
配置项说明如下,可参照[standard-case-config-base.py.example]:
-
必选参数:
-
vendor
,值为"nvidia"即可,会在运行FlagPerf时被配置在test_conf里的vendor值覆盖。 -
data_dir
,值为""空即可,会在运行FlagPerf时被配置在test_conf中对应case配置项data_dir_container覆盖。
-
-
可选参数:
-
train_data
:训练数据路径,填写相对data_dir
的路径 -
eval_data
:评估数据路径,填写相对data_dir
的路径 -
init_checkpoint
:初始化模型checkpoint文件,填写相对data_dir
的路径,一般提供文件名即可,下载checkpoint文件后放置于data_dir
-
-
等等
Nvidia适配的配置
Nvidia适配的配置是指标准Case运行在Nvidia GPU环境的配置参数。作为Nvidia的标准配置,可以和基础配置一致,也可以在运行时覆盖标准Case的基础配置参数。在Nvidia GPU上运行所需的配置文件放在training/nvidia/<model>-<framework>/config目录下,可以看作是Nvidia适配标准Case的配置项,由于训练规模不同,可以给出多个配置文件。
在FlagPerf运行时,会根据test_conf里的case配置项选择加载哪个配置文件。配置文件命名为:config_<machine>x<nnodes>x<nproc>.py,例如单机4卡的A100环境运行,使用config_A100x1x4.py,这里主要放置是厂商适配case时可覆盖的参数,一般定义在自己设备上跑该Case最优的配置。
3.2 容器外启动
- 在training/run_benchmarks/config/test_conf.py中添加新标准case的key-value, 验证以run.py 方式启动有效性。
以GLM和Bert为例,
# Set the case dict you want to run here.
'''
# Users must use {
"model:framework:hardwareID:nnodes:nproc:repeat": "dataset path"}
'''
CASES = {
"bert:pytorch:A100:1:8:1": "/home/datasets_ckpt/bert/train/",
"glm:pytorch:A100:1:8:1": "/home/datasets_ckpt/glm/train/",
}
-
在training/run_benchmarks/config/cluster_conf.py中添加标准case运行机器
# Hosts to run the benchmark. Each item is an IP address or a hostname.
HOSTS = ["10.209.20.12","10.209.20.13"]
3.【必需】在run.py 脚本启动完整测试
python3 ./run_benchmarks/run.py
4. 在training/nvidia/docker_image/pytorch/目录下撰写环境依赖包
注:调试运行时可在容器中进行,最终提交前需run.py 完整测试,验证代码工作正常。关于配置方法,可参考:https://github.com/FlagOpen/FlagPerf/blob/main/training/README.md
4. 验证达标要求
-
以Perf方式启动训练模型收敛达到目标精度(NV上原始代码单机8卡精度值)
-
单个case的收敛时间在1周内
-
多机/多卡吞吐量加速比符合预期,需提供1x1、1x8和2x8三种配置验证单卡,多卡,多机场景下的性能数据
-
提供训练过程和benchmark结果日志(NV),包括训练中的N个steps的和最终结果输出。
-
提交模型、case、厂商三类文档,具体介绍见上篇。
内容中包含的图片若涉及版权问题,请及时与我们联系删除
评论
沙发等你来抢