之前服务器环境使用的是NVIDIA的Tesla P4的环境,程序运行没有问题,但是换成Tesla M40,程序就算就出现较大的偏差。
大致原因是M40是单精度的浮点数的运算,P4是双精度,在双精度上的计算结果用在单精度上运行,运算精度不一样,所以计算偏差比较大,导致的结果不一致。特别是乘除法的矩阵运算,结果运算偏差会很大。
解决方式是模型训练时,指明单精度运算做训练:
如:
改写为:
参考:
- CUDA 中 单精度浮点操作和 双精度浮点操作
- Different results for CUDA addition on host and on GPU