From 3863a33e1c5f4ccc3f6478497c40460e7a968429 Mon Sep 17 00:00:00 2001 From: Fengjuzhuwhw <32644100+Fengjuzhuwhw@users.noreply.github.com> Date: Sat, 26 Dec 2020 19:35:57 +0800 Subject: [PATCH 1/4] Create dlpack.py --- mindspore/numpy/dlpack.py | 133 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 mindspore/numpy/dlpack.py diff --git a/mindspore/numpy/dlpack.py b/mindspore/numpy/dlpack.py new file mode 100644 index 00000000000..6f11c812b90 --- /dev/null +++ b/mindspore/numpy/dlpack.py @@ -0,0 +1,133 @@ + +import ctypes + +class DLDeviceType(ctypes.c_int): + kDLCPU = 1 + kDLGPU = 2 + kDLCPUPinned = 3 + kDLOpenCL = 4 + kDLVulkan = 7 + kDLMetal = 8 + kDLVPI = 9 + kDLROCM = 10 + kDLExtDev = 12 + +class DLDataTypeCode(ctypes.c_uint8): + kDLInt = 0 + kDLUInt = 1 + kDLFloat = 2 + kDLBfloat = 4 + + def __str__(self): + return {self.kDLInt : 'int', self.kDLUInt : 'uint', self.kDLFloat : 'float', self.kDLBfloat : 'bfloat'}[self.value] + +class DLDataType(ctypes.Structure): + _fields_ = [ + ('type_code', DLDataTypeCode), + ('bits', ctypes.c_uint8), + ('lanes', ctypes.c_uint16) + ] + + @property + def descr(self): + typestr = str(self.type_code) + str(self.bits) + return [('f' + str(l), typestr) for l in range(self.lanes)] + + def __str__(self): + return repr(self.descr) + +class DLContext(ctypes.Structure): + _fields_ = [ + ('device_type', DLDeviceType), + ('device_id', ctypes.c_int) + ] + +class DLTensor(ctypes.Structure): + _fields_ = [ + ('data', ctypes.c_void_p), + ('ctx', DLContext), + ('ndim', ctypes.c_int), + ('dtype', DLDataType), + ('shape', ctypes.POINTER(ctypes.c_int64)), + ('strides', ctypes.POINTER(ctypes.c_int64)), + ('byte_offset', ctypes.c_uint64) + ] + + @property + def size(self): + prod = 1 + for i in range(self.ndim): + prod *= self.shape[i] + return prod + + @property + def itemsize(self): + return self.dtype.lanes * self.dtype.bits // 8; + + @property + def nbytes(self): + return self.size * self.itemsize + + @property + def __array_interface__(self): + shape = tuple(self.shape[dim] for dim in range(self.ndim)) + strides = tuple(self.strides[dim] * self.itemsize for dim in range(self.ndim)) + typestr = '|' + str(self.dtype.type_code)[0] + str(self.itemsize) + return dict(version = 3, shape = shape, strides = strides, data = (self.data, True), offset = self.byte_offset, typestr = typestr) + + def __str__(self): + return 'dtype={dtype}, ndim={ndim}, shape={shape}, strides={strides}, byte_offset={byte_offset}'.format(dtype = self.dtype, ndim = self.ndim, shape = tuple(self.shape[i] for i in range(self.ndim)), strides = tuple(self.strides[i] for i in range(self.ndim)), byte_offset = self.byte_offset) + +class DLManagedTensor(ctypes.Structure): + _fields_ = [ + ('dl_tensor', DLTensor), + ('manager_ctx', ctypes.c_void_p), + ('deleter', ctypes.CFUNCTYPE(None, ctypes.c_void_p)) + ] + +PyCapsule_Destructor = ctypes.CFUNCTYPE(None, ctypes.py_object) +PyCapsule_New = ctypes.pythonapi.PyCapsule_New +PyCapsule_New.restype = ctypes.py_object +PyCapsule_New.argtypes = (ctypes.c_void_p, ctypes.c_char_p, ctypes.c_void_p) +PyCapsule_GetPointer = ctypes.pythonapi.PyCapsule_GetPointer +PyCapsule_GetPointer.restype = ctypes.c_void_p +PyCapsule_GetPointer.argtypes = (ctypes.py_object, ctypes.c_char_p) + +def to_dlpack(dl_managed_tensor): + return PyCapsule_New(ctypes.byref(dl_managed_tensor), b'dltensor', None) + +def numpy_from_dlpack(pycapsule): + dl_managed_tensor = ctypes.cast(PyCapsule_GetPointer(pycapsule, b'dltensor'), ctypes.POINTER(DLManagedTensor)).contents + wrapped = type('', (), dict(__array_interface__ = dl_managed_tensor.dl_tensor.__array_interface__, __del__ = lambda self: dl_managed_tensor.deleter(ctypes.byref(dl_managed_tensor))))() + return numpy.asarray(wrapped) + +if __name__ == '__main__': + import os + import sys + import numpy + import torch.utils.dlpack + + lib = ctypes.CDLL(os.path.abspath('libdlpack.so')) + lib.create_and_allocate_dlpack_tensor.restype = DLManagedTensor + dl_managed_tensor = lib.create_and_allocate_dlpack_tensor() + + dlpack_tensor = to_dlpack(dl_managed_tensor) + + if 'numpy' in sys.argv[1]: + array = numpy_from_dlpack(dlpack_tensor) + elif 'torch' in sys.argv[1]: + array = torch.utils.dlpack.from_dlpack(dlpack_tensor) + + array.tofile(sys.argv[1]) + del dlpack_tensor +## dlpack to numpy.array +def numpy_from_dlpack(pycapsule): + dl_managed_tensor = ctypes.cast(PyCapsule_GetPointer(pycapsule, b'dltensor'), ctypes.POINTER(DLManagedTensor)).contents + wrapped = type('', (), dict(__array_interface__ = dl_managed_tensor.dl_tensor.__array_interface__, __del__ = lambda self: dl_managed_tensor.deleter(ctypes.byref(dl_managed_tensor))))() + return numpy.asarray(wrapped) + +## numpy.array to mindspore.tensor +from mindspore import Tensor +import numpy as np +def tensor_from_numpy(data_numpy): + return Tensor(data_numpy) From 7561e2e2f43f20cda61e5914a96de25d6cf7d094 Mon Sep 17 00:00:00 2001 From: Fengjuzhuwhw <32644100+Fengjuzhuwhw@users.noreply.github.com> Date: Sat, 26 Dec 2020 19:38:06 +0800 Subject: [PATCH 2/4] Update dlpack.py --- mindspore/numpy/dlpack.py | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/mindspore/numpy/dlpack.py b/mindspore/numpy/dlpack.py index 6f11c812b90..0860c6c45fd 100644 --- a/mindspore/numpy/dlpack.py +++ b/mindspore/numpy/dlpack.py @@ -1,4 +1,4 @@ - +# https://github.com/vadimkantorov/pydlpack/blob/master/dlpack.py import ctypes class DLDeviceType(ctypes.c_int): @@ -95,31 +95,7 @@ class DLManagedTensor(ctypes.Structure): def to_dlpack(dl_managed_tensor): return PyCapsule_New(ctypes.byref(dl_managed_tensor), b'dltensor', None) - -def numpy_from_dlpack(pycapsule): - dl_managed_tensor = ctypes.cast(PyCapsule_GetPointer(pycapsule, b'dltensor'), ctypes.POINTER(DLManagedTensor)).contents - wrapped = type('', (), dict(__array_interface__ = dl_managed_tensor.dl_tensor.__array_interface__, __del__ = lambda self: dl_managed_tensor.deleter(ctypes.byref(dl_managed_tensor))))() - return numpy.asarray(wrapped) - -if __name__ == '__main__': - import os - import sys - import numpy - import torch.utils.dlpack - - lib = ctypes.CDLL(os.path.abspath('libdlpack.so')) - lib.create_and_allocate_dlpack_tensor.restype = DLManagedTensor - dl_managed_tensor = lib.create_and_allocate_dlpack_tensor() - - dlpack_tensor = to_dlpack(dl_managed_tensor) - if 'numpy' in sys.argv[1]: - array = numpy_from_dlpack(dlpack_tensor) - elif 'torch' in sys.argv[1]: - array = torch.utils.dlpack.from_dlpack(dlpack_tensor) - - array.tofile(sys.argv[1]) - del dlpack_tensor ## dlpack to numpy.array def numpy_from_dlpack(pycapsule): dl_managed_tensor = ctypes.cast(PyCapsule_GetPointer(pycapsule, b'dltensor'), ctypes.POINTER(DLManagedTensor)).contents From 728888f4a6a5dc9755958dece8b49af4f1f86e38 Mon Sep 17 00:00:00 2001 From: Fengjuzhuwhw <32644100+Fengjuzhuwhw@users.noreply.github.com> Date: Sat, 26 Dec 2020 19:40:42 +0800 Subject: [PATCH 3/4] Update dlpack.py This is the first pr of WWZ team!!! --- mindspore/numpy/dlpack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mindspore/numpy/dlpack.py b/mindspore/numpy/dlpack.py index 0860c6c45fd..8bee055d775 100644 --- a/mindspore/numpy/dlpack.py +++ b/mindspore/numpy/dlpack.py @@ -102,7 +102,7 @@ def numpy_from_dlpack(pycapsule): wrapped = type('', (), dict(__array_interface__ = dl_managed_tensor.dl_tensor.__array_interface__, __del__ = lambda self: dl_managed_tensor.deleter(ctypes.byref(dl_managed_tensor))))() return numpy.asarray(wrapped) -## numpy.array to mindspore.tensor +### numpy.array to mindspore.tensor from mindspore import Tensor import numpy as np def tensor_from_numpy(data_numpy): From 553bb6e9d1156d8170f7ce9b9dd376e545f8bf97 Mon Sep 17 00:00:00 2001 From: Fengjuzhuwhw <32644100+Fengjuzhuwhw@users.noreply.github.com> Date: Sat, 26 Dec 2020 20:28:22 +0800 Subject: [PATCH 4/4] Update dlpack.py this is the second PR of WZZ team! --- mindspore/numpy/dlpack.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/mindspore/numpy/dlpack.py b/mindspore/numpy/dlpack.py index 8bee055d775..308a939668f 100644 --- a/mindspore/numpy/dlpack.py +++ b/mindspore/numpy/dlpack.py @@ -93,17 +93,27 @@ class DLManagedTensor(ctypes.Structure): PyCapsule_GetPointer.restype = ctypes.c_void_p PyCapsule_GetPointer.argtypes = (ctypes.py_object, ctypes.c_char_p) -def to_dlpack(dl_managed_tensor): - return PyCapsule_New(ctypes.byref(dl_managed_tensor), b'dltensor', None) -## dlpack to numpy.array -def numpy_from_dlpack(pycapsule): - dl_managed_tensor = ctypes.cast(PyCapsule_GetPointer(pycapsule, b'dltensor'), ctypes.POINTER(DLManagedTensor)).contents - wrapped = type('', (), dict(__array_interface__ = dl_managed_tensor.dl_tensor.__array_interface__, __del__ = lambda self: dl_managed_tensor.deleter(ctypes.byref(dl_managed_tensor))))() - return numpy.asarray(wrapped) - -### numpy.array to mindspore.tensor +### mindspore.tensor to numpy.array from mindspore import Tensor import numpy as np def tensor_from_numpy(data_numpy): + if not isinstance(data_numpy,np.array): + panic() return Tensor(data_numpy) + +## dlpack to numpy.array +def from_dlpack(pycapsule): + dl_managed_tensor = ctypes.cast(PyCapsule_GetPointer(pycapsule, b'dltensor'), ctypes.POINTER(DLManagedTensor)).contents + wrapped = type('', (), dict(__array_interface__ = dl_managed_tensor.dl_tensor.__array_interface__, __del__ = lambda self: dl_managed_tensor.deleter(ctypes.byref(dl_managed_tensor))))() + tensor_mindspore = tensor_from_numpy(numpy.asarray(wrapped)) + return tensor_mindspore + +# def to_dlpack(tensor_mindspore): +# if not isinstance(tensor_mindspore, mindspore.Tensor): +# panic() +# data_numpy = tensor_mindspore.asnumpy() +# return PyCapsule_New(ctypes.byref(dl_managed_tensor), b'dltensor', None) + + +#