【SCU】【Paddle Tensor No.3】新增 Tensor.__dlpack__#69689
【SCU】【Paddle Tensor No.3】新增 Tensor.__dlpack__#69689SCUcookie wants to merge 33 commits intoPaddlePaddle:developfrom
Tensor.__dlpack__#69689Conversation
|
你的PR提交成功,感谢你对开源项目的贡献! |
paddle/fluid/pybind/tensor.cc
Outdated
| .def( | ||
| "__dlpack__", | ||
| [](phi::DenseTensor &self) { | ||
| DLManagedTensor *dlMTensor = framework::toDLPack(self); | ||
| return pybind11::capsule( | ||
| dlMTensor, | ||
| "dltensor", | ||
| [](PyObject *capsule) { | ||
| DLManagedTensor *managedTensor = | ||
| reinterpret_cast<DLManagedTensor *>( | ||
| PyCapsule_GetPointer(capsule, "dltensor")); | ||
| if (managedTensor && managedTensor->deleter) { | ||
| managedTensor->deleter(managedTensor); | ||
| } | ||
| }); | ||
| }, | ||
| R"DOC( | ||
| Encode the tensor to a DLPack capsule. | ||
|
|
||
| Returns: | ||
| PyCapsule: The DLPack representation of the tensor. | ||
| )DOC") |
There was a problem hiding this comment.
这个复用 paddle.to_dlpack即可,不用写C++代码,可以参考:https://github.com/pytorch/pytorch/blob/main/torch/_tensor.py#L1565
python/paddle/__init__.py
Outdated
| 'positive', | ||
| 'from_dlpack', | ||
| 'to_dlpack', | ||
| '__dlpack__', |
There was a problem hiding this comment.
__dlpack__是Tensor的方法,不是paddle模块下的函数
| def _grad_ivar(self) -> Tensor | None: ... | ||
|
|
||
| # annotation: ${tensor_alias} | ||
| def __dlpack__(self) -> Any: ... |
There was a problem hiding this comment.
这个返回的是Any吗?应该是CapsuleType,参考Paddle/python/paddle/utils/dlpack.py
setup.py
Outdated
| from setuptools.command.install import install as InstallCommandBase | ||
| from setuptools.command.install_lib import install_lib | ||
| from setuptools.dist import Distribution | ||
| from paddle.utils.dlpack import enable_dlpack |
There was a problem hiding this comment.
__dlpack__作为Tensor的类方法,和__cuda_array_interface__是类似的:
| def test_dlpack_basic(self): | ||
| tensor = paddle.to_tensor([1.0, 2.0, 3.0]) | ||
| dlpack_capsule = tensor.__dlpack__() | ||
| self.assertIsNotNone(dlpack_capsule) |
There was a problem hiding this comment.
只判断是不是None是不够的,需要将dlpack_capsule用paddle.from_dlpack重新转回Tensor,检测转换前的两个tensor里的值,以及.data_ptr()是不是一样的
| "version": 2, | ||
| } | ||
|
|
||
| @property |
There was a problem hiding this comment.
删除,__dlpack__不是一个属性,而是一个方法(函数)
| def test_dlpack_basic(self): | ||
| tensor = paddle.to_tensor([1.0, 2.0, 3.0]) | ||
| dlpack_capsule = tensor.__dlpack__() | ||
| self.assertIsNotNone(dlpack_capsule) | ||
|
|
||
| converted_tensor = paddle.from_dlpack(dlpack_capsule) | ||
| self.assertTrue(paddle.equal_all(tensor, converted_tensor)) | ||
| self.assertEqual(tensor.data_ptr(), converted_tensor.data_ptr()) |
There was a problem hiding this comment.
这个单测有两个问题:
- 设备类型没有测试全,只测了当前默认设备。
- 没有测试stream这个参数非None的情况
Tensor.__dlpack__

PR Category
User Experience
PR Types
New features
Description
Paddle Tensor 规范化:新增
Tensor.__dlpack__