MEOpt (Memory-Efficient Optimizers, 面向高效显存占用的优化器算法库)是一款面向大模型训练的优化器库,用于降低大模型训练过程中优化器显存占用过高的问题,能够有效降低大模型训练对计算卡显存及计算卡数量的需求,满足大模型预训练、微调的科研需求。
执行以下命令进行编译
cd source
bash compile.sh编译成功后,终端输出以下信息
creating build\bdist.win-amd64\wheel\meopt-0.1.0.dist-info\WHEEL
creating 'dist\meopt-0.1.0-py3-none-any.whl' and adding 'build\bdist.win-amd64\wheel' to it
adding 'meopt/__init__.py'
adding 'meopt/apadam.py'
adding 'meopt/apadamw.py'
adding 'meopt/apsgd.py'
adding 'meopt/lamb.py'
adding 'meopt/lion.py'
adding 'meopt/meopt.py'
adding 'meopt-0.1.0.dist-info/METADATA'
adding 'meopt-0.1.0.dist-info/WHEEL'
adding 'meopt-0.1.0.dist-info/top_level.txt'
adding 'meopt-0.1.0.dist-info/RECORD'
编译完成后软件的安装包在目录source/dist下面
软件安装命令
cd dist
pip install meopt-0.1.0-py3-none-any.whl安装成功后,终端输出以下信息
Installing collected packages: meopt
Successfully installed meopt-0.1.0
数据准备:
cd examples/
curl -f -C - -o COCO2014.tar.gz https://wuzh01.hpccube.com:65015/efile/s/d/Z2hmdW5kNF9kNg==/6bee40614029823d
tar -xzvf COCO2014.tar.gz模型准备:
cd examples/
curl -f -C - -o ModelWeight.tar.gz https://wuzh01.hpccube.com:65015/efile/s/d/Z2hmdW5kNF9kNg==/ed9b12d95a494ea1
tar -xzvf ModelWeight.tar.gz 简介:将参数规模为1.01B的EVA CLIP-g-plus作为教师模型,参数规模为1.01B的EVA CLIP-g作为学生模型,进行蒸馏训练
配置文件:根据模型预训练权重、数据集具体存放路径和运行的模式,修改examples/eva_clip/configs_dcu/eva_clip.yaml中以下键值
# model键中的weight_t
weight_t: ../ModelWeight/EVA-CLIP/EVA01_CLIP_g_14_plus_psz14_s11B.pt
# model键中的weight_s
weight_s: ../ModelWeight/EVA-CLIP/EVA01_CLIP_g_14_psz14_s11B.pt
# data键中的root
root: ../COCO2014
# optim键中的pure_bf16和use_meopt
pure_bf16: true
use_meopt: true完成上述配置文件配置之后,运行以下命令训练模型
cd examples/eva_clip
bash run_eva.sh- 与Nvidia A6000 GPU进行对比
| 计算卡型号 | batch size | #epochs | 卡数 | 单卡显存消耗 | 训练耗时 | 收敛损失 |
|---|---|---|---|---|---|---|
| Nvidia A6000 | 32*4=128 | 10 | 4 | 30949 MB | 1.83 hr | 1.53e-4 |
| K100 AI DCU | 32*4=128 | 10 | 4 | 38365 MB | 4.88 hr | 1.45e-4 |
- 显存节省情况
| 计算卡型号 | batch size | 单卡显存消耗(不使用meopt) | 单卡显存消耗(使用meopt) | 下降幅度 |
|---|---|---|---|---|
| Nvidia A6000 | 32*4=128 | 44175 MB | 30949 MB | 29.9% |
| K100 AI DCU | 32*4=128 | 54134 MB | 38365 MB | 29.1% |
- Loss训练曲线(灰色:A6000, 粉色:K100 AI)
iteration-loss曲线
epoch-loss曲线
从上图中,Nvidia RTX A6000显卡和DCU K100 AI计算卡上所训练模型的loss曲线相近,可以看出移植后的软件和原软件一致,移植基本正确。
- 由于用CPU训练视觉大模型耗时太长不可接受,因此在CPU运行时间可接受的模型范围内测试"本项目DCU相对于32核CPU的加速比",详见[算例四:DCU K100 AI相对于CPU的加速比测试](##算例四:DCU K100 AI相对于CPU的加速比测试);
- Nvidia RTX A6000显卡和DCU K100 AI计算卡上所训练模型的loss曲线相近,最终loss分别为1.53e-4和1.45e-4;
- 与Nvidia A6000显卡相比,同样的程序在K100计算卡上消耗更多显存,训练耗时增加了4.88/1.83=2.67倍,但使用meopt优化器之后显存消耗下降百分比相近。
简介:将参数规模为1.01B的Open CLIP-g-plus作为教师模型,参数规模为0.63B的Open CLIP-H作为学生模型,进行蒸馏训练
配置文件:根据模型预训练权重、数据集具体存放路径和运行的模式,修改examples/open_clip/configs_dcu/open_clip.yaml中以下键值
# model键中的weight_t
weight_t: ../ModelWeight/CLIP-ViT-g-14-laion2B-s34B-b88K/open_clip_pytorch_model.bin
# model键中的weight_s
weight_s: ../ModelWeight/CLIP-ViT-H-14-laion2B-s32B-b79K/open_clip_pytorch_model.bin
# data键中的root
root: ../COCO2014
# optim键中的pure_bf16和use_meopt
pure_bf16: true
use_meopt: true完成上述配置文件配置之后,运行以下命令训练模型
cd examples/open_clip
bash run_open.sh- 与Nvidia A6000 GPU进行对比
| 计算卡型号 | batch size | #epochs | 卡数 | 单卡显存消耗 | 训练耗时 | 收敛损失 |
|---|---|---|---|---|---|---|
| Nvidia A6000 | 32*4=128 | 10 | 4 | 23183 MB | 1.42 hr | 0.1338 |
| K100 AI DCU | 32*4=128 | 10 | 4 | 29818 MB | 3.16 hr | 0.1328 |
- 显存节省情况
| 计算卡型号 | batch size | 单卡显存消耗(不使用meopt) | 单卡显存消耗(使用meopt) | 下降幅度 |
|---|---|---|---|---|
| Nvidia A6000 | 32*4=128 | 31209 MB | 23183 MB | 25.0% |
| K100 AI DCU | 32*4=128 | 37949 MB | 29818 MB | 21.4% |
- Loss训练曲线(橙红色:A6000, 紫色:K100 AI)
iteration-loss曲线
epoch-loss曲线
从上图中,Nvidia RTX A6000显卡和DCU K100 AI计算卡上所训练模型的loss曲线相近,可以看出移植后的软件和原软件一致,移植基本正确。
- 由于用CPU训练视觉大模型耗时太长不可接受,因此在CPU运行时间可接受的模型范围内测试"本项目DCU相对于32核CPU的加速比",详见[算例四:DCU K100 AI相对于CPU的加速比测试](##算例四:DCU K100 AI相对于CPU的加速比测试);
- Nvidia RTX A6000显卡和DCU K100 AI计算卡上所训练模型的loss曲线相近,最终loss分别为0.1338和0.1328;
- 与Nvidia A6000显卡相比,同样的程序在K100计算卡上消耗更多显存,训练耗时增加了4.49/1.69=2.23倍,但使用meopt优化器之后显存消耗下降百分比相近。
简介:将参数规模为1.14B的DINOv2-gaint作为教师模型,参数规模为0.31B的DINOv2-large作为学生模型,进行蒸馏训练
配置文件:根据模型预训练权重、数据集具体存放路径和运行的模式,修改examples/dinov2/configs_dcu/dinov2.yaml中以下键值
# model_t键中的weight
weight: ../ModelWeight/dinov2/dinov2_vitg14_pretrain.pth
# model_s键中的weight
weight: ../ModelWeight/dinov2/dinov2_vitl14_pretrain.pth
# data键中的root
root: ../COCO2014
# optim键中的pure_bf16和use_meopt
pure_bf16: true
use_meopt: true完成上述配置文件配置之后,运行以下命令训练模型
cd examples/dinov2
bash run_dino.sh- 与Nvidia A6000 GPU进行对比
| 计算卡型号 | batch size | #epochs | 卡数 | 单卡显存消耗 | 训练耗时 | 收敛损失 |
|---|---|---|---|---|---|---|
| Nvidia A6000 | 32*4=128 | 10 | 4 | 15273 MB | 2.79 hr | 1.218 |
| K100 AI DCU | 32*4=128 | 10 | 4 | 19060 MB | 2.20 hr | 1.325 |
- 显存节省情况
| 计算卡型号 | batch size | 单卡显存消耗(不使用meopt) | 单卡显存消耗(使用meopt) | 下降幅度 |
|---|---|---|---|---|
| Nvidia A6000 | 32*4=128 | 20861 MB | 15273 MB | 26.8% |
| K100 AI DCU | 32*4=128 | 28357 MB | 19060 MB | 32.8% |
- Loss训练曲线
从上图中,Nvidia RTX A6000显卡和DCU K100 AI计算卡上所训练模型的loss曲线相近,可以看出移植后的软件和原软件一致,移植基本正确。
- 由于用CPU训练视觉大模型耗时太长不可接受,因此在CPU运行时间可接受的模型范围内测试"本项目DCU相对于32核CPU的加速比",详见[算例四:DCU K100 AI相对于CPU的加速比测试](##算例四:DCU K100 AI相对于CPU的加速比测试);
- Nvidia RTX A6000显卡和DCU K100 AI计算卡上所训练模型的loss曲线相近,最终loss分别为1.218和1.325;
- 与Nvidia A6000显卡相比,同样的程序在K100计算卡上消耗更多显存,但使用meopt优化器之后,显存消耗下降更多,且训练时间短于Nvidia A6000显卡。
由于SCNet超算互联网社区提供的pytorch不支持基于gloo的多核并行计算(Meta官方版pytorch支持,对应代码为examples\test_speedup\test_speedup.py),因此本项目实际测试了单DCU相对于单核CPU的加速比。假设CPU并行效率为100%,如果单DCU相对于单核CPU的加速比高于32,则本项目在单DCU的效率高于32核CPU。
cd examples/test_speedup
bash test_speedup.shTesting optimization on dcu
Total time for optimization on dcu: 0.004723581485450268s
Testing optimization on cpu
Total time for optimization on cpu: 0.2753479778766632s
Speedup ratio: 58.292204490342584
在单个DCU K100 AI上,模型单次训练迭代耗时0.0047s,而在单核CPU上耗时0.2753s,单DCU相较于单核CPU的加速比为58.3,假设32核CPU的多核并行效率为100%,那么单DCU相较于32核CPU的加速比为1.82。因此,移植后的meopt的单DCU运行效率高于32核CPU。





