apex和pytorch autocast混合精度训练速度和时间对比

众所周知,自从pytorch更新1.6版本之后,就引入了自家的混合精度训练模式(下面统称autocast),这种方法简单,只需要添加几行代码即可实现,可以说是pytorch爱好者的福音。autocast在面对主流的apex时,是完爆还是被吊打呢,请看下面分析:

  • 模型架构:Transformer-xl
  • 环境:python3.6.9 、torch1.7.1、cuda10.1、显卡GeForce RTX 2080Ti

1、即不用apex,也不用autocast

  • batch size = 1
    在这里插入图片描述
    占用内存:7561M,每个batch的时间为285.69ms

  • batch size = 2
    在这里插入图片描述

占用内存:10323M,每个batch的时间为503.74ms

2、autocast

  • batch size = 1
    在这里插入图片描述

占用内存:7515M,每个batch的时间为272.65ms

  • batch size = 2
    在这里插入图片描述

占用内存:8965M,每个batch的时间为451.57ms

3、apex

  • batch size = 1
    在这里插入图片描述
    占用内存:7831M,每个batch的时间为246.25ms

  • batch size = 2
    在这里插入图片描述
    占用内存:9521M,每个batch的时间为389.40ms

4、结果

  • 空间上:在普通训练时,增加一个batch,会增加10323-7561=2762M内存,autocast增加1450M,apex增加1690M。相当于:普通训练 = 1.9 * autocast = 1.6 * apex

  • 时间上:bsz = 2时,普通训练 = 1.12 * autocast = 1.29 * apex;
    bsz = 1时,普通训练 = 1.05 * autocast = 1.16 * apex;因为机器内存有限,这里只能测试batch size为1和2的情况,但是也可以发现问题,当batch size变大时,普通训练和autocast,apex的差别变得更大了,也就是说,autocast和apex在batch size越大的时候,优势越明显。

  • autocast相对于apex更省内存,但是速度上会稍微慢一些。

方式普通训练autocastapex
bsz = 1内存(M)756175157831
bsz = 2内存(M)1032389659521
bsz = 1时间(ms)285.69272.65246.25
bsz = 2时间(ms)503.74451.57389.40

补充

之后,我在3090显卡上测试,使用apex可以放9个batch,用autocast可以放11个batch。时间上,autocast是1.82s/batch,apex是1.75s/batch,说明,在batch比较大的时候,autocast相比apex在显存上是有比较大的优势的,时间上都相差不大。因此,鉴于apex的安装步骤繁琐困难,建议大家使用autocast进行训练。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值