Pytorch:计算精度?

问题描述 投票:0回答:1

我用 numpy 写了自己的 autograd,听说 pytorch 更喜欢 float32 因为它更快并且节省内存。所以我在计算中使用了numpy中的float32,并保存在float32中。

但是,当我将结果与pytorch进行比较时,它会有所不同(例如,最终损失比较是:numpy autograd:0.005946858786046505 vs pytorch autograd:0.005946869496256113)。当我在 numpy 中使用 float64 时,最终结果变得相似(numpy autograd:0.9532327802786481 vs pytorch autograd:0.9532327802786484)

所以我怀疑pytorch在float64中计算所有内容,但使用float32保存其参数。是真的吗?我似乎无法在别处找到答案。谢谢!

python numpy pytorch backpropagation autograd
1个回答
0
投票

即使同一操作的两个不同实现在整个过程中使用相同的数据类型,也可能会出现浮点错误。如果在实现上有任何细微的差别,它通常会改变结果,即使它只是像改变一些数字相加的顺序。

对于绝大多数操作,PyTorch 不会将 float32 转换为 float64。操作使用输入的数据类型执行计算,以获得最佳性能。您可以尝试通过创建一个大型(数千个元素)float32 张量和一个相同大小的大型 float64 张量来确认这一点,并计算对它们中的每一个运行某些操作所需的时间。

我们也可以从代码中确认这一点。这是

torch.prod
的 CPU 实现的一部分的链接:https://github.com/pytorch/pytorch/blob/9f0092c4b7fcc9ca44ac082609ed6c586156d00d/aten/src/ATen/native/cpu/ReduceOpsKernel.cpp#L179

AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND
宏包围的代码(以及其他类似的
AT_DISPATCH_*_TYPES*
)被编译到多个不同的内核中,每个内核都有不同的数据类型。当使用 float32 输入调用
torch.prod
时,将调用 float32 内核。当使用 float64 输入调用时,将调用 float64 内核。
scalar_t
这里将成为它正在编译的任何类型。你可以搜索 PyTorch 的代码库,发现这些类型调度宏被使用得非常频繁。

在少数情况下,输入确实会向上转换或向下转换为不同的类型,但它们并不常见。在大多数情况下,操作要么支持特定的数据类型,要么在不支持数据类型时发出错误。

© www.soinside.com 2019 - 2024. All rights reserved.