libtorch 中的 numpy.spacing(1) 等价于什么?
What's the equivalent of numpy.spacing(1) in libtorch?
pytorch 似乎 have/expose finfo
link,但我在 libtorch
中找不到它。它甚至在 libtorch 中可用吗?使用 torch.finfo 我可以轻松做到:
esp = torch.finfo(torch.float).eps
我认为是 np.spacing(1)
的 counterpart/equivalent 但是在 libtorch 中我不能做同样的事情因为我找不到 finfo
class 的任何痕迹.我该怎么办?
有一个TypeInfo.cpp模块(pytorch/torch/csrc/TypeInfo.cpp),不幸的是你提到的方法(torch.finfo(torch.float).eps)似乎是私有的,因为它在翻译单元中被标记为 static
:
static PyObject* THPFInfo_eps(THPFInfo* self, void*) {
return AT_DISPATCH_FLOATING_AND_COMPLEX_TYPES_AND2(at::kHalf, at::ScalarType::BFloat16,
self->type, "epsilon", [] {
return PyFloat_FromDouble(
std::numeric_limits<
at::scalar_value_type<scalar_t>::type>::epsilon());
});
}
但是,在相应的header中,有一个外部声明:
extern PyTypeObject THPFInfoType;
THPFInfoType
似乎是一个包含以下函数指针的实例:THPFInfo_str
。另一方面,此函数打印以下内容:
PyObject* THPFInfo_str(THPFInfo* self) {
std::ostringstream oss;
oss << "finfo(resolution=" << PyFloat_AsDouble(THPFInfo_resolution(self, nullptr));
oss << ", min=" << PyFloat_AsDouble(THPFInfo_min(self, nullptr));
oss << ", max=" << PyFloat_AsDouble(THPFInfo_max(self, nullptr));
oss << ", eps=" << PyFloat_AsDouble(THPFInfo_eps(self, nullptr));
oss << ", tiny=" << PyFloat_AsDouble(THPFInfo_tiny(self, nullptr));
oss << ", dtype=" << PyUnicode_AsUTF8(THPFInfo_dtype(self, nullptr)) << ")";
return THPUtils_packString(oss.str().c_str());
}
这显然打印了 eps
信息。也许你可以用 TypeInfo.cpp 以某种方式 link 你的目标并利用上面的定义?
事实证明,我们可以简单地使用std::nextafter
就可以了。最近还添加了 torch::nextafter
(#42580) 并在后台使用它!
因此,如果您不使用 nighlybuilds,并且在 1.7 发布之前,您可以简单地使用 std::nextafter
就好了!关于 THPFinfo
:
THPFInfo and THPFInfo_eps exist to make this information available in
python
pytorch 似乎 have/expose finfo
link,但我在 libtorch
中找不到它。它甚至在 libtorch 中可用吗?使用 torch.finfo 我可以轻松做到:
esp = torch.finfo(torch.float).eps
我认为是 np.spacing(1)
的 counterpart/equivalent 但是在 libtorch 中我不能做同样的事情因为我找不到 finfo
class 的任何痕迹.我该怎么办?
有一个TypeInfo.cpp模块(pytorch/torch/csrc/TypeInfo.cpp),不幸的是你提到的方法(torch.finfo(torch.float).eps)似乎是私有的,因为它在翻译单元中被标记为 static
:
static PyObject* THPFInfo_eps(THPFInfo* self, void*) {
return AT_DISPATCH_FLOATING_AND_COMPLEX_TYPES_AND2(at::kHalf, at::ScalarType::BFloat16,
self->type, "epsilon", [] {
return PyFloat_FromDouble(
std::numeric_limits<
at::scalar_value_type<scalar_t>::type>::epsilon());
});
}
但是,在相应的header中,有一个外部声明:
extern PyTypeObject THPFInfoType;
THPFInfoType
似乎是一个包含以下函数指针的实例:THPFInfo_str
。另一方面,此函数打印以下内容:
PyObject* THPFInfo_str(THPFInfo* self) {
std::ostringstream oss;
oss << "finfo(resolution=" << PyFloat_AsDouble(THPFInfo_resolution(self, nullptr));
oss << ", min=" << PyFloat_AsDouble(THPFInfo_min(self, nullptr));
oss << ", max=" << PyFloat_AsDouble(THPFInfo_max(self, nullptr));
oss << ", eps=" << PyFloat_AsDouble(THPFInfo_eps(self, nullptr));
oss << ", tiny=" << PyFloat_AsDouble(THPFInfo_tiny(self, nullptr));
oss << ", dtype=" << PyUnicode_AsUTF8(THPFInfo_dtype(self, nullptr)) << ")";
return THPUtils_packString(oss.str().c_str());
}
这显然打印了 eps
信息。也许你可以用 TypeInfo.cpp 以某种方式 link 你的目标并利用上面的定义?
事实证明,我们可以简单地使用std::nextafter
就可以了。最近还添加了 torch::nextafter
(#42580) 并在后台使用它!
因此,如果您不使用 nighlybuilds,并且在 1.7 发布之前,您可以简单地使用 std::nextafter
就好了!关于 THPFinfo
:
THPFInfo and THPFInfo_eps exist to make this information available in python