Tesla GPU系列P40不支持半精度(FP16)模型训练。因为它没有Tensor core。


训练bert非常慢,想要加速,了解到半精度混合训练,能提速一倍,研究了下混合精度,以及其对设备的要求。发现当前设备不能使用半精度混合训练,了解了个寂寞...

NVIDIA Tesla系列GPU适用于高性能计算(HPC)、深度学习等超大规模数据计算,Tesla系列GPU能够处理解析PB级的数据,速度比使用传统CPU快几个数量级,NVIDIA Tesla GPU系列P4、T4、P40以及V100是Tesla GPU系列的明星产品,云服务器吧分享NVIDIA Tesla GPU系列P4、T4、P40以及V100参数性能对比:

NVIDIA Tesla GPU系列P4、T4、P40以及V100

NVIDIA Tesla系列GPUP4、T4、P40以及V100性能规格参数对比表,提供的实例GN4(Nvidia M40)、GN5(Nvidia P100)、GN5i(Nvidia P4)及GN6(Nvidia V100),也会基于NVIDIA Tesla GPU系列。【主要关注第3行:P40不支持半精度(FP16)模型训练】

 来看看这些芯片内部的集成电路情况:

Tensor Core:我们知道在深度学习中大量的运算都是在高维矩阵(张量 Tensor)间进行的,Tensor Core可以让tensor的计算速度急速上升。Tensor Core专业执行矩阵数学运算,适用于深度学习和某些类型的HPC。Tensor Core执行融合乘法加法,其中两个4*4 FP16矩阵相乘,然后将结果添加到4*4 FP16或FP32矩阵中,最终输出新的4*4 FP16或FP32矩阵。NVIDIA将Tensor Core进行的这种运算称为混合精度数学,因为输入矩阵的精度为半精度,但乘积可以达到完全精度。碰巧的是,Tensor Core所做的这种运算在深度学习训练和推理中很常见。Tensor Core在GPU里处理的是大型矩阵运算,而不是简单地单指令流多数据流标量运算。虽然它在执行标量运算时的表现很糟糕,但它可以将更多的操作打包到同一个芯片区域。

使用半精度混合训练满足的条件:

在最近在apex使用中的踩过的所有的坑,由于apex报错并不明显,常常debug得让人很沮丧,但只要注意到以下的点,95%的情况都可以畅通无阻了:

  1. 判断你的GPU是否支持FP16:构拥有Tensor Core的GPU(2080Ti、Titan、Tesla等),不支持的(Pascal系列)就不建议折腾了。

  2. 常数的范围:为了保证计算不溢出,首先要保证人为设定的常数(包括调用的源码中的)不溢出,如各种epsilon,INF等。

  3. Dimension最好是8的倍数:Nvidia官方的文档的2.2条表示,维度都是8的倍数的时候,性能最好。

  4. 涉及到sum的操作要小心,很容易溢出,类似Softmax的操作建议用官方API,并定义成layer写在模型初始化里。

  5. 模型书写要规范:自定义的Layer写在模型初始化函数里,graph计算写在forward里。

  6. 某些不常用的函数,在使用前需要注册:amp.register_float_function(torch, 'sigmoid')

  7. 某些函数(如einsum)暂不支持FP16加速,建议不要用的太heavy,xlnet的实现改FP16困扰了我很久。

  8. 需要操作模型参数的模块(类似EMA),要使用AMP封装后的model。

  9. 需要操作梯度的模块必须在optimizer的step里,不然AMP不能判断grad是否为Nan。

参考:

1.GPU性能:https://developer.aliyun.com/article/753454

2.半精度混合训练的条件:https://bbs.cvmart.net/topics/2107

3.混合精度计算对硬件的要求:tensor core:https://zhuanlan.zhihu.com/p/51380356

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐