Skip to content

visresearch/meopt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

软件简介

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 

算例一:基于EVA CLIP的视觉大模型训练

简介:将参数规模为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曲线

iteration-loss曲线

epoch-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优化器之后显存消耗下降百分比相近。

算例二:基于Open CLIP的视觉大模型训练

简介:将参数规模为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曲线

iteration-loss曲线

epoch-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优化器之后显存消耗下降百分比相近。

算例三:基于DINO v2的视觉大模型训练

简介:将参数规模为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训练曲线

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.218和1.325;
  • 与Nvidia A6000显卡相比,同样的程序在K100计算卡上消耗更多显存,但使用meopt优化器之后,显存消耗下降更多,且训练时间短于Nvidia A6000显卡。

算例四:DCU K100 AI相对于CPU的加速比测试

由于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.sh

运行结果

Testing 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。

About

Memory-Efficient Optimizers

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published