evidentlyai / evidently

Evidently is ​​an open-source ML and LLM observability framework. Evaluate, test, and monitor any AI-powered system or data pipeline. From tabular data to Gen AI. 100+ metrics.
https://www.evidentlyai.com/evidently-oss
Apache License 2.0
5.15k stars 576 forks source link

ModuleNotFoundError: No module named 'tkinter' on evidently version 0.3.2 when importing evidently modules #606

Closed Moe520 closed 1 year ago

Moe520 commented 1 year ago

We have been using evidently 0.3.1 to run data drift detection jobs on DataBricks cluster with runtime 11.3 LTS ML for a while.

It has been running without issue for a few weeks using evidently 0.3.1. When the cluster booted today, it automatically used 0.3.2 because we didn't have evidently pinned and now it gives this error

ModuleNotFoundError: No module named 'tkinter'

Full error stack:

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<command-1695407214055700> in <cell line: 6>()
      4 
      5 from evidently import ColumnMapping
----> 6 from evidently.test_suite import TestSuite
      7 
      8 from evidently.test_preset import NoTargetPerformanceTestPreset

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/test_suite/__init__.py in <module>
----> 1 from .test_suite import TestSuite

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/test_suite/test_suite.py in <module>
     20 from evidently.pipeline.column_mapping import ColumnMapping
     21 from evidently.renderers.base_renderer import TestRenderer
---> 22 from evidently.suite.base_suite import Display
     23 from evidently.suite.base_suite import Suite
     24 from evidently.suite.base_suite import find_test_renderer

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/suite/base_suite.py in <module>
     28 from evidently.renderers.base_renderer import TestRenderer
     29 from evidently.renderers.notebook_utils import determine_template
---> 30 from evidently.suite.execution_graph import ExecutionGraph
     31 from evidently.suite.execution_graph import SimpleExecutionGraph
     32 from evidently.tests.base_test import GroupingTypes

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/suite/execution_graph.py in <module>
      7 
      8 from evidently.base_metric import Metric
----> 9 from evidently.tests.base_test import Test
     10 
     11 

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/tests/__init__.py in <module>
     17 from .classification_performance_tests import TestTNR
     18 from .classification_performance_tests import TestTPR
---> 19 from .data_drift_tests import TestAllFeaturesValueDrift
     20 from .data_drift_tests import TestColumnDrift
     21 from .data_drift_tests import TestCustomFeaturesValueDrift

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/tests/data_drift_tests.py in <module>
     13 from evidently.calculations.stattests import PossibleStatTestType
     14 from evidently.metric_results import DatasetColumns
---> 15 from evidently.metrics import ColumnDriftMetric
     16 from evidently.metrics import DataDriftTable
     17 from evidently.metrics import EmbeddingsDriftMetric

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/metrics/__init__.py in <module>
     16 from .classification_performance.quality_by_feature_table import ClassificationQualityByFeatureTable
     17 from .classification_performance.roc_curve_metric import ClassificationRocCurve
---> 18 from .data_drift.column_drift_metric import ColumnDriftMetric
     19 from .data_drift.column_value_plot import ColumnValuePlot
     20 from .data_drift.data_drift_table import DataDriftTable

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

/local_disk0/.ephemeral_nfs/cluster_libraries/python/lib/python3.9/site-packages/evidently/metrics/data_drift/column_drift_metric.py in <module>
----> 1 from tkinter import N
      2 from typing import List
      3 from typing import Optional
      4 from typing import Union
      5 

/databricks/python_shell/dbruntime/PythonPackageImportsInstrumentation/__init__.py in import_patch(name, globals, locals, fromlist, level)
    169             # Import the desired module. If you’re seeing this while debugging a failed import,
    170             # look at preceding stack frames for relevant error information.
--> 171             original_result = python_builtin_import(name, globals, locals, fromlist, level)
    172 
    173             is_root_import = thread_local._nest_level == 1

ModuleNotFoundError: No module named 'tkinter'

Pip freeze output

absl-py==1.0.0 argon2-cffi==20.1.0 astor==0.8.1 astunparse==1.6.3 async-generator==1.10 attrs==21.2.0 azure-core==1.22.1 azure-cosmos==4.2.0 backcall==0.2.0 backports.entry-points-selectable==1.1.1 bcrypt==4.0.0 black==22.3.0 bleach==4.0.0 blis==0.7.8 boto3==1.21.18 botocore==1.24.18 cachetools==5.2.0 catalogue==2.0.8 certifi==2021.10.8 cffi==1.14.6 chardet==4.0.0 charset-normalizer==2.0.4 click==8.0.3 cloudpickle==2.0.0 cmdstanpy==0.9.68 confection==0.0.1 configparser==5.2.0 convertdate==2.4.0 cryptography==3.4.8 cycler==0.10.0 cymem==2.0.6 Cython==0.29.24 databricks-automl-runtime==0.2.11.1 databricks-cli==0.17.3 dbl-tempo==0.1.12 dbus-python==1.2.16 debugpy==1.4.1 decorator==5.1.0 defusedxml==0.7.1 dill==0.3.4 diskcache==5.4.0 distlib==0.3.6 distro==1.4.0 distro-info===0.23ubuntu1 entrypoints==0.3 ephem==4.1.3 evidently==0.3.2 facets-overview==1.0.0 fast-ml==3.68 fasttext==0.9.2 filelock==3.3.1 Flask==1.1.2 flatbuffers==1.12 fsspec==2021.8.1 future==0.18.2 gast==0.4.0 gitdb==4.0.9 GitPython==3.1.27 google-auth==2.6.0 google-auth-oauthlib==0.4.6 google-pasta==0.2.0 grpcio==1.44.0 gunicorn==20.1.0 gviz-api==1.10.0 h5py==3.3.0 hijri-converter==2.2.4 holidays==0.15 horovod==0.25.0 htmlmin==0.1.12 huggingface-hub==0.9.1 idna==3.2 ImageHash==4.3.0 imbalanced-learn==0.8.1 importlib-metadata==4.8.1 ipykernel==6.12.1 ipython==7.32.0 ipython-genutils==0.2.0 ipywidgets==7.7.0 isodate==0.6.1 itsdangerous==2.0.1 jedi==0.18.0 Jinja2==3.1.2 jmespath==0.10.0 joblib==1.0.1 joblibspark==0.5.0 jsonschema==3.2.0 jupyter-client==6.1.12 jupyter-core==4.8.1 jupyterlab-pygments==0.1.2 jupyterlab-widgets==1.0.0 keras==2.9.0 Keras-Preprocessing==1.1.2 kiwisolver==1.3.1 korean-lunar-calendar==0.3.1 langcodes==3.3.0 libclang==14.0.6 lightgbm==3.3.2 llvmlite==0.37.0 LunarCalendar==0.0.9 Mako==1.2.0 Markdown==3.3.6 MarkupSafe==2.0.1 matplotlib==3.4.3 matplotlib-inline==0.1.2 missingno==0.5.1 mistune==0.8.4 mleap==0.20.0 mlflow-databricks-artifacts==2.0.0 mlflow-skinny==1.29.0 multimethod==1.9 murmurhash==1.0.8 mypy-extensions==0.4.3 nbclient==0.5.3 nbconvert==6.1.0 nbformat==5.1.3 nest-asyncio==1.5.1 networkx==2.6.3 nltk==3.8.1 notebook==6.4.5 numba==0.54.1 numpy==1.20.3 oauthlib==3.2.0 opt-einsum==3.3.0 packaging==21.0 pandas==1.5.3 pandas-profiling==3.1.0 pandocfilters==1.4.3 paramiko==2.9.2 parso==0.8.2 pathspec==0.9.0 pathy==0.6.2 patsy==0.5.2 petastorm==0.11.4 pexpect==4.8.0 phik==0.12.2 pickleshare==0.7.5 Pillow==8.4.0 platformdirs==2.5.2 plotly==5.9.0 pmdarima==1.8.5 preshed==3.0.7 prometheus-client==0.11.0 prompt-toolkit==3.0.20 prophet==1.0.1 protobuf==3.19.4 psutil==5.8.0 psycopg2==2.9.3 ptyprocess==0.7.0 pyarrow==7.0.0 pyasn1==0.4.8 pyasn1-modules==0.2.8 pybind11==2.10.0 pycparser==2.20 pydantic==1.9.2 Pygments==2.10.0 PyGObject==3.36.0 PyJWT==2.5.0 PyMeeus==0.5.11 PyNaCl==1.5.0 pynndescent==0.5.10 pyodbc==4.0.31 pyparsing==3.0.4 pyrsistent==0.18.0 pystan==2.19.1.1 python-apt==2.0.1+ubuntu0.20.4.1 python-dateutil==2.8.2 python-editor==1.0.4 pytz==2021.3 PyWavelets==1.1.1 PyYAML==6.0 pyzmq==22.2.1 regex==2021.8.3 requests==2.26.0 requests-oauthlib==1.3.1 requests-unixsocket==0.2.0 rsa==4.9 s3path==0.4.1 s3transfer==0.5.2 scikit-learn==0.24.2 scipy==1.7.1 seaborn==0.11.2 Send2Trash==1.8.0 setuptools-git==1.2 shap==0.41.0 simplejson==3.17.6 six==1.16.0 slicer==0.0.7 smart-open==5.2.1 smmap==5.0.0 spacy==3.4.1 spacy-legacy==3.0.10 spacy-loggers==1.0.3 spark-tensorflow-distributor==1.0.0 sqlparse==0.4.2 srsly==2.4.4 ssh-import-id==5.10 statsmodels==0.12.2 tabulate==0.8.9 tangled-up-in-unicode==0.1.0 tenacity==8.0.1 tensorboard==2.9.1 tensorboard-data-server==0.6.1 tensorboard-plugin-profile==2.8.0 tensorboard-plugin-wit==1.8.1 tensorflow-cpu==2.9.1 tensorflow-estimator==2.9.0 tensorflow-io-gcs-filesystem==0.27.0 termcolor==2.0.1 terminado==0.9.4 testpath==0.5.0 thinc==8.1.2 threadpoolctl==2.2.0 tokenize-rt==4.2.1 tokenizers==0.12.1 tomli==2.0.1 torch==1.12.1+cpu torchvision==0.13.1+cpu tornado==6.1 tqdm==4.62.3 traitlets==5.1.0 transformers==4.21.2 typer==0.4.2 typing-extensions==3.10.0.2 tzdata==2023.3 ujson==4.0.2 umap-learn==0.5.3 unattended-upgrades==0.1 urllib3==1.26.7 virtualenv==20.8.0 visions==0.7.4 wasabi==0.10.1 wcwidth==0.2.5 webencodings==0.5.1 websocket-client==1.3.1 Werkzeug==2.0.2 widgetsnbextension==3.6.0 wrapt==1.12.1 xgboost==1.6.2 zipp==3.6.0

Screenshot 2023-05-19 at 1 19 34 PM

Moe520 commented 1 year ago

Contents of the DataBricks cell that produces the error

import math
import dataclasses
from sklearn import datasets, ensemble, model_selection

from evidently import ColumnMapping
from evidently.test_suite import TestSuite

from evidently.test_preset import NoTargetPerformanceTestPreset
from evidently.test_preset import DataQualityTestPreset
from evidently.test_preset import DataStabilityTestPreset
from evidently.test_preset import DataDriftTestPreset
from evidently.test_preset import RegressionTestPreset
from evidently.test_preset import MulticlassClassificationTestPreset
from evidently.test_preset import BinaryClassificationTopKTestPreset
from evidently.test_preset import BinaryClassificationTestPreset
Moe520 commented 1 year ago

Update: Reverted evidently version of the cluster to 0.3.1 by changing the dependency list of the cluster from 'evidently~=0.3.1' to 'evidently==0.3.1'.

This fixed the issue and our pipelines are working again.

I'm now fairly confident that version 0.3.2 introduced a bug.