小编Kev*_*eng的帖子

为什么 pytorch matmul 在 cpu 和 gpu 上执行时得到不同的结果?

我试图找出 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()) 得到全零结果!这对我来说纯粹是幻想……

环境如下:

  • 蟒蛇:3.8.5
  • 火炬:1.7.0
  • numpy:1.21.2
  • CUDA:11.1
  • 显卡:GeForce RTX 3090

根据一些评论者的建议,我添加了以下平等测试

(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)

numpy rounding pytorch

5
推荐指数
1
解决办法
2570
查看次数

标签 统计

numpy ×1

pytorch ×1

rounding ×1