From 10c3086b5f8a5ee6d4e66d5b421e67b6dc35e358 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Mon, 19 Aug 2024 16:05:22 +0200 Subject: [PATCH 01/15] Fix segfault --- src/bindings/python/src/pyopenvino/core/common.cpp | 2 +- tests/layer_tests/tensorflow_tests/test_tf_LookupTableSize.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index 5d44bb74a11e35..ccf1a62cd1a3c7 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -193,7 +193,7 @@ void fill_tensor_from_strings(ov::Tensor& tensor, py::array& array) { PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, reinterpret_cast(ptr), buf.itemsize / 4); PyObject* _utf8_obj = PyUnicode_AsUTF8String(_unicode_obj); const char* _tmp_str = PyBytes_AsString(_utf8_obj); - data[i] = std::string(_tmp_str); + data[i] = std::string(_tmp_str, buf.ndim == 0 ? buf.itemsize : buf.strides[0]); Py_XDECREF(_unicode_obj); Py_XDECREF(_utf8_obj); } diff --git a/tests/layer_tests/tensorflow_tests/test_tf_LookupTableSize.py b/tests/layer_tests/tensorflow_tests/test_tf_LookupTableSize.py index e0050c245f1321..04831c5604358a 100644 --- a/tests/layer_tests/tensorflow_tests/test_tf_LookupTableSize.py +++ b/tests/layer_tests/tensorflow_tests/test_tf_LookupTableSize.py @@ -68,9 +68,6 @@ def create_lookup_table_size_net(self, hash_table_type, keys_type, values_type, @pytest.mark.nightly def test_lookup_table_size(self, hash_table_type, params, ie_device, precision, ir_version, temp_dir, use_legacy_frontend): - keys_type = params['keys_type'] - if ie_device == 'GPU' and keys_type == str: - pytest.skip("148921: Segmentation fault on GPU") self._test(*self.create_lookup_table_size_net(hash_table_type=hash_table_type, **params), ie_device, precision, ir_version, temp_dir=temp_dir, use_legacy_frontend=use_legacy_frontend) From 15cd31fcf9cb9bfab986d9d68bbca59d36cc05d0 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Tue, 20 Aug 2024 16:27:13 +0200 Subject: [PATCH 02/15] Debug --- src/bindings/python/src/pyopenvino/core/common.cpp | 7 ++++++- src/bindings/python/src/pyopenvino/utils/utils.cpp | 13 +++++++++++++ src/bindings/python/src/pyopenvino/utils/utils.hpp | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index ccf1a62cd1a3c7..750afdb35ae51c 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -10,6 +10,7 @@ #include "openvino/core/except.hpp" #include "openvino/runtime/shared_buffer.hpp" #include "openvino/util/common_util.hpp" +#include "pyopenvino/utils/utils.hpp" #define C_CONTIGUOUS py::detail::npy_api::constants::NPY_ARRAY_C_CONTIGUOUS_ @@ -193,7 +194,11 @@ void fill_tensor_from_strings(ov::Tensor& tensor, py::array& array) { PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, reinterpret_cast(ptr), buf.itemsize / 4); PyObject* _utf8_obj = PyUnicode_AsUTF8String(_unicode_obj); const char* _tmp_str = PyBytes_AsString(_utf8_obj); - data[i] = std::string(_tmp_str, buf.ndim == 0 ? buf.itemsize : buf.strides[0]); + if (!Common::utils::is_string_null_terminated(_tmp_str)) { + data[i] = std::string(_tmp_str); + } else { + data[i] = std::string(_tmp_str, buf.ndim == 0 ? buf.itemsize : buf.strides[0]); + } Py_XDECREF(_unicode_obj); Py_XDECREF(_utf8_obj); } diff --git a/src/bindings/python/src/pyopenvino/utils/utils.cpp b/src/bindings/python/src/pyopenvino/utils/utils.cpp index 845691749b64f4..bd80572810cf86 100644 --- a/src/bindings/python/src/pyopenvino/utils/utils.cpp +++ b/src/bindings/python/src/pyopenvino/utils/utils.cpp @@ -258,6 +258,19 @@ std::map properties_to_any_map(const std::map properties_to_any_map(const std::map& properties); + bool is_string_null_terminated(const char* item); + std::string convert_path_to_string(const py::object& path); void deprecation_warning(const std::string& function_name, const std::string& version = std::string(), const std::string& message = std::string(), int stacklevel=2); From 6440f11ac36000ea06be940f610e0f0361e617c2 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Thu, 12 Sep 2024 13:11:14 +0200 Subject: [PATCH 03/15] Debug fix --- src/bindings/python/src/pyopenvino/core/common.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index 07de93b26fc124..bc1e70598bfda5 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -195,10 +195,10 @@ void fill_tensor_from_strings(ov::Tensor& tensor, py::array& array) { PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, reinterpret_cast(ptr), buf.itemsize / 4); PyObject* _utf8_obj = PyUnicode_AsUTF8String(_unicode_obj); const char* _tmp_str = PyBytes_AsString(_utf8_obj); - if (!Common::utils::is_string_null_terminated(_tmp_str)) { - data[i] = std::string(_tmp_str); + if (buf.ndim == 0) { + data[i] = std::string(_tmp_str, buf.itemsize); } else { - data[i] = std::string(_tmp_str, buf.ndim == 0 ? buf.itemsize : buf.strides[0]); + data[i] = std::string(_tmp_str); } Py_XDECREF(_unicode_obj); Py_XDECREF(_utf8_obj); From 75380f1efd375f346b4393c28c2fb917e0270722 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Thu, 12 Sep 2024 13:15:28 +0200 Subject: [PATCH 04/15] Cleanup --- src/bindings/python/src/pyopenvino/core/common.cpp | 2 +- src/bindings/python/src/pyopenvino/utils/utils.cpp | 13 ------------- src/bindings/python/src/pyopenvino/utils/utils.hpp | 2 -- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index bc1e70598bfda5..020f088e595141 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -10,8 +10,8 @@ #include "openvino/core/except.hpp" #include "openvino/runtime/shared_buffer.hpp" #include "openvino/util/common_util.hpp" -#include "pyopenvino/utils/utils.hpp" #include "pyopenvino/core/remote_tensor.hpp" +#include "pyopenvino/utils/utils.hpp" #define C_CONTIGUOUS py::detail::npy_api::constants::NPY_ARRAY_C_CONTIGUOUS_ diff --git a/src/bindings/python/src/pyopenvino/utils/utils.cpp b/src/bindings/python/src/pyopenvino/utils/utils.cpp index 674db6a86d590f..e165c2e00b4808 100644 --- a/src/bindings/python/src/pyopenvino/utils/utils.cpp +++ b/src/bindings/python/src/pyopenvino/utils/utils.cpp @@ -282,19 +282,6 @@ std::map properties_to_any_map(const std::map properties_to_any_map(const std::map& properties); - bool is_string_null_terminated(const char* item); - std::string convert_path_to_string(const py::object& path); void deprecation_warning(const std::string& function_name, const std::string& version = std::string(), const std::string& message = std::string(), int stacklevel=2); From c3ee56a31e232235447486611e924bce2e4e590b Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Thu, 12 Sep 2024 14:26:27 +0200 Subject: [PATCH 05/15] Debug --- src/bindings/python/src/pyopenvino/core/common.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index 020f088e595141..eb418362cbca6b 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -195,11 +195,7 @@ void fill_tensor_from_strings(ov::Tensor& tensor, py::array& array) { PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, reinterpret_cast(ptr), buf.itemsize / 4); PyObject* _utf8_obj = PyUnicode_AsUTF8String(_unicode_obj); const char* _tmp_str = PyBytes_AsString(_utf8_obj); - if (buf.ndim == 0) { - data[i] = std::string(_tmp_str, buf.itemsize); - } else { - data[i] = std::string(_tmp_str); - } + data[i] = std::string(_tmp_str, strlen(_tmp_str)); Py_XDECREF(_unicode_obj); Py_XDECREF(_utf8_obj); } From 6d6980fe8ff8a3fc3f46421222bf9cbb358398a0 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Tue, 17 Sep 2024 11:29:25 +0200 Subject: [PATCH 06/15] Change ctor --- src/bindings/python/src/pyopenvino/core/common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index eb418362cbca6b..537e414333551e 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -195,7 +195,7 @@ void fill_tensor_from_strings(ov::Tensor& tensor, py::array& array) { PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, reinterpret_cast(ptr), buf.itemsize / 4); PyObject* _utf8_obj = PyUnicode_AsUTF8String(_unicode_obj); const char* _tmp_str = PyBytes_AsString(_utf8_obj); - data[i] = std::string(_tmp_str, strlen(_tmp_str)); + data[i] = std::string(_tmp_str, buf.strides[0]); Py_XDECREF(_unicode_obj); Py_XDECREF(_utf8_obj); } From 77a6138ca3359c5742eeb8ad7494b10c8220c7fa Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 12:57:21 +0200 Subject: [PATCH 07/15] Change Python assignment operation --- .../src/openvino/runtime/utils/data_helpers/data_dispatcher.py | 3 ++- src/bindings/python/src/pyopenvino/core/common.cpp | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index bce10c9c3774ef..593fb905c6a87c 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -321,7 +321,8 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - tensor.bytes_data = inputs + for i in range(inputs.size): + tensor.bytes_data[i] = inputs[i] else: tensor.data[:] = inputs[:] else: diff --git a/src/bindings/python/src/pyopenvino/core/common.cpp b/src/bindings/python/src/pyopenvino/core/common.cpp index 537e414333551e..a202c3a3801001 100644 --- a/src/bindings/python/src/pyopenvino/core/common.cpp +++ b/src/bindings/python/src/pyopenvino/core/common.cpp @@ -11,7 +11,6 @@ #include "openvino/runtime/shared_buffer.hpp" #include "openvino/util/common_util.hpp" #include "pyopenvino/core/remote_tensor.hpp" -#include "pyopenvino/utils/utils.hpp" #define C_CONTIGUOUS py::detail::npy_api::constants::NPY_ARRAY_C_CONTIGUOUS_ @@ -195,7 +194,7 @@ void fill_tensor_from_strings(ov::Tensor& tensor, py::array& array) { PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, reinterpret_cast(ptr), buf.itemsize / 4); PyObject* _utf8_obj = PyUnicode_AsUTF8String(_unicode_obj); const char* _tmp_str = PyBytes_AsString(_utf8_obj); - data[i] = std::string(_tmp_str, buf.strides[0]); + data[i] = std::string(_tmp_str); Py_XDECREF(_unicode_obj); Py_XDECREF(_utf8_obj); } From 4d932e227702bab2c2ec6743eeca9ff1b393f253 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 13:03:10 +0200 Subject: [PATCH 08/15] Minor change --- .../src/openvino/runtime/utils/data_helpers/data_dispatcher.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 593fb905c6a87c..5e97c499ab78ee 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -321,8 +321,7 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - for i in range(inputs.size): - tensor.bytes_data[i] = inputs[i] + tensor.bytes_data[:] = inputs[:] else: tensor.data[:] = inputs[:] else: From 32f9335d39fa1ddd1c6298d0285149c34df344ec Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 13:44:42 +0200 Subject: [PATCH 09/15] Adjust logic for byte strings --- .../utils/data_helpers/data_dispatcher.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 5e97c499ab78ee..a3a10323901c40 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -41,6 +41,16 @@ def get_request_tensor( raise TypeError(f"Unsupported key type: {type(key)} for Tensor under key: {key}") +def is_all_ascii(input_array): + def isascii(s): + if isinstance(s, bytes): + s = s.decode('utf-8') + return s.isascii() + v_isascii = np.vectorize(isascii) + ascii_flags = v_isascii(input_array) + return ascii_flags.all() + + @singledispatch def value_to_tensor( value: Union[Tensor, np.ndarray, ScalarTypes, str], @@ -314,6 +324,7 @@ def _( request: _InferRequestWrapper, key: Optional[ValidKeys] = None, ) -> None: + if inputs.ndim != 0: tensor = get_request_tensor(request, key) # Update shape if there is a mismatch @@ -321,7 +332,10 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - tensor.bytes_data[:] = inputs[:] + if is_all_ascii(inputs) and inputs.dtype.char == 'U': + tensor.bytes_data[:] = inputs[:] + else: + tensor.bytes_data = inputs else: tensor.data[:] = inputs[:] else: From 423a94bb0869e881f12ce5c4b20eab48df6fc0be Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 13:45:16 +0200 Subject: [PATCH 10/15] Minor change --- .../src/openvino/runtime/utils/data_helpers/data_dispatcher.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index a3a10323901c40..597c0d8ade5eb8 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -324,7 +324,6 @@ def _( request: _InferRequestWrapper, key: Optional[ValidKeys] = None, ) -> None: - if inputs.ndim != 0: tensor = get_request_tensor(request, key) # Update shape if there is a mismatch From f45a57ab0f8ecb227f681678401e41c5a10f2f58 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 13:54:05 +0200 Subject: [PATCH 11/15] Fix flake --- .../runtime/utils/data_helpers/data_dispatcher.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 597c0d8ade5eb8..57de16344c0d81 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -42,10 +42,10 @@ def get_request_tensor( def is_all_ascii(input_array): - def isascii(s): - if isinstance(s, bytes): - s = s.decode('utf-8') - return s.isascii() + def isascii(data): + if isinstance(data, bytes): + data = data.decode("utf-8") + return data.isascii() v_isascii = np.vectorize(isascii) ascii_flags = v_isascii(input_array) return ascii_flags.all() @@ -331,7 +331,7 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - if is_all_ascii(inputs) and inputs.dtype.char == 'U': + if is_all_ascii(inputs) and inputs.dtype.char == "U": tensor.bytes_data[:] = inputs[:] else: tensor.bytes_data = inputs From 17f2618540dcb73bc56949483706eb7e3f9f3547 Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 13:57:40 +0200 Subject: [PATCH 12/15] Fix mypy --- .../openvino/runtime/utils/data_helpers/data_dispatcher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 57de16344c0d81..1a5d1e8c26b821 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -41,8 +41,8 @@ def get_request_tensor( raise TypeError(f"Unsupported key type: {type(key)} for Tensor under key: {key}") -def is_all_ascii(input_array): - def isascii(data): +def is_all_ascii(input_array: Union[np.ndarray, list[bytes]]) -> bool: + def isascii(data: Union[str, bytes]) -> bool: if isinstance(data, bytes): data = data.decode("utf-8") return data.isascii() From b9bb13056f3b45b6a4a591405d0cbe8159a0697a Mon Sep 17 00:00:00 2001 From: p-wysocki Date: Wed, 18 Sep 2024 15:18:58 +0200 Subject: [PATCH 13/15] Logic for U17 --- .../openvino/runtime/utils/data_helpers/data_dispatcher.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 1a5d1e8c26b821..3890680035a1f9 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 from functools import singledispatch -from typing import Any, Dict, Union, Optional +from typing import Any, Dict, Union, Optional, List import numpy as np @@ -41,7 +41,7 @@ def get_request_tensor( raise TypeError(f"Unsupported key type: {type(key)} for Tensor under key: {key}") -def is_all_ascii(input_array: Union[np.ndarray, list[bytes]]) -> bool: +def is_all_ascii(input_array: Union[np.ndarray, List[bytes]]) -> bool: def isascii(data: Union[str, bytes]) -> bool: if isinstance(data, bytes): data = data.decode("utf-8") @@ -331,7 +331,7 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - if is_all_ascii(inputs) and inputs.dtype.char == "U": + if is_all_ascii(inputs) and inputs.dtype.char == "U" and inputs.dtype != " Date: Wed, 18 Sep 2024 15:21:02 +0200 Subject: [PATCH 14/15] Minor change --- .../src/openvino/runtime/utils/data_helpers/data_dispatcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 3890680035a1f9..777192253cd133 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -331,7 +331,7 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - if is_all_ascii(inputs) and inputs.dtype.char == "U" and inputs.dtype != " Date: Wed, 18 Sep 2024 15:37:02 +0200 Subject: [PATCH 15/15] Add logic for F_CONTIGUOUS --- .../src/openvino/runtime/utils/data_helpers/data_dispatcher.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 777192253cd133..9b14a9f13c3ea4 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -331,7 +331,8 @@ def _( tensor.shape = inputs.shape # When copying, type should be up/down-casted automatically. if tensor.element_type == Type.string: - if is_all_ascii(inputs) and inputs.dtype.char == "U": + # Edge case resolving assignment segfaults on GPU + if is_all_ascii(inputs) and inputs.dtype.char == "U" and inputs.flags["F_CONTIGUOUS"]: tensor.bytes_data[:] = inputs[:] else: tensor.bytes_data = inputs