计算精度问题

如果计算精度误差比较大,那么可能为安培架构的GPU引入的TF32数值类型以及Torch等框架会自动启用TF32计算造成的。TF32可简单理解为FP16的精度,FP32的表示范围,带来了更强的性能但是可能更差的精度。
该问题可参考Torch官方文档:文档
一般来说TF32够用,但是如果权重值有比较大的异常数值(一般没有)时会出现较大误差。
import torch A = torch.tensor([[113.2017, 7.4502, 39.3118], [-99.4285, 13.2169, 85.9321], [194.0693, -4282.2979, 58.0138]]).float().cuda() B = torch.tensor([[0.8673, -0.4966, 0.0337], [0.0377, -0.0019, -0.9993], [0.4963, 0.8680, 0.0171]]).float().cuda() gpu = A @ B cpu = A.cpu() @ B.cpu() print('gpu:\n', gpu) print('cpu:\n', cpu) print('gpu-cpu:\n', gpu.cpu() - cpu)

0
A = torch.rand(3, 3).float().cuda() B = torch.rand(3, 3).float().cuda()
0
gpu = A @ B cpu = A.cpu() @ B.cpu()
0
从上面的结果可以发现第一组A和B计算出的结果,GPU对比CPU的误差比较大,主要原因在于这个A矩阵中有比较大的数字(绝对值),而第二组随机初始化的A和B,GPU对比CPU的误差小很多。
如何避免上述误差?在顶部输入以下代码可以禁止使用TF32计算。代码如下:
torch.backends.cuda.matmul.allow_tf32 = False # 禁止矩阵乘法使用tf32 torch.backends.cudnn.allow_tf32 = False # 禁止卷积使用tf32
0
栏目
问题反馈