我试图找出 numpy/pytorch、gpu/cpu、float16/float32 数字之间的舍入差异,而我发现的内容让我感到困惑。
基本版本是:
a = torch.rand(3, 4, dtype=torch.float32)
b = torch.rand(4, 5, dtype=torch.float32)
print(a.numpy()@b.numpy() - a@b)
Run Code Online (Sandbox Code Playgroud)
然而,结果如预期全为零
print((a.cuda()@b.cuda()).cpu() - a@b)
Run Code Online (Sandbox Code Playgroud)
得到非零结果。为什么 Pytorch float32 matmul 在 gpu 和 cpu 上执行不同?
一个更令人困惑的实验涉及 float16,如下所示:
a = torch.rand(3, 4, dtype=torch.float16)
b = torch.rand(4, 5, dtype=torch.float16)
print(a.numpy()@b.numpy() - a@b)
print((a.cuda()@b.cuda()).cpu() - a@b)
Run Code Online (Sandbox Code Playgroud)
这两个结果均非零。为什么 numpy 和 torch 处理 float16 数字的方式不同?我知道cpu只能进行float32运算,并且numpy在计算之前将float16转换为float32,但是torch计算也在cpu上执行。
你猜怎么着,print((a.cuda()@b.cuda()).cpu() - a.numpy()@b.numpy()) 得到全零结果!这对我来说纯粹是幻想……
环境如下:
根据一些评论者的建议,我添加了以下平等测试
(a.numpy()@b.numpy() - (a@b).numpy()).any()
((a.cuda()@b.cuda()).cpu() - a@b).numpy().any()
(a.numpy()@b.numpy() …Run Code Online (Sandbox Code Playgroud)