【混合精度】Gluon处理混合精度时,做 float16 加法还是 float32 加法?


#1

最近参加 MicroNet Challenge 比赛,赛方 (Google) 给了一种默认的 float16 时的 FLOPs 计算方式:矩阵乘法中 mult 的运算记为 float16 运算,add 运算记为 float32 运算。

比较困惑的一点是,我看到 Nvidia 和 MXNet tutorial 中都这样提到混合精度:

Nvidia: The Volta generation of GPUs introduces Tensor Cores, which provide 8x more throughput than single-precision math pipelines. Each Tensor Core performs D = A x B + C, where A, B, C, and D are matrices. A and B are half-precision 4x4 matrices, whereas D and C can be either half or single precision 4x4 matrices.

MXNet: Nvidia Tensor Cores essentially perform the computation D = A * B + C, where A and B are half-precision matrices, while C and D could be either half-precision or full precision.

Gluon mixed-precision 在实现中具体使用的 float16 做加法还是 float32 做加法呢?谢谢!


#2

有没有大佬帮助一下。。。


#3

有两种情形,其中第二种情形有分两类。

  1. C是bias(y=Wx+B惯用操作), AMP 会把A, B, C转换(cast)成fp16, 然后乘法和加法都是float16的操作。
  2. C不是bias, 比如你构建了两层的网络,第一次是全连接层做乘法操作, 第二层是个加法操作,那么:
    第一步的A*B的矩阵相乘中,乘法是float16操作,结果存储成float16类型。
    第二步的加C的操作视C的类型而定,如果C是float16类型,那么加法会是float16的操作,如果C是float32类型,这个加法就是float32操作。

#4

这个跟+C的加法不是一回事。因为A和B都是矩阵,A*B中既有乘法运算也有加法运算,AMP中跟他的描述是一样的,乘法是float16,加法是float32。这样可以防止溢出。


#5

另外祝你在 MicroNet Challenge取得好成绩,也欢迎你把战果贴出来。


#6

明白了,多谢多谢!过两天就把我的 repo 发过来给大家分享~