From ade44674d47be0782b003ca4a65c17aa77f52581 Mon Sep 17 00:00:00 2001 From: shadeMe Date: Wed, 11 May 2022 12:45:35 +0200 Subject: [PATCH 1/4] `CupyOps`: Simplify `asarray` --- thinc/backends/cupy_ops.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/thinc/backends/cupy_ops.py b/thinc/backends/cupy_ops.py index ec70cf72e..7d8e9af85 100644 --- a/thinc/backends/cupy_ops.py +++ b/thinc/backends/cupy_ops.py @@ -59,29 +59,24 @@ def gemm(self, x, y, out=None, trans1=False, trans2=False): return out def asarray(self, data, dtype=None): - # This is sort of frustrating, but we can't easily otherwise pass - # forward "unset". - dtype = {"dtype": dtype} if dtype is not None else {} - # We'll try to perform a zero-copy conversion if possible. - array = None - cast_array = False + cast_array = True + if is_cupy_array(data): - array = self.xp.asarray(data, **dtype) + array = self.xp.asarray(data, dtype=dtype) + cast_array = False elif is_torch_gpu_array(data): array = torch2xp(data) - cast_array = True elif is_tensorflow_gpu_array(data): array = tensorflow2xp(data) - cast_array = True elif is_mxnet_gpu_array(data): array = mxnet2xp(data) - cast_array = True else: - array = self.xp.array(data, **dtype) + array = self.xp.array(data, dtype=dtype) + cast_array = False - if cast_array and dtype != {}: - array = array.astype(dtype["dtype"]) + if cast_array and dtype is not None: + array = array.astype(dtype=dtype) return array From 84753c575d6c69f303be3af2e59a5369911c4fd7 Mon Sep 17 00:00:00 2001 From: shadeMe Date: Wed, 11 May 2022 12:55:07 +0200 Subject: [PATCH 2/4] Remove `cast_array` flag and use `astype` unconditionally --- thinc/backends/cupy_ops.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/thinc/backends/cupy_ops.py b/thinc/backends/cupy_ops.py index 7d8e9af85..5c140c46d 100644 --- a/thinc/backends/cupy_ops.py +++ b/thinc/backends/cupy_ops.py @@ -60,11 +60,8 @@ def gemm(self, x, y, out=None, trans1=False, trans2=False): def asarray(self, data, dtype=None): # We'll try to perform a zero-copy conversion if possible. - cast_array = True - if is_cupy_array(data): - array = self.xp.asarray(data, dtype=dtype) - cast_array = False + array = self.xp.asarray(data) elif is_torch_gpu_array(data): array = torch2xp(data) elif is_tensorflow_gpu_array(data): @@ -72,12 +69,9 @@ def asarray(self, data, dtype=None): elif is_mxnet_gpu_array(data): array = mxnet2xp(data) else: - array = self.xp.array(data, dtype=dtype) - cast_array = False - - if cast_array and dtype is not None: - array = array.astype(dtype=dtype) + array = self.xp.array(data) + array = array.astype(dtype=dtype, copy=False) return array def maxout(self, X): From 502a6b47fa37cdf45466147d92cefcdafb2e2b2c Mon Sep 17 00:00:00 2001 From: shadeMe Date: Wed, 11 May 2022 13:02:44 +0200 Subject: [PATCH 3/4] Revert unconditional call to `astype` --- thinc/backends/cupy_ops.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/thinc/backends/cupy_ops.py b/thinc/backends/cupy_ops.py index 5c140c46d..8ef097a52 100644 --- a/thinc/backends/cupy_ops.py +++ b/thinc/backends/cupy_ops.py @@ -71,7 +71,9 @@ def asarray(self, data, dtype=None): else: array = self.xp.array(data) - array = array.astype(dtype=dtype, copy=False) + if dtype is not None: + array = array.astype(dtype=dtype, copy=False) + return array def maxout(self, X): From f0e6bb9363fa7fe1b0c784f505cfe90fa4a1533c Mon Sep 17 00:00:00 2001 From: shadeMe Date: Thu, 12 May 2022 11:35:25 +0200 Subject: [PATCH 4/4] Remove no-op --- thinc/backends/cupy_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thinc/backends/cupy_ops.py b/thinc/backends/cupy_ops.py index 8ef097a52..9f420fcd6 100644 --- a/thinc/backends/cupy_ops.py +++ b/thinc/backends/cupy_ops.py @@ -61,7 +61,7 @@ def gemm(self, x, y, out=None, trans1=False, trans2=False): def asarray(self, data, dtype=None): # We'll try to perform a zero-copy conversion if possible. if is_cupy_array(data): - array = self.xp.asarray(data) + array = data elif is_torch_gpu_array(data): array = torch2xp(data) elif is_tensorflow_gpu_array(data):