Repository: automl/auto-sklearn

Issue:
run_wrapper() got an unexpected keyword argument 'pure'
While running a fitting on a classifier (*output[0]* with data *output[1]* to *output[4]*), I get the following error; I think it's packages issue;

   > output[0].fit(output[1], output[2], output[3], output[4])
   > File "/usr/local/lib/python3.8/dist-packages/autosklearn/estimators.py", line 1045, in fit
     super().fit(
   > File "/usr/local/lib/python3.8/dist-packages/autosklearn/estimators.py", line 375, in fit
     self.automl_.fit(load_models=self.load_models, **kwargs)
   > File "/usr/local/lib/python3.8/dist-packages/autosklearn/automl.py", line 2056, in fit
     return super().fit(
   > File "/usr/local/lib/python3.8/dist-packages/autosklearn/automl.py", line 931, in fit
     _proc_smac.run_smbo()
   > File "/usr/local/lib/python3.8/dist-packages/autosklearn/smbo.py", line 498, in run_smbo
     smac.optimize()
   > File "/usr/local/lib/python3.8/dist-packages/smac/facade/smac_ac_facade.py", line 720, in optimize
     incumbent = self.solver.run()
   > File "/usr/local/lib/python3.8/dist-packages/smac/optimizer/smbo.py", line 287, in run
     self.tae_runner.submit_run(run_info=run_info)
   > File "/usr/local/lib/python3.8/dist-packages/smac/tae/dask_runner.py", line 166, in submit_run
     self.client.submit(
   > File "/usr/local/lib/python3.8/dist-packages/autosklearn/util/single_thread_client.py", line 59, in submit
     return DummyFuture(func(*args, **kwargs))
 > **TypeError: run_wrapper() got an unexpected keyword argument 'pure'**

It seems like it's an error with Dask. Here are the installed packages on ubuntu 18.04

pandas==1.3.0
scikit-learn==0.24
dask==2021.12.0
auto-sklearn==0.14.5    #AutoML
tensorflow==2.8.0

I've tried all versions of dask from 2021.12.0 to 2022.02.0 (Current) and nothing seems to work. Downgrading to auto-sklearn 0.14.4 and lower didn't solve the problem.


Discussion:
Same here, running in Google Colab with default libraries and installing the latest AutoSKLearn produces TypeError: run_wrapper() got an unexpected keyword argument 'pure'. Also tried downgraded versions and other problems are occurring now.

Resolving patch:
diff --git a/autosklearn/__version__.py b/autosklearn/__version__.py
--- a/autosklearn/__version__.py
+++ b/autosklearn/__version__.py
@@ -1,4 +1,4 @@
 """Version information."""
 
 # The following line *must* be the last in the module, exactly as formatted:
-__version__ = "0.14.4"
+__version__ = "0.14.6"
diff --git a/autosklearn/util/single_thread_client.py b/autosklearn/util/single_thread_client.py
--- a/autosklearn/util/single_thread_client.py
+++ b/autosklearn/util/single_thread_client.py
@@ -1,5 +1,6 @@
 import typing
 from pathlib import Path
+from typing import Any
 
 import dask.distributed
 
@@ -9,6 +10,7 @@ class DummyFuture(dask.distributed.Future):
     A class that mimics a distributed Future, the outcome of
     performing submit on a distributed client.
     """
+
     def __init__(self, result: typing.Any) -> None:
         self._result = result  # type: typing.Any
 
@@ -33,13 +35,24 @@ class SingleThreadedClient(dask.distributed.Client):
     A class to Mock the Distributed Client class, in case
     Auto-Sklearn is meant to run in the current Thread.
     """
+
     def __init__(self) -> None:
 
         # Raise a not implemented error if using a method from Client
-        implemented_methods = ['submit', 'close', 'shutdown', 'write_scheduler_file',
-                               '_get_scheduler_info', 'nthreads']
-        method_list = [func for func in dir(dask.distributed.Client) if callable(
-            getattr(dask.distributed.Client, func)) and not func.startswith('__')]
+        implemented_methods = [
+            "submit",
+            "close",
+            "shutdown",
+            "write_scheduler_file",
+            "_get_scheduler_info",
+            "nthreads",
+        ]
+        method_list = [
+            func
+            for func in dir(dask.distributed.Client)
+            if callable(getattr(dask.distributed.Client, func))
+            and not func.startswith("__")
+        ]
         for method in method_list:
             if method in implemented_methods:
                 continue
@@ -54,8 +67,24 @@ def submit(
         func: typing.Callable,
         *args: typing.List,
         priority: int = 0,
-        **kwargs: typing.Dict,
+        key: Any = None,
+        workers: Any = None,
+        resources: Any = None,
+        retries: Any = None,
+        fifo_timeout: Any = "100 ms",
+        allow_other_workers: Any = False,
+        actor: Any = False,
+        actors: Any = False,
+        pure: Any = None,
+        **kwargs: Any,
     ) -> typing.Any:
+        """
+        Note
+        ----
+        The keyword arguments caught in `dask.distributed.Client` need to
+        be specified here so they don't get passed in as ``**kwargs`` to the
+        ``func``.
+        """
         return DummyFuture(func(*args, **kwargs))
 
     def close(self) -> None:
@@ -70,17 +99,17 @@ def write_scheduler_file(self, scheduler_file: str) -> None:
 
     def _get_scheduler_info(self) -> typing.Dict:
         return {
-            'workers': ['127.0.0.1'],
-            'type': 'Scheduler',
+            "workers": ["127.0.0.1"],
+            "type": "Scheduler",
         }
 
     def nthreads(self) -> typing.Dict:
         return {
-            '127.0.0.1': 1,
+            "127.0.0.1": 1,
         }
 
     def __repr__(self) -> str:
-        return 'SingleThreadedClient()'
+        return "SingleThreadedClient()"
 
     def __del__(self) -> None:
         pass


Test patch: