Skip to content

Commit eae4c83

Browse files
authored
[Paddle Tensor No.12][BUPT] 新增 Tensor.__dlpack_device__ (#69632)
* 新增__dlpack_device__ * 修改为DLDeviceType * 修改cpu的device_id * 添加单侧文件 * 添加Place判断逻辑 * 修改单侧文件 * 修改device_id
1 parent 6082a2b commit eae4c83

File tree

4 files changed

+201
-0
lines changed

4 files changed

+201
-0
lines changed

python/paddle/base/dygraph/tensor_patch_methods.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
_PADDLE_DTYPE_2_NUMPY_DTYPE,
3030
convert_uint16_to_float,
3131
)
32+
from paddle.base.libpaddle import Place
3233
from paddle.profiler.utils import in_profiler_mode
3334
from paddle.utils import deprecated
35+
from paddle.utils.dlpack import DLDeviceType
3436

3537
from .. import core, framework, unique_name
3638
from ..framework import (
@@ -127,6 +129,7 @@ def _to_static_var(self, to_parameter=False, **kwargs):
127129
'strides',
128130
'offset',
129131
'__cuda_array_interface__',
132+
'__dlpack_device__',
130133
]
131134
param_keys = ['stop_gradient', 'trainable']
132135
if isinstance(self, EagerParamBase):
@@ -1257,6 +1260,39 @@ def coalesce(self: Tensor, name: str | None = None) -> Tensor:
12571260
"""
12581261
return _C_ops.sparse_coalesce(self)
12591262

1263+
@framework.dygraph_only
1264+
def __dlpack_device__(self):
1265+
"""
1266+
Extract the DLPack device type and device ID for the current tensor.
1267+
1268+
Returns:
1269+
tuple: A tuple containing the DLPack device type and device ID.
1270+
- device_type (DLDeviceType): The type of device (e.g., kDLCPU, kDLCUDA, etc.).
1271+
- device_id (int): The device ID.
1272+
"""
1273+
place = self.place
1274+
if isinstance(place, Place):
1275+
if place.is_gpu_place():
1276+
return DLDeviceType.kDLCUDA, place.gpu_device_id()
1277+
elif place.is_cpu_place():
1278+
return DLDeviceType.kDLCPU, None
1279+
elif place.is_cuda_pinned_place():
1280+
return DLDeviceType.kDLCUDAHost, None
1281+
elif place.is_xpu_place():
1282+
return DLDeviceType.kDLOneAPI, place.xpu_device_id()
1283+
else:
1284+
raise RuntimeError(f"Unsupported Paddle device type {place}")
1285+
elif place.is_cpu_place():
1286+
return DLDeviceType.kDLCPU, None
1287+
elif place.is_cuda_pinned_place():
1288+
return DLDeviceType.kDLCUDAHost, None
1289+
elif place.is_gpu_place():
1290+
return DLDeviceType.kDLCUDA, place.get_device_id()
1291+
elif place.is_xpu_place():
1292+
return DLDeviceType.kDLOneAPI, place.get_device_id()
1293+
else:
1294+
raise ValueError(f"Unsupported tensor place: {place}")
1295+
12601296
@property
12611297
def __cuda_array_interface__(self):
12621298
"""Array view description for cuda tensors.
@@ -1374,6 +1410,7 @@ def __cuda_array_interface__(self):
13741410
("_use_gpudnn", _use_gpudnn),
13751411
("_md5sum", _md5sum),
13761412
("__cuda_array_interface__", __cuda_array_interface__),
1413+
("__dlpack_device__", __dlpack_device__),
13771414
):
13781415
setattr(core.eager.Tensor, method_name, method)
13791416

test/dygraph_to_static/test_tensor_attr_consistency.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
'value',
7979
'zero_',
8080
"__cuda_array_interface__",
81+
"__dlpack_device__",
8182
]
8283
)
8384
STATIC_ONLY_TENSOR_ATTRS_ALLOW_LIST = OrderedSet(

test/legacy_test/test_dlpack.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,86 @@ def test_to_dlpack_from_zero_size(self):
326326
np.testing.assert_array_equal(x.numpy(), y2.numpy())
327327

328328

329+
from paddle.utils.dlpack import DLDeviceType
330+
331+
332+
class TestDLPackDevice(unittest.TestCase):
333+
def test_dlpack_device(self):
334+
with dygraph_guard():
335+
336+
tensor_cpu = paddle.to_tensor([1, 2, 3], place=base.CPUPlace())
337+
device_type, device_id = tensor_cpu.__dlpack_device__()
338+
self.assertEqual(device_type, DLDeviceType.kDLCPU)
339+
self.assertEqual(device_id, None)
340+
341+
if paddle.is_compiled_with_cuda():
342+
tensor_cuda = paddle.to_tensor(
343+
[1, 2, 3], place=base.CUDAPlace(0)
344+
)
345+
device_type, device_id = tensor_cuda.__dlpack_device__()
346+
self.assertEqual(device_type, DLDeviceType.kDLCUDA)
347+
self.assertEqual(device_id, 0)
348+
349+
if paddle.is_compiled_with_cuda():
350+
tensor_pinned = paddle.to_tensor(
351+
[1, 2, 3], place=base.CUDAPinnedPlace()
352+
)
353+
device_type, device_id = tensor_pinned.__dlpack_device__()
354+
self.assertEqual(device_type, DLDeviceType.kDLCUDAHost)
355+
self.assertEqual(device_id, None)
356+
357+
if paddle.is_compiled_with_xpu():
358+
tensor_xpu = paddle.to_tensor([1, 2, 3], place=base.XPUPlace(0))
359+
device_type, device_id = tensor_xpu.__dlpack_device__()
360+
self.assertEqual(device_type, DLDeviceType.kDLOneAPI)
361+
self.assertEqual(device_id, 0)
362+
363+
def test_dlpack_device_zero_dim(self):
364+
with dygraph_guard():
365+
366+
tensor = paddle.to_tensor(5.0, place=base.CPUPlace())
367+
device_type, device_id = tensor.__dlpack_device__()
368+
self.assertEqual(device_type, DLDeviceType.kDLCPU)
369+
self.assertEqual(device_id, None)
370+
371+
if paddle.is_compiled_with_cuda():
372+
tensor_cuda = paddle.to_tensor(5.0, place=base.CUDAPlace(0))
373+
device_type, device_id = tensor_cuda.__dlpack_device__()
374+
self.assertEqual(device_type, DLDeviceType.kDLCUDA)
375+
self.assertEqual(device_id, 0)
376+
377+
if paddle.is_compiled_with_xpu():
378+
tensor_xpu = paddle.to_tensor(5.0, place=base.XPUPlace(0))
379+
device_type, device_id = tensor_xpu.__dlpack_device__()
380+
self.assertEqual(device_type, DLDeviceType.kDLOneAPI)
381+
self.assertEqual(device_id, 0)
382+
383+
def test_dlpack_device_zero_size(self):
384+
with dygraph_guard():
385+
tensor = paddle.to_tensor(
386+
paddle.zeros([0, 10]), place=base.CPUPlace()
387+
)
388+
device_type, device_id = tensor.__dlpack_device__()
389+
self.assertEqual(device_type, DLDeviceType.kDLCPU)
390+
self.assertEqual(device_id, None)
391+
392+
if paddle.is_compiled_with_cuda():
393+
tensor_cuda = paddle.to_tensor(
394+
paddle.zeros([0, 10]), place=base.CUDAPlace(0)
395+
)
396+
device_type, device_id = tensor_cuda.__dlpack_device__()
397+
self.assertEqual(device_type, DLDeviceType.kDLCUDA)
398+
self.assertEqual(device_id, 0)
399+
400+
if paddle.is_compiled_with_xpu():
401+
tensor_xpu = paddle.to_tensor(
402+
paddle.zeros([0, 10]), place=base.XPUPlace(0)
403+
)
404+
device_type, device_id = tensor_xpu.__dlpack_device__()
405+
self.assertEqual(device_type, DLDeviceType.kDLOneAPI)
406+
self.assertEqual(device_id, 0)
407+
408+
329409
class TestRaiseError(unittest.TestCase):
330410
def test_to_dlpack_raise_type_error(self):
331411
self.assertRaises(TypeError, paddle.utils.dlpack.to_dlpack, np.zeros(5))

test/legacy_test/test_eager_tensor.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import paddle.nn.functional as F
2424
from paddle import base
2525
from paddle.base import core
26+
from paddle.utils.dlpack import DLDeviceType
2627

2728

2829
class TestEagerTensor(unittest.TestCase):
@@ -1292,6 +1293,88 @@ def test___cuda_array_interface__(self):
12921293
self.assertIn("version", interface)
12931294
self.assertEqual(interface["version"], 2)
12941295

1296+
def test_dlpack_device(self):
1297+
"""test Tensor.__dlpack_device__"""
1298+
with dygraph_guard():
1299+
# test CPU
1300+
tensor_cpu = paddle.to_tensor([1, 2, 3], place=base.CPUPlace())
1301+
device_type, device_id = tensor_cpu.__dlpack_device__()
1302+
self.assertEqual(device_type, DLDeviceType.kDLCPU)
1303+
self.assertEqual(device_id, None)
1304+
1305+
# test CUDA
1306+
if paddle.is_compiled_with_cuda():
1307+
tensor_cuda = paddle.to_tensor(
1308+
[1, 2, 3], place=base.CUDAPlace(0)
1309+
)
1310+
device_type, device_id = tensor_cuda.__dlpack_device__()
1311+
self.assertEqual(device_type, DLDeviceType.kDLCUDA)
1312+
self.assertEqual(device_id, 0)
1313+
1314+
# test CUDA Pinned
1315+
if paddle.is_compiled_with_cuda():
1316+
tensor_pinned = paddle.to_tensor(
1317+
[1, 2, 3], place=base.CUDAPinnedPlace()
1318+
)
1319+
device_type, device_id = tensor_pinned.__dlpack_device__()
1320+
self.assertEqual(device_type, DLDeviceType.kDLCUDAHost)
1321+
self.assertEqual(device_id, None)
1322+
1323+
# test XPU
1324+
if paddle.is_compiled_with_xpu():
1325+
tensor_xpu = paddle.to_tensor([1, 2, 3], place=base.XPUPlace(0))
1326+
device_type, device_id = tensor_xpu.__dlpack_device__()
1327+
self.assertEqual(device_type, DLDeviceType.kDLOneAPI)
1328+
self.assertEqual(device_id, 0)
1329+
1330+
# zero_dim
1331+
# test CPU
1332+
tensor = paddle.to_tensor(5.0, place=base.CPUPlace())
1333+
device_type, device_id = tensor.__dlpack_device__()
1334+
self.assertEqual(device_type, DLDeviceType.kDLCPU)
1335+
self.assertEqual(device_id, None)
1336+
1337+
# test CUDA
1338+
if paddle.is_compiled_with_cuda():
1339+
tensor_cuda = paddle.to_tensor(5.0, place=base.CUDAPlace(0))
1340+
device_type, device_id = tensor_cuda.__dlpack_device__()
1341+
self.assertEqual(device_type, DLDeviceType.kDLCUDA)
1342+
self.assertEqual(device_id, 0)
1343+
1344+
# test XPU
1345+
if paddle.is_compiled_with_xpu():
1346+
tensor_xpu = paddle.to_tensor(5.0, place=base.XPUPlace(0))
1347+
device_type, device_id = tensor_xpu.__dlpack_device__()
1348+
self.assertEqual(device_type, DLDeviceType.kDLOneAPI)
1349+
self.assertEqual(device_id, 0)
1350+
1351+
# zero_size
1352+
# test CPU
1353+
tensor = paddle.to_tensor(
1354+
paddle.zeros([0, 10]), place=base.CPUPlace()
1355+
)
1356+
device_type, device_id = tensor.__dlpack_device__()
1357+
self.assertEqual(device_type, DLDeviceType.kDLCPU)
1358+
self.assertEqual(device_id, None)
1359+
1360+
# test CUDA
1361+
if paddle.is_compiled_with_cuda():
1362+
tensor_cuda = paddle.to_tensor(
1363+
paddle.zeros([0, 10]), place=base.CUDAPlace(0)
1364+
)
1365+
device_type, device_id = tensor_cuda.__dlpack_device__()
1366+
self.assertEqual(device_type, DLDeviceType.kDLCUDA)
1367+
self.assertEqual(device_id, 0)
1368+
1369+
# test XPU
1370+
if paddle.is_compiled_with_xpu():
1371+
tensor_xpu = paddle.to_tensor(
1372+
paddle.zeros([0, 10]), place=base.XPUPlace(0)
1373+
)
1374+
device_type, device_id = tensor_xpu.__dlpack_device__()
1375+
self.assertEqual(device_type, DLDeviceType.kDLOneAPI)
1376+
self.assertEqual(device_id, 0)
1377+
12951378
def test_tensor__format__(self):
12961379
# test for floating point scalar
12971380
for width in range(0, 5):

0 commit comments

Comments
 (0)