You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by tq...@apache.org on 2025/02/18 15:30:17 UTC
(tvm) branch main updated: [Refactor] Phrase out python dependency `decorator` (#17661)
This is an automated email from the ASF dual-hosted git repository.
tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 0d42dc411d [Refactor] Phrase out python dependency `decorator` (#17661)
0d42dc411d is described below
commit 0d42dc411d8729a97a7d6cc89266da2b50045897
Author: Lei Wang <34...@users.noreply.github.com>
AuthorDate: Tue Feb 18 23:30:10 2025 +0800
[Refactor] Phrase out python dependency `decorator` (#17661)
* Refactor decorate function to use functools.wraps
Replace decorator package with functools.wraps for simpler and more standard function wrapping. This change removes an external dependency and uses Python's built-in functools module for function decoration.
* Remove decorator package dependency
Remove the decorator package from various installation scripts and requirements files. This follows the previous refactoring of decorators to use functools.wraps, eliminating an external dependency and simplifying the project's package requirements.
* Modify decorate function to support more flexible function wrapping
Update the decorate function to create a wrapper that allows more flexible function decoration. The new implementation passes the original function as the first argument to the wrapped function, enabling more dynamic decoration behavior while maintaining the functools.wraps functionality.
* Remove decorate function and replace with functools.wraps
Remove the custom decorate function from base.py and update multiple files to use functools.wraps directly. This change eliminates the need for a custom decorator implementation and simplifies the codebase by leveraging Python's built-in functools module.
* Remove generic_func.py as upstream did
* Fix dominant issues of decorator
* fix for pickle memoize
---
conda/recipe/meta.yaml | 1 -
docker/Dockerfile.demo_opencl | 2 +-
docker/install/ubuntu2004_install_python_package.sh | 1 -
docker/install/ubuntu_install_python_package.sh | 1 -
docs/install/from_source.rst | 2 +-
python/gen_requirements.py | 2 --
python/tvm/_ffi/base.py | 16 ----------------
python/tvm/contrib/pickle_memoize.py | 9 +++++----
python/tvm/te/tag.py | 9 +++++----
9 files changed, 12 insertions(+), 31 deletions(-)
diff --git a/conda/recipe/meta.yaml b/conda/recipe/meta.yaml
index e7294b71b2..9aa0746a30 100644
--- a/conda/recipe/meta.yaml
+++ b/conda/recipe/meta.yaml
@@ -82,7 +82,6 @@ outputs:
- {{ pin_subpackage(pkg_name + '-libs', exact=True) }}
run:
- python
- - decorator
- psutil
- scipy
- typing_extensions
diff --git a/docker/Dockerfile.demo_opencl b/docker/Dockerfile.demo_opencl
index f7f1ebe200..9112ccc0d8 100644
--- a/docker/Dockerfile.demo_opencl
+++ b/docker/Dockerfile.demo_opencl
@@ -40,7 +40,7 @@ RUN apt-install-and-clear -y apt-utils sudo cmake g++ llvm git libopenblas-dev
RUN echo "Installing Python"
RUN apt-install-and-clear -y python3-dev python3-pip
-RUN pip3 install setuptools numpy pytest cython decorator scipy tornado psutil xgboost
+RUN pip3 install setuptools numpy pytest cython scipy tornado psutil xgboost
RUN echo "Installing Jupyter notebook"
RUN pip3 install matplotlib Image "Pillow<7" jupyter[notebook]
diff --git a/docker/install/ubuntu2004_install_python_package.sh b/docker/install/ubuntu2004_install_python_package.sh
index b79221885d..7bb75f718c 100644
--- a/docker/install/ubuntu2004_install_python_package.sh
+++ b/docker/install/ubuntu2004_install_python_package.sh
@@ -25,7 +25,6 @@ pip3 install --upgrade \
"Pygments>=2.4.0" \
cloudpickle \
cython \
- decorator \
mypy \
numpy==1.21.* \
orderedset \
diff --git a/docker/install/ubuntu_install_python_package.sh b/docker/install/ubuntu_install_python_package.sh
index ba02b9ffdc..e815c25165 100755
--- a/docker/install/ubuntu_install_python_package.sh
+++ b/docker/install/ubuntu_install_python_package.sh
@@ -25,7 +25,6 @@ pip3 install --upgrade \
"Pygments>=2.4.0" \
cloudpickle \
cython \
- decorator \
mypy \
numpy==1.21.* \
orderedset \
diff --git a/docs/install/from_source.rst b/docs/install/from_source.rst
index 86d11e9a1b..cc50f9fec9 100644
--- a/docs/install/from_source.rst
+++ b/docs/install/from_source.rst
@@ -209,7 +209,7 @@ The following commands can be used to install the extra Python dependencies:
.. code:: bash
- pip3 install numpy decorator
+ pip3 install numpy
* If you want to use RPC Tracker
diff --git a/python/gen_requirements.py b/python/gen_requirements.py
index b5d8a56657..32674e6a65 100644
--- a/python/gen_requirements.py
+++ b/python/gen_requirements.py
@@ -64,7 +64,6 @@ REQUIREMENTS_BY_PIECE: RequirementsByPieceType = [
"Base requirements needed to install tvm",
[
"cloudpickle",
- "decorator",
"ml_dtypes",
"numpy",
"packaging",
@@ -192,7 +191,6 @@ CONSTRAINTS = [
("commonmark", ">=0.7.3"), # From PR #213.
("coremltools", None),
("cpplint", None),
- ("decorator", None),
(
"docutils",
"<0.17",
diff --git a/python/tvm/_ffi/base.py b/python/tvm/_ffi/base.py
index b0a63700b7..263ab0bdb3 100644
--- a/python/tvm/_ffi/base.py
+++ b/python/tvm/_ffi/base.py
@@ -121,22 +121,6 @@ def c_array(ctype, values):
return (ctype * len(values))(*values)
-def decorate(func, fwrapped):
- """A wrapper call of decorator package, differs to call time
-
- Parameters
- ----------
- func : function
- The original function
-
- fwrapped : function
- The wrapped function
- """
- import decorator
-
- return decorator.decorate(func, fwrapped)
-
-
# -----------------------------------------
# Base code for structured error handling.
# -----------------------------------------
diff --git a/python/tvm/contrib/pickle_memoize.py b/python/tvm/contrib/pickle_memoize.py
index 4f3aff8fb5..72efb80643 100644
--- a/python/tvm/contrib/pickle_memoize.py
+++ b/python/tvm/contrib/pickle_memoize.py
@@ -22,7 +22,7 @@ import os
import pathlib
import sys
-from decorator import decorate
+import functools
from .._ffi.base import string_types
try:
@@ -123,7 +123,8 @@ def memoize(key, save_at_exit=False):
cargs = tuple(x.cell_contents for x in f.__closure__) if f.__closure__ else ()
cargs = (len(cargs),) + cargs
- def _memoized_f(func, *args, **kwargs):
+ @functools.wraps(f)
+ def _memoized_f(*args, **kwargs):
assert not kwargs, "Only allow positional call"
key = cargs + args
for arg in key:
@@ -134,11 +135,11 @@ def memoize(key, save_at_exit=False):
assert isinstance(arg, allow_types)
if key in cache.cache:
return cache.cache[key]
- res = func(*args)
+ res = f(*args)
cache.cache[key] = res
cache.dirty = True
return res
- return decorate(f, _memoized_f)
+ return _memoized_f
return _register
diff --git a/python/tvm/te/tag.py b/python/tvm/te/tag.py
index 87a0034400..ec7d3377b0 100644
--- a/python/tvm/te/tag.py
+++ b/python/tvm/te/tag.py
@@ -16,7 +16,7 @@
# under the License.
"""Tag class for TVM operators."""
import warnings
-from tvm._ffi.base import decorate
+import functools
class TagScope(object):
@@ -51,11 +51,12 @@ class TagScope(object):
TagScope._current = self._old_scope
def __call__(self, fdecl):
- def tagged_fdecl(func, *args, **kwargs):
+ @functools.wraps(fdecl)
+ def tagged_fdecl(*args, **kwargs):
with self:
- return func(*args, **kwargs)
+ return fdecl(*args, **kwargs)
- return decorate(fdecl, tagged_fdecl)
+ return tagged_fdecl
def tag_scope(tag):