From 428a8d54f574a73804274e53e61f711aebc25a0a Mon Sep 17 00:00:00 2001 From: Raul Farkas Date: Mon, 16 Jan 2023 16:52:18 +0000 Subject: MLBEDSW-6982: Move to setup.cfg and pyproject.toml - Move all static information from setup.py to newly added pyproject.toml - Add setup.cfg used for static information that cannot be added to pyproject.toml due to it still being in beta. - Modify mlw_codec to to throw a real python exception when importing NumPy arrays instead of just printing them to stdout. - Surround mlw_codec import with try catch statement to catch NumPy C API mismatch errors and throw them again with a more detailed message. - Update README.md with documentation about known issue with changing used NumPy version after installing ethos-u-vela. Change-Id: I1eeee5536be7c1744e30d6088f7069fbb1403e06 Signed-off-by: Raul Farkas --- README.md | 60 ++++++++++++++++++++++++++++++++++++++ ethosu/mlw_codec/mlw_codecmodule.c | 17 +++++++++-- ethosu/vela/weight_compressor.py | 25 ++++++++++++++-- pyproject.toml | 56 +++++++++++++++++++++++++++++++++++ setup.cfg | 27 +++++++++++++++++ setup.py | 39 +------------------------ 6 files changed, 181 insertions(+), 43 deletions(-) create mode 100644 pyproject.toml create mode 100644 setup.cfg diff --git a/README.md b/README.md index ecd13228..974b0b63 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,66 @@ Some example networks that contain quantised operators which can be compiled by Vela to run on the Ethos-U NPU can be found at: +## Known Issues + +### 1. NumPy C API version change + +Once ethos-u-vela is installed, the user might want to install a different NumPy +version that is still within the dependency constraints defined in pyproject.toml. + +In some scenarios, doing so might prevent ethos-u-vela from functioning as +expected due to incompatibilities between the installed NumPy C headers used in +the mlw_codec and the current version of NumPy. + +**Example scenario:** + +In the ethos-u-vela source directory, run: + +```bash +virtualenv -p 3.8 venv +. venv/bin/activate +pip install ethos-u-vela +``` + +Next, install a different NumPy version (e.g. 1.21.3) + +```bash +pip install numpy==1.21.3 --force +``` + +Finally, run ethos-u-vela. You might get an error similar to this: + +``` +ImportError: NumPy C API version mismatch +(Build-time version: 0x10, Run-time version: 0xe) +This is a known issue most likely caused by a change in the API version in +NumPy after installing ethos-u-vela. +``` + +#### Solution + +In order for ethos-u-vela to work with an older version of NumPy that uses +different C APIs, you will need to install the desired NumPy version first, and +then build ethos-u-vela with that specific NumPy version: + +1) Uninstall ethos-u-vela and install the desired version of NumPy + ``` + pip uninstall ethos-u-vela + pip install numpy==1.21.3 --force + ``` + +2) Install required build dependencies + ``` + pip install "setuptools_scm[toml]<6" wheel + ``` + +3) Install ethos-u-vela without build isolation. Not using build isolation + ensures that the correct version of NumPy is used when copying the C headers + in mlw_codec during the build process. + ``` + pip install ethos-u-vela --no-build-isolation --no-cache-dir + ``` + ## APIs Please see [Vela External APIs](API.md). diff --git a/ethosu/mlw_codec/mlw_codecmodule.c b/ethosu/mlw_codec/mlw_codecmodule.c index 61ae6a47..8c540d61 100644 --- a/ethosu/mlw_codec/mlw_codecmodule.c +++ b/ethosu/mlw_codec/mlw_codecmodule.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright 2020-2021 Arm Limited and/or its affiliates + * SPDX-FileCopyrightText: Copyright 2020-2021, 2023 Arm Limited and/or its affiliates * * SPDX-License-Identifier: Apache-2.0 * @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - #define PY_SSIZE_T_CLEAN #include #include @@ -307,7 +306,19 @@ static struct PyModuleDef mlw_codecmodule = { PyMODINIT_FUNC PyInit_mlw_codec(void) { + PyObject *ptype, *pvalue, *ptraceback; PyObject* ret = PyModule_Create(&mlw_codecmodule); - import_array(); + if (_import_array() < 0) + { + // Fetch currently set error + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + // Extract the error message + const char *pStrErrorMessage = PyUnicode_AsUTF8(pvalue); + // Re-format error message to start with "mlw_codec Error: " so it is + // clearer it comes from mlw_codec. + PyErr_Format(PyExc_RuntimeError, "mlw_codec error: %s", pStrErrorMessage); + return NULL; + } + return ret; } diff --git a/ethosu/vela/weight_compressor.py b/ethosu/vela/weight_compressor.py index e3e318c3..e56cc5e5 100644 --- a/ethosu/vela/weight_compressor.py +++ b/ethosu/vela/weight_compressor.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2020-2022 Arm Limited and/or its affiliates +# SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates # # SPDX-License-Identifier: Apache-2.0 # @@ -37,7 +37,28 @@ from .scaling import reduced_quantise_scale from .tensor import Tensor from .tensor import TensorFormat from .tensor import TensorPurpose -from ethosu import mlw_codec + +# Handle any errors thrown by NumPy while importing mlw_codec module +try: + from ethosu import mlw_codec +except RuntimeError as ex: + if "mlw_codec error: module compiled against API version" in str(ex): + # Extract API versions from error message + matches = [s for s in str(ex).split() if "0x" in s] + if len(matches) == 2: + # Raise new exception with more detailed message + raise ImportError( # pylint: disable=W0707 + "NumPy C API version mismatch " + f"(Build-time version: {matches[0]}, " + f"Run-time version: {matches[1]})" + "\nThis is a known issue most likely caused by a change in the API " + "version in NumPy after installing ethos-u-vela.\nYou can find more " + "information about the issue and possible solutions in the " + "'Known Issues' section at https://review.mlplatform.org/" + "plugins/gitiles/ml/ethos-u/ethos-u-vela/+/refs/heads/main/" + "README.md#known-issues" + ) + raise # Contains meta info for a weight compression. If two tensors have identical weight compression config, diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..d8cbe661 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[project] +name = "ethos-u-vela" +description = "Neural network model compiler for Arm Ethos-U NPUs" +requires-python = "~=3.7" +authors = [{name = "Arm Ltd", email = "mlg-vela@arm.com"}] +license = {text= "Apache License 2.0"} +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Operating System :: POSIX :: Linux", + "Operating System :: Microsoft :: Windows :: Windows 10", + "Programming Language :: C", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Software Development :: Compilers", +] +keywords = ["ethos-u", "vela compiler", "tflite", "npu"] +dependencies = [ + "flatbuffers==2.0.7", + "numpy<=1.21.3; python_version<='3.7'", + "numpy; python_version>'3.7'", + "lxml>=4.5.1" +] +dynamic = ["readme", "version"] + +[project.urls] +Homepage = "https://git.mlplatform.org/ml/ethos-u/ethos-u-vela.git/" + +[project.scripts] +vela = "ethosu.vela.vela:main" + +[build-system] +requires = [ + "numpy<=1.21.3; python_version<='3.7'", + "numpy; python_version>'3.7'", + "setuptools_scm[toml]<6" +] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..5c63e159 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[options] +packages = + ethosu + ethosu.vela + ethosu.vela.ethos_u55_regs + ethosu.vela.tflite + ethosu.vela.tosa + ethosu.mlw_codec + +[options.package_data] +ethosu = config_files/*/*.ini \ No newline at end of file diff --git a/setup.py b/setup.py index 69a115a9..29df63b0 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2020-2022 Arm Limited and/or its affiliates +# SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates # # SPDX-License-Identifier: Apache-2.0 # @@ -61,46 +61,9 @@ mlw_module = Extension( ) setup( - name="ethos-u-vela", use_scm_version=True, - description="Neural network model compiler for Arm Ethos-U NPUs", long_description=long_description, long_description_content_type="text/markdown", - url="https://git.mlplatform.org/ml/ethos-u/ethos-u-vela.git/", - author="Arm Ltd.", - author_email="mlg-vela@arm.com", - license="Apache License 2.0", - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "License :: OSI Approved :: Apache Software License", - "Operating System :: POSIX :: Linux", - "Operating System :: Microsoft :: Windows :: Windows 10", - "Programming Language :: C", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development :: Compilers", - ], - keywords=["ethos-u", "vela compiler", "tflite", "npu"], - packages=[ - "ethosu", - "ethosu.vela", - "ethosu.vela.ethos_u55_regs", - "ethosu.vela.tflite", - "ethosu.vela.tosa", - "ethosu.mlw_codec", - ], - package_data={"ethosu": ["config_files/*/*.ini"]}, - python_requires="~=3.7", - install_requires=[ - "flatbuffers==2.0.7", - "numpy<=1.21.3; python_version<='3.7'", - "numpy; python_version>'3.7'", - "lxml>=4.5.1", - ], - entry_points={"console_scripts": ["vela = ethosu.vela.vela:main"]}, ext_modules=[mlw_module], cmdclass={"build_ext": BuildExtension}, # type: ignore[dict-item] - setup_requires=["numpy<=1.21.3; python_version<='3.7'", "numpy; python_version>'3.7'", "setuptools_scm<6.0"], ) -- cgit v1.2.1