From 3c2ea8327e77a28e2d8a2631d2dffaed94be7f23 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 12:41:58 +0200 Subject: [PATCH 01/26] print stream --- mlens/parallel/estimation.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mlens/parallel/estimation.py b/mlens/parallel/estimation.py index e04416e3..dd815cc4 100644 --- a/mlens/parallel/estimation.py +++ b/mlens/parallel/estimation.py @@ -142,7 +142,7 @@ def fit(self, X, y, P, dir, parallel): """Fit layer through given attribute.""" if self.verbose: printout = "stderr" if self.verbose < 50 else "stdout" - safe_print('Fitting %s' % self.name) + safe_print('Fitting %s' % self.name, file=printout) t0 = time_() pred_method = 'predict' if not self.proba else 'predict_proba' @@ -215,7 +215,7 @@ def predict(self, X, P, parallel): if self.verbose: printout = "stderr" if self.verbose < 50 else "stdout" - safe_print('Predicting %s' % self.name) + safe_print('Predicting %s' % self.name, file=printout) t0 = time_() pred_method = 'predict' if not self.proba else 'predict_proba' @@ -244,7 +244,7 @@ def transform(self, X, P, parallel): if self.verbose: printout = "stderr" if self.verbose < 50 else "stdout" - safe_print('Transforming %s' % self.name) + safe_print('Transforming %s' % self.name, file=printout) t0 = time_() pred_method = 'predict' if not self.proba else 'predict_proba' From e81b1999403cac0f33fee862d7dee7bb27dd3c70 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 12:42:17 +0200 Subject: [PATCH 02/26] equivalence tests --- mlens/ensemble/tests/test_sequential.py | 58 +++++++++++++++++++++++-- mlens/ensemble/tests/test_subsemble.py | 19 +++++++- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/mlens/ensemble/tests/test_sequential.py b/mlens/ensemble/tests/test_sequential.py index efb71e96..dc002a9e 100644 --- a/mlens/ensemble/tests/test_sequential.py +++ b/mlens/ensemble/tests/test_sequential.py @@ -4,9 +4,16 @@ """ import numpy as np -from mlens.ensemble import SequentialEnsemble -from mlens.utils.dummy import Data, PREPROCESSING, ESTIMATORS, \ - ECM, LayerGenerator +from mlens.ensemble import (SequentialEnsemble, + SuperLearner, + BlendEnsemble, + Subsemble) + +from mlens.utils.dummy import (Data, + PREPROCESSING, + ESTIMATORS, + ECM, + LayerGenerator) FOLDS = 3 @@ -55,3 +62,48 @@ def test_predict(): out = ens.fit(X, y).predict(X) np.testing.assert_array_equal(U, out) + + +def test_equivalence_super_learner(): + """[Sequential] Test ensemble equivalence with SuperLearner.""" + + ens = SuperLearner() + seq = SequentialEnsemble() + + ens.add(ECM) + seq.add('stack', ECM) + + F = ens.fit(X, y).predict(X) + P = seq.fit(X, y).predict(X) + + np.testing.assert_array_equal(P, F) + + +def test_equivalence_blend(): + """[Sequential] Test ensemble equivalence with BlendEnsemble.""" + + ens = BlendEnsemble() + seq = SequentialEnsemble() + + ens.add(ECM) + seq.add('blend', ECM) + + F = ens.fit(X, y).predict(X) + P = seq.fit(X, y).predict(X) + + np.testing.assert_array_equal(P, F) + + +def test_equivalence_subsemble(): + """[Sequential] Test ensemble equivalence with Subsemble.""" + + ens = Subsemble() + seq = SequentialEnsemble() + + ens.add(ECM) + seq.add('subset', ECM) + + F = ens.fit(X, y).predict(X) + P = seq.fit(X, y).predict(X) + + np.testing.assert_array_equal(P, F) diff --git a/mlens/ensemble/tests/test_subsemble.py b/mlens/ensemble/tests/test_subsemble.py index 06ee1ebd..34fd8ec2 100644 --- a/mlens/ensemble/tests/test_subsemble.py +++ b/mlens/ensemble/tests/test_subsemble.py @@ -3,12 +3,12 @@ """ import numpy as np -from mlens.utils.dummy import OLS +from mlens.utils.dummy import OLS, ECM from mlens.base import SubsetIndex from mlens.parallel.subset import _expand_instance_list, _get_col_idx -from mlens.ensemble import Subsemble +from mlens.ensemble import Subsemble, SuperLearner X = np.arange(24).reshape((12, 2)) y = X[:, 0] * X[:, 1] @@ -62,3 +62,18 @@ def test_subset_fit(): pred = ens.predict(X) np.testing.assert_array_equal(pred, g) + + +def test_subset_equiv(): + """[Subsemble] Test equivalence with SuperLearner for J=1.""" + + sub = Subsemble(partitions=1) + sl = SuperLearner() + + sub.add(ECM) + sl.add(ECM) + + F = sub.fit(X, y).predict(X) + P = sl.fit(X, y).predict(X) + + np.testing.assert_array_equal(P, F) From 49ae4c2e826e231fb7c20787caf47165873ca529 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 12:44:30 +0200 Subject: [PATCH 03/26] newline on fit/predict initial print --- mlens/ensemble/base.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mlens/ensemble/base.py b/mlens/ensemble/base.py index c5f86b52..3eb2f3cc 100644 --- a/mlens/ensemble/base.py +++ b/mlens/ensemble/base.py @@ -55,8 +55,8 @@ class LayerContainer(BaseEstimator): level of verbosity. - ``verbose = 0`` silent (same as ``verbose = False``) - - ``verbose = 1`` messages at start and finish \ - (same as ``verbose = True``) + - ``verbose = 1`` messages at start and finish + (same as ``verbose = True``) - ``verbose = 2`` messages for each layer If ``verbose >= 50`` prints to ``sys.stdout``, else ``sys.stderr``. @@ -224,7 +224,7 @@ def fit(self, X=None, y=None, return_preds=None, **process_kwargs): if self.verbose: pout = "stdout" if self.verbose >= 3 else "stderr" safe_print("Processing layers (%d)" % self.n_layers, - file=pout, flush=True) + file=pout, flush=True, end="\n") t0 = time() # Initialize cache @@ -310,7 +310,7 @@ def _predict(self, X, job, *args, **kwargs): if self.verbose: pout = "stdout" if self.verbose >= 3 else "stderr" safe_print("Processing layers (%d)" % self.n_layers, - file=pout, flush=True) + file=pout, flush=True, end="\n") t0 = time() # Initialize cache From a41d43b5078011eb4c2d5d206c82eb24911e746e Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 15:37:44 +0200 Subject: [PATCH 04/26] updated for 0.1.0 --- docs/benchmarks.rst | 2 +- docs/conf.py | 1 + docs/ensemble_tutorial.rst | 212 ++++++++++++++++-- docs/getting_started.rst | 115 ++++++---- docs/gotchas.rst | 62 +++++ docs/index.rst | 72 +++--- docs/install.rst | 47 ++-- docs/licence.rst | 5 + docs/scaling.rst | 2 +- docs/source/mlens.visualization.benchmark.rst | 7 - docs/source/mlens.visualization.rst | 1 - docs/updates.rst | 15 ++ 12 files changed, 423 insertions(+), 118 deletions(-) create mode 100644 docs/gotchas.rst delete mode 100644 docs/source/mlens.visualization.benchmark.rst create mode 100644 docs/updates.rst diff --git a/docs/benchmarks.rst b/docs/benchmarks.rst index 5c5e933b..8c43b9c7 100644 --- a/docs/benchmarks.rst +++ b/docs/benchmarks.rst @@ -1,6 +1,6 @@ .. _benchmarks: -Performance Benchmarks +Performance benchmarks ====================== The Friedman Regression Problem 1 diff --git a/docs/conf.py b/docs/conf.py index 4f12ac2b..00e6af50 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,6 +59,7 @@ # Intersphinx options intersphinx_mapping = {'http://scikit-learn.org/stable/': None, + 'http://docs.scipy.org/doc/numpy/': None, 'http://matplotlib.org/': None, 'http://pandas.pydata.org/pandas-docs/stable/': None} diff --git a/docs/ensemble_tutorial.rst b/docs/ensemble_tutorial.rst index 0dbb507d..e185fe3a 100644 --- a/docs/ensemble_tutorial.rst +++ b/docs/ensemble_tutorial.rst @@ -6,24 +6,21 @@ Tutorials The following tutorials highlight advanced functionality and a more detailed view of how ensembles are built and trained. -The :ref:`proba-tutorial` shows how to build layers that output class -probabilities from each base learner, so that the next layer or meta estimator -is learning not from the predicted class of each base learner, but from each -base learner's probability distribution. - -The :ref:`sequential-tutorial` shows how to build ensembles with different -layer classes. This can be a very powerful way of building scalable ensembles, -by letting initial layers use subsets of the full data, while later layers -use more compute intense estimation techniques. - -The :ref:`memory-tutorial` details how users can avoid loading data into the -parent process by specifying a file path to a memmaped array or a csv file. - -.. py:currentmodule:: mlens.preprocessing - -The :ref:`model-selection-tutorial` walks through how to use the -:class:`EnsembleTransformer` class to pre-generate base layers and use the -:class:`Evaluator` class to select between meta learners. +=============================== ============================================== +Tutorial Content +=============================== ============================================== +:ref:`proba-tutorial` Build layers that output class probabilities from each base +\ learner so that the next layer or meta estimator learns +\ from probability distributions. +:ref:`sequential-tutorial` How to build ensembles with different layer classes +:ref:`memory-tutorial` Avoid loading data into the parent process by specifying a +\ file path to a memmaped array or a csv file. +:ref:`model-selection-tutorial` Build transformers that replicate layers in ensembles for +\ model selection of higher-order layers and / or meta learners. +=============================== ============================================== + +We use the same preliminary settings as in the +:ref:`getting started ` section. .. _proba-tutorial: @@ -31,19 +28,196 @@ The :ref:`model-selection-tutorial` walks through how to use the Probabilistic ensemble learning ------------------------------- - +When the target to predict is a class label, it can often be beneficial to +let higher-order layers or the meta learner learn from *class probabilities*, +as opposed to the predicted class. Scikit-learn classifiers can return a +matrix that, for each observation in the test set, gives the probability that +the observation belongs to the a given class. While we are ultimately +interested in class membership, this information is much richer that just +feeding the predicted class to the meta learner. In essence, using class +probabilities allow the meta learner to weigh in not just the predicted +class label (the highest probability), but also with what confidence each +estimator makes the prediction, and how estimators consider the alternative. + +First, let us set a benchmark ensemble performance when learning is by +predicted class membership. :: + + from mlens.ensemble import BlendEnsemble + from sklearn.linear_model import LogisticRegression + from sklearn.ensemble import RandomForestClassifier + from sklearn.svm import SVC + + def build_ensemble(proba, **kwargs): + """Return an ensemble.""" + estimators = [RandomForestClassifier(random_state=seed), + SVC(probability=proba)] + + ensemble = BlendEnsemble(**kwargs) + ensemble.add(estimators, proba=proba) # Specify 'proba' here + ensemble.add_meta(LogisticRegression()) + + return ensemble + +As in the :ref:`ensemble guide`, we fit on the first half, and test on the +remainder. :: + + >>> ensemble = build_ensemble(proba=False) + >>> ensemble.fit(X[:75], y[:75]) + >>> preds = ensemble.predict(X[75:]) + >>> f1_score(preds, y[75:], average='micro') + 0.69333333333333336 + +Not particularly impressive. Recall that the blend ensemble consumes +observation between layers; in this case, each layer sees only half of the +samples. + +To enable probibalistic learning, we set ``proba=True`` in the ``add`` +method. Note that when a layer is declared as a meta learner (either through +the ``add_meta`` method or by setting ``meta=True`` in the ``add`` method), +the layer will always predict classes. :: + + >>> ensemble = build_ensemble(proba=True) + >>> ensemble.fit(X[:75], y[:75]) + >>> preds = ensemble.predict(X[75:]) + >>> print('Prediction shape: {}'.format(preds.shape)) + >>> f1_score(preds, y[75:], average='micro') + Prediction shape: (75,) + 0.97333333333333338 + +In this case, using probabilities had a drastic effect on predictive +performance, increasing some 40%. As a final remark, even though the base +learners predict probabilities, the meta layer returns predictions. If you +want an ensemble to return the matrix of predicted probabilities, avoid +specifying a meta layer. .. _sequential-tutorial: General multi-layer ensemble learning ------------------------------------- +.. currentmodule:: mlens.ensemble + +The modular ``add`` API of ML-Ensembles allow users to build arbitrarily +deep ensembles. If you would like to alternate between the *type* of each layer +the :class:`SequentialEnsemble` class can be used to specify what type of +layer (i.e. stacked, blended, subsamle-style) to add. This can be particularly +powerful if facing a large dataset, as the first layer can use a fast appraoch +such as blending, while subsequent layers fitted on the remaining data can +use more computationally intensive approaches. The type of layer, along with +any parameter settings pertaining to that layer, are specified in the +``add`` method. :: + + from mlens.ensemble import SequentialEnsemble + + ensemble = SequentialEnsemble() + + # The initial layer is a the same as a BlendEnsemble with one layer + ensemble.add('blend', [SVC(), RandomForestClassifier(random_state=seed)]) + + # The second layer is a the same as a SuperLearner with one layer + ensemble.add('stack', [SVC(), RandomForestClassifier(random_state=seed)]) + + # The meta estimator is added as in any other ensemble + ensemble.add_meta(SVC()) + +Note that currently, the sequential ensemble uses the backend terminology and +may not overlap with what the ensemble classes uses. This will be fixed in a +coming release. Until then, the following conversion may be helpful. + +=================== ============================ +front-end parameter SequentialEnsemble parameter +=================== ============================ +'SuperLearner' 'stack' +'BlendEnsemble' 'blend' +'Subsemble' 'subset' +'folds' 'n_splits' +'partitions' 'n_partitions' +=================== ============================ + +This ensemble can now be used for fitting and prediction with the conventional +syntax. :: + + >>> preds = ensemble.fit(X[:75], y[:75]).predict(X[75:]) + >>> f1_score(preds, y[75:], average='micro') + 0.97333333333333338 + +In this case, the multi-layer :class:`SequentialEnsemble` with an initial +blended layer and second stacked layer achieved the same performance as the +:class:`BlendEnsemble` with probabilistic learning. Note that we could have +made any of the layers probabilistic by setting ``Proba=True``. + .. _memory-tutorial: Passing file paths as data input -------------------------------- +With large datasets, it can be expensive to load the full data into memory as +a numpy array. Since ML-Ensemle uses a memmaped cache, the need to keep the +full array in memory can be entirely circumvented by passing a file path as +entry to ``X`` and ``y``. There are two important things to note when doing +this. + +First, ML-Ensemble delpoys Scikit-learn's array checks, and passing a +string will cause an error. To avoid this, the ensemble must be initialized +with ``array_check=0``, in which case there will be no checks on the array. +The user should make certain that the the data is approprate for esitmation, +by converting missing values and infinites to numerical representation, +ensuring that all features are numerical, and remove any headers, +index columns and footers. + +Second, ML-Ensemble expects the file to be either a ``csv``, +an ``npy`` or ``mmap`` file and will treat these differently. + + - If a path to a ``csv`` file is passed, the ensemble will first **load** + the file into memory, then dump it into the cache, before discarding the + file from memory by replacing it with a pointer to the memmaped file. + The loading module used for the ``csv`` + file is the :func:`numpy.loadtxt` function. + + - If a path to a ``npy`` file is passed, a memmaped pointer to it will be + loaded. + + - If a path to a ``mmap`` file is passed, it will be used as the memmaped + input array for estimation. + + :: + + import os + import gc + import tempfile + + # We create a temporary folder in the current working directory + temp = tempfile.TemporaryDirectory(dir=os.getcwd()) + + # Dump the X and y array in the temporary directory, here as csv files + fx = os.path.join(temp.name, 'X.csv') + fy = os.path.join(temp.name, 'y.csv') + + np.savetxt(fx, X) + np.savetxt(fy, y) + + +We can now fit any ensemble simply by passing the file pointers ``fx`` and +``fy``. Remember to set ``array_check=0``. :: + + >>> ensemble = build_ensemble(False, array_check=0) + >>> ensemble.fit(fx, fy) + >>> preds = ensemble.predict(fx) + >>> preds[:10] + array([ 2., 2., 2., 1., 1., 2., 2., 2., 2., 2.]) + +If you are following the examples on your machine, +don't forget to remove the temporary directory. + +:: + + try: + temp.cleanup() + del temp + except OSError: + # This can fail on Windows + pass .. _model-selection-tutorial: diff --git a/docs/getting_started.rst b/docs/getting_started.rst index c8a2eb79..2efa6630 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -5,29 +5,34 @@ Getting started =============== -The :ref:`ensemble-guide` shows how to instantiate, fit and predict with an -ensemble. The :ref:`model-selection-guide` gives a breif overview of the -syntax used in the model selection library, -while the :ref:`visualization-guide` gives an introduction to the -plotting functionality. For more in-depth material, see -:ref:`ensemble-tutorial`. +To get you up and running, the following guides highlights the basics of the +API for ensemble classes, model selection and visualization. + +============================ ================================================= + Guides Content +============================ ================================================= +:ref:`ensemble-guide` how to build, fit and predict with an ensemble +:ref:`model-selection-guide` how to evaluate estimators across preprocessing cases +:ref:`visualization-guide` plotting functionality +============================ ================================================= + +For more more in-depth material and advanced usage, +see :ref:`ensemble-tutorial`. Preliminaries ------------- We use the following setup throughout:: import numpy as np + from pandas import DataFrame + from mlens.metrics import make_scorer + from sklearn.metrics import f1_score + from sklearn.datasets import load_iris seed = 2017 np.random.seed(seed) - from sklearn.metrics import f1_score - - def f1(y_true, y_pred): - """Wrapper around f1_scorer to get multi-label scores.""" - return f1_score(y_true, y_pred, average='micro') - - from sklearn.datasets import load_iris + f1 = make_scorer(f1_score, average='micro', greater_is_better=True) data = load_iris() idx = np.random.permutation(150) @@ -81,7 +86,7 @@ for a tabular format. :: To round off, let's see how the ensemble as a whole fared. :: - >>> f1(preds, y[75:]) + >>> f1_score(preds, y[75:], average='micro') 0.95999999999999996 Multi-layer ensembles @@ -105,26 +110,56 @@ instance, in the above example, we could add a second layer as follows. :: We now fit this ensemble in the same manner as before:: >>> ensemble.fit(X[:75], y[:75]) - Fitting layer layer-1 - [layer-1] Done | 00:00:00 - Fitting layer layer-2 - [layer-2] Done | 00:00:00 - Fitting layer layer-3 - [layer-3] Done | 00:00:00 + Processing layers (3) + + Fitting layer-1 + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 6 out of 6 | elapsed: 0.1s finished + layer-1 Done | 00:00:00 + + Fitting layer-2 + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.0s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 7 out of 6 | elapsed: 0.1s remaining: -0.0s + [Parallel(n_jobs=-1)]: Done 6 out of 6 | elapsed: 0.1s finished + layer-2 Done | 00:00:00 + + Fitting layer-3 + [Parallel(n_jobs=-1)]: Done 1 out of 1 | elapsed: 0.0s finished + [Parallel(n_jobs=-1)]: Done 1 out of 1 | elapsed: 0.0s finished + layer-3 Done | 00:00:00 + + Fit complete | 00:00:00 + Similarly with predictions:: >>> preds = ensemble.predict(X[75:]) - Predicting layer layer-1 - [layer-1] Done | 00:00:00 - Predicting layer layer-2 - [layer-2] Done | 00:00:00 - Predicting layer layer-3 - [layer-3] Done | 00:00:00 + Processing layers (3) + + Predicting layer-1 + [Parallel(n_jobs=-1)]: Done 2 out of 2 | elapsed: 0.0s finished + layer-1 Done | 00:00:00 + + Predicting layer-2 + [Parallel(n_jobs=-1)]: Done 2 out of 2 | elapsed: 0.0s finished + layer-2 Done | 00:00:00 + Predicting layer-3 + [Parallel(n_jobs=-1)]: Done 1 out of 1 | elapsed: 0.0s finished + layer-3 Done | 00:00:00 -The design of the ``scores_`` attribute now allows an easy overview of the -ensemble performance. :: + Done | 00:00:00 + + +The design of the ``scores_`` attribute allows an intuitive overview of how +the base learner's perform in each layer. :: >>> DataFrame(ensemble.scores_) score_mean score_std @@ -155,7 +190,6 @@ In the latter case, preprocessing is constituted by selecting a subset from mlens.model_selection import Evaluator from mlens.preprocessing import Subset from sklearn.preprocessing import StandardScaler - from pandas import DataFrame from sklearn.naive_bayes import GaussianNB from sklearn.neighbors import KNeighborsClassifier @@ -217,7 +251,7 @@ Make sure to specify the number of parameter draws to evaluate >>> evaluator.evaluate(X, y, estimators, params, n_iter=10) Evaluating 6 estimators for 10 parameter draws 10 CV folds, totalling 600 fits - [Parallel(n_jobs=-1)]: Done 600 out of 600 | elapsed: 0.9s finished + [Parallel(n_jobs=-1)]: Done 600 out of 600 | elapsed: 1.0s finished Evaluation done | 00:00:01 The results for all parameter draws are stored in ``cv_results``. The @@ -227,16 +261,17 @@ objects, and can be passed to a :class:`pandas.DataFrame` instance for a tabular output:: >>> DataFrame(evaluator.summary) - fit_time_mean fit_time_std train_score_mean train_score_std test_score_mean test_score_std params - none gnb 0.001353 0.001316 0.957037 0.005543 0.960000 0.032660 {} - knn 0.000447 0.000012 0.980000 0.004743 0.966667 0.033333 {'n_neighbors': 15} - sc gnb 0.001000 0.000603 0.957037 0.005543 0.960000 0.032660 {} - knn 0.000448 0.000036 0.965185 0.003395 0.960000 0.044222 {'n_neighbors': 8} - sub gnb 0.000735 0.000248 0.791111 0.019821 0.780000 0.133500 {} - knn 0.000462 0.000143 0.837037 0.014815 0.800000 0.126491 {'n_neighbors': 9} - -So we can quickly surmise that the two perform similarly, the KNN should -use 15 neighbours. and preprocessing doesn't seem necessary. + train_score_mean train_score_std test_score_mean test_score_std fit_time_mean fit_time_std params + none gnb 0.957037 0.005543 0.960000 0.032660 0.001000 0.000605 {} + knn 0.980000 0.004743 0.966667 0.033333 0.000805 0.000520 {'n_neighbors': 15} + sc gnb 0.957037 0.005543 0.960000 0.032660 0.000845 0.000279 {} + knn 0.965185 0.003395 0.960000 0.044222 0.000501 0.000168 {'n_neighbors': 8} + sub gnb 0.791111 0.019821 0.780000 0.133500 0.001026 0.000625 {} + knn 0.837037 0.014815 0.800000 0.126491 0.000675 0.000447 {'n_neighbors': 9} + +So we can easily surmise that the two perform similarly when the KNN +use 15 neighbours, the best performing setting. Moreover, the tested +preprocessing pipelines does not seem to help in this case. .. _visualization-guide: diff --git a/docs/gotchas.rst b/docs/gotchas.rst new file mode 100644 index 00000000..67bf147b --- /dev/null +++ b/docs/gotchas.rst @@ -0,0 +1,62 @@ +Gotcha's +======== + +This page collects known issues and gotcha's that arises in third-party +integrations and that are not within the scope of ML-Ensemble to address. + +Nesting multi-threaded objects fails +------------------------------------ + +This issue arises when a multit-hreaded python object is nested within another +multi-threaded object. Examples include when a base estimator in an ensemble +is multi-threaded or when a multi-threaded estimator (such as an ensemble) is +passed to a grid search object that is run in parallel. This issue is due to a +limitation of how `Python runs processes in parallel`_, and as such beyond the +scope of ML-Ensemble to fix. In short, when Python forks the main process, the +sub-processes will act as if they have the entire machine's threads at their +disposal when in fact only the main thread has been forked. Hence, every +sub-procsses will send jobs to all threads, causing a grid lock where every +thread is waiting on each other. Your main process (where you executed the +code) will not fail, but simple stall. You can detect this issue if your +activity monitor shows not Python process with significant CPU usage (< 5%). +Your script is executing, but not doing anything. + +The simplest solution to avoid this is to turn off multi-threading in the +sub-processes, for instance by setting ``n_jobs`` (or ``nthread``) to ``1``. +Since an ensemble or grid search runs processes in parallel as is, this will +not cause a significant performance drop. + +In Python 3.4+, it is possible to circumvent this issue by using the +``forkprocess`` backend within the native python ``multiprocessing`` library. +To do this, set the multiprocessing start method to ``forkserver`` as below. :: + + import multiprocessing + + # Imports and functions/class definitions + + if __name__ == '__main__': + + multiprocessing.set_start_method('forkserver') + + # Your execution here + +Further information can be found here_. + +File permissions on Windows +--------------------------- + +During ensemble estimation, ML-Ensemble will create a temporary directory and +populate it with training data and predictions, along with pickled estimators +and transformers. Each subprocess is given an container object that points to +the objects in the directory, and once the estimation is done the temporary +directory is cleaned and removed. The native python execution of the +termination typically fails due to how Windows gives read and write permission +between processes. To overcome this, ML-Ensemble runs an explicit shell command +(``rmdir -s -q dir``) that forcibly removes the cache. Current testing on +development machines indicates this exception handling is successful and +Windows users should not expect any issues. If however you do notice +memory performance issues, create an issue at the `issue tracker`_. + +.. _Python runs processes in parallel: https://wiki.python.org/moin/ParallelProcessing +.. _here: https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods +.. _issue tracker: https://github.com/flennerhag/mlens/issues diff --git a/docs/index.rst b/docs/index.rst index 23d92dce..41279baf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,25 +1,18 @@ ML-Ensemble =========== -ML-Ensemble is a Python library for **memory efficient -parallelized ensemble network learning**. +**A Python library for memory efficient parallelized ensemble learning**. -ML-Ensemble emphasizes user friendliness, and all estimators follows the -`Scikit-learn`_ API. In fact, any ML-Ensemble estimator is passes as a -proper Scikit-learn estimator and interacts seamlessly with any -Scikit-learn object. The ensemble layer API is similar to that of popular -Neural Network libraries like Keras_, and it is straightforward to build deep -ensembles of any desired level of complexity. +ML-Ensemble deploys sequential ensemble networks through a `Scikit-learn`_ API. +Ensembles can be made arbitrarily deep, by adding layers of base learners +that are fitted sequentially on previous layer's predictions. By leveraging a +network API similar to that of popular deep learning libraries like Keras_, +it is straightforward to build fast and memory efficient +multi-layered ensembles. -ML-Ensemble implements a range of ensemble techniques and the list is -constantly growing. For latest news, see :ref:`updates`. - -If you are new to ML-Ensemble, check out the :ref:`getting-started` -and :ref:`ensemble-tutorial`. For more detailed examples, see the -:ref:`memory` and :ref:`scaling` section. Performance testimonials can be found -in the :ref:`here `. - -If you would like to get involved, don't hesitate to reach out on Github_ ! +ML-Ensemble is looking for contributors at all levels of experience. +If you would like to get involved, reach out to the project's Github_ +repository. Core Features ------------- @@ -101,9 +94,26 @@ preferred. This can easily be achieved in ML-Ensemble:: Dedicated Diagnostics ^^^^^^^^^^^^^^^^^^^^^ -ML Ensemble implements a dedicated diagnostics and model selection suite -for intuitive and speedy ensemble evaluation. This suite is under -development, so check in frequently for new functionality. +Building complex ensembles requires an understanding of how base learners +interact. Grid searches on each estimator in isolation is unlikely to yield +superior results, not to mention being helpful in finding the right base +learners and meta estimator. ML-Ensemble comes equipped with a grid search +functionality that lets you run several estimators across any number of +preprocessing pipelines in one go. Ensemble transformers can be used to +build initial layers of ensembles as preprocessing pipelines to avoid +repeatedly fitting the same layer during model selection, which is orders of +magnitude faster that fitting an entire ensemble repeatedly just to evaluate +(say) the meta learner. Output allows easy comparison of estimator performance, +as in the example below. :: + + + train_score_mean train_score_std test_score_mean test_score_std fit_time_mean fit_time_std params + prep-1 est-1 0.957037 0.005543 0.960000 0.032660 0.001000 0.000605 {} + est-2 0.980000 0.004743 0.966667 0.033333 0.000805 0.000520 {'n_neighbors': 15} + prep-2 est-1 0.957037 0.005543 0.960000 0.032660 0.000845 0.000279 {} + est-2 0.965185 0.003395 0.960000 0.044222 0.000501 0.000168 {'n_neighbors': 8} + prep-3 est-1 0.791111 0.019821 0.780000 0.133500 0.001026 0.000625 {} + est-2 0.837037 0.014815 0.800000 0.126491 0.000675 0.000447 {'n_neighbors': 9} .. toctree:: @@ -127,9 +137,10 @@ development, so check in frequently for new functionality. :maxdepth: 2 :caption: Details - benchmarks memory + benchmarks scaling + gotchas .. toctree:: :hidden: @@ -137,7 +148,6 @@ development, so check in frequently for new functionality. :caption: Documentation API - source/modules .. toctree:: :hidden: @@ -145,15 +155,19 @@ development, so check in frequently for new functionality. :caption: Additional Information licence + updates + +.. toctree:: + :hidden: + :maxdepth: 0 + :caption: Package index + + source/modules -References ----------- -.. [1] van der Laan, Mark J.; Polley, Eric C.; and Hubbard, Alan E., - "Super Learner" (July 2007). U.C. Berkeley Division of Biostatistics - Working Paper Series. Working Paper 222. - http://biostats.bepress.com/ucbbiostat/paper222 +.. +==== -ML Ensemble is licenced under MIT and is hosted on Github_. +ML Ensemble is licenced under :ref:`MIT ` and is hosted on Github_. .. _Github: https://github.com/flennerhag/mlens .. _Scikit-learn: http://scikit-learn.org/stable/ diff --git a/docs/install.rst b/docs/install.rst index d643f48d..563b0b7d 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -1,3 +1,6 @@ + +.. Install instructions + Install ======= @@ -19,27 +22,11 @@ development version, install the ``master`` branch of the Github repository. git clone https://flennerhag/mlens.git; cd mlens; python install setup.py -To update, first pull the latest changes, and re-install: - -.. code-block:: bash - - git pull; python install setup.py - -To avoid explicitly re-installing, one can install the repository with -symlinks enabled through ``pip``: - -.. code-block:: bash - - git clone https://flennerhag/mlens.git; cd mlens; - pip install -e . - -This requires only pulling the latest changes to update the library. - Developer ^^^^^^^^^ For the latest in-development version, install the ``dev`` branch of the -:mod:`mlens` repository. It is advised to check Travis build history +:mod:`mlens` repository. It is advised to check the CI build status first to ensure the current version does not contain apparent errors. Dependencies @@ -52,11 +39,31 @@ Package Version Module ============ ======= ====================== scipy >= 0.17 All numpy >= 1.11 All -matplotlib >= 1.5 Only for visualization -seaborn >= 0.7 Only for visualization ============ ======= ====================== -Test Build +.. currentmodule:: mlens.visualization + +Additionally, to use the :mod:`visualization` module, the following +libraries are necessary: + +============ ======= +Package Version +============ ======= +matplotlib >= 1.5 +seaborn >= 0.7 +============ ======= + +If you want to run examples, you may also need: + +============ ======= +Package Version +============ ======= +sklearn >= 0.17 +pandas >= 0.17 +============ ======= + + +Test build ========== To test the installation, run: diff --git a/docs/licence.rst b/docs/licence.rst index 49ded080..a96b2409 100644 --- a/docs/licence.rst +++ b/docs/licence.rst @@ -1,3 +1,8 @@ + +.. License + +.. _license: + Licence ======= diff --git a/docs/scaling.rst b/docs/scaling.rst index 69bfa110..1a799a0d 100644 --- a/docs/scaling.rst +++ b/docs/scaling.rst @@ -2,5 +2,5 @@ .. _scaling: -Scale Benchmarks +Scale benchmarks ================ diff --git a/docs/source/mlens.visualization.benchmark.rst b/docs/source/mlens.visualization.benchmark.rst deleted file mode 100644 index 9ac79485..00000000 --- a/docs/source/mlens.visualization.benchmark.rst +++ /dev/null @@ -1,7 +0,0 @@ -mlens.visualization.benchmark module -==================================== - -.. automodule:: mlens.visualization.benchmark - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/mlens.visualization.rst b/docs/source/mlens.visualization.rst index a961d0da..67d69ce6 100644 --- a/docs/source/mlens.visualization.rst +++ b/docs/source/mlens.visualization.rst @@ -6,7 +6,6 @@ Submodules .. toctree:: - mlens.visualization.benchmark mlens.visualization.correlations mlens.visualization.var_analysis diff --git a/docs/updates.rst b/docs/updates.rst new file mode 100644 index 00000000..1c7577c7 --- /dev/null +++ b/docs/updates.rst @@ -0,0 +1,15 @@ + +.. Change log + + +.. _updates: + +Change log +========== + + * 10/04/2017: `Release of version 0.1.0`_ + Initial stable version released. + + + +.. _Release of version 0.1.0: https://github.com/flennerhag/mlens/releases From 133247c30455fd1142d70e3f9897717a94c99e59 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 15:38:14 +0200 Subject: [PATCH 05/26] print control --- mlens/ensemble/base.py | 4 +-- mlens/model_selection/model_selection.py | 44 ++++++++++++++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/mlens/ensemble/base.py b/mlens/ensemble/base.py index 3eb2f3cc..c75e9bac 100644 --- a/mlens/ensemble/base.py +++ b/mlens/ensemble/base.py @@ -224,7 +224,7 @@ def fit(self, X=None, y=None, return_preds=None, **process_kwargs): if self.verbose: pout = "stdout" if self.verbose >= 3 else "stderr" safe_print("Processing layers (%d)" % self.n_layers, - file=pout, flush=True, end="\n") + file=pout, flush=True, end="\n\n") t0 = time() # Initialize cache @@ -310,7 +310,7 @@ def _predict(self, X, job, *args, **kwargs): if self.verbose: pout = "stdout" if self.verbose >= 3 else "stderr" safe_print("Processing layers (%d)" % self.n_layers, - file=pout, flush=True, end="\n") + file=pout, flush=True, end="\n\n") t0 = time() # Initialize cache diff --git a/mlens/model_selection/model_selection.py b/mlens/model_selection/model_selection.py index 9c838103..2d933275 100644 --- a/mlens/model_selection/model_selection.py +++ b/mlens/model_selection/model_selection.py @@ -522,12 +522,42 @@ def _print_prep_start(self, t0, printout): def _print_eval_start(self, printout): """Print initiation message and return timer.""" - msg = ('Evaluating %i models for %i parameter draws over %i' + - ' preprocessing pipelines and %i CV folds, totalling %i fits') + if self.preprocessing is None: + msg = ('Evaluating %i models for %i parameter draws over %i ' + 'CV folds, totalling %i fits') - e = len(self.estimators) - p = len(getattr(self, 'preprocessing', [1])) - c = self.cv if isinstance(self.cv, int) else self.cv.n_splits + e, c, tot = self._get_count() + safe_print(msg % (e, self.n_iter, c, tot), file=printout) + else: + msg = ('Evaluating %i models for %i parameter draws over %i' + + ' preprocessing pipelines and %i CV folds, ' + 'totalling %i fits') + + e, p, c, tot = self._get_count() + safe_print(msg % (e, self.n_iter, p, c, tot), file=printout) + + def _get_count(self): + """Utility for counting number of fits to make.""" + c = self.cv + + if self.preprocessing is None: + # Simply grab length of estimator list + e = len(self.estimators) + tot = e * c * self.n_iter + return int(e), int(c), int(tot) + else: + # Need to consider cases + p = len(self.preprocessing) + + if isinstance(self.estimators, list): + # If all esimtimators are applied to all cases, just grab + # length of list and multiply by cases + e = len(self.estimators) * p + else: + # Sum over cases + e = 0 + for v in self.estimators.values(): + e += len(v) - tot = e * p * self.n_iter * c - safe_print(msg % (e, self.n_iter, p, c, tot), file=printout) + tot = e * c * self.n_iter + return int(e), int(p), int(c), int(tot) From 368beff389bb365e3e48a12c6c737107108bbde3 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 15:38:27 +0200 Subject: [PATCH 06/26] sep conda build --- .conda/bld.bat | 2 -- .conda/build.sh | 3 --- .conda/meta.yaml | 40 ---------------------------------------- 3 files changed, 45 deletions(-) delete mode 100644 .conda/bld.bat delete mode 100644 .conda/build.sh delete mode 100644 .conda/meta.yaml diff --git a/.conda/bld.bat b/.conda/bld.bat deleted file mode 100644 index c40a9bbe..00000000 --- a/.conda/bld.bat +++ /dev/null @@ -1,2 +0,0 @@ -"%PYTHON%" setup.py install -if errorlevel 1 exit 1 diff --git a/.conda/build.sh b/.conda/build.sh deleted file mode 100644 index 8e25a145..00000000 --- a/.conda/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -$PYTHON setup.py install diff --git a/.conda/meta.yaml b/.conda/meta.yaml deleted file mode 100644 index 266c85b4..00000000 --- a/.conda/meta.yaml +++ /dev/null @@ -1,40 +0,0 @@ -package: - name: mlens - version: "0.1.0" - -source: - git_rev: v0.1.0 - git_url: https://github.com/flennerhag/mlens.git - -requirements: - build: - - python - - setuptools - - numpy >=1.11 - - scipy >=0.17 - - run: - - python - - numpy >=1.11 - - scipy >=0.17 - -test: - requires: - - nose-exclude - - imports: - - mlens - - mlens.base - - mlens.ensemble - - mlens.externals - - mlens.metrics - - mlens.model_selection - - mlens.parallel - - mlens.preprocessing - - mlens.utils - - -about: - home: https://github.com/flennerhag/mlens - license: MIT - license_file: LICENSE From cdbf6adc8f541794d85b250c3b8d1813cd498e55 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 16:24:22 +0200 Subject: [PATCH 07/26] bug fix: add kwargs to _add call --- mlens/ensemble/sequential.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mlens/ensemble/sequential.py b/mlens/ensemble/sequential.py index 01f8b5ca..def6c488 100644 --- a/mlens/ensemble/sequential.py +++ b/mlens/ensemble/sequential.py @@ -239,4 +239,5 @@ def add(self, cls, estimators, preprocessing=None, **kwargs): cls=cls, indexer=indexer, preprocessing=preprocessing, - verbose=self.verbose) + verbose=self.verbose, + **kwargs) From 1ba6e64b63675ef0314c6337c882d1fcc329056a Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:20:31 +0200 Subject: [PATCH 08/26] rebase for blend transformer --- mlens/parallel/evaluation.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mlens/parallel/evaluation.py b/mlens/parallel/evaluation.py index e07402ec..0b4adb2c 100644 --- a/mlens/parallel/evaluation.py +++ b/mlens/parallel/evaluation.py @@ -157,6 +157,12 @@ def _fit_score(case, tr_list, est_name, est, params, X, y, idx, scorer, for tr_name, tr in tr_list: xtrain = tr.transform(xtrain) + # We might have to rebase the training labels since a BlendEnsemble would + # make xtrain. Since Blend is sequential, we can discard the first 'n' + # observation until the dimensions match + rebase = ytrain.shape[0] - xtrain.shape[0] + ytrain = ytrain[rebase:] + # Fit estimator t0 = time() est = est.fit(xtrain, ytrain) From 9e17dc7c2f9db91c5cf7cbdceef943b3b57b29fc Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:20:58 +0200 Subject: [PATCH 09/26] param_dict formatting --- mlens/model_selection/model_selection.py | 217 ++++++++++++++++------- 1 file changed, 151 insertions(+), 66 deletions(-) diff --git a/mlens/model_selection/model_selection.py b/mlens/model_selection/model_selection.py index 2d933275..69f395c7 100644 --- a/mlens/model_selection/model_selection.py +++ b/mlens/model_selection/model_selection.py @@ -104,16 +104,14 @@ class Evaluator(object): Attributes ---------- - summary\_ : DataFrame + summary : dict Summary output that shows data for best mean test scores, such as test and train scores, std, fit times, and params. - cv_results\_ : DataFrame - a table of data from each fit. Includes mean and std of test and train - scores and fit times, as well as param draw index and parameters. - - best_idx\_ : ndarray - an array of index keys for best estimator in ``cv_results_``. + cv_results : dict + a nested ``dict`` of data from each fit. Includes mean and std of + test and train scores and fit times, as well as param draw index + and parameters. """ def __init__(self, @@ -179,34 +177,58 @@ def fit(self, X, y, estimators, param_dicts, n_iter=2, preprocessing=None): set of estimators to use. If no preprocessing is desired or if only on preprocessing pipeline should apply to all, pass a list of estimators. The list can contain elements of named tuples - (i.e. ``('my_name', my_est)``). If several preprocessing cases - are evaluated, a dictionary that maps estimators to each case must + (i.e. ``('my_name', my_est)``). + + If different estimators should be mapped to preprocessing cases, + a dictionary that maps estimators to each case should be passed: ``{'case_a': list_of_est, ...}``. param_dicts : dict - param_dicts for estimators. Current implementation only supports - randomized grid search. Passed distribution object must - have an ``rvs`` method. See - :py:class:`sklearn.model_selection.RandomizedSearchCV` for - details. Note that the if several cases are evaluated, - ``param_dicts`` should have a ``(case_name, est_name)`` tuple - as key. ``param_dict`` should be specified as:: - - param_dicts = {'est-1': - {'param-1': some_distribution, - 'param-2': some_distribution}, - 'est-2': + parameter distribution mapping for estimators. Current + implementation only supports randomized grid search. Passed + distribution object must have an ``rvs`` method. + See :mod:`Scipy.stats` for details. + + There is quite some flexibility in specifying ``param_dicts``. If + there is no preprocessing, or if all estimators are fitted on all + preprocessing cases, the ``param_dict`` should have keys matching + the names of the estimators. :: + + estimators = [('name', est), est] + + param_dicts = {'name': {'param-1': some_distribution}, + 'est': {'param-1': some_distribution} + } + + It is possible to specify different distributions for some or all + preprocessing cases:: + + preprocessing = {'case-1': transformer_list, + 'case-2': transformer_list} + + estimators = [('name', est), est] + + param_dicts = {'name': + {'param-1': some_distribution}, + ('case-1', 'est'): + {'param-1': some_distribution} + ('case-2', 'est'): {'param-1': some_distribution, - 'param-2': some_distribution}, - } + 'param-2': some_distribution} + } + + If estimators are mapped on a per-preprocessing case basis as a + dictionary, ``param_dict`` must have key entries of the form + ``(case_name, est_name)``. n_iter : int number of parameter draws to evaluate. - preprocessing : list or dict, optional - preprocessing cases to consider. If only on case, pass a list. - if several cases, pass a dictionary mapping a case name to a - preprocessing pipeline. + preprocessing : dict, optional + preprocessing cases to consider. Pass a dictionary mapping a + case name to a preprocessing pipeline. :: + + preprocessing = {'case_name': transformer_list,} Returns ------- @@ -233,9 +255,10 @@ def preprocess(self, X, y, preprocessing=None): training labels. preprocessing : list or dict, optional - preprocessing cases to consider. If only on case, pass a list. - if several cases, pass a dictionary mapping a case name to a - preprocessing pipeline. + preprocessing cases to consider. Pass a dictionary mapping a + case name to a preprocessing pipeline. :: + + preprocessing = {'case_name': transformer_list,} Returns ------- @@ -285,26 +308,49 @@ def evaluate(self, X, y, estimators, param_dicts, n_iter=2): set of estimators to use. If no preprocessing is desired or if only on preprocessing pipeline should apply to all, pass a list of estimators. The list can contain elements of named tuples - (i.e. ``('my_name', my_est)``). If several preprocessing cases - are evaluated, a dictionary that maps estimators to each case must + (i.e. ``('my_name', my_est)``). + + If different estimators should be mapped to preprocessing cases, + a dictionary that maps estimators to each case should be passed: ``{'case_a': list_of_est, ...}``. param_dicts : dict - param_dicts for estimators. Current implementation only supports - randomized grid search. Passed distribution object must - have an ``rvs`` method. See - :py:class:`sklearn.model_selection.RandomizedSearchCV` for - details. Note that the if several cases are evaluated, - ``param_dicts`` should have a ``(case_name, est_name)`` tuple - as key. ``param_dict`` should be specified as:: - - param_dicts = {'est-1': - {'param-1': some_distribution, - 'param-2': some_distribution}, - 'est-2': + parameter distribution mapping for estimators. Current + implementation only supports randomized grid search. Passed + distribution object must have an ``rvs`` method. + See :mod:`Scipy.stats` for details. + + There is quite some flexibility in specifying ``param_dicts``. If + there is no preprocessing, or if all estimators are fitted on all + preprocessing cases, the ``param_dict`` should have keys matching + the names of the estimators. :: + + estimators = [('name', est), est] + + param_dicts = {'name': {'param-1': some_distribution}, + 'est': {'param-1': some_distribution} + } + + It is possible to specify different distributions for some or all + preprocessing cases:: + + preprocessing = {'case-1': transformer_list, + 'case-2': transformer_list} + + estimators = [('name', est), est] + + param_dicts = {'name': + {'param-1': some_distribution}, + ('case-1', 'est'): + {'param-1': some_distribution} + ('case-2', 'est'): {'param-1': some_distribution, - 'param-2': some_distribution}, - } + 'param-2': some_distribution} + } + + If estimators are mapped on a per-preprocessing case basis as a + dictionary, ``param_dict`` must have key entries of the form + ``(case_name, est_name)``. n_iter : int number of parameter draws to evaluate. @@ -315,21 +361,10 @@ def evaluate(self, X, y, estimators, param_dicts, n_iter=2): class instance with stored estimator evaluation results. """ # First check if list of estimators should be expanded to very case - preprocessing = getattr(self, 'preprocessing', None) - if preprocessing is not None and isinstance(estimators, list): - - ests_ = estimators - estimators = {case: ests_ for case in preprocessing.keys()} - - draws = param_dicts - param_dicts = {(case, est_name): params - for case in preprocessing.keys() - for est_name, params in draws.items()} + estimators, param_dicts = self._format(estimators, param_dicts) - assert_correct_format(estimators, preprocessing) - - self.n_iter = n_iter self.estimators = check_instances(estimators) + self.n_iter = n_iter self._param_sets(param_dicts) if self.verbose > 0: @@ -356,6 +391,52 @@ class instance with stored estimator evaluation results. return self + def _format(self, estimators, param_dicts): + """Ensure estimator object and param_dict object have right format.""" + preprocessing = getattr(self, 'preprocessing', None) + + if preprocessing is not None and isinstance(estimators, list): + # Set all estimators in list as ests for each case + ests_ = estimators + estimators = {case: ests_ for case in preprocessing.keys()} + + # Set parameter draws for each case + if preprocessing is not None: + + params = dict() + for key, pars in param_dicts.items(): + if isinstance(key, tuple): + # Check that naming is of the (case, est) form + + if key[0] not in preprocessing: + + msg = ("param_dict poorly formatted. Valid keys are " + "'(case_name, est_name)' or 'est_name'." + " Failed on key entry {}. \nAll keys: " + "{}".format(key, list(preprocessing))) + + raise ValueError(msg) + + params[key] = pars + + else: + # have an est_name key entry. Need to generate + # keys of the form (case, est) + for case in preprocessing.keys(): + if (case, key) in params: + # We do not want to overwrite user-specified dists + continue + + params[(case, key)] = pars + else: + params = param_dicts + + # Finally, check that estimators and preprocessing are correctly + # formatted for estimation + assert_correct_format(estimators, preprocessing) + + return estimators, params + def _draw_params(self, param_dists): """Draw a list of param dictionaries for estimator.""" # Set up empty list of parameter setting @@ -522,35 +603,39 @@ def _print_prep_start(self, t0, printout): def _print_eval_start(self, printout): """Print initiation message and return timer.""" - if self.preprocessing is None: + preprocessing = getattr(self, 'preprocessing', None) + + if preprocessing is None: + msg = ('Evaluating %i models for %i parameter draws over %i ' 'CV folds, totalling %i fits') - e, c, tot = self._get_count() + e, c, tot = self._get_count(preprocessing) safe_print(msg % (e, self.n_iter, c, tot), file=printout) else: + msg = ('Evaluating %i models for %i parameter draws over %i' + ' preprocessing pipelines and %i CV folds, ' 'totalling %i fits') - e, p, c, tot = self._get_count() + e, p, c, tot = self._get_count(preprocessing) safe_print(msg % (e, self.n_iter, p, c, tot), file=printout) - def _get_count(self): + def _get_count(self, preprocessing): """Utility for counting number of fits to make.""" c = self.cv - if self.preprocessing is None: + if preprocessing is None: # Simply grab length of estimator list e = len(self.estimators) tot = e * c * self.n_iter return int(e), int(c), int(tot) else: # Need to consider cases - p = len(self.preprocessing) + p = len(preprocessing) if isinstance(self.estimators, list): - # If all esimtimators are applied to all cases, just grab + # If all estimators are applied to all cases, just grab # length of list and multiply by cases e = len(self.estimators) * p else: From 3989c900d602fe89c730b918cdd3652734a7a38e Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:21:21 +0200 Subject: [PATCH 10/26] auto version detection --- docs/conf.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 00e6af50..1ad11ea4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,11 +17,13 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -import subprocess import os import sys +from mlens import __version__ +import subprocess import sphinx_rtd_theme + # Ensure numpydoc exists subprocess.run(['pip', 'install', 'numpydoc']) @@ -85,9 +87,9 @@ # built documents. # # The short X.Y version. -version = '0.0.1' +version = str(__version__)[:5] # The full version, including alpha/beta/rc tags. -release = '0.0.1.dev0' +release = str(__version__) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From d9efc443d4e3064bd08283fda95af81c9728c433 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:21:47 +0200 Subject: [PATCH 11/26] tutorials --- docs/ensemble_tutorial.rst | 91 +++++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/docs/ensemble_tutorial.rst b/docs/ensemble_tutorial.rst index e185fe3a..91bd0ac6 100644 --- a/docs/ensemble_tutorial.rst +++ b/docs/ensemble_tutorial.rst @@ -58,8 +58,8 @@ predicted class membership. :: return ensemble -As in the :ref:`ensemble guide`, we fit on the first half, and test on the -remainder. :: +As in the :ref:`ensemble guide `, we fit on the first half, +and test on the remainder. :: >>> ensemble = build_ensemble(proba=False) >>> ensemble.fit(X[:75], y[:75]) @@ -142,7 +142,7 @@ syntax. :: 0.97333333333333338 In this case, the multi-layer :class:`SequentialEnsemble` with an initial -blended layer and second stacked layer achieved the same performance as the +blended layer and second stacked layer achieves similar performance as the :class:`BlendEnsemble` with probabilistic learning. Note that we could have made any of the layers probabilistic by setting ``Proba=True``. @@ -221,5 +221,86 @@ don't forget to remove the temporary directory. .. _model-selection-tutorial: -Meta learner model selection ----------------------------- +Ensemble model selection +------------------------ + +Ensembles benefit from a diversity of base learners, but often it is not clear +how to parametrize the base learners. In fact, combining base learners with +lower predictive power can often yield a superior ensemble. This hinges on the +errors made by the base learners being relatively uncorrelated, thus allowing +a meta estimator to learn how to overcome each model's weakness. But with +highly correlated errors, there is little for the ensemble to learn from. + +To fully exploit the learning capacity in an ensemble, it is beneficial to +conduct careful hyper parameter tuning, treating the base learner's parameters +as the parameters of the ensemble. By far the most critical part of the +ensemble is the meta learner, but selecting an appropriate meta learner can be +an ardous task if the entire ensemble has to be evaluated each time. + +.. py:currentmodule:: mlens.preprocessing + +The :class:`EnsembleTransformer` can be leveraged to treat the initial +layers of the ensemble as preprocessing. Thus, a copy of the transformer is +fitted once on each fold, and any model selection will use these pre-fits to +convert raw input to prediction matrices that corresponds to the output of the +specified ensemble. + +.. py:currentmodule:: mlens.ensemble + +The transformer follows the same API as the :class:`SequentialEnsemble`, but +does not implement a meta estimator and has a transform method that recovers +the prediction matrix from the ``fit`` call. In the following example, +we run model selection on the meta learner of a blend ensemble, and try +two configurations of the blend ensemble: learning from class predictions or +from probability distributions over classes. :: + + from mlens.preprocessing import EnsembleTransformer + from mlens.model_selection import Evaluator + from scipy.stats import uniform, randint + from pandas import DataFrame + + # Set up two competing ensemble bases as preprocessing transformers: + # one blend ensemble base with proba and one without + base_learners = [RandomForestClassifier(random_state=seed), + SVC(probability=True)] + + proba_transformer = EnsembleTransformer().add('blend', base_learners, proba=True) + class_transformer = EnsembleTransformer().add('blend', base_learners, proba=False) + + # Set up a preprocessing mapping + # Each pipeline in this map is fitted once on each fold before + # evaluating candidate meta learners. + preprocessing = {'proba': [('layer-1', proba_transformer)], + 'class': [('layer-1', class_transformer)]} + + # Set up candidate meta learners + # We can specify a dictionary if we wish to try different candidates on + # different cases, or a list if all estimators should be run on all + # preprocessing pipelines (as in this example) + meta_learners = [SVC(), ('rf', RandomForestClassifier(random_state=2017))] + + # Set parameter mapping + # Here, we differentiate distributions between cases for the random forest + params = {'svc': {'C': uniform(0, 10)}, + ('class', 'rf'): {'max_depth': randint(2, 10)}, + ('proba', 'rf'): {'max_depth': randint(2, 10), + 'max_features': uniform(0.5, 0.5)} + } + + evaluator = Evaluator(scorer=f1, random_state=2017, cv=20) + + evaluator.fit(X, y, meta_learners, params, preprocessing=preprocessing, n_iter=2) + +We can now compare the performance of the best fit for each candidate +meta learner. :: + + >>> DataFrame(evaluator.summary) + test_score_mean test_score_std train_score_mean train_score_std fit_time_mean fit_time_std params + class rf 0.955357 0.060950 0.972535 0.008303 0.024585 0.014300 {'max_depth': 5} + svc 0.961607 0.070818 0.972535 0.008303 0.000800 0.000233 {'C': 7.67070164682} + proba rf 0.980357 0.046873 0.992254 0.007007 0.022789 0.003296 {'max_depth': 3, 'max_features': 0.883535082341} + svc 0.974107 0.051901 0.969718 0.008060 0.000994 0.000367 {'C': 0.209602254061} + + +In this toy example, our model selection suggests the Random Forest is the +best meta learner when the ensemble uses probabilistic learning. From 7b51553c43effdc7f9474b86781f53169c74e24c Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:22:08 +0200 Subject: [PATCH 12/26] updated model sel with new API --- docs/getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 2efa6630..8f81403c 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -220,7 +220,7 @@ an example. To explicitly fit preprocessing pipelines, call ``preprocess``. :: >>> evaluator.preprocess(X, y, preprocess_cases) Preprocessing 3 preprocessing pipelines over 10 CV folds - [Parallel(n_jobs=-1)]: Done 30 out of 30 | elapsed: 0.0s finished + [Parallel(n_jobs=-1)]: Done 30 out of 30 | elapsed: 0.2s finished Preprocessing done | 00:00:00 To launch an evaluation, we need a mapping of parameter distributions to From 88235c8bc9e49cfbfb7de89a44307e3d90a434ea Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:22:22 +0200 Subject: [PATCH 13/26] wording --- docs/index.rst | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 41279baf..a6f8ca76 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -106,15 +106,12 @@ magnitude faster that fitting an entire ensemble repeatedly just to evaluate (say) the meta learner. Output allows easy comparison of estimator performance, as in the example below. :: - - train_score_mean train_score_std test_score_mean test_score_std fit_time_mean fit_time_std params - prep-1 est-1 0.957037 0.005543 0.960000 0.032660 0.001000 0.000605 {} - est-2 0.980000 0.004743 0.966667 0.033333 0.000805 0.000520 {'n_neighbors': 15} - prep-2 est-1 0.957037 0.005543 0.960000 0.032660 0.000845 0.000279 {} - est-2 0.965185 0.003395 0.960000 0.044222 0.000501 0.000168 {'n_neighbors': 8} - prep-3 est-1 0.791111 0.019821 0.780000 0.133500 0.001026 0.000625 {} - est-2 0.837037 0.014815 0.800000 0.126491 0.000675 0.000447 {'n_neighbors': 9} - + >>> DataFrame(evaluator.summary) + test_score_mean test_score_std train_score_mean train_score_std fit_time_mean fit_time_std params + class rf 0.955357 0.060950 0.972535 0.008303 0.024585 0.014300 {'max_depth': 5} + svc 0.961607 0.070818 0.972535 0.008303 0.000800 0.000233 {'C': 7.67070164682} + proba rf 0.980357 0.046873 0.992254 0.007007 0.022789 0.003296 {'max_depth': 3, 'max_features': 0.883535082341} + svc 0.974107 0.051901 0.969718 0.008060 0.000994 0.000367 {'C': 0.209602254061} .. toctree:: :hidden: From 6badfa905ca56027c2a857c3df2579b7a85f9fcb Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Mon, 10 Apr 2017 19:29:59 +0200 Subject: [PATCH 14/26] param_dicts --- mlens/model_selection/tests/test_model_selection.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mlens/model_selection/tests/test_model_selection.py b/mlens/model_selection/tests/test_model_selection.py index 5b5bad55..200c0e4c 100644 --- a/mlens/model_selection/tests/test_model_selection.py +++ b/mlens/model_selection/tests/test_model_selection.py @@ -34,6 +34,17 @@ def test_check(): np.testing.assert_raises(ValueError, Evaluator, mape) +def test_params(): + """[Model Selection] Test raises on bad params.""" + evl = Evaluator(mape_scorer) + + np.testing.assert_raises(ValueError, + evl.fit, X, y, [OLS()], + {('bad', 'ols'): + {'offset': randint(1, 10)}}, + preprocessing={'prep': [Scale()]}) + + def test_raises(): """[Model Selection] Test raises on error.""" From 37216d9a9ac808786cd1655d4675d345a92b99e0 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Wed, 12 Apr 2017 23:10:06 +0200 Subject: [PATCH 15/26] 0.1.2 ticker --- mlens/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlens/__init__.py b/mlens/__init__.py index fbfd42d0..8b4c4d05 100644 --- a/mlens/__init__.py +++ b/mlens/__init__.py @@ -8,7 +8,7 @@ learning. """ -__version__ = "0.1.0" +__version__ = "0.1.2" __all__ = ['base', 'ensemble', From 2f8fb0bacde7dddf3156f402523a207ee33fa49c Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Wed, 12 Apr 2017 23:11:23 +0200 Subject: [PATCH 16/26] fixed array check --- mlens/preprocessing/ensemble_transformer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlens/preprocessing/ensemble_transformer.py b/mlens/preprocessing/ensemble_transformer.py index 4c113df0..a68fb332 100644 --- a/mlens/preprocessing/ensemble_transformer.py +++ b/mlens/preprocessing/ensemble_transformer.py @@ -302,12 +302,12 @@ def _transform(self, X): # No layers instantiated, but raise_on_exception is False return - X, y = check_inputs(X, check_level=self.array_check) + X, _ = check_inputs(X, check_level=self.array_check) if self.shuffle: r = check_random_state(self.random_state) idx = r.permutation(X.shape[0]) - X, y = X[idx], y[idx] + X = X[idx] y = self.layers.transform(X) From de070c0cfb42fbceed462785f7dc03d9b110595f Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Wed, 12 Apr 2017 23:16:03 +0200 Subject: [PATCH 17/26] added array_check --- mlens/model_selection/model_selection.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/mlens/model_selection/model_selection.py b/mlens/model_selection/model_selection.py index 69f395c7..6b4e15a1 100644 --- a/mlens/model_selection/model_selection.py +++ b/mlens/model_selection/model_selection.py @@ -15,12 +15,13 @@ import numpy as np from ..base import FoldIndex +from ..metrics import make_scorer from ..parallel import ParallelEvaluation from ..utils import (print_time, safe_print, check_instances, - assert_correct_format) -from ..metrics import make_scorer + assert_correct_format, + check_inputs) try: from time import perf_counter as time @@ -96,6 +97,19 @@ class Evaluator(object): random_state : int, optional seed for creating folds (if shuffled) and parameter draws + array_check : int (default = 2) + level of strictness in checking input arrays. + + - ``array_check = 0`` will not check ``X`` or ``y`` + + - ``array_check = 1`` will check ``X`` and ``y`` for + inconsistencies and warn when format looks suspicious, + but retain original format. + + - ``array_check = 2`` will impose Scikit-learn array checks, + which converts ``X`` and ``y`` to numpy arrays and raises + an error if conversion fails. + n_jobs: int (default = -1) number of CPU cores to use. @@ -122,6 +136,7 @@ def __init__(self, backend='multiprocessing', error_score=None, metrics=None, + array_check=2, n_jobs=-1, verbose=False): @@ -132,6 +147,7 @@ def __init__(self, self.n_jobs = n_jobs self.error_score = error_score self.metrics = [np.mean, np.std] if metrics is None else metrics + self.array_check = array_check self.random_state = random_state self.verbose = verbose @@ -360,6 +376,8 @@ def evaluate(self, X, y, estimators, param_dicts, n_iter=2): self : instance class instance with stored estimator evaluation results. """ + X, y = check_inputs(X, y, check_level=self.array_check) + # First check if list of estimators should be expanded to very case estimators, param_dicts = self._format(estimators, param_dicts) From fd34d27a1bb963d4220732699c03a6bf3027edbb Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Wed, 12 Apr 2017 23:25:36 +0200 Subject: [PATCH 18/26] scorer proba check --- mlens/ensemble/base.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mlens/ensemble/base.py b/mlens/ensemble/base.py index c75e9bac..d53a1447 100644 --- a/mlens/ensemble/base.py +++ b/mlens/ensemble/base.py @@ -664,6 +664,14 @@ def _add(self, scorer=self.scorer, **kwargs) + # Check parameter compatability + if 'proba' in kwargs: + scorer = getattr(self, 'scorer', None) + if kwargs['proba'] and scorer: + raise ValueError("Cannot score probability-based predictions." + "Set either ensemble parameter 'scorer' to " + "None or layer parameter 'Proba' to False.") + # Set the layer as an attribute of the ensemble lyr = list(self.layers.layers)[-1] attr = lyr.replace('-', '_').replace(' ', '').strip() From 777bc0bb5133521637229fa6cbe23d01290291b5 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Tue, 2 May 2017 10:09:03 +0200 Subject: [PATCH 19/26] 0.1.2 --- benchmarks/scale_comp.py | 17 +++++++----- mlens/ensemble/base.py | 35 +++++++++++++++++++++++- mlens/model_selection/model_selection.py | 10 ++++--- mlens/parallel/estimation.py | 22 ++++++++++++--- mlens/parallel/evaluation.py | 5 ++-- mlens/parallel/manager.py | 17 +++++++++--- 6 files changed, 83 insertions(+), 23 deletions(-) diff --git a/benchmarks/scale_comp.py b/benchmarks/scale_comp.py index 1c191f5f..04f99ddd 100644 --- a/benchmarks/scale_comp.py +++ b/benchmarks/scale_comp.py @@ -45,8 +45,8 @@ print("Could not import matplotlib. Will ignore PLOT flag.") PLOT = False -MAX = int(50000) -STEP = int(5000) +MAX = int(1000000) +STEP = int(200000) COLS = 5 SEED = 2017 @@ -75,10 +75,12 @@ def build_ensemble(kls, **kwargs): c = os.cpu_count() print("Available CPUs: %i\n" % c) - cores = [int(np.floor(i)) for i in np.linspace(1, c, 3)] + cores = [int(np.floor(i)) for i in np.linspace(1, c, 2)] - ens = [[build_ensemble(kls, n_jobs=i, ) - for kls in [SuperLearner, Subsemble, BlendEnsemble]] + ens_classes = [SuperLearner, Subsemble, BlendEnsemble] + kwargs = [{'folds': 4}, {'partitions': 8, 'folds': 4}, {}] + ens = [[build_ensemble(kls, n_jobs=i, **kwd) + for kls, kwd in zip(ens_classes , kwargs)] for i in cores] print('Ensemble architecture') @@ -117,7 +119,8 @@ def build_ensemble(kls, **kwargs): times[n][name].append(t1) - print('%s (%i) : %4.2f |' % (name, n, t1), end=" ", flush=True) + print('%s (%i) : %6.2fs |' % (name, n, t1), + end=" ", flush=True) print() print() @@ -128,7 +131,7 @@ def build_ensemble(kls, **kwargs): x = range(STEP, MAX + STEP, STEP) cm = [plt.cm.rainbow(i) for i in np.linspace(0, 1.0, - int(3 *len(cores))) + int(3 * len(cores))) ] plt.figure(figsize=(8, 8)) diff --git a/mlens/ensemble/base.py b/mlens/ensemble/base.py index d53a1447..11ac2e2c 100644 --- a/mlens/ensemble/base.py +++ b/mlens/ensemble/base.py @@ -559,7 +559,7 @@ def _store_layer_data(self): setattr(self, '%s_n_est' % case, n_est) n_pred += n_est - self.n_pred = n_pred + self.n_pred = self.n_est = n_pred if self.cls is 'subset': self.n_pred *= self.indexer.n_partitions @@ -589,10 +589,18 @@ def get_params(self, deep=True): for case, instances in step.items(): for instance_name, instance in instances: out["%s-%s" % (case, instance_name)] = instance + # Get instance parameters + for k, v in instances.get_params().items(): + out["%s-%s__%s" % (case, instance_name, k)] = v + else: # Simple named list of estimators / transformers for instance_name, instance in step: out[instance_name] = instance + # Get instance parameters + for k, v in instance.get_params().items(): + out["%s__%s" % (instance_name, k)] = v + return out @@ -743,3 +751,28 @@ def predict(self, X): y = y.ravel() return y + + def predict_proba(self, X): + """Predict class probabilities with fitted ensemble. + + Compatibility method for Scikit-learn. This method checks that the + final layer has ``proba=True``, then calls the regular ``predict`` + method. + + Parameters + ---------- + X : array-like, shape=[n_samples, n_features] + input matrix to be used for prediction. + + Returns + ------- + y_pred : array-like, shape=[n_samples, n_classes] + predicted class membership probabilities for provided input array. + """ + meta_name = list(self.layers.layers)[-1] + lyr = self.layers.layers[meta_name] + + if not getattr(lyr, 'proba', False): + raise ValueError("Cannot use 'predict_proba' if final layer" + "does not have 'proba=True'.") + return self.predict(X) diff --git a/mlens/model_selection/model_selection.py b/mlens/model_selection/model_selection.py index 6b4e15a1..e903e0ea 100644 --- a/mlens/model_selection/model_selection.py +++ b/mlens/model_selection/model_selection.py @@ -15,7 +15,6 @@ import numpy as np from ..base import FoldIndex -from ..metrics import make_scorer from ..parallel import ParallelEvaluation from ..utils import (print_time, safe_print, @@ -34,11 +33,12 @@ _dict = dict from operator import itemgetter +import warnings def _check_scorer(scorer): """Check that the scorer instance passed behaves as expected.""" - if not type(scorer).__name__ == '_PredictScorer': + if not type(scorer).__name__ in ['_PredictScorer', '_ProbaScorer']: raise ValueError("The passes scorer does not seem to be a valid " "scorer. Expected type '_PredictScorer', got '%s'." "Use the mlens.metrics.make_scorer function to " @@ -476,8 +476,10 @@ def _set_params(self, param_dicts, key): self.params[key] = \ self._draw_params(param_dicts[key]) except KeyError: - # No param draws desired. Set empty dict - self.params[key] = [{} for _ in range(self.n_iter)] + # No param draws desired. Set empty dict. + warnings.warn("No valid parameters found for %s. Will fit and " + "score once with given parameter settings." % key) + self.params[key] = [{}] def _param_sets(self, param_dicts): """For each estimator, create a mapping of parameter draws.""" diff --git a/mlens/parallel/estimation.py b/mlens/parallel/estimation.py index dd815cc4..c81772e1 100644 --- a/mlens/parallel/estimation.py +++ b/mlens/parallel/estimation.py @@ -433,11 +433,12 @@ def fit_trans(dir, case, inst, X, y, idx, name): out = [] for tr_name, tr in inst: # Fit transformer - tr = tr.fit(x, y) + tr.fit(x, y) # If more than one step, transform input for next step if len(inst) > 1: - x = tr.transform(x) + x, y = _transform(tr, x, y) + out.append((tr_name, tr)) # Write transformer list to cache @@ -464,7 +465,7 @@ def fit_est(dir, case, inst_name, inst, X, y, pred, idx, raise_on_exception, # Transform input for tr_name, tr in tr_list: - x = tr.transform(x) + x, z = _transform(tr, x, z) # Fit estimator inst.fit(x, z) @@ -479,7 +480,7 @@ def fit_est(dir, case, inst_name, inst, X, y, pred, idx, raise_on_exception, x, z, tei = _slice_array(X, y, tei) for tr_name, tr in tr_list: - x = tr.transform(x) + x, z = _transform(tr, x, z) p = getattr(inst, attr)(x) @@ -514,6 +515,19 @@ def _fit(**kwargs): ############################################################################### +def _transform(tr, x, y): + """Try transforming with X and y. Else, transform with only X.""" + try: + x = tr.transform(x, y) + if isinstance(x, (tuple, list)): + x, y = x + + except TypeError: + x = tr.transform(x) + + return x, y + + def _load_trans(dir, case, ivals, raise_on_exception): """Try loading transformers, and handle exception if not ready yet.""" s = ivals[0] diff --git a/mlens/parallel/evaluation.py b/mlens/parallel/evaluation.py index 0b4adb2c..998d2509 100644 --- a/mlens/parallel/evaluation.py +++ b/mlens/parallel/evaluation.py @@ -7,8 +7,7 @@ Cross-validation jobs for an :class:`Evaluator` instance. """ -from .estimation import (fit_trans, - _slice_array) +from .estimation import (fit_trans, _slice_array, _transform) from ..externals.joblib import delayed from ..utils import pickle_load @@ -155,7 +154,7 @@ def _fit_score(case, tr_list, est_name, est, params, X, y, idx, scorer, xtrain, ytrain, _ = _slice_array(X, y, idx[0]) for tr_name, tr in tr_list: - xtrain = tr.transform(xtrain) + xtrain, ytrain = _transform(tr, xtrain, ytrain) # We might have to rebase the training labels since a BlendEnsemble would # make xtrain. Since Blend is sequential, we can discard the first 'n' diff --git a/mlens/parallel/manager.py b/mlens/parallel/manager.py index 71d00764..84ea078c 100644 --- a/mlens/parallel/manager.py +++ b/mlens/parallel/manager.py @@ -12,6 +12,7 @@ import subprocess import tempfile import warnings +from joblib import dump import numpy as np @@ -149,10 +150,18 @@ def initialize(self, job, X, y=None, dir=None): shape = self._get_lyr_sample_size(lyr) - self.job.P.append(np.memmap(filename=f, - dtype=np.float, - mode='w+', - shape=shape)) + try: + self.job.P.append(np.memmap(filename=f, + dtype=np.float, + mode='w+', + shape=shape)) + except Exception as exc: + raise OSError("Cannot create prediction matrix of shape (" + "%i, %i), size %i MBs, for %s.\n Note that " + "files sizes are limited to 2GB on 32-bit " + "platforms. Details:\n%r" % + (shape[0], shape[1], 8.*shape[0]*shape[1]/1e6, + name, exc)) self.__initialized__ = 1 From b5a888f13ab621bc520e671d8ea27c2c7326a751 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Wed, 17 May 2017 21:45:17 +0200 Subject: [PATCH 20/26] avoid copying contiguous slice --- benchmarks/scale_comp.py | 48 ++++--- mlens/ensemble/base.py | 2 - mlens/parallel/estimation.py | 145 ++++++++++++---------- mlens/parallel/evaluation.py | 16 +-- mlens/parallel/manager.py | 53 ++++---- mlens/parallel/tests/test_a_evaluation.py | 2 +- 6 files changed, 147 insertions(+), 119 deletions(-) diff --git a/benchmarks/scale_comp.py b/benchmarks/scale_comp.py index 04f99ddd..04bca9c5 100644 --- a/benchmarks/scale_comp.py +++ b/benchmarks/scale_comp.py @@ -13,7 +13,7 @@ Ensemble architecture Num layers: 2 Fit per base layer estimator: 4 + 1 -layer-1 | Estimators: ['RandomForestRegressor', 'GradientBoostingRegressor', 'ElasticNet', 'KNeighborsRegressor']. +layer-1 | Estimators: 4x Lasso layer-2 | Meta Estimator: Lasso FIT TIMES @@ -25,6 +25,8 @@ import numpy as np import os +from mlens.base import FoldIndex +from mlens.ensemble.base import LayerContainer from mlens.ensemble import SuperLearner, Subsemble, BlendEnsemble from mlens.utils import print_time @@ -32,6 +34,8 @@ from sklearn.base import clone +from mlens.utils.dummy import OLS +from sklearn.linear_model import Lasso from sklearn.neighbors import KNeighborsRegressor from time import perf_counter @@ -45,9 +49,12 @@ print("Could not import matplotlib. Will ignore PLOT flag.") PLOT = False -MAX = int(1000000) -STEP = int(200000) -COLS = 5 + +ENS = [SuperLearner, BlendEnsemble] +KWG = [{'folds': 2, 'backend': 'threading'}, {}] +MAX = int(1e6) +STEP = int(1e5) +COLS = 100 SEED = 2017 np.random.seed(SEED) @@ -57,16 +64,27 @@ def build_ensemble(kls, **kwargs): """Generate ensemble of class kls.""" ens = kls(**kwargs) + ens.add([OLS() for _ in range(20)]) + ens.add_meta(OLS()) + return ens + +if __name__ == '__main__': + X, y = make_friedman1(n_samples=int(1e6), + n_features=100, random_state=SEED) - ens.add([KNeighborsRegressor(), KNeighborsRegressor(), - KNeighborsRegressor(), KNeighborsRegressor()]) + ens = SuperLearner(n_jobs=-1, folds=4, verbose=100) + ens = LayerContainer(n_jobs=-1, verbose=100) + ens.add([OLS() for _ in range(4)], 'stack', + indexer=FoldIndex(2)) - ens.add(KNeighborsRegressor()) + t0 = perf_counter() + ens.fit(X, y) + t1 = perf_counter() - return ens + print(t1 - t0) -if __name__ == '__main__': +if __name__ == 'sd': print("\nML-ENSEMBLE\n") print("Threading performance test for data set dimensioned up " @@ -75,12 +93,10 @@ def build_ensemble(kls, **kwargs): c = os.cpu_count() print("Available CPUs: %i\n" % c) - cores = [int(np.floor(i)) for i in np.linspace(1, c, 2)] + cores = [1, c] - ens_classes = [SuperLearner, Subsemble, BlendEnsemble] - kwargs = [{'folds': 4}, {'partitions': 8, 'folds': 4}, {}] ens = [[build_ensemble(kls, n_jobs=i, **kwd) - for kls, kwd in zip(ens_classes , kwargs)] + for kls, kwd in zip(ENS, KWG)] for i in cores] print('Ensemble architecture') @@ -101,11 +117,11 @@ def build_ensemble(kls, **kwargs): ts = perf_counter() times = {i: {kls().__class__.__name__: [] - for kls in [SuperLearner, Subsemble, BlendEnsemble]} + for kls in [SuperLearner, BlendEnsemble]} for i in cores} for s in range(STEP, MAX + STEP, STEP): - X, y = make_friedman1(n_samples=s, random_state=SEED) + X, y = make_friedman1(n_samples=s, n_features=COLS, random_state=SEED) for n, etypes in zip(cores, ens): print('%7i' % s, end=" ", flush=True) @@ -147,6 +163,6 @@ def build_ensemble(kls, **kwargs): plt.ylabel('Time to fit (sec)') plt.legend(frameon=False) - f = os.path.join('scale_comp.png') + f = os.path.join('scale_comp_1.png') plt.savefig(f, bbox_inches='tight', dpi=600) print("done.\nFigure written to %s" % f) diff --git a/mlens/ensemble/base.py b/mlens/ensemble/base.py index 11ac2e2c..77bb70bc 100644 --- a/mlens/ensemble/base.py +++ b/mlens/ensemble/base.py @@ -9,8 +9,6 @@ from __future__ import division, print_function -import gc -import warnings from abc import ABCMeta, abstractmethod from collections import OrderedDict diff --git a/mlens/parallel/estimation.py b/mlens/parallel/estimation.py index c81772e1..9be28d36 100644 --- a/mlens/parallel/estimation.py +++ b/mlens/parallel/estimation.py @@ -13,8 +13,7 @@ import numpy as np -from ..externals.joblib import delayed -from ..externals.joblib.parallel import SafeFunction +from joblib import delayed from ..utils import (check_is_fitted, pickle_load, @@ -22,13 +21,9 @@ print_time, safe_print) -from ..utils.exceptions import (FitFailedError, - FitFailedWarning, - NotFittedError, +from ..utils.exceptions import (NotFittedError, ParallelProcessingError, - ParallelProcessingWarning, - PredictFailedError, - PredictFailedWarning) + ParallelProcessingWarning) try: from time import perf_counter as time_ @@ -86,7 +81,6 @@ def __init__(self, layer, dual=True): self.dual = dual - @abstractmethod def _format_instance_list(self): """Formatting layer's estimator and preprocessing for parallel loop.""" @@ -145,14 +139,15 @@ def fit(self, X, y, P, dir, parallel): safe_print('Fitting %s' % self.name, file=printout) t0 = time_() - pred_method = 'predict' if not self.proba else 'predict_proba' + # Auxiliary variables preprocess = self.t is not None + pred_method = 'predict' if not self.proba else 'predict_proba' if y.shape[0] > X.shape[0]: # This is legal if X is a prediction matrix generated by predicting # only a subset of the original training set. # Since indexing is strictly monotonic, we can simply discard - # the first observations y to get the corresponding labels. + # the first observations in y to get the corresponding labels. rebase = y.shape[0] - X.shape[0] y = y[rebase:] @@ -161,17 +156,18 @@ def fit(self, X, y, P, dir, parallel): parallel(delayed(fit_trans)(dir=dir, case=case, inst=instance_list, - X=X, + x=X, y=y, idx=tri, name=self.name) - for case, tri, _, instance_list in self.t) + for i, (case, tri, _, instance_list) + in enumerate(self.t)) parallel(delayed(fit_est)(dir=dir, case=case, inst_name=inst_name, inst=instance, - X=X, + x=X, y=y, pred=P if tei is not None else None, idx=(tri, tei, self.c[case, inst_name]), @@ -189,7 +185,7 @@ def fit(self, X, y, P, dir, parallel): case=case, inst_name=inst_name, inst=instance, - X=X, + x=X, y=y, pred=P if tei is not None else None, idx=(tri, tei, self.c[case, inst_name]) @@ -323,33 +319,55 @@ def _wrap(folded_list, name='__trans__'): case, tri, tei, instance_list in folded_list] -def _slice_array(x, y, idx): +def _slice_array(x, y, idx, r = 0): """Build training array index and slice data.""" - # Have to be careful in prepping data for estimation. - # We need to slice memmap and convert to a proper array - otherwise - # transformers can store results memmaped to the cache, which will - # prevent the garbage collector from releasing the memmaps from memory - # after estimation if idx is None: - idx = None + return x, y else: + # Check if the idx is a tuple and if so, whether it can be made + # into a simple slice if isinstance(idx[0], tuple): - # If a tuple of indices, build iteratively - idx = np.hstack([np.arange(t0, t1) for t0, t1 in idx]) + if len(idx[0]) > 1: + # Advanced indexing is required. This will trigger a copy + # of the slice in question to be made + simple_slice = False + idx = np.hstack([np.arange(t0 - r, t1 - r) for t0, t1 in idx]) + x = x[idx] + y = y[idx] if y is not None else y + else: + # The tuple is of the form ((a, b),) and can be made + # into a simple (a, b) tuple for which basic slicing applies + # which allows a view to be returned instead of a copy + simple_slice = True + idx = idx[0] else: - idx = np.arange(idx[0], idx[1]) + # Index tuples of the form (a, b) allows simple slicing + simple_slice = True + + if simple_slice: + x = x[slice(idx[0] - r, idx[1] - r)] + y = y[slice(idx[0] - r, idx[1] - r)] if y is not None else y + + return x, y - x = x[idx] if idx is not None else x - if y is not None: - y = np.asarray(y[idx]) if idx is not None else np.asarray(y) +def _assign_predictions(pred, p, tei, col, n): + """Assign predictions to memmaped prediction array.""" + r = n - pred.shape[0] - if x.__class__.__name__[:3] not in ['csr', 'csc', 'coo', 'dok']: - # numpy asarray does not work with scipy sparse. Current experimental - # solution is to just leave them as is. - x = np.asarray(x) + if isinstance(tei[0], tuple): + if len(tei) > 1: + idx = np.hstack([np.arange(t0 - r, t1 - r) for t0, t1 in tei]) + else: + tei = tei[0] + idx = slice(tei[0] - r, tei[1] - r) + else: + idx = slice(tei[0] - r, tei[1] - r) - return x, y, idx + if len(p.shape) == 1: + pred[idx, col] = p + else: + pred[(idx, slice(col, col + p.shape[1]))] = p def _assemble(dir, instance_list, suffix): @@ -396,7 +414,7 @@ def predict_est(case, tr_list, inst_name, est, xtest, pred, col, name, attr): if len(p.shape) == 1: pred[:, col] = p else: - pred[:, np.arange(col, col + p.shape[1])] = p + pred[:, col:(col + p.shape[1])] = p def predict_fold_est(case, tr_list, inst_name, est, xtest, pred, idx, name, @@ -404,38 +422,34 @@ def predict_fold_est(case, tr_list, inst_name, est, xtest, pred, idx, name, """Method for predicting with transformers and estimators from fit call.""" tei = idx[0] col = idx[1] + n = xtest.shape[0] - x, _, tei = _slice_array(xtest, None, tei) + xtest, _ = _slice_array(xtest, None, tei) for tr_name, tr in tr_list: - x = tr.transform(x) + xtest = tr.transform(xtest) # Predict into memmap # Here, we coerce errors on failed predictions - all predictors that # survive into the estimators_ attribute of a layer should be able to # predict, otherwise the subsequent layer will get corrupt input. - p = getattr(est, attr)(x) - - rebase = xtest.shape[0] - pred.shape[0] - tei -= rebase + p = getattr(est, attr)(xtest) - if len(p.shape) == 1: - pred[tei, col] = p - else: - cols = np.arange(col, col + p.shape[1]) - pred[np.ix_(tei, cols)] = p + # Assign predictions to matrix + _assign_predictions(pred, p, tei, col, n) -def fit_trans(dir, case, inst, X, y, idx, name): +def fit_trans(dir, case, inst, x, y, idx, name): """Fit transformers and write to cache.""" - x, y, _ = _slice_array(X, y, idx) + x, y = _slice_array(x, y, idx) out = [] for tr_name, tr in inst: # Fit transformer tr.fit(x, y) - # If more than one step, transform input for next step + # If more than one step, transform input for next step. + # This step triggers a copy of x to be created if len(inst) > 1: x, y = _transform(tr, x, y) @@ -446,7 +460,7 @@ def fit_trans(dir, case, inst, X, y, idx, name): pickle_save(out, f) -def fit_est(dir, case, inst_name, inst, X, y, pred, idx, raise_on_exception, +def fit_est(dir, case, inst_name, inst, x, y, pred, idx, raise_on_exception, preprocess, name, ivals, attr, scorer=None): """Fit estimator and write to cache along with predictions.""" # Have to be careful in prepping data for estimation. @@ -454,7 +468,9 @@ def fit_est(dir, case, inst_name, inst, X, y, pred, idx, raise_on_exception, # estimators can store results memmaped to the cache, which will # prevent the garbage collector from releasing the memmaps from memory # after estimation - x, z, _ = _slice_array(X, y, idx[0]) + n = x.shape[0] + + xtrain, ytrain = _slice_array(x, y, idx[0]) # Load transformers if preprocess: @@ -464,11 +480,12 @@ def fit_est(dir, case, inst_name, inst, X, y, pred, idx, raise_on_exception, tr_list = [] # Transform input + # This will trigger copying of x and z for tr_name, tr in tr_list: - x, z = _transform(tr, x, z) + xtrain, ytrain = _transform(tr, xtrain, ytrain) # Fit estimator - inst.fit(x, z) + inst.fit(xtrain, ytrain) # Predict if asked # The predict loop is kept separate to allow overwrite of x, thus keeping @@ -477,31 +494,25 @@ def fit_est(dir, case, inst_name, inst, X, y, pred, idx, raise_on_exception, tei = idx[1] col = idx[2] - x, z, tei = _slice_array(X, y, tei) + xtest, ytest = _slice_array(x, y, tei) for tr_name, tr in tr_list: - x, z = _transform(tr, x, z) - - p = getattr(inst, attr)(x) + xtest = tr.transform(xtest) - rebase = X.shape[0] - pred.shape[0] - tei -= rebase + p = getattr(inst, attr)(xtest) - if len(p.shape) == 1: - pred[tei, col] = p - else: - cols = np.arange(col, col + p.shape[1]) - pred[np.ix_(tei, cols)] = p + # Assign predictions to matrix + _assign_predictions(pred, p, tei, col, n) + # Score predictions if applicable try: - s = scorer(z, p) + s = scorer(ytest, p) except Exception: s = None - # We drop tri from index and only keep tei if any predictions were made - idx = idx[1:] + idx = idx[1:] # format as (tei, col) else: - idx = (None, idx[2]) + idx = (None, idx[2]) # (tei, col), with tei = all observations s = None f = os.path.join(dir, '%s__%s__e' % (case, inst_name)) diff --git a/mlens/parallel/evaluation.py b/mlens/parallel/evaluation.py index 998d2509..2887749e 100644 --- a/mlens/parallel/evaluation.py +++ b/mlens/parallel/evaluation.py @@ -63,7 +63,7 @@ def preprocess(self, parallel, X, y, dir): parallel(delayed(fit_trans)(dir=dir, case=case, inst=instance_list, - X=X, + x=X, y=y, idx=tri, name=None) @@ -100,7 +100,7 @@ def evaluate(self, parallel, X, y, dir): est_name=est_name, est=est, params=(i, params), - X=X, + x=X, y=y, idx=(tri, tei), scorer=self.evaluator.scorer, @@ -123,19 +123,19 @@ def _name(case, est_name): return est_name.split('__')[0] -def fit_score(case, tr_list, est_name, est, params, X, y, idx, scorer, +def fit_score(case, tr_list, est_name, est, params, x, y, idx, scorer, error_score): """Wrapper around fit function to determine how to handle exceptions.""" if error_score is None: # If fit or scoring fails, we raise errors. - return _fit_score(case, tr_list, est_name, est, params, X, y, idx, + return _fit_score(case, tr_list, est_name, est, params, x, y, idx, scorer, error_score) else: # Otherwise, we issue a warning and set an error score. try: - return _fit_score(case, tr_list, est_name, est, params, X, y, idx, + return _fit_score(case, tr_list, est_name, est, params, x, y, idx, scorer, error_score) except Exception as exception: @@ -145,13 +145,13 @@ def fit_score(case, tr_list, est_name, est, params, X, y, idx, scorer, return case, est_name, params[0], error_score, error_score, 0 -def _fit_score(case, tr_list, est_name, est, params, X, y, idx, scorer, +def _fit_score(case, tr_list, est_name, est, params, x, y, idx, scorer, error_score): """Fit an estimator and generate scores for train and test set.""" est = clone(est).set_params(**params[1]) # Prepare training set - xtrain, ytrain, _ = _slice_array(X, y, idx[0]) + xtrain, ytrain = _slice_array(x, y, idx[0]) for tr_name, tr in tr_list: xtrain, ytrain = _transform(tr, xtrain, ytrain) @@ -168,7 +168,7 @@ def _fit_score(case, tr_list, est_name, est, params, X, y, idx, scorer, fit_time = time() - t0 # Prepare test set - xtest, ytest, _ = _slice_array(X, y, idx[1]) + xtest, ytest = _slice_array(x, y, idx[1]) for tr_name, tr in tr_list: xtest = tr.transform(xtest) diff --git a/mlens/parallel/manager.py b/mlens/parallel/manager.py index 84ea078c..55a956f8 100644 --- a/mlens/parallel/manager.py +++ b/mlens/parallel/manager.py @@ -12,12 +12,11 @@ import subprocess import tempfile import warnings -from joblib import dump import numpy as np from . import Blender, Evaluation, SingleRun, Stacker, SubStacker -from ..externals.joblib import Parallel, dump, load +from joblib import Parallel, dump, load from ..utils import check_initialized from ..utils.exceptions import (ParallelProcessingError, ParallelProcessingWarning) @@ -101,8 +100,8 @@ def initialize(self, job, X, y=None, dir=None): try: # Fails on python 2 - self.job.tmp = tempfile.TemporaryDirectory(prefix='mlens_', - dir=dir) + self.job.tmp = \ + tempfile.TemporaryDirectory(prefix='mlens_', dir=dir) self.job.dir = self.job.tmp.name except Exception: self.job.dir = tempfile.mkdtemp(prefix='mlens_', dir=dir) @@ -141,33 +140,36 @@ def initialize(self, job, X, y=None, dir=None): # Each layer will be fitted on P[i] and write to P[i + 1] for n, (name, lyr) in enumerate(self.layers.layers.items()): - f = os.path.join(self.job.dir, '%s.mmap' % name) - # We call the indexers fit method now at initialization - if there # is something funky with indexing it is better to catch it now # than mid-estimation lyr.indexer.fit(self.job.P[n]) - shape = self._get_lyr_sample_size(lyr) - - try: - self.job.P.append(np.memmap(filename=f, - dtype=np.float, - mode='w+', - shape=shape)) - except Exception as exc: - raise OSError("Cannot create prediction matrix of shape (" - "%i, %i), size %i MBs, for %s.\n Note that " - "files sizes are limited to 2GB on 32-bit " - "platforms. Details:\n%r" % - (shape[0], shape[1], 8.*shape[0]*shape[1]/1e6, - name, exc)) + # Prediction array + self._gen_prediction_array(lyr, name) self.__initialized__ = 1 # Release any memory before going into process gc.collect() + def _gen_prediction_array(self, lyr, name): + """Persist prediction array to disk.""" + f = os.path.join(self.job.dir, '%s.mmap' % name) + shape = self._get_lyr_sample_size(lyr) + try: + self.job.P.append(np.memmap(filename=f, + dtype=np.float, + mode='w+', + shape=shape)) + except Exception as exc: + raise OSError("Cannot create prediction matrix of shape (" + "%i, %i), size %i MBs, for %s.\n Note that " + "files sizes are limited to 2GB on 32-bit " + "platforms. Details:\n%r" % + (shape[0], shape[1], 8 * shape[0] * shape[1] / 1e6, + name, exc)) + def _get_lyr_sample_size(self, lyr): """Decide what sample size to create P with based on the job type.""" # Sample size is full for prediction, for fitting @@ -208,7 +210,7 @@ def process(self): with Parallel(n_jobs=self.layers.n_jobs, temp_folder=self.job.dir, max_nbytes=None, - mmap_mode='r+', + mmap_mode='w+', verbose=self.layers.verbose, backend=self.layers.backend) as parallel: @@ -290,7 +292,8 @@ def _partial_process(self, n, lyr, parallel): fargs = f.__func__.__code__.co_varnames # Strip variables we don't want to set from job directly - args = [a for a in fargs if a not in {'parallel', 'X', 'P', 'self'}] + args = [a for a in fargs + if a not in {'parallel', 'X', 'P', 'self'}] # Build argument list kwargs = {a: getattr(self.job, a) for a in args if a in @@ -328,8 +331,8 @@ def initialize(self, X, y=None, dir=None): try: # Fails on python 2 - self.job.tmp = tempfile.TemporaryDirectory(prefix='mlens_', - dir=dir) + self.job.tmp = \ + tempfile.TemporaryDirectory(prefix='mlens_', dir=dir) self.job.dir = self.job.tmp.name except Exception: self.job.dir = tempfile.mkdtemp(prefix='mlens_', dir=dir) @@ -372,7 +375,7 @@ def process(self, attr): with Parallel(n_jobs=self.evaluator.n_jobs, temp_folder=self.job.dir, max_nbytes=None, - mmap_mode='r+', + mmap_mode='w+', verbose=self.evaluator.verbose, backend=self.evaluator.backend) as parallel: diff --git a/mlens/parallel/tests/test_a_evaluation.py b/mlens/parallel/tests/test_a_evaluation.py index 466339dd..63b750ea 100644 --- a/mlens/parallel/tests/test_a_evaluation.py +++ b/mlens/parallel/tests/test_a_evaluation.py @@ -17,7 +17,7 @@ def test_fit_score(): est_name='ols', est=OLS(), params=(0, {'offset': 2}), - X=X, + x=X, y=y, idx=((0, 5), (5, 10)), scorer=make_scorer(mape, greater_is_better=False), From a36c07de7ef3d86b19fbebfdc0d1cf12e93c33d2 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Wed, 17 May 2017 23:47:49 +0200 Subject: [PATCH 21/26] joblib patch --- mlens/externals/joblib/__init__.py | 15 +- mlens/externals/joblib/_compat.py | 7 + .../joblib/_multiprocessing_helpers.py | 3 +- mlens/externals/joblib/disk.py | 13 +- mlens/externals/joblib/format_stack.py | 4 +- mlens/externals/joblib/func_inspect.py | 7 +- mlens/externals/joblib/hashing.py | 34 +- mlens/externals/joblib/my_exceptions.py | 7 + mlens/externals/joblib/numpy_pickle.py | 747 ++++++++++-------- mlens/externals/joblib/parallel.py | 562 ++++++------- mlens/externals/joblib/pool.py | 77 +- mlens/parallel/estimation.py | 4 +- mlens/parallel/evaluation.py | 6 +- 13 files changed, 802 insertions(+), 684 deletions(-) diff --git a/mlens/externals/joblib/__init__.py b/mlens/externals/joblib/__init__.py index 2bdff942..ce1957d1 100644 --- a/mlens/externals/joblib/__init__.py +++ b/mlens/externals/joblib/__init__.py @@ -58,7 +58,7 @@ inputs and outputs: Python functions. Joblib can save their computation to disk and rerun it only if necessary:: - >>> from joblib import Memory + >>> from sklearn.externals.joblib import Memory >>> mem = Memory(cachedir='/tmp/joblib') >>> import numpy as np >>> a = np.vander(np.arange(3)).astype(np.float) @@ -77,7 +77,7 @@ 2) **Embarrassingly parallel helper:** to make it easy to write readable parallel code and debug it quickly:: - >>> from joblib import Parallel, delayed + >>> from sklearn.externals.joblib import Parallel, delayed >>> from math import sqrt >>> Parallel(n_jobs=1)(delayed(sqrt)(i**2) for i in range(10)) [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] @@ -115,7 +115,8 @@ # Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer. # 'X.Y.dev0' is the canonical version of 'X.Y.dev' # -__version__ = '0.9.4' + +__version__ = '0.10.3' from .memory import Memory, MemorizedResult @@ -127,3 +128,11 @@ from .parallel import Parallel from .parallel import delayed from .parallel import cpu_count +from .parallel import register_parallel_backend +from .parallel import parallel_backend +from .parallel import effective_n_jobs + + +__all__ = ['Memory', 'MemorizedResult', 'PrintTime', 'Logger', 'hash', 'dump', + 'load', 'Parallel', 'delayed', 'cpu_count', 'effective_n_jobs', + 'register_parallel_backend', 'parallel_backend'] diff --git a/mlens/externals/joblib/_compat.py b/mlens/externals/joblib/_compat.py index 70a1f43e..6309fa52 100644 --- a/mlens/externals/joblib/_compat.py +++ b/mlens/externals/joblib/_compat.py @@ -4,6 +4,8 @@ import sys PY3_OR_LATER = sys.version_info[0] >= 3 +PY26 = sys.version_info[:2] == (2, 6) +PY27 = sys.version_info[:2] == (2, 7) try: _basestring = basestring @@ -11,3 +13,8 @@ except NameError: _basestring = str _bytes_or_unicode = (bytes, str) + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + return meta("NewBase", bases, {}) diff --git a/mlens/externals/joblib/_multiprocessing_helpers.py b/mlens/externals/joblib/_multiprocessing_helpers.py index e7ec21f7..4111a26f 100644 --- a/mlens/externals/joblib/_multiprocessing_helpers.py +++ b/mlens/externals/joblib/_multiprocessing_helpers.py @@ -14,7 +14,6 @@ if mp: try: import multiprocessing as mp - import multiprocessing.pool except ImportError: mp = None @@ -23,7 +22,7 @@ if mp is not None: try: _sem = mp.Semaphore() - del _sem # cleanup + del _sem # cleanup except (ImportError, OSError) as e: mp = None warnings.warn('%s. joblib will operate in serial mode' % (e,)) diff --git a/mlens/externals/joblib/disk.py b/mlens/externals/joblib/disk.py index 4e825c19..30ad1008 100644 --- a/mlens/externals/joblib/disk.py +++ b/mlens/externals/joblib/disk.py @@ -3,7 +3,7 @@ """ # Authors: Gael Varoquaux -# Lars Buitinck +# Lars Buitinck # Copyright (c) 2010 Gael Varoquaux # License: BSD Style, 3 clauses. @@ -31,18 +31,17 @@ def disk_used(path): return int(size / 1024.) -def memstr_to_kbytes(text): - """ Convert a memory text to it's value in kilobytes. +def memstr_to_bytes(text): + """ Convert a memory text to its value in bytes. """ kilo = 1024 - units = dict(K=1, M=kilo, G=kilo ** 2) + units = dict(K=kilo, M=kilo ** 2, G=kilo ** 3) try: size = int(units[text[-1]] * float(text[:-1])) except (KeyError, ValueError): raise ValueError( - "Invalid literal for size give: %s (type %s) should be " - "alike '10G', '500M', '50K'." % (text, type(text)) - ) + "Invalid literal for size give: %s (type %s) should be " + "alike '10G', '500M', '50K'." % (text, type(text))) return size diff --git a/mlens/externals/joblib/format_stack.py b/mlens/externals/joblib/format_stack.py index ad28a86c..91eabeb0 100644 --- a/mlens/externals/joblib/format_stack.py +++ b/mlens/externals/joblib/format_stack.py @@ -273,8 +273,10 @@ def linereader(file=file, lnum=[lnum], getline=linecache.getline): # enclosing scope. for token in generate_tokens(linereader): tokeneater(*token) - except (IndexError, UnicodeDecodeError): + except (IndexError, UnicodeDecodeError, SyntaxError): # signals exit of tokenizer + # SyntaxError can happen when trying to tokenize + # a compiled (e.g. .so or .pyd) extension pass except tokenize.TokenError as msg: _m = ("An unexpected error occurred while tokenizing input file %s\n" diff --git a/mlens/externals/joblib/func_inspect.py b/mlens/externals/joblib/func_inspect.py index 9fb67f02..ad5a548d 100644 --- a/mlens/externals/joblib/func_inspect.py +++ b/mlens/externals/joblib/func_inspect.py @@ -50,8 +50,7 @@ def get_func_code(func): line_no = 1 if source_file.startswith('', - source_file).groups() + '\', source_file).groups() line_no = int(line_no) source_file = '' % source_file return source_code, source_file, line_no @@ -312,7 +311,7 @@ def filter_args(func, ignore_lst, args=(), kwargs=dict()): "function %s" % (item, _signature_str(name, arg_spec)) - ) + ) # XXX: Return a sorted list of pairs? return arg_dict @@ -352,4 +351,4 @@ def format_call(func, args, kwargs, object_name="Memory"): path, signature) return msg # XXX: Not using logging framework - #self.debug(msg) + # self.debug(msg) diff --git a/mlens/externals/joblib/hashing.py b/mlens/externals/joblib/hashing.py index f9e20b13..ced817be 100644 --- a/mlens/externals/joblib/hashing.py +++ b/mlens/externals/joblib/hashing.py @@ -187,24 +187,28 @@ def save(self, obj): the Pickler class. """ if isinstance(obj, self.np.ndarray) and not obj.dtype.hasobject: - # Compute a hash of the object: - try: - # memoryview is not supported for some dtypes, - # e.g. datetime64, see - # https://github.com/numpy/numpy/issues/4983. The - # workaround is to view the array as bytes before - # taking the memoryview - obj_bytes_view = obj.view(self.np.uint8) - self._hash.update(self._getbuffer(obj_bytes_view)) - # ValueError is raised by .view when the array is not contiguous - # BufferError is raised by Python 3 in the hash update if - # the array is Fortran rather than C contiguous - except (ValueError, BufferError): + # Compute a hash of the object + # The update function of the hash requires a c_contiguous buffer. + if obj.shape == (): + # 0d arrays need to be flattened because viewing them as bytes + # raises a ValueError exception. + obj_c_contiguous = obj.flatten() + elif obj.flags.c_contiguous: + obj_c_contiguous = obj + elif obj.flags.f_contiguous: + obj_c_contiguous = obj.T + else: # Cater for non-single-segment arrays: this creates a # copy, and thus aleviates this issue. # XXX: There might be a more efficient way of doing this - obj_bytes_view = obj.flatten().view(self.np.uint8) - self._hash.update(self._getbuffer(obj_bytes_view)) + obj_c_contiguous = obj.flatten() + + # memoryview is not supported for some dtypes, e.g. datetime64, see + # https://github.com/numpy/numpy/issues/4983. The + # workaround is to view the array as bytes before + # taking the memoryview. + self._hash.update( + self._getbuffer(obj_c_contiguous.view(self.np.uint8))) # We store the class, to be able to distinguish between # Objects with the same binary content, but different diff --git a/mlens/externals/joblib/my_exceptions.py b/mlens/externals/joblib/my_exceptions.py index 9d26cb57..28f31ddd 100644 --- a/mlens/externals/joblib/my_exceptions.py +++ b/mlens/externals/joblib/my_exceptions.py @@ -50,6 +50,13 @@ def __init__(self, message, etype): self.etype = etype +class WorkerInterrupt(Exception): + """ An exception that is not KeyboardInterrupt to allow subprocesses + to be interrupted. + """ + pass + + _exception_mapping = dict() diff --git a/mlens/externals/joblib/numpy_pickle.py b/mlens/externals/joblib/numpy_pickle.py index 79170d80..0cf88a2b 100644 --- a/mlens/externals/joblib/numpy_pickle.py +++ b/mlens/externals/joblib/numpy_pickle.py @@ -1,224 +1,231 @@ -""" -Utilities for fast persistence of big data, with optional compression. -""" +"""Utilities for fast persistence of big data, with optional compression.""" # Author: Gael Varoquaux # Copyright (c) 2009 Gael Varoquaux # License: BSD Style, 3 clauses. import pickle -import traceback import os -import zlib +import sys import warnings -from io import BytesIO - +try: + from pathlib import Path +except ImportError: + Path = None + +from .numpy_pickle_utils import _COMPRESSORS +from .numpy_pickle_utils import BinaryZlibFile +from .numpy_pickle_utils import Unpickler, Pickler +from .numpy_pickle_utils import _read_fileobject, _write_fileobject +from .numpy_pickle_utils import _read_bytes, BUFFER_SIZE +from .numpy_pickle_compat import load_compatibility +from .numpy_pickle_compat import NDArrayWrapper +# For compatibility with old versions of joblib, we need ZNDArrayWrapper +# to be visible in the current namespace. +# Explicitly skipping next line from flake8 as it triggers an F401 warning +# which we don't care. +from .numpy_pickle_compat import ZNDArrayWrapper # noqa from ._compat import _basestring, PY3_OR_LATER +############################################################################### +# Utility objects for persistence. -if PY3_OR_LATER: - Unpickler = pickle._Unpickler - Pickler = pickle._Pickler - - def asbytes(s): - if isinstance(s, bytes): - return s - return s.encode('latin1') -else: - Unpickler = pickle.Unpickler - Pickler = pickle.Pickler - asbytes = str +class NumpyArrayWrapper(object): + """An object to be persisted instead of numpy arrays. -def hex_str(an_int): - """Converts an int to an hexadecimal string + This object is used to hack into the pickle machinery and read numpy + array data from our custom persistence format. + More precisely, this object is used for: + * carrying the information of the persisted array: subclass, shape, order, + dtype. Those ndarray metadata are used to correctly reconstruct the array + with low level numpy functions. + * determining if memmap is allowed on the array. + * reading the array bytes from a file. + * reading the array using memorymap from a file. + * writing the array bytes to a file. + + Attributes + ---------- + subclass: numpy.ndarray subclass + Determine the subclass of the wrapped array. + shape: numpy.ndarray shape + Determine the shape of the wrapped array. + order: {'C', 'F'} + Determine the order of wrapped array data. 'C' is for C order, 'F' is + for fortran order. + dtype: numpy.ndarray dtype + Determine the data type of the wrapped array. + allow_mmap: bool + Determine if memory mapping is allowed on the wrapped array. + Default: False. """ - return '{0:#x}'.format(an_int) - -_MEGA = 2 ** 20 + def __init__(self, subclass, shape, order, dtype, allow_mmap=False): + """Constructor. Store the useful information for later.""" + self.subclass = subclass + self.shape = shape + self.order = order + self.dtype = dtype + self.allow_mmap = allow_mmap -# Compressed pickle header format: _ZFILE_PREFIX followed by _MAX_LEN -# bytes which contains the length of the zlib compressed data as an -# hexadecimal string. For example: 'ZF0x139 ' -_ZFILE_PREFIX = asbytes('ZF') -_MAX_LEN = len(hex_str(2 ** 64)) + def write_array(self, array, pickler): + """Write array bytes to pickler file handle. + This function is an adaptation of the numpy write_array function + available in version 1.10.1 in numpy/lib/format.py. + """ + # Set buffer size to 16 MiB to hide the Python loop overhead. + buffersize = max(16 * 1024 ** 2 // array.itemsize, 1) + if array.dtype.hasobject: + # We contain Python objects so we cannot write out the data + # directly. Instead, we will pickle it out with version 2 of the + # pickle protocol. + pickle.dump(array, pickler.file_handle, protocol=2) + else: + for chunk in pickler.np.nditer(array, + flags=['external_loop', + 'buffered', + 'zerosize_ok'], + buffersize=buffersize, + order=self.order): + pickler.file_handle.write(chunk.tostring('C')) + + def read_array(self, unpickler): + """Read array from unpickler file handle. + + This function is an adaptation of the numpy read_array function + available in version 1.10.1 in numpy/lib/format.py. + """ + if len(self.shape) == 0: + count = 1 + else: + count = unpickler.np.multiply.reduce(self.shape) + # Now read the actual data. + if self.dtype.hasobject: + # The array contained Python objects. We need to unpickle the data. + array = pickle.load(unpickler.file_handle) + else: + if (not PY3_OR_LATER and + unpickler.np.compat.isfileobj(unpickler.file_handle)): + # In python 2, gzip.GzipFile is considered as a file so one + # can use numpy.fromfile(). + # For file objects, use np.fromfile function. + # This function is faster than the memory-intensive + # method below. + array = unpickler.np.fromfile(unpickler.file_handle, + dtype=self.dtype, count=count) + else: + # This is not a real file. We have to read it the + # memory-intensive way. + # crc32 module fails on reads greater than 2 ** 32 bytes, + # breaking large reads from gzip streams. Chunk reads to + # BUFFER_SIZE bytes to avoid issue and reduce memory overhead + # of the read. In non-chunked case count < max_read_count, so + # only one read is performed. + max_read_count = BUFFER_SIZE // min(BUFFER_SIZE, + self.dtype.itemsize) + + array = unpickler.np.empty(count, dtype=self.dtype) + for i in range(0, count, max_read_count): + read_count = min(max_read_count, count - i) + read_size = int(read_count * self.dtype.itemsize) + data = _read_bytes(unpickler.file_handle, + read_size, "array data") + array[i:i + read_count] = \ + unpickler.np.frombuffer(data, dtype=self.dtype, + count=read_count) + del data + + if self.order == 'F': + array.shape = self.shape[::-1] + array = array.transpose() + else: + array.shape = self.shape -############################################################################### -# Compressed file with Zlib + return array -def _read_magic(file_handle): - """ Utility to check the magic signature of a file identifying it as a - Zfile - """ - magic = file_handle.read(len(_ZFILE_PREFIX)) - # Pickling needs file-handles at the beginning of the file - file_handle.seek(0) - return magic + def read_mmap(self, unpickler): + """Read an array using numpy memmap.""" + offset = unpickler.file_handle.tell() + if unpickler.mmap_mode == 'w+': + unpickler.mmap_mode = 'r+' + marray = unpickler.np.memmap(unpickler.filename, + dtype=self.dtype, + shape=self.shape, + order=self.order, + mode=unpickler.mmap_mode, + offset=offset) + # update the offset so that it corresponds to the end of the read array + unpickler.file_handle.seek(offset + marray.nbytes) -def read_zfile(file_handle): - """Read the z-file and return the content as a string + return marray - Z-files are raw data compressed with zlib used internally by joblib - for persistence. Backward compatibility is not guaranteed. Do not - use for external purposes. - """ - file_handle.seek(0) - assert _read_magic(file_handle) == _ZFILE_PREFIX, \ - "File does not have the right magic" - header_length = len(_ZFILE_PREFIX) + _MAX_LEN - length = file_handle.read(header_length) - length = length[len(_ZFILE_PREFIX):] - length = int(length, 16) - - # With python2 and joblib version <= 0.8.4 compressed pickle header is one - # character wider so we need to ignore an additional space if present. - # Note: the first byte of the zlib data is guaranteed not to be a - # space according to - # https://tools.ietf.org/html/rfc6713#section-2.1 - next_byte = file_handle.read(1) - if next_byte != b' ': - # The zlib compressed data has started and we need to go back - # one byte - file_handle.seek(header_length) - - # We use the known length of the data to tell Zlib the size of the - # buffer to allocate. - data = zlib.decompress(file_handle.read(), 15, length) - assert len(data) == length, ( - "Incorrect data length while decompressing %s." - "The file could be corrupted." % file_handle) - return data - - -def write_zfile(file_handle, data, compress=1): - """Write the data in the given file as a Z-file. - - Z-files are raw data compressed with zlib used internally by joblib - for persistence. Backward compatibility is not guarantied. Do not - use for external purposes. - """ - file_handle.write(_ZFILE_PREFIX) - length = hex_str(len(data)) - # Store the length of the data - file_handle.write(asbytes(length.ljust(_MAX_LEN))) - file_handle.write(zlib.compress(asbytes(data), compress)) + def read(self, unpickler): + """Read the array corresponding to this wrapper. + Use the unpickler to get all information to correctly read the array. -############################################################################### -# Utility objects for persistence. + Parameters + ---------- + unpickler: NumpyUnpickler -class NDArrayWrapper(object): - """ An object to be persisted instead of numpy arrays. + Returns + ------- + array: numpy.ndarray - The only thing this object does, is to carry the filename in which - the array has been persisted, and the array subclass. - """ - def __init__(self, filename, subclass, allow_mmap=True): - "Store the useful information for later" - self.filename = filename - self.subclass = subclass - self.allow_mmap = allow_mmap + """ + # When requested, only use memmap mode if allowed. + if unpickler.mmap_mode is not None and self.allow_mmap: + array = self.read_mmap(unpickler) + else: + array = self.read_array(unpickler) - def read(self, unpickler): - "Reconstruct the array" - filename = os.path.join(unpickler._dirname, self.filename) - # Load the array from the disk - np_ver = [int(x) for x in unpickler.np.__version__.split('.', 2)[:2]] - - # use getattr instead of self.allow_mmap to ensure backward compat - # with NDArrayWrapper instances pickled with joblib < 0.9.0 - allow_mmap = getattr(self, 'allow_mmap', True) - memmap_kwargs = ({} if not allow_mmap - else {'mmap_mode': unpickler.mmap_mode}) - array = unpickler.np.load(filename, **memmap_kwargs) - # Reconstruct subclasses. This does not work with old - # versions of numpy - if (hasattr(array, '__array_prepare__') - and not self.subclass in (unpickler.np.ndarray, - unpickler.np.memmap)): + # Manage array subclass case + if (hasattr(array, '__array_prepare__') and + self.subclass not in (unpickler.np.ndarray, + unpickler.np.memmap)): # We need to reconstruct another subclass new_array = unpickler.np.core.multiarray._reconstruct( - self.subclass, (0,), 'b') - new_array.__array_prepare__(array) - array = new_array - return array - - #def __reduce__(self): - # return None - - -class ZNDArrayWrapper(NDArrayWrapper): - """An object to be persisted instead of numpy arrays. - - This object store the Zfile filename in which - the data array has been persisted, and the meta information to - retrieve it. - - The reason that we store the raw buffer data of the array and - the meta information, rather than array representation routine - (tostring) is that it enables us to use completely the strided - model to avoid memory copies (a and a.T store as fast). In - addition saving the heavy information separately can avoid - creating large temporary buffers when unpickling data with - large arrays. - """ - def __init__(self, filename, init_args, state): - "Store the useful information for later" - self.filename = filename - self.state = state - self.init_args = init_args - - def read(self, unpickler): - "Reconstruct the array from the meta-information and the z-file" - # Here we a simply reproducing the unpickling mechanism for numpy - # arrays - filename = os.path.join(unpickler._dirname, self.filename) - array = unpickler.np.core.multiarray._reconstruct(*self.init_args) - with open(filename, 'rb') as f: - data = read_zfile(f) - state = self.state + (data,) - array.__setstate__(state) - return array - + self.subclass, (0,), 'b') + return new_array.__array_prepare__(array) + else: + return array ############################################################################### # Pickler classes -class NumpyPickler(Pickler): - """A pickler to persist of big data efficiently. - - The main features of this object are: - * persistence of numpy arrays in separate .npy files, for which - I/O is fast. - - * optional compression using Zlib, with a special care on avoid - temporaries. +class NumpyPickler(Pickler): + """A pickler to persist big data efficiently. + + The main features of this object are: + * persistence of numpy arrays in a single file. + * optional compression with a special care on avoiding memory copies. + + Attributes + ---------- + fp: file + File object handle used for serializing the input object. + protocol: int + Pickle protocol used. Default is pickle.DEFAULT_PROTOCOL under + python 3, pickle.HIGHEST_PROTOCOL otherwise. """ + dispatch = Pickler.dispatch.copy() - def __init__(self, filename, compress=0, cache_size=10, protocol=None): - self._filename = filename - self._filenames = [filename, ] - self.cache_size = cache_size - self.compress = compress - if not self.compress: - self.file = open(filename, 'wb') - else: - self.file = BytesIO() - # Count the number of npy files that we have created: - self._npy_counter = 1 + def __init__(self, fp, protocol=None): + self.file_handle = fp + self.buffered = isinstance(self.file_handle, BinaryZlibFile) + # By default we want a pickle protocol that only changes with # the major python version and not the minor one if protocol is None: protocol = (pickle.DEFAULT_PROTOCOL if PY3_OR_LATER else pickle.HIGHEST_PROTOCOL) - Pickler.__init__(self, self.file, - protocol=protocol) + Pickler.__init__(self, self.file_handle, protocol=protocol) # delayed import of numpy, to avoid tight coupling try: import numpy as np @@ -226,75 +233,82 @@ def __init__(self, filename, compress=0, cache_size=10, protocol=None): np = None self.np = np - def _write_array(self, array, filename): - if not self.compress: - self.np.save(filename, array) - allow_mmap = not array.dtype.hasobject - container = NDArrayWrapper(os.path.basename(filename), - type(array), - allow_mmap=allow_mmap) - else: - filename += '.z' - # Efficient compressed storage: - # The meta data is stored in the container, and the core - # numerics in a z-file - _, init_args, state = array.__reduce__() - # the last entry of 'state' is the data itself - with open(filename, 'wb') as zfile: - write_zfile(zfile, state[-1], compress=self.compress) - state = state[:-1] - container = ZNDArrayWrapper(os.path.basename(filename), - init_args, state) - return container, filename + def _create_array_wrapper(self, array): + """Create and returns a numpy array wrapper from a numpy array.""" + order = 'F' if (array.flags.f_contiguous and + not array.flags.c_contiguous) else 'C' + allow_mmap = not self.buffered and not array.dtype.hasobject + wrapper = NumpyArrayWrapper(type(array), + array.shape, order, array.dtype, + allow_mmap=allow_mmap) + + return wrapper def save(self, obj): - """ Subclass the save method, to save ndarray subclasses in npy - files, rather than pickling them. Of course, this is a - total abuse of the Pickler class. + """Subclass the Pickler `save` method. + + This is a total abuse of the Pickler class in order to use the numpy + persistence function `save` instead of the default pickle + implementation. The numpy array is replaced by a custom wrapper in the + pickle persistence stack and the serialized array is written right + after in the file. Warning: the file produced does not follow the + pickle format. As such it can not be read with `pickle.load`. """ - if (self.np is not None and type(obj) in - (self.np.ndarray, self.np.matrix, self.np.memmap)): - size = obj.size * obj.itemsize - if self.compress and size < self.cache_size * _MEGA: - # When compressing, as we are not writing directly to the - # disk, it is more efficient to use standard pickling - if type(obj) is self.np.memmap: - # Pickling doesn't work with memmaped arrays - obj = self.np.asarray(obj) - return Pickler.save(self, obj) - - if not obj.dtype.hasobject: - try: - filename = '%s_%02i.npy' % (self._filename, - self._npy_counter) - # This converts the array in a container - obj, filename = self._write_array(obj, filename) - self._filenames.append(filename) - self._npy_counter += 1 - except Exception: - # XXX: We should have a logging mechanism - print('Failed to save %s to .npy file:\n%s' % ( - type(obj), - traceback.format_exc())) + if self.np is not None and type(obj) in (self.np.ndarray, + self.np.matrix, + self.np.memmap): + if type(obj) is self.np.memmap: + # Pickling doesn't work with memmapped arrays + obj = self.np.asanyarray(obj) + + # The array wrapper is pickled instead of the real array. + wrapper = self._create_array_wrapper(obj) + Pickler.save(self, wrapper) + + # A framer was introduced with pickle protocol 4 and we want to + # ensure the wrapper object is written before the numpy array + # buffer in the pickle file. + # See https://www.python.org/dev/peps/pep-3154/#framing to get + # more information on the framer behavior. + if self.proto >= 4: + self.framer.commit_frame(force=True) + + # And then array bytes are written right after the wrapper. + wrapper.write_array(obj, self) + return return Pickler.save(self, obj) - def close(self): - if self.compress: - with open(self._filename, 'wb') as zfile: - write_zfile(zfile, self.file.getvalue(), self.compress) - class NumpyUnpickler(Unpickler): """A subclass of the Unpickler to unpickle our numpy pickles. + + Attributes + ---------- + mmap_mode: str + The memorymap mode to use for reading numpy arrays. + file_handle: file_like + File object to unpickle from. + filename: str + Name of the file to unpickle from. It should correspond to file_handle. + This parameter is required when using mmap_mode. + np: module + Reference to numpy module if numpy is installed else None. + """ + dispatch = Unpickler.dispatch.copy() def __init__(self, filename, file_handle, mmap_mode=None): - self._filename = os.path.basename(filename) + # The next line is for backward compatibility with pickle generated + # with joblib versions less than 0.10. self._dirname = os.path.dirname(filename) + self.mmap_mode = mmap_mode - self.file_handle = self._open_pickle(file_handle) + self.file_handle = file_handle + # filename is required for numpy mmap mode. + self.filename = filename + self.compat_mode = False Unpickler.__init__(self, self.file_handle) try: import numpy as np @@ -302,25 +316,28 @@ def __init__(self, filename, file_handle, mmap_mode=None): np = None self.np = np - def _open_pickle(self, file_handle): - return file_handle - def load_build(self): - """ This method is called to set the state of a newly created - object. + """Called to set the state of a newly created object. - We capture it to replace our place-holder objects, - NDArrayWrapper, by the array we are interested in. We - replace them directly in the stack of pickler. + We capture it to replace our place-holder objects, NDArrayWrapper or + NumpyArrayWrapper, by the array we are interested in. We + replace them directly in the stack of pickler. + NDArrayWrapper is used for backward compatibility with joblib <= 0.9. """ Unpickler.load_build(self) - if isinstance(self.stack[-1], NDArrayWrapper): + + # For backward compatibility, we support NDArrayWrapper objects. + if isinstance(self.stack[-1], (NDArrayWrapper, NumpyArrayWrapper)): if self.np is None: - raise ImportError('Trying to unpickle an ndarray, ' - "but numpy didn't import correctly") - nd_array_wrapper = self.stack.pop() - array = nd_array_wrapper.read(self) - self.stack.append(array) + raise ImportError("Trying to unpickle an ndarray, " + "but numpy didn't import correctly") + array_wrapper = self.stack.pop() + # If any NDArrayWrapper is found, we switch to compatibility mode, + # this will be used to raise a DeprecationWarning to the user at + # the end of the unpickling. + if isinstance(array_wrapper, NDArrayWrapper): + self.compat_mode = True + self.stack.append(array_wrapper.read(self)) # Be careful to register our new method. if PY3_OR_LATER: @@ -329,44 +346,34 @@ def load_build(self): dispatch[pickle.BUILD] = load_build -class ZipNumpyUnpickler(NumpyUnpickler): - """A subclass of our Unpickler to unpickle on the fly from - compressed storage.""" - - def __init__(self, filename, file_handle): - NumpyUnpickler.__init__(self, filename, - file_handle, - mmap_mode=None) - - def _open_pickle(self, file_handle): - return BytesIO(read_zfile(file_handle)) - - ############################################################################### # Utility functions -def dump(value, filename, compress=0, cache_size=100, protocol=None): - """Fast persistence of an arbitrary Python object into one or multiple - files, with dedicated storage for numpy arrays. +def dump(value, filename, compress=0, protocol=None, cache_size=None): + """Persist an arbitrary Python object into one file. Parameters ----------- value: any Python object - The object to store to disk - filename: string - The name of the file in which it is to be stored - compress: integer for 0 to 9, optional - Optional compression level for the data. 0 is no compression. - Higher means more compression, but also slower read and + The object to store to disk. + filename: str or pathlib.Path + The path of the file in which it is to be stored. The compression + method corresponding to one of the supported filename extensions ('.z', + '.gz', '.bz2', '.xz' or '.lzma') will be used automatically. + compress: int from 0 to 9 or bool or 2-tuple, optional + Optional compression level for the data. 0 or False is no compression. + Higher value means more compression, but also slower read and write times. Using a value of 3 is often a good compromise. See the notes for more details. - cache_size: positive number, optional - Fixes the order of magnitude (in megabytes) of the cache used - for in-memory compression. Note that this is just an order of - magnitude estimate and that for big arrays, the code will go - over this value at dump and at load time. + If compress is True, the compression level used is 3. + If compress is a 2-tuple, the first element must correspond to a string + between supported compressors (e.g 'zlib', 'gzip', 'bz2', 'lzma' + 'xz'), the second element must be an integer from 0 to 9, corresponding + to the compression level. protocol: positive int Pickle protocol, see pickle.dump documentation for more details. + cache_size: positive int, optional + This option is deprecated in 0.10 and has no effect. Returns ------- @@ -384,29 +391,139 @@ def dump(value, filename, compress=0, cache_size=100, protocol=None): using compression can significantly slow down loading. In addition, compressed files take extra extra memory during dump and load. + """ + + if Path is not None and isinstance(filename, Path): + filename = str(filename) + + is_filename = isinstance(filename, _basestring) + is_fileobj = hasattr(filename, "write") + + compress_method = 'zlib' # zlib is the default compression method. if compress is True: - # By default, if compress is enabled, we want to be using 3 by - # default - compress = 3 - if not isinstance(filename, _basestring): + # By default, if compress is enabled, we want to be using 3 by default + compress_level = 3 + elif isinstance(compress, tuple): + # a 2-tuple was set in compress + if len(compress) != 2: + raise ValueError( + 'Compress argument tuple should contain exactly 2 elements: ' + '(compress method, compress level), you passed {0}' + .format(compress)) + compress_method, compress_level = compress + else: + compress_level = compress + + if compress_level is not False and compress_level not in range(10): + # Raising an error if a non valid compress level is given. + raise ValueError( + 'Non valid compress level given: "{0}". Possible values are ' + '{1}.'.format(compress_level, list(range(10)))) + + if compress_method not in _COMPRESSORS: + # Raising an error if an unsupported compression method is given. + raise ValueError( + 'Non valid compression method given: "{0}". Possible values are ' + '{1}.'.format(compress_method, _COMPRESSORS)) + + if not is_filename and not is_fileobj: # People keep inverting arguments, and the resulting error is # incomprehensible raise ValueError( - 'Second argument should be a filename, %s (type %s) was given' - % (filename, type(filename)) - ) - + 'Second argument should be a filename or a file-like object, ' + '%s (type %s) was given.' + % (filename, type(filename)) + ) + + if is_filename and not isinstance(compress, tuple): + # In case no explicit compression was requested using both compression + # method and level in a tuple and the filename has an explicit + # extension, we select the corresponding compressor. + if filename.endswith('.z'): + compress_method = 'zlib' + elif filename.endswith('.gz'): + compress_method = 'gzip' + elif filename.endswith('.bz2'): + compress_method = 'bz2' + elif filename.endswith('.lzma'): + compress_method = 'lzma' + elif filename.endswith('.xz'): + compress_method = 'xz' + else: + # no matching compression method found, we unset the variable to + # be sure no compression level is set afterwards. + compress_method = None + + if compress_method in _COMPRESSORS and compress_level == 0: + # we choose a default compress_level of 3 in case it was not given + # as an argument (using compress). + compress_level = 3 + + if not PY3_OR_LATER and compress_method in ('lzma', 'xz'): + raise NotImplementedError("{0} compression is only available for " + "python version >= 3.3. You are using " + "{1}.{2}".format(compress_method, + sys.version_info[0], + sys.version_info[1])) + + if cache_size is not None: + # Cache size is deprecated starting from version 0.10 + warnings.warn("Please do not set 'cache_size' in joblib.dump, " + "this parameter has no effect and will be removed. " + "You used 'cache_size={0}'".format(cache_size), + DeprecationWarning, stacklevel=2) + + if compress_level != 0: + with _write_fileobject(filename, compress=(compress_method, + compress_level)) as f: + NumpyPickler(f, protocol=protocol).dump(value) + elif is_filename: + with open(filename, 'wb') as f: + NumpyPickler(f, protocol=protocol).dump(value) + else: + NumpyPickler(filename, protocol=protocol).dump(value) + + # If the target container is a file object, nothing is returned. + if is_fileobj: + return + + # For compatibility, the list of created filenames (e.g with one element + # after 0.10.0) is returned by default. + return [filename] + + +def _unpickle(fobj, filename="", mmap_mode=None): + """Internal unpickling function.""" + # We are careful to open the file handle early and keep it open to + # avoid race-conditions on renames. + # That said, if data is stored in companion files, which can be + # the case with the old persistence format, moving the directory + # will create a race when joblib tries to access the companion + # files. + unpickler = NumpyUnpickler(filename, fobj, mmap_mode=mmap_mode) + obj = None try: - pickler = NumpyPickler(filename, compress=compress, - cache_size=cache_size, protocol=protocol) - pickler.dump(value) - pickler.close() - finally: - if 'pickler' in locals() and hasattr(pickler, 'file'): - pickler.file.flush() - pickler.file.close() - return pickler._filenames + obj = unpickler.load() + if unpickler.compat_mode: + warnings.warn("The file '%s' has been generated with a " + "joblib version less than 0.10. " + "Please regenerate this pickle file." + % filename, + DeprecationWarning, stacklevel=3) + except UnicodeDecodeError as exc: + # More user-friendly error message + if PY3_OR_LATER: + new_exc = ValueError( + 'You may be trying to read with ' + 'python 3 a joblib pickle generated with python 2. ' + 'This feature is not supported by joblib.') + new_exc.__cause__ = exc + raise new_exc + # Reraise exception with Python 2 + raise + + return obj def load(filename, mmap_mode=None): @@ -414,8 +531,8 @@ def load(filename, mmap_mode=None): Parameters ----------- - filename: string - The name of the file from which to load the object + filename: str or pathlib.Path + The path of the file from which to load the object mmap_mode: {None, 'r+', 'r', 'w+', 'c'}, optional If not None, the arrays are memory-mapped from the disk. This mode has no effect for compressed files. Note that in this @@ -440,33 +557,21 @@ def load(filename, mmap_mode=None): object might not match the original pickled object. Note that if the file was saved with compression, the arrays cannot be memmaped. """ - with open(filename, 'rb') as file_handle: - # We are careful to open the file handle early and keep it open to - # avoid race-conditions on renames. That said, if data are stored in - # companion files, moving the directory will create a race when - # joblib tries to access the companion files. - if _read_magic(file_handle) == _ZFILE_PREFIX: - if mmap_mode is not None: - warnings.warn('file "%(filename)s" appears to be a zip, ' - 'ignoring mmap_mode "%(mmap_mode)s" flag passed' - % locals(), Warning, stacklevel=2) - unpickler = ZipNumpyUnpickler(filename, file_handle=file_handle) - else: - unpickler = NumpyUnpickler(filename, file_handle=file_handle, - mmap_mode=mmap_mode) + if Path is not None and isinstance(filename, Path): + filename = str(filename) - try: - obj = unpickler.load() - except UnicodeDecodeError as exc: - # More user-friendly error message - if PY3_OR_LATER: - new_exc = ValueError( - 'You may be trying to read with ' - 'python 3 a joblib pickle generated with python 2. ' - 'This feature is not supported by joblib.') - new_exc.__cause__ = exc - raise new_exc - finally: - if hasattr(unpickler, 'file_handle'): - unpickler.file_handle.close() - return obj + if hasattr(filename, "read") and hasattr(filename, "seek"): + with _read_fileobject(filename, "", mmap_mode) as fobj: + obj = _unpickle(fobj) + else: + with open(filename, 'rb') as f: + with _read_fileobject(f, filename, mmap_mode) as fobj: + if isinstance(fobj, _basestring): + # if the returned file object is a string, this means we + # try to load a pickle file generated with an version of + # Joblib so we load it with joblib compatibility function. + return load_compatibility(fobj) + + obj = _unpickle(fobj, filename, mmap_mode) + + return obj diff --git a/mlens/externals/joblib/parallel.py b/mlens/externals/joblib/parallel.py index 110fc9b3..74bd18c4 100644 --- a/mlens/externals/joblib/parallel.py +++ b/mlens/externals/joblib/parallel.py @@ -9,51 +9,110 @@ import os import sys -import gc -import warnings from math import sqrt import functools import time import threading import itertools from numbers import Integral +from contextlib import contextmanager try: import cPickle as pickle except: import pickle from ._multiprocessing_helpers import mp -if mp is not None: - from .pool import MemmapingPool - from multiprocessing.pool import ThreadPool -from .format_stack import format_exc, format_outer_frames +from .format_stack import format_outer_frames from .logger import Logger, short_format_time from .my_exceptions import TransportableException, _mk_exception -from .disk import memstr_to_kbytes +from .disk import memstr_to_bytes +from ._parallel_backends import (FallbackToBackend, MultiprocessingBackend, + ThreadingBackend, SequentialBackend) from ._compat import _basestring +from .func_inspect import getfullargspec +# Make sure that those two classes are part of the public joblib.parallel API +# so that 3rd party backend implementers can import them from here. +from ._parallel_backends import AutoBatchingMixin # noqa +from ._parallel_backends import ParallelBackendBase # noqa -VALID_BACKENDS = ['multiprocessing', 'threading'] +BACKENDS = { + 'multiprocessing': MultiprocessingBackend, + 'threading': ThreadingBackend, + 'sequential': SequentialBackend, +} -# Environment variables to protect against bad situations when nesting -JOBLIB_SPAWNED_PROCESS = "__JOBLIB_SPAWNED_PARALLEL__" +# name of the backend used by default by Parallel outside of any context +# managed by ``parallel_backend``. +DEFAULT_BACKEND = 'multiprocessing' +DEFAULT_N_JOBS = 1 -# In seconds, should be big enough to hide multiprocessing dispatching -# overhead. -# This settings was found by running benchmarks/bench_auto_batching.py -# with various parameters on various platforms. -MIN_IDEAL_BATCH_DURATION = .2 +# Thread local value that can be overriden by the ``parallel_backend`` context +# manager +_backend = threading.local() + + +def get_active_backend(): + """Return the active default backend""" + active_backend_and_jobs = getattr(_backend, 'backend_and_jobs', None) + if active_backend_and_jobs is not None: + return active_backend_and_jobs + # We are outside of the scope of any parallel_backend context manager, + # create the default backend instance now + active_backend = BACKENDS[DEFAULT_BACKEND]() + return active_backend, DEFAULT_N_JOBS + + +@contextmanager +def parallel_backend(backend, n_jobs=-1, **backend_params): + """Change the default backend used by Parallel inside a with block. + + If ``backend`` is a string it must match a previously registered + implementation using the ``register_parallel_backend`` function. + + Alternatively backend can be passed directly as an instance. + + By default all available workers will be used (``n_jobs=-1``) unless the + caller passes an explicit value for the ``n_jobs`` parameter. + + This is an alternative to passing a ``backend='backend_name'`` argument to + the ``Parallel`` class constructor. It is particularly useful when calling + into library code that uses joblib internally but does not expose the + backend argument in its own API. + + >>> from operator import neg + >>> with parallel_backend('threading'): + ... print(Parallel()(delayed(neg)(i + 1) for i in range(5))) + ... + [-1, -2, -3, -4, -5] + + Warning: this function is experimental and subject to change in a future + version of joblib. + + .. versionadded:: 0.10 + + """ + if isinstance(backend, _basestring): + backend = BACKENDS[backend](**backend_params) + old_backend_and_jobs = getattr(_backend, 'backend_and_jobs', None) + try: + _backend.backend_and_jobs = (backend, n_jobs) + # return the backend instance to make it easier to write tests + yield backend, n_jobs + finally: + if old_backend_and_jobs is None: + if getattr(_backend, 'backend_and_jobs', None) is not None: + del _backend.backend_and_jobs + else: + _backend.backend_and_jobs = old_backend_and_jobs -# Should not be too high to avoid stragglers: long jobs running alone -# on a single worker while other workers have no work to process any more. -MAX_IDEAL_BATCH_DURATION = 2 # Under Linux or OS X the default start method of multiprocessing # can cause third party libraries to crash. Under Python 3.4+ it is possible # to set an environment variable to switch the default start method from # 'fork' to 'forkserver' or 'spawn' to avoid this issue albeit at the cost -# of causing semantic changes and some additional pool instanciation overhead. +# of causing semantic changes and some additional pool instantiation overhead. if hasattr(mp, 'get_context'): method = os.environ.get('JOBLIB_START_METHOD', '').strip() or None DEFAULT_MP_CONTEXT = mp.get_context(method=method) @@ -79,8 +138,7 @@ def __len__(self): # CPU count that works also when multiprocessing has been disabled via # the JOBLIB_MULTIPROCESSING environment variable def cpu_count(): - """ Return the number of CPUs. - """ + """Return the number of CPUs.""" if mp is None: return 1 return mp.cpu_count() @@ -107,39 +165,6 @@ def _verbosity_filter(index, verbose): return (int(next_scale) == int(scale)) -############################################################################### -class WorkerInterrupt(Exception): - """ An exception that is not KeyboardInterrupt to allow subprocesses - to be interrupted. - """ - pass - - -############################################################################### -class SafeFunction(object): - """ Wraps a function to make it exception with full traceback in - their representation. - Useful for parallel computing with multiprocessing, for which - exceptions cannot be captured. - """ - def __init__(self, func): - self.func = func - - def __call__(self, *args, **kwargs): - try: - return self.func(*args, **kwargs) - except KeyboardInterrupt: - # We capture the KeyboardInterrupt and reraise it as - # something different, as multiprocessing does not - # interrupt processing for a KeyboardInterrupt - raise WorkerInterrupt() - except: - e_type, e_value, e_tb = sys.exc_info() - text = format_exc(e_type, e_value, e_tb, context=10, - tb_offset=1) - raise TransportableException(text, e_type) - - ############################################################################### def delayed(function, check_pickle=True): """Decorator used to capture the arguments of a function. @@ -166,23 +191,6 @@ def delayed_function(*args, **kwargs): return delayed_function -############################################################################### -class ImmediateComputeBatch(object): - """Sequential computation of a batch of tasks. - - This replicates the async computation API but actually does not delay - the computations when joblib.Parallel runs in sequential mode. - - """ - def __init__(self, batch): - # Don't delay the application, to avoid keeping the input - # arguments in memory - self.results = batch() - - def get(self): - return self.results - - ############################################################################### class BatchCompletionCallBack(object): """Callback used by joblib.Parallel's multiprocessing backend. @@ -204,26 +212,62 @@ def __call__(self, out): self.parallel.n_completed_tasks += self.batch_size this_batch_duration = time.time() - self.dispatch_timestamp - if (self.parallel.batch_size == 'auto' - and self.batch_size == self.parallel._effective_batch_size): - # Update the smoothed streaming estimate of the duration of a batch - # from dispatch to completion - old_duration = self.parallel._smoothed_batch_duration - if old_duration == 0: - # First record of duration for this batch size after the last - # reset. - new_duration = this_batch_duration - else: - # Update the exponentially weighted average of the duration of - # batch for the current effective size. - new_duration = 0.8 * old_duration + 0.2 * this_batch_duration - self.parallel._smoothed_batch_duration = new_duration - + self.parallel._backend.batch_completed(self.batch_size, + this_batch_duration) self.parallel.print_progress() if self.parallel._original_iterator is not None: self.parallel.dispatch_next() +############################################################################### +def register_parallel_backend(name, factory, make_default=False): + """Register a new Parallel backend factory. + + The new backend can then be selected by passing its name as the backend + argument to the Parallel class. Moreover, the default backend can be + overwritten globally by setting make_default=True. + + The factory can be any callable that takes no argument and return an + instance of ``ParallelBackendBase``. + + Warning: this function is experimental and subject to change in a future + version of joblib. + + .. versionadded:: 0.10 + + """ + BACKENDS[name] = factory + if make_default: + global DEFAULT_BACKEND + DEFAULT_BACKEND = name + + +def effective_n_jobs(n_jobs=-1): + """Determine the number of jobs that can actually run in parallel + + n_jobs is the is the number of workers requested by the callers. + Passing n_jobs=-1 means requesting all available workers for instance + matching the number of CPU cores on the worker host(s). + + This method should return a guesstimate of the number of workers that can + actually perform work concurrently with the currently enabled default + backend. The primary use case is to make it possible for the caller to know + in how many chunks to slice the work. + + In general working on larger data chunks is more efficient (less + scheduling overhead and better use of CPU cache prefetching heuristics) + as long as all the workers have enough work to do. + + Warning: this function is experimental and subject to change in a future + version of joblib. + + .. versionadded:: 0.10 + + """ + backend, _ = get_active_backend() + return backend.effective_n_jobs(n_jobs=n_jobs) + + ############################################################################### class Parallel(Logger): ''' Helper class for readable parallel mapping. @@ -243,7 +287,7 @@ class Parallel(Logger): Supported backends are: - "multiprocessing" used by default, can induce some communication and memory overhead when exchanging input and - output data with the with the worker Python processes. + output data with the worker Python processes. - "threading" is a very low-overhead backend but it suffers from the Python Global Interpreter Lock if the called function relies a lot on Python objects. "threading" is mostly useful @@ -251,15 +295,21 @@ class Parallel(Logger): explicitly releases the GIL (for instance a Cython loop wrapped in a "with nogil" block or an expensive call to a library such as NumPy). + - finally, you can register backends by calling + register_parallel_backend. This will allow you to implement + a backend of your liking. verbose: int, optional The verbosity level: if non zero, progress messages are printed. Above 50, the output is sent to stdout. The frequency of the messages increases with the verbosity level. If it more than 10, all iterations are reported. + timeout: float, optional + Timeout limit for each task to complete. If any task takes longer + a TimeOutError will be raised. Only applied when n_jobs != 1 pre_dispatch: {'all', integer, or expression, as in '3*n_jobs'} The number of batches (of tasks) to be pre-dispatched. Default is '2*n_jobs'. When batch_size="auto" this is reasonable - default and the multiprocessing workers shoud never starve. + default and the multiprocessing workers should never starve. batch_size: int or 'auto', default: 'auto' The number of atomic tasks to dispatch at once to each worker. When individual evaluations are very fast, multiprocessing @@ -290,6 +340,9 @@ class Parallel(Logger): in Bytes, or a human-readable string, e.g., '1M' for 1 megabyte. Use None to disable memmaping of large arrays. Only active when backend="multiprocessing". + mmap_mode: {None, 'r+', 'r', 'w+', 'c'} + Memmapping mode for numpy arrays passed to workers. + See 'max_nbytes' parameter documentation for more details. Notes ----- @@ -325,7 +378,7 @@ class Parallel(Logger): A simple example: >>> from math import sqrt - >>> from joblib import Parallel, delayed + >>> from sklearn.externals.joblib import Parallel, delayed >>> Parallel(n_jobs=1)(delayed(sqrt)(i**2) for i in range(10)) [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] @@ -333,7 +386,7 @@ class Parallel(Logger): values: >>> from math import modf - >>> from joblib import Parallel, delayed + >>> from sklearn.externals.joblib import Parallel, delayed >>> r = Parallel(n_jobs=1)(delayed(modf)(i/2.) for i in range(10)) >>> res, i = zip(*r) >>> res @@ -345,7 +398,7 @@ class Parallel(Logger): messages:: >>> from time import sleep - >>> from joblib import Parallel, delayed + >>> from sklearn.externals.joblib import Parallel, delayed >>> r = Parallel(n_jobs=2, verbose=5)(delayed(sleep)(.1) for _ in range(10)) #doctest: +SKIP [Parallel(n_jobs=2)]: Done 1 out of 10 | elapsed: 0.1s remaining: 0.9s [Parallel(n_jobs=2)]: Done 3 out of 10 | elapsed: 0.2s remaining: 0.5s @@ -359,7 +412,7 @@ class Parallel(Logger): child process:: >>> from heapq import nlargest - >>> from joblib import Parallel, delayed + >>> from sklearn.externals.joblib import Parallel, delayed >>> Parallel(n_jobs=2)(delayed(nlargest)(2, n) for n in (range(4), 'abcde', 3)) #doctest: +SKIP #... --------------------------------------------------------------------------- @@ -391,7 +444,7 @@ class Parallel(Logger): number of iterations cannot be reported in the progress messages:: >>> from math import sqrt - >>> from joblib import Parallel, delayed + >>> from sklearn.externals.joblib import Parallel, delayed >>> def producer(): ... for i in range(6): @@ -403,153 +456,101 @@ class Parallel(Logger): Produced 0 Produced 1 Produced 2 - [Parallel(n_jobs=2)]: Done 1 jobs | elapsed: 0.0s + [Parallel(n_jobs=2)]: Done 1 jobs | elapsed: 0.0s Produced 3 - [Parallel(n_jobs=2)]: Done 2 jobs | elapsed: 0.0s + [Parallel(n_jobs=2)]: Done 2 jobs | elapsed: 0.0s Produced 4 - [Parallel(n_jobs=2)]: Done 3 jobs | elapsed: 0.0s + [Parallel(n_jobs=2)]: Done 3 jobs | elapsed: 0.0s Produced 5 - [Parallel(n_jobs=2)]: Done 4 jobs | elapsed: 0.0s - [Parallel(n_jobs=2)]: Done 5 out of 6 | elapsed: 0.0s remaining: 0.0s - [Parallel(n_jobs=2)]: Done 6 out of 6 | elapsed: 0.0s finished + [Parallel(n_jobs=2)]: Done 4 jobs | elapsed: 0.0s + [Parallel(n_jobs=2)]: Done 5 out of 6 | elapsed: 0.0s remaining: 0.0s + [Parallel(n_jobs=2)]: Done 6 out of 6 | elapsed: 0.0s finished ''' - def __init__(self, n_jobs=1, backend='multiprocessing', verbose=0, + def __init__(self, n_jobs=1, backend=None, verbose=0, timeout=None, pre_dispatch='2 * n_jobs', batch_size='auto', temp_folder=None, max_nbytes='1M', mmap_mode='r'): + active_backend, default_n_jobs = get_active_backend() + if backend is None and n_jobs == 1: + # If we are under a parallel_backend context manager, look up + # the default number of jobs and use that instead: + n_jobs = default_n_jobs + self.n_jobs = n_jobs self.verbose = verbose - self._mp_context = DEFAULT_MP_CONTEXT + self.timeout = timeout + self.pre_dispatch = pre_dispatch + + if isinstance(max_nbytes, _basestring): + max_nbytes = memstr_to_bytes(max_nbytes) + + self._backend_args = dict( + max_nbytes=max_nbytes, + mmap_mode=mmap_mode, + temp_folder=temp_folder, + verbose=max(0, self.verbose - 50), + ) + if DEFAULT_MP_CONTEXT is not None: + self._backend_args['context'] = DEFAULT_MP_CONTEXT + if backend is None: - # `backend=None` was supported in 0.8.2 with this effect - backend = "multiprocessing" + backend = active_backend elif hasattr(backend, 'Pool') and hasattr(backend, 'Lock'): # Make it possible to pass a custom multiprocessing context as # backend to change the start method to forkserver or spawn or # preload modules on the forkserver helper process. - self._mp_context = backend - backend = "multiprocessing" - if backend not in VALID_BACKENDS: - raise ValueError("Invalid backend: %s, expected one of %r" - % (backend, VALID_BACKENDS)) - self.backend = backend - self.n_jobs = n_jobs - if (batch_size == 'auto' - or isinstance(batch_size, Integral) and batch_size > 0): + self._backend_args['context'] = backend + backend = MultiprocessingBackend() + else: + try: + backend_factory = BACKENDS[backend] + except KeyError: + raise ValueError("Invalid backend: %s, expected one of %r" + % (backend, sorted(BACKENDS.keys()))) + backend = backend_factory() + + if (batch_size == 'auto' or isinstance(batch_size, Integral) and + batch_size > 0): self.batch_size = batch_size else: raise ValueError( "batch_size must be 'auto' or a positive integer, got: %r" % batch_size) - self.pre_dispatch = pre_dispatch - self._temp_folder = temp_folder - if isinstance(max_nbytes, _basestring): - self._max_nbytes = 1024 * memstr_to_kbytes(max_nbytes) - else: - self._max_nbytes = max_nbytes - self._mmap_mode = mmap_mode - # Not starting the pool in the __init__ is a design decision, to be - # able to close it ASAP, and not burden the user with closing it - # unless they choose to use the context manager API with a with block. - self._pool = None + self._backend = backend self._output = None self._jobs = list() - self._managed_pool = False + self._managed_backend = False # This lock is used coordinate the main thread of this process with # the async callback thread of our the pool. self._lock = threading.Lock() def __enter__(self): - self._managed_pool = True - self._initialize_pool() + self._managed_backend = True + self._initialize_backend() return self def __exit__(self, exc_type, exc_value, traceback): - self._terminate_pool() - self._managed_pool = False + self._terminate_backend() + self._managed_backend = False - def _effective_n_jobs(self): - n_jobs = self.n_jobs - if n_jobs == 0: - raise ValueError('n_jobs == 0 in Parallel has no meaning') - elif mp is None or n_jobs is None: - # multiprocessing is not available or disabled, fallback - # to sequential mode - return 1 - elif n_jobs < 0: - n_jobs = max(mp.cpu_count() + 1 + n_jobs, 1) - return n_jobs - - def _initialize_pool(self): + def _initialize_backend(self): """Build a process or thread pool and return the number of workers""" - n_jobs = self._effective_n_jobs() - # The list of exceptions that we will capture - self.exceptions = [TransportableException] - - if n_jobs == 1: - # Sequential mode: do not use a pool instance to avoid any - # useless dispatching overhead - self._pool = None - elif self.backend == 'threading': - self._pool = ThreadPool(n_jobs) - elif self.backend == 'multiprocessing': - if mp.current_process().daemon: - # Daemonic processes cannot have children - self._pool = None - warnings.warn( - 'Multiprocessing-backed parallel loops cannot be nested,' - ' setting n_jobs=1', - stacklevel=3) - return 1 - elif threading.current_thread().name != 'MainThread': - # Prevent posix fork inside in non-main posix threads - self._pool = None - warnings.warn( - 'Multiprocessing backed parallel loops cannot be nested' - ' below threads, setting n_jobs=1', - stacklevel=3) - return 1 - else: - already_forked = int(os.environ.get(JOBLIB_SPAWNED_PROCESS, 0)) - if already_forked: - raise ImportError('[joblib] Attempting to do parallel computing ' - 'without protecting your import on a system that does ' - 'not support forking. To use parallel-computing in a ' - 'script, you must protect your main loop using "if ' - "__name__ == '__main__'" - '". Please see the joblib documentation on Parallel ' - 'for more information' - ) - # Set an environment variable to avoid infinite loops - os.environ[JOBLIB_SPAWNED_PROCESS] = '1' - - # Make sure to free as much memory as possible before forking - gc.collect() - poolargs = dict( - max_nbytes=self._max_nbytes, - mmap_mode=self._mmap_mode, - temp_folder=self._temp_folder, - verbose=max(0, self.verbose - 50), - ) - if self._mp_context is not None: - # Use Python 3.4+ multiprocessing context isolation - poolargs['context'] = self._mp_context - self._pool = MemmapingPool(n_jobs, **poolargs) - - # We are using multiprocessing, we also want to capture - # KeyboardInterrupts - self.exceptions.extend([KeyboardInterrupt, WorkerInterrupt]) - else: - raise ValueError("Unsupported backend: %s" % self.backend) - return n_jobs + try: + return self._backend.configure(n_jobs=self.n_jobs, parallel=self, + **self._backend_args) + except FallbackToBackend as e: + # Recursively initialize the backend in case of requested fallback. + self._backend = e.backend + return self._initialize_backend() + + def _effective_n_jobs(self): + if self._backend: + return self._backend.effective_n_jobs(self.n_jobs) + return 1 - def _terminate_pool(self): - if self._pool is not None: - self._pool.close() - self._pool.terminate() # terminate does a join() - self._pool = None - if self.backend == 'multiprocessing': - os.environ.pop(JOBLIB_SPAWNED_PROCESS, 0) + def _terminate_backend(self): + if self._backend is not None: + self._backend.terminate() def _dispatch(self, batch): """Queue the batch for computing, with or without multiprocessing @@ -562,24 +563,13 @@ def _dispatch(self, batch): if self._aborting: return - if self._pool is None: - job = ImmediateComputeBatch(batch) - self._jobs.append(job) - self.n_dispatched_batches += 1 - self.n_dispatched_tasks += len(batch) - self.n_completed_tasks += len(batch) - if not _verbosity_filter(self.n_dispatched_batches, self.verbose): - self._print('Done %3i tasks | elapsed: %s', - (self.n_completed_tasks, - short_format_time(time.time() - self._start_time) - )) - else: - dispatch_timestamp = time.time() - cb = BatchCompletionCallBack(dispatch_timestamp, len(batch), self) - job = self._pool.apply_async(SafeFunction(batch), callback=cb) - self._jobs.append(job) - self.n_dispatched_tasks += len(batch) - self.n_dispatched_batches += 1 + self.n_dispatched_tasks += len(batch) + self.n_dispatched_batches += 1 + + dispatch_timestamp = time.time() + cb = BatchCompletionCallBack(dispatch_timestamp, len(batch), self) + job = self._backend.apply_async(batch, callback=cb) + self._jobs.append(job) def dispatch_next(self): """Dispatch more data for parallel processing @@ -603,55 +593,15 @@ def dispatch_one_batch(self, iterator): lock so calling this function should be thread safe. """ - if self.batch_size == 'auto' and self.backend == 'threading': - # Batching is never beneficial with the threading backend - batch_size = 1 - elif self.batch_size == 'auto': - old_batch_size = self._effective_batch_size - batch_duration = self._smoothed_batch_duration - if (batch_duration > 0 and - batch_duration < MIN_IDEAL_BATCH_DURATION): - # The current batch size is too small: the duration of the - # processing of a batch of task is not large enough to hide - # the scheduling overhead. - ideal_batch_size = int( - old_batch_size * MIN_IDEAL_BATCH_DURATION / batch_duration) - # Multiply by two to limit oscilations between min and max. - batch_size = max(2 * ideal_batch_size, 1) - self._effective_batch_size = batch_size - if self.verbose >= 10: - self._print("Batch computation too fast (%.4fs.) " - "Setting batch_size=%d.", ( - batch_duration, batch_size)) - elif (batch_duration > MAX_IDEAL_BATCH_DURATION and - old_batch_size >= 2): - # The current batch size is too big. If we schedule overly long - # running batches some CPUs might wait with nothing left to do - # while a couple of CPUs a left processing a few long running - # batches. Better reduce the batch size a bit to limit the - # likelihood of scheduling such stragglers. - self._effective_batch_size = batch_size = old_batch_size // 2 - if self.verbose >= 10: - self._print("Batch computation too slow (%.2fs.) " - "Setting batch_size=%d.", ( - batch_duration, batch_size)) - else: - # No batch size adjustment - batch_size = old_batch_size - - if batch_size != old_batch_size: - # Reset estimation of the smoothed mean batch duration: this - # estimate is updated in the multiprocessing apply_async - # CallBack as long as the batch_size is constant. Therefore - # we need to reset the estimate whenever we re-tune the batch - # size. - self._smoothed_batch_duration = 0 + if self.batch_size == 'auto': + batch_size = self._backend.compute_batch_size() else: # Fixed batch size strategy batch_size = self.batch_size + with self._lock: tasks = BatchedCalls(itertools.islice(iterator, batch_size)) - if not tasks: + if len(tasks) == 0: # No more tasks available in the iterator: tell caller to stop. return False else: @@ -679,37 +629,40 @@ def print_progress(self): return elapsed_time = time.time() - self._start_time - # This is heuristic code to print only 'verbose' times a messages - # The challenge is that we may not know the queue length - if self._original_iterator: + # Original job iterator becomes None once it has been fully + # consumed : at this point we know the total number of jobs and we are + # able to display an estimation of the remaining time based on already + # completed jobs. Otherwise, we simply display the number of completed + # tasks. + if self._original_iterator is not None: if _verbosity_filter(self.n_dispatched_batches, self.verbose): return self._print('Done %3i tasks | elapsed: %s', (self.n_completed_tasks, - short_format_time(elapsed_time), - )) + short_format_time(elapsed_time), )) else: - index = self.n_dispatched_batches + index = self.n_completed_tasks # We are finished dispatching total_tasks = self.n_dispatched_tasks # We always display the first loop if not index == 0: # Display depending on the number of remaining items # A message as soon as we finish dispatching, cursor is 0 - cursor = (total_tasks - index + 1 - - self._pre_dispatch_amount) + cursor = (total_tasks - index + 1 - + self._pre_dispatch_amount) frequency = (total_tasks // self.verbose) + 1 is_last_item = (index + 1 == total_tasks) if (is_last_item or cursor % frequency): return - remaining_time = (elapsed_time / (index + 1) * - (self.n_dispatched_tasks - index - 1.)) + remaining_time = (elapsed_time / index) * \ + (self.n_dispatched_tasks - index * 1.0) + # only display status if remaining time is greater or equal to 0 self._print('Done %3i out of %3i | elapsed: %s remaining: %s', - (index + 1, + (index, total_tasks, short_format_time(elapsed_time), short_format_time(remaining_time), - )) + )) def retrieve(self): self._output = list() @@ -724,8 +677,15 @@ def retrieve(self): with self._lock: job = self._jobs.pop(0) try: - self._output.extend(job.get()) - except tuple(self.exceptions) as exception: + # check if timeout supported in backend future implementation + if 'timeout' in getfullargspec(job.get).args: + self._output.extend(job.get(timeout=self.timeout)) + else: + self._output.extend(job.get()) + except BaseException as exception: + # Note: we catch any BaseException instead of just Exception + # instances to also include KeyboardInterrupt. + # Stop dispatching any new job in the async callback thread self._aborting = True @@ -744,16 +704,18 @@ def retrieve(self): exception_type = _mk_exception(exception.etype)[0] exception = exception_type(report) - # Kill remaining running processes without waiting for - # the results as we will raise the exception we got back - # to the caller instead of returning any result. - self._terminate_pool() - if self._managed_pool: - # In case we had to terminate a managed pool, let - # us start a new one to ensure that subsequent calls - # to __call__ on the same Parallel instance will get - # a working pool as they expect. - self._initialize_pool() + # If the backends allows it, cancel or kill remaining running + # tasks without waiting for the results as we will raise + # the exception we got back to the caller instead of returning + # any result. + backend = self._backend + if (backend is not None and + hasattr(backend, 'abort_everything')): + # If the backend is managed externally we need to make sure + # to leave it in a working state to allow for future jobs + # scheduling. + ensure_ready = self._managed_backend + backend.abort_everything(ensure_ready=ensure_ready) raise exception def __call__(self, iterable): @@ -762,14 +724,11 @@ def __call__(self, iterable): # A flag used to abort the dispatching of jobs in case an # exception is found self._aborting = False - if not self._managed_pool: - n_jobs = self._initialize_pool() + if not self._managed_backend: + n_jobs = self._initialize_backend() else: n_jobs = self._effective_n_jobs() - if self.batch_size == 'auto': - self._effective_batch_size = 1 - iterator = iter(iterable) pre_dispatch = self.pre_dispatch @@ -792,7 +751,6 @@ def __call__(self, iterable): self.n_dispatched_batches = 0 self.n_dispatched_tasks = 0 self.n_completed_tasks = 0 - self._smoothed_batch_duration = 0.0 try: # Only set self._iterating to True if at least a batch # was dispatched. In particular this covers the edge @@ -814,8 +772,8 @@ def __call__(self, iterable): (len(self._output), len(self._output), short_format_time(elapsed_time))) finally: - if not self._managed_pool: - self._terminate_pool() + if not self._managed_backend: + self._terminate_backend() self._jobs = list() output = self._output self._output = None diff --git a/mlens/externals/joblib/pool.py b/mlens/externals/joblib/pool.py index 54fdac50..e0682c18 100644 --- a/mlens/externals/joblib/pool.py +++ b/mlens/externals/joblib/pool.py @@ -1,4 +1,4 @@ -"""Custom implementation of multiprocessing.Pool with custom pickler +"""Custom implementation of multiprocessing.Pool with custom pickler. This module provides efficient ways of working with data stored in shared memory with numpy.memmap arrays without inducing any memory @@ -30,6 +30,7 @@ except NameError: WindowsError = None +from pickle import whichmodule try: # Python 2 compat from cPickle import loads @@ -76,7 +77,7 @@ def _get_backing_memmap(a): - """Recursively look up the original np.memmap instance base if any""" + """Recursively look up the original np.memmap instance base if any.""" b = getattr(a, 'base', None) if b is None: # TODO: check scipy sparse datastructure if scipy is installed @@ -93,13 +94,13 @@ def _get_backing_memmap(a): def has_shareable_memory(a): - """Return True if a is backed by some mmap buffer directly or not""" + """Return True if a is backed by some mmap buffer directly or not.""" return _get_backing_memmap(a) is not None def _strided_from_memmap(filename, dtype, mode, offset, order, shape, strides, total_buffer_len): - """Reconstruct an array view on a memmory mapped file""" + """Reconstruct an array view on a memory mapped file.""" if mode == 'w+': # Do not zero the original data when unpickling mode = 'r+' @@ -117,7 +118,7 @@ def _strided_from_memmap(filename, dtype, mode, offset, order, shape, strides, def _reduce_memmap_backed(a, m): - """Pickling reduction for memmap backed arrays + """Pickling reduction for memmap backed arrays. a is expected to be an instance of np.ndarray (or np.memmap) m is expected to be an instance of np.memmap on the top of the ``base`` @@ -153,7 +154,7 @@ def _reduce_memmap_backed(a, m): def reduce_memmap(a): - """Pickle the descriptors of a memmap instance to reopen on same file""" + """Pickle the descriptors of a memmap instance to reopen on same file.""" m = _get_backing_memmap(a) if m is not None: # m is a real mmap backed memmap instance, reduce a preserving striding @@ -268,7 +269,7 @@ class CustomizablePickler(Pickler): to pickle ephemeral datastructures for interprocess communication hence no backward compatibility is required. - `reducers` is expected expected to be a dictionary with key/values + `reducers` is expected to be a dictionary with key/values being `(type, callable)` pairs where `callable` is a function that give an instance of `type` will return a tuple `(constructor, tuple_of_objects)` to rebuild an instance out of the pickled @@ -299,6 +300,7 @@ def __init__(self, writer, reducers=None, protocol=HIGHEST_PROTOCOL): self.register(type, reduce_func) def register(self, type, reduce_func): + """Attach a reducer function to a given type in the dispatch table.""" if hasattr(Pickler, 'dispatch'): # Python 2 pickler dispatching is not explicitly customizable. # Let us use a closure to workaround this limitation. @@ -316,14 +318,15 @@ class CustomizablePicklingQueue(object): This class is an alternative to the multiprocessing implementation of SimpleQueue in order to make it possible to pass custom pickling reducers, for instance to avoid memory copy when passing - memmory mapped datastructures. + memory mapped datastructures. - `reducers` is expected expected to be a dictionary with key/values - being `(type, callable)` pairs where `callable` is a function that - give an instance of `type` will return a tuple `(constructor, - tuple_of_objects)` to rebuild an instance out of the pickled - `tuple_of_objects` as would return a `__reduce__` method. See the - standard library documentation on pickling for more details. + `reducers` is expected to be a dict with key / values being + `(type, callable)` pairs where `callable` is a function that, given an + instance of `type`, will return a tuple `(constructor, tuple_of_objects)` + to rebuild an instance out of the pickled `tuple_of_objects` as would + return a `__reduce__` method. + + See the standard library documentation on pickling for more details. """ def __init__(self, context, reducers=None): @@ -397,11 +400,10 @@ class PicklingPool(Pool): `forward_reducers` and `backward_reducers` are expected to be dictionaries with key/values being `(type, callable)` pairs where - `callable` is a function that give an instance of `type` will return - a tuple `(constructor, tuple_of_objects)` to rebuild an instance out - of the pickled `tuple_of_objects` as would return a `__reduce__` - method. See the standard library documentation on pickling for more - details. + `callable` is a function that, given an instance of `type`, will return a + tuple `(constructor, tuple_of_objects)` to rebuild an instance out of the + pickled `tuple_of_objects` as would return a `__reduce__` method. + See the standard library documentation about pickling for more details. """ @@ -428,7 +430,7 @@ def _setup_queues(self): def delete_folder(folder_path): - """Utility function to cleanup a temporary folder if still existing""" + """Utility function to cleanup a temporary folder if still existing.""" try: if os.path.exists(folder_path): shutil.rmtree(folder_path) @@ -477,8 +479,11 @@ class MemmapingPool(PicklingPool): under Unix operating systems. max_nbytes int or None, optional, 1e6 by default Threshold on the size of arrays passed to the workers that - triggers automated memmory mapping in temp_folder. + triggers automated memory mapping in temp_folder. Use None to disable memmaping of large arrays. + mmap_mode: {'r+', 'r', 'w+', 'c'} + Memmapping mode for numpy arrays passed to workers. + See 'max_nbytes' parameter documentation for more details. forward_reducers: dictionary, optional Reducers used to pickle objects passed from master to worker processes: see below. @@ -549,7 +554,22 @@ def __init__(self, processes=None, temp_folder=None, max_nbytes=1e6, # self to ensure that this callback won't prevent garbage collection of # the pool instance and related file handler resources such as POSIX # semaphores and pipes - atexit.register(lambda: delete_folder(pool_folder)) + pool_module_name = whichmodule(delete_folder, 'delete_folder') + + def _cleanup(): + # In some cases the Python runtime seems to set delete_folder to + # None just before exiting when accessing the delete_folder + # function from the closure namespace. So instead we reimport + # the delete_folder function explicitly. + # https://github.com/joblib/joblib/issues/328 + # We cannot just use from 'joblib.pool import delete_folder' + # because joblib should only use relative imports to allow + # easy vendoring. + delete_folder = __import__( + pool_module_name, fromlist=['delete_folder']).delete_folder + delete_folder(pool_folder) + + atexit.register(_cleanup) if np is not None: # Register smart numpy.ndarray reducers that detects memmap backed @@ -580,5 +600,16 @@ def __init__(self, processes=None, temp_folder=None, max_nbytes=1e6, super(MemmapingPool, self).__init__(**poolargs) def terminate(self): - super(MemmapingPool, self).terminate() + n_retries = 10 + for i in range(n_retries): + try: + super(MemmapingPool, self).terminate() + break + except WindowsError as e: + # Workaround occasional "[Error 5] Access is denied" issue + # when trying to terminate a process under windows. + sleep(0.1) + if i + 1 == n_retries: + warnings.warn("Failed to terminate worker processes in " + " multiprocessing pool: %r" % e) delete_folder(self._temp_folder) diff --git a/mlens/parallel/estimation.py b/mlens/parallel/estimation.py index 9be28d36..0d551323 100644 --- a/mlens/parallel/estimation.py +++ b/mlens/parallel/estimation.py @@ -13,14 +13,12 @@ import numpy as np -from joblib import delayed - +from ..externals.joblib import delayed from ..utils import (check_is_fitted, pickle_load, pickle_save, print_time, safe_print) - from ..utils.exceptions import (NotFittedError, ParallelProcessingError, ParallelProcessingWarning) diff --git a/mlens/parallel/evaluation.py b/mlens/parallel/evaluation.py index 2887749e..d9ea142d 100644 --- a/mlens/parallel/evaluation.py +++ b/mlens/parallel/evaluation.py @@ -7,15 +7,15 @@ Cross-validation jobs for an :class:`Evaluator` instance. """ -from .estimation import (fit_trans, _slice_array, _transform) +import os +import warnings +from .estimation import (fit_trans, _slice_array, _transform) from ..externals.joblib import delayed from ..utils import pickle_load from ..utils.exceptions import FitFailedWarning from ..externals.sklearn.base import clone -import os -import warnings try: from time import perf_counter as time From 9f56d6d3616835346cfd6ea7082c0114a03c362d Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Thu, 18 May 2017 10:39:18 +0200 Subject: [PATCH 22/26] joblib patch --- mlens/externals/joblib/_parallel_backends.py | 360 ++++++++++ mlens/externals/joblib/numpy_pickle_compat.py | 239 +++++++ mlens/externals/joblib/numpy_pickle_utils.py | 623 ++++++++++++++++++ 3 files changed, 1222 insertions(+) create mode 100644 mlens/externals/joblib/_parallel_backends.py create mode 100644 mlens/externals/joblib/numpy_pickle_compat.py create mode 100644 mlens/externals/joblib/numpy_pickle_utils.py diff --git a/mlens/externals/joblib/_parallel_backends.py b/mlens/externals/joblib/_parallel_backends.py new file mode 100644 index 00000000..cc4f221d --- /dev/null +++ b/mlens/externals/joblib/_parallel_backends.py @@ -0,0 +1,360 @@ +""" +Backends for embarrassingly parallel code. +""" + +import gc +import os +import sys +import warnings +import threading +from abc import ABCMeta, abstractmethod + +from .format_stack import format_exc +from .my_exceptions import WorkerInterrupt, TransportableException +from ._multiprocessing_helpers import mp +from ._compat import with_metaclass +if mp is not None: + from .pool import MemmapingPool + from multiprocessing.pool import ThreadPool + + +class ParallelBackendBase(with_metaclass(ABCMeta)): + """Helper abc which defines all methods a ParallelBackend must implement""" + + @abstractmethod + def effective_n_jobs(self, n_jobs): + """Determine the number of jobs that can actually run in parallel + + n_jobs is the number of workers requested by the callers. Passing + n_jobs=-1 means requesting all available workers for instance matching + the number of CPU cores on the worker host(s). + + This method should return a guesstimate of the number of workers that + can actually perform work concurrently. The primary use case is to make + it possible for the caller to know in how many chunks to slice the + work. + + In general working on larger data chunks is more efficient (less + scheduling overhead and better use of CPU cache prefetching heuristics) + as long as all the workers have enough work to do. + """ + + @abstractmethod + def apply_async(self, func, callback=None): + """Schedule a func to be run""" + + def configure(self, n_jobs=1, parallel=None, **backend_args): + """Reconfigure the backend and return the number of workers. + + This makes it possible to reuse an existing backend instance for + successive independent calls to Parallel with different parameters. + """ + self.parallel = parallel + return self.effective_n_jobs(n_jobs) + + def terminate(self): + """Shutdown the process or thread pool""" + + def compute_batch_size(self): + """Determine the optimal batch size""" + return 1 + + def batch_completed(self, batch_size, duration): + """Callback indicate how long it took to run a batch""" + + def get_exceptions(self): + """List of exception types to be captured.""" + return [] + + def abort_everything(self, ensure_ready=True): + """Abort any running tasks + + This is called when an exception has been raised when executing a tasks + and all the remaining tasks will be ignored and can therefore be + aborted to spare computation resources. + + If ensure_ready is True, the backend should be left in an operating + state as future tasks might be re-submitted via that same backend + instance. + + If ensure_ready is False, the implementer of this method can decide + to leave the backend in a closed / terminated state as no new task + are expected to be submitted to this backend. + + Setting ensure_ready to False is an optimization that can be leveraged + when aborting tasks via killing processes from a local process pool + managed by the backend it-self: if we expect no new tasks, there is no + point in re-creating a new working pool. + """ + # Does nothing by default: to be overriden in subclasses when canceling + # tasks is possible. + pass + + +class SequentialBackend(ParallelBackendBase): + """A ParallelBackend which will execute all batches sequentially. + + Does not use/create any threading objects, and hence has minimal + overhead. Used when n_jobs == 1. + """ + + def effective_n_jobs(self, n_jobs): + """Determine the number of jobs which are going to run in parallel""" + if n_jobs == 0: + raise ValueError('n_jobs == 0 in Parallel has no meaning') + return 1 + + def apply_async(self, func, callback=None): + """Schedule a func to be run""" + result = ImmediateResult(func) + if callback: + callback(result) + return result + + +class PoolManagerMixin(object): + """A helper class for managing pool of workers.""" + + def effective_n_jobs(self, n_jobs): + """Determine the number of jobs which are going to run in parallel""" + if n_jobs == 0: + raise ValueError('n_jobs == 0 in Parallel has no meaning') + elif mp is None or n_jobs is None: + # multiprocessing is not available or disabled, fallback + # to sequential mode + return 1 + elif n_jobs < 0: + n_jobs = max(mp.cpu_count() + 1 + n_jobs, 1) + return n_jobs + + def terminate(self): + """Shutdown the process or thread pool""" + if self._pool is not None: + self._pool.close() + self._pool.terminate() # terminate does a join() + self._pool = None + + def apply_async(self, func, callback=None): + """Schedule a func to be run""" + return self._pool.apply_async(SafeFunction(func), callback=callback) + + def abort_everything(self, ensure_ready=True): + """Shutdown the pool and restart a new one with the same parameters""" + self.terminate() + if ensure_ready: + self.configure(n_jobs=self.parallel.n_jobs, parallel=self.parallel, + **self.parallel._backend_args) + + +class AutoBatchingMixin(object): + """A helper class for automagically batching jobs.""" + + # In seconds, should be big enough to hide multiprocessing dispatching + # overhead. + # This settings was found by running benchmarks/bench_auto_batching.py + # with various parameters on various platforms. + MIN_IDEAL_BATCH_DURATION = .2 + + # Should not be too high to avoid stragglers: long jobs running alone + # on a single worker while other workers have no work to process any more. + MAX_IDEAL_BATCH_DURATION = 2 + + # Batching counters + _effective_batch_size = 1 + _smoothed_batch_duration = 0.0 + + def compute_batch_size(self): + """Determine the optimal batch size""" + old_batch_size = self._effective_batch_size + batch_duration = self._smoothed_batch_duration + if (batch_duration > 0 and + batch_duration < self.MIN_IDEAL_BATCH_DURATION): + # The current batch size is too small: the duration of the + # processing of a batch of task is not large enough to hide + # the scheduling overhead. + ideal_batch_size = int(old_batch_size * + self.MIN_IDEAL_BATCH_DURATION / + batch_duration) + # Multiply by two to limit oscilations between min and max. + batch_size = max(2 * ideal_batch_size, 1) + self._effective_batch_size = batch_size + if self.parallel.verbose >= 10: + self.parallel._print( + "Batch computation too fast (%.4fs.) " + "Setting batch_size=%d.", (batch_duration, batch_size)) + elif (batch_duration > self.MAX_IDEAL_BATCH_DURATION and + old_batch_size >= 2): + # The current batch size is too big. If we schedule overly long + # running batches some CPUs might wait with nothing left to do + # while a couple of CPUs a left processing a few long running + # batches. Better reduce the batch size a bit to limit the + # likelihood of scheduling such stragglers. + batch_size = old_batch_size // 2 + self._effective_batch_size = batch_size + if self.parallel.verbose >= 10: + self.parallel._print( + "Batch computation too slow (%.4fs.) " + "Setting batch_size=%d.", (batch_duration, batch_size)) + else: + # No batch size adjustment + batch_size = old_batch_size + + if batch_size != old_batch_size: + # Reset estimation of the smoothed mean batch duration: this + # estimate is updated in the multiprocessing apply_async + # CallBack as long as the batch_size is constant. Therefore + # we need to reset the estimate whenever we re-tune the batch + # size. + self._smoothed_batch_duration = 0 + + return batch_size + + def batch_completed(self, batch_size, duration): + """Callback indicate how long it took to run a batch""" + if batch_size == self._effective_batch_size: + # Update the smoothed streaming estimate of the duration of a batch + # from dispatch to completion + old_duration = self._smoothed_batch_duration + if old_duration == 0: + # First record of duration for this batch size after the last + # reset. + new_duration = duration + else: + # Update the exponentially weighted average of the duration of + # batch for the current effective size. + new_duration = 0.8 * old_duration + 0.2 * duration + self._smoothed_batch_duration = new_duration + + +class ThreadingBackend(PoolManagerMixin, ParallelBackendBase): + """A ParallelBackend which will use a thread pool to execute batches in. + + This is a low-overhead backend but it suffers from the Python Global + Interpreter Lock if the called function relies a lot on Python objects. + Mostly useful when the execution bottleneck is a compiled extension that + explicitly releases the GIL (for instance a Cython loop wrapped in a + "with nogil" block or an expensive call to a library such as NumPy). + """ + + def configure(self, n_jobs=1, parallel=None, **backend_args): + """Build a process or thread pool and return the number of workers""" + n_jobs = self.effective_n_jobs(n_jobs) + if n_jobs == 1: + # Avoid unnecessary overhead and use sequential backend instead. + raise FallbackToBackend(SequentialBackend()) + self.parallel = parallel + self._pool = ThreadPool(n_jobs) + return n_jobs + + +class MultiprocessingBackend(PoolManagerMixin, AutoBatchingMixin, + ParallelBackendBase): + """A ParallelBackend which will use a multiprocessing.Pool. + + Will introduce some communication and memory overhead when exchanging + input and output data with the with the worker Python processes. + However, does not suffer from the Python Global Interpreter Lock. + """ + + # Environment variables to protect against bad situations when nesting + JOBLIB_SPAWNED_PROCESS = "__JOBLIB_SPAWNED_PARALLEL__" + + def effective_n_jobs(self, n_jobs): + """Determine the number of jobs which are going to run in parallel. + + This also checks if we are attempting to create a nested parallel + loop. + """ + if mp is None: + return 1 + + if mp.current_process().daemon: + # Daemonic processes cannot have children + if n_jobs != 1: + warnings.warn( + 'Multiprocessing-backed parallel loops cannot be nested,' + ' setting n_jobs=1', + stacklevel=3) + return 1 + + elif threading.current_thread().name != 'MainThread': + # Prevent posix fork inside in non-main posix threads + warnings.warn( + 'Multiprocessing backed parallel loops cannot be nested' + ' below threads, setting n_jobs=1', + stacklevel=3) + return 1 + + return super(MultiprocessingBackend, self).effective_n_jobs(n_jobs) + + def configure(self, n_jobs=1, parallel=None, **backend_args): + """Build a process or thread pool and return the number of workers""" + n_jobs = self.effective_n_jobs(n_jobs) + if n_jobs == 1: + raise FallbackToBackend(SequentialBackend()) + + already_forked = int(os.environ.get(self.JOBLIB_SPAWNED_PROCESS, 0)) + if already_forked: + raise ImportError( + '[joblib] Attempting to do parallel computing ' + 'without protecting your import on a system that does ' + 'not support forking. To use parallel-computing in a ' + 'script, you must protect your main loop using "if ' + "__name__ == '__main__'" + '". Please see the joblib documentation on Parallel ' + 'for more information') + # Set an environment variable to avoid infinite loops + os.environ[self.JOBLIB_SPAWNED_PROCESS] = '1' + + # Make sure to free as much memory as possible before forking + gc.collect() + self._pool = MemmapingPool(n_jobs, **backend_args) + self.parallel = parallel + return n_jobs + + def terminate(self): + """Shutdown the process or thread pool""" + super(MultiprocessingBackend, self).terminate() + if self.JOBLIB_SPAWNED_PROCESS in os.environ: + del os.environ[self.JOBLIB_SPAWNED_PROCESS] + + +class ImmediateResult(object): + def __init__(self, batch): + # Don't delay the application, to avoid keeping the input + # arguments in memory + self.results = batch() + + def get(self): + return self.results + + +class SafeFunction(object): + """Wrapper that handles the serialization of exception tracebacks. + + If an exception is triggered when calling the inner function, a copy of + the full traceback is captured to make it possible to serialize + it so that it can be rendered in a different Python process. + """ + def __init__(self, func): + self.func = func + + def __call__(self, *args, **kwargs): + try: + return self.func(*args, **kwargs) + except KeyboardInterrupt: + # We capture the KeyboardInterrupt and reraise it as + # something different, as multiprocessing does not + # interrupt processing for a KeyboardInterrupt + raise WorkerInterrupt() + except: + e_type, e_value, e_tb = sys.exc_info() + text = format_exc(e_type, e_value, e_tb, context=10, tb_offset=1) + raise TransportableException(text, e_type) + + +class FallbackToBackend(Exception): + """Raised when configuration should fallback to another backend""" + + def __init__(self, backend): + self.backend = backend diff --git a/mlens/externals/joblib/numpy_pickle_compat.py b/mlens/externals/joblib/numpy_pickle_compat.py new file mode 100644 index 00000000..150d8f4e --- /dev/null +++ b/mlens/externals/joblib/numpy_pickle_compat.py @@ -0,0 +1,239 @@ +"""Numpy pickle compatibility functions.""" + +import pickle +import os +import zlib +from io import BytesIO + +from ._compat import PY3_OR_LATER +from .numpy_pickle_utils import _ZFILE_PREFIX +from .numpy_pickle_utils import Unpickler + + +def hex_str(an_int): + """Convert an int to an hexadecimal string.""" + return '{0:#x}'.format(an_int) + +if PY3_OR_LATER: + def asbytes(s): + if isinstance(s, bytes): + return s + return s.encode('latin1') +else: + asbytes = str + +_MAX_LEN = len(hex_str(2 ** 64)) +_CHUNK_SIZE = 64 * 1024 + + +def read_zfile(file_handle): + """Read the z-file and return the content as a string. + + Z-files are raw data compressed with zlib used internally by joblib + for persistence. Backward compatibility is not guaranteed. Do not + use for external purposes. + """ + file_handle.seek(0) + header_length = len(_ZFILE_PREFIX) + _MAX_LEN + length = file_handle.read(header_length) + length = length[len(_ZFILE_PREFIX):] + length = int(length, 16) + + # With python2 and joblib version <= 0.8.4 compressed pickle header is one + # character wider so we need to ignore an additional space if present. + # Note: the first byte of the zlib data is guaranteed not to be a + # space according to + # https://tools.ietf.org/html/rfc6713#section-2.1 + next_byte = file_handle.read(1) + if next_byte != b' ': + # The zlib compressed data has started and we need to go back + # one byte + file_handle.seek(header_length) + + # We use the known length of the data to tell Zlib the size of the + # buffer to allocate. + data = zlib.decompress(file_handle.read(), 15, length) + assert len(data) == length, ( + "Incorrect data length while decompressing %s." + "The file could be corrupted." % file_handle) + return data + + +def write_zfile(file_handle, data, compress=1): + """Write the data in the given file as a Z-file. + + Z-files are raw data compressed with zlib used internally by joblib + for persistence. Backward compatibility is not guarantied. Do not + use for external purposes. + """ + file_handle.write(_ZFILE_PREFIX) + length = hex_str(len(data)) + # Store the length of the data + file_handle.write(asbytes(length.ljust(_MAX_LEN))) + file_handle.write(zlib.compress(asbytes(data), compress)) + +############################################################################### +# Utility objects for persistence. + + +class NDArrayWrapper(object): + """An object to be persisted instead of numpy arrays. + + The only thing this object does, is to carry the filename in which + the array has been persisted, and the array subclass. + """ + + def __init__(self, filename, subclass, allow_mmap=True): + """Constructor. Store the useful information for later.""" + self.filename = filename + self.subclass = subclass + self.allow_mmap = allow_mmap + + def read(self, unpickler): + """Reconstruct the array.""" + filename = os.path.join(unpickler._dirname, self.filename) + # Load the array from the disk + # use getattr instead of self.allow_mmap to ensure backward compat + # with NDArrayWrapper instances pickled with joblib < 0.9.0 + allow_mmap = getattr(self, 'allow_mmap', True) + memmap_kwargs = ({} if not allow_mmap + else {'mmap_mode': unpickler.mmap_mode}) + array = unpickler.np.load(filename, **memmap_kwargs) + # Reconstruct subclasses. This does not work with old + # versions of numpy + if (hasattr(array, '__array_prepare__') and + self.subclass not in (unpickler.np.ndarray, + unpickler.np.memmap)): + # We need to reconstruct another subclass + new_array = unpickler.np.core.multiarray._reconstruct( + self.subclass, (0,), 'b') + return new_array.__array_prepare__(array) + else: + return array + + +class ZNDArrayWrapper(NDArrayWrapper): + """An object to be persisted instead of numpy arrays. + + This object store the Zfile filename in which + the data array has been persisted, and the meta information to + retrieve it. + The reason that we store the raw buffer data of the array and + the meta information, rather than array representation routine + (tostring) is that it enables us to use completely the strided + model to avoid memory copies (a and a.T store as fast). In + addition saving the heavy information separately can avoid + creating large temporary buffers when unpickling data with + large arrays. + """ + + def __init__(self, filename, init_args, state): + """Constructor. Store the useful information for later.""" + self.filename = filename + self.state = state + self.init_args = init_args + + def read(self, unpickler): + """Reconstruct the array from the meta-information and the z-file.""" + # Here we a simply reproducing the unpickling mechanism for numpy + # arrays + filename = os.path.join(unpickler._dirname, self.filename) + array = unpickler.np.core.multiarray._reconstruct(*self.init_args) + with open(filename, 'rb') as f: + data = read_zfile(f) + state = self.state + (data,) + array.__setstate__(state) + return array + + +class ZipNumpyUnpickler(Unpickler): + """A subclass of the Unpickler to unpickle our numpy pickles.""" + + dispatch = Unpickler.dispatch.copy() + + def __init__(self, filename, file_handle, mmap_mode=None): + """Constructor.""" + self._filename = os.path.basename(filename) + self._dirname = os.path.dirname(filename) + self.mmap_mode = mmap_mode + self.file_handle = self._open_pickle(file_handle) + Unpickler.__init__(self, self.file_handle) + try: + import numpy as np + except ImportError: + np = None + self.np = np + + def _open_pickle(self, file_handle): + return BytesIO(read_zfile(file_handle)) + + def load_build(self): + """Set the state of a newly created object. + + We capture it to replace our place-holder objects, + NDArrayWrapper, by the array we are interested in. We + replace them directly in the stack of pickler. + """ + Unpickler.load_build(self) + if isinstance(self.stack[-1], NDArrayWrapper): + if self.np is None: + raise ImportError("Trying to unpickle an ndarray, " + "but numpy didn't import correctly") + nd_array_wrapper = self.stack.pop() + array = nd_array_wrapper.read(self) + self.stack.append(array) + + # Be careful to register our new method. + if PY3_OR_LATER: + dispatch[pickle.BUILD[0]] = load_build + else: + dispatch[pickle.BUILD] = load_build + + +def load_compatibility(filename): + """Reconstruct a Python object from a file persisted with joblib.dump. + + This function ensures the compatibility with joblib old persistence format + (<= 0.9.3). + + Parameters + ----------- + filename: string + The name of the file from which to load the object + + Returns + ------- + result: any Python object + The object stored in the file. + + See Also + -------- + joblib.dump : function to save an object + + Notes + ----- + + This function can load numpy array files saved separately during the + dump. + """ + with open(filename, 'rb') as file_handle: + # We are careful to open the file handle early and keep it open to + # avoid race-conditions on renames. That said, if data is stored in + # companion files, moving the directory will create a race when + # joblib tries to access the companion files. + unpickler = ZipNumpyUnpickler(filename, file_handle=file_handle) + try: + obj = unpickler.load() + except UnicodeDecodeError as exc: + # More user-friendly error message + if PY3_OR_LATER: + new_exc = ValueError( + 'You may be trying to read with ' + 'python 3 a joblib pickle generated with python 2. ' + 'This feature is not supported by joblib.') + new_exc.__cause__ = exc + raise new_exc + finally: + if hasattr(unpickler, 'file_handle'): + unpickler.file_handle.close() + return obj diff --git a/mlens/externals/joblib/numpy_pickle_utils.py b/mlens/externals/joblib/numpy_pickle_utils.py new file mode 100644 index 00000000..6f471073 --- /dev/null +++ b/mlens/externals/joblib/numpy_pickle_utils.py @@ -0,0 +1,623 @@ +"""Utilities for fast persistence of big data, with optional compression.""" + +# Author: Gael Varoquaux +# Copyright (c) 2009 Gael Varoquaux +# License: BSD Style, 3 clauses. + +import pickle +import sys +import io +import zlib +import gzip +import bz2 +import warnings +import contextlib +from contextlib import closing + +from ._compat import PY3_OR_LATER, PY26, PY27, _basestring + +try: + from threading import RLock +except ImportError: + from dummy_threading import RLock + +if PY3_OR_LATER: + Unpickler = pickle._Unpickler + Pickler = pickle._Pickler + xrange = range +else: + Unpickler = pickle.Unpickler + Pickler = pickle.Pickler + +try: + import numpy as np +except ImportError: + np = None + +try: + import lzma +except ImportError: + lzma = None + + +# Magic numbers of supported compression file formats. ' +_ZFILE_PREFIX = b'ZF' # used with pickle files created before 0.9.3. +_ZLIB_PREFIX = b'\x78' +_GZIP_PREFIX = b'\x1f\x8b' +_BZ2_PREFIX = b'BZ' +_XZ_PREFIX = b'\xfd\x37\x7a\x58\x5a' +_LZMA_PREFIX = b'\x5d\x00' + +# Supported compressors +_COMPRESSORS = ('zlib', 'bz2', 'lzma', 'xz', 'gzip') +_COMPRESSOR_CLASSES = [gzip.GzipFile, bz2.BZ2File] +if lzma is not None: + _COMPRESSOR_CLASSES.append(lzma.LZMAFile) + +# The max magic number length of supported compression file types. +_MAX_PREFIX_LEN = max(len(prefix) + for prefix in (_ZFILE_PREFIX, _GZIP_PREFIX, _BZ2_PREFIX, + _XZ_PREFIX, _LZMA_PREFIX)) + +# Buffer size used in io.BufferedReader and io.BufferedWriter +_IO_BUFFER_SIZE = 1024 ** 2 + + +############################################################################### +# Cache file utilities +def _detect_compressor(fileobj): + """Return the compressor matching fileobj. + + Parameters + ---------- + fileobj: file object + + Returns + ------- + str in {'zlib', 'gzip', 'bz2', 'lzma', 'xz', 'compat', 'not-compressed'} + """ + # Ensure we read the first bytes. + fileobj.seek(0) + first_bytes = fileobj.read(_MAX_PREFIX_LEN) + fileobj.seek(0) + + if first_bytes.startswith(_ZLIB_PREFIX): + return "zlib" + elif first_bytes.startswith(_GZIP_PREFIX): + return "gzip" + elif first_bytes.startswith(_BZ2_PREFIX): + return "bz2" + elif first_bytes.startswith(_LZMA_PREFIX): + return "lzma" + elif first_bytes.startswith(_XZ_PREFIX): + return "xz" + elif first_bytes.startswith(_ZFILE_PREFIX): + return "compat" + + return "not-compressed" + + +def _buffered_read_file(fobj): + """Return a buffered version of a read file object.""" + if PY26 or (PY27 and isinstance(fobj, bz2.BZ2File)): + # Python 2.6 doesn't fully support io.BufferedReader. + # Python 2.7 doesn't work with BZ2File through a buffer: "no + # attribute 'readable'" error. + return fobj + else: + return io.BufferedReader(fobj, buffer_size=_IO_BUFFER_SIZE) + + +def _buffered_write_file(fobj): + """Return a buffered version of a write file object.""" + if PY26 or (PY27 and isinstance(fobj, bz2.BZ2File)): + # Python 2.6 doesn't fully support io.BufferedWriter. + # Python 2.7 doesn't work with BZ2File through a buffer: no attribute + # 'writable'. + # BZ2File doesn't implement the file object context manager in python 2 + # so we wrap the fileobj using `closing`. + return closing(fobj) + else: + return io.BufferedWriter(fobj, buffer_size=_IO_BUFFER_SIZE) + + +@contextlib.contextmanager +def _read_fileobject(fileobj, filename, mmap_mode=None): + """Utility function opening the right fileobject from a filename. + + The magic number is used to choose between the type of file object to open: + * regular file object (default) + * zlib file object + * gzip file object + * bz2 file object + * lzma file object (for xz and lzma compressor) + + Parameters + ---------- + fileobj: file object + compressor: str in {'zlib', 'gzip', 'bz2', 'lzma', 'xz', 'compat', + 'not-compressed'} + filename: str + filename path corresponding to the fileobj parameter. + mmap_mode: str + memory map mode that should be used to open the pickle file. This + parameter is useful to verify that the user is not trying to one with + compression. Default: None. + + Returns + ------- + a file like object + + """ + # Detect if the fileobj contains compressed data. + compressor = _detect_compressor(fileobj) + if isinstance(fileobj, tuple(_COMPRESSOR_CLASSES)): + compressor = fileobj.__class__.__name__ + if compressor == 'compat': + # Compatibility with old pickle mode: simply return the input + # filename "as-is" and let the compatibility function be called by the + # caller. + warnings.warn("The file '%s' has been generated with a joblib " + "version less than 0.10. " + "Please regenerate this pickle file." % filename, + DeprecationWarning, stacklevel=2) + yield filename + else: + # Checking if incompatible load parameters with the type of file: + # mmap_mode cannot be used with compressed file or in memory buffers + # such as io.BytesIO. + if ((compressor in _COMPRESSORS or + isinstance(fileobj, tuple(_COMPRESSOR_CLASSES))) and + mmap_mode is not None): + warnings.warn('File "%(filename)s" is compressed using ' + '"%(compressor)s" which is not compatible with ' + 'mmap_mode "%(mmap_mode)s" flag passed. mmap_mode ' + 'option will be ignored.' + % locals(), stacklevel=2) + if isinstance(fileobj, io.BytesIO) and mmap_mode is not None: + warnings.warn('In memory persistence is not compatible with ' + 'mmap_mode "%(mmap_mode)s" flag passed. mmap_mode ' + 'option will be ignored.' + % locals(), stacklevel=2) + + # if the passed fileobj is in the supported list of decompressor + # objects (GzipFile, BZ2File, LzmaFile), we simply return it. + if isinstance(fileobj, tuple(_COMPRESSOR_CLASSES)): + yield fileobj + # otherwise, based on the compressor detected in the file, we open the + # correct decompressor file object, wrapped in a buffer. + elif compressor == 'zlib': + yield _buffered_read_file(BinaryZlibFile(fileobj, 'rb')) + elif compressor == 'gzip': + yield _buffered_read_file(BinaryGzipFile(fileobj, 'rb')) + elif compressor == 'bz2': + if PY3_OR_LATER: + yield _buffered_read_file(bz2.BZ2File(fileobj, 'rb')) + else: + # In python 2, BZ2File doesn't support a fileobj opened in + # binary mode. In this case, we pass the filename. + yield _buffered_read_file(bz2.BZ2File(fileobj.name, 'rb')) + elif (compressor == 'lzma' or compressor == 'xz'): + if lzma is not None: + yield _buffered_read_file(lzma.LZMAFile(fileobj, 'rb')) + else: + raise NotImplementedError("Lzma decompression is not " + "available for this version of " + "python ({0}.{1})" + .format(sys.version_info[0], + sys.version_info[1])) + # No compression detected => returning the input file object (open) + else: + yield fileobj + + +def _write_fileobject(filename, compress=("zlib", 3)): + """Return the right compressor file object in write mode.""" + compressmethod = compress[0] + compresslevel = compress[1] + if compressmethod == "gzip": + return _buffered_write_file(BinaryGzipFile(filename, 'wb', + compresslevel=compresslevel)) + elif compressmethod == "bz2": + return _buffered_write_file(bz2.BZ2File(filename, 'wb', + compresslevel=compresslevel)) + elif lzma is not None and compressmethod == "xz": + return _buffered_write_file(lzma.LZMAFile(filename, 'wb', + check=lzma.CHECK_NONE, + preset=compresslevel)) + elif lzma is not None and compressmethod == "lzma": + return _buffered_write_file(lzma.LZMAFile(filename, 'wb', + preset=compresslevel, + format=lzma.FORMAT_ALONE)) + else: + return _buffered_write_file(BinaryZlibFile(filename, 'wb', + compresslevel=compresslevel)) + + +############################################################################### +# Joblib zlib compression file object definition + +_MODE_CLOSED = 0 +_MODE_READ = 1 +_MODE_READ_EOF = 2 +_MODE_WRITE = 3 +_BUFFER_SIZE = 8192 + + +class BinaryZlibFile(io.BufferedIOBase): + """A file object providing transparent zlib (de)compression. + + A BinaryZlibFile can act as a wrapper for an existing file object, or refer + directly to a named file on disk. + + Note that BinaryZlibFile provides only a *binary* file interface: data read + is returned as bytes, and data to be written should be given as bytes. + + This object is an adaptation of the BZ2File object and is compatible with + versions of python >= 2.6. + + If filename is a str or bytes object, it gives the name + of the file to be opened. Otherwise, it should be a file object, + which will be used to read or write the compressed data. + + mode can be 'rb' for reading (default) or 'wb' for (over)writing + + If mode is 'wb', compresslevel can be a number between 1 + and 9 specifying the level of compression: 1 produces the least + compression, and 9 (default) produces the most compression. + """ + + wbits = zlib.MAX_WBITS + + def __init__(self, filename, mode="rb", compresslevel=9): + # This lock must be recursive, so that BufferedIOBase's + # readline(), readlines() and writelines() don't deadlock. + self._lock = RLock() + self._fp = None + self._closefp = False + self._mode = _MODE_CLOSED + self._pos = 0 + self._size = -1 + + if not isinstance(compresslevel, int) or not (1 <= compresslevel <= 9): + raise ValueError("compresslevel must be between an integer " + "between 1 and 9, you gave {0}" + .format(compresslevel)) + + if mode == "rb": + mode_code = _MODE_READ + self._decompressor = zlib.decompressobj(self.wbits) + self._buffer = b"" + self._buffer_offset = 0 + elif mode == "wb": + mode_code = _MODE_WRITE + self._compressor = zlib.compressobj(compresslevel, + zlib.DEFLATED, + self.wbits, + zlib.DEF_MEM_LEVEL, + 0) + else: + raise ValueError("Invalid mode: %r" % (mode,)) + + if isinstance(filename, _basestring): + self._fp = open(filename, mode) + self._closefp = True + self._mode = mode_code + elif hasattr(filename, "read") or hasattr(filename, "write"): + self._fp = filename + self._mode = mode_code + else: + raise TypeError("filename must be a str or bytes object, " + "or a file") + + def close(self): + """Flush and close the file. + + May be called more than once without error. Once the file is + closed, any other operation on it will raise a ValueError. + """ + with self._lock: + if self._mode == _MODE_CLOSED: + return + try: + if self._mode in (_MODE_READ, _MODE_READ_EOF): + self._decompressor = None + elif self._mode == _MODE_WRITE: + self._fp.write(self._compressor.flush()) + self._compressor = None + finally: + try: + if self._closefp: + self._fp.close() + finally: + self._fp = None + self._closefp = False + self._mode = _MODE_CLOSED + self._buffer = b"" + self._buffer_offset = 0 + + @property + def closed(self): + """True if this file is closed.""" + return self._mode == _MODE_CLOSED + + def fileno(self): + """Return the file descriptor for the underlying file.""" + self._check_not_closed() + return self._fp.fileno() + + def seekable(self): + """Return whether the file supports seeking.""" + return self.readable() and self._fp.seekable() + + def readable(self): + """Return whether the file was opened for reading.""" + self._check_not_closed() + return self._mode in (_MODE_READ, _MODE_READ_EOF) + + def writable(self): + """Return whether the file was opened for writing.""" + self._check_not_closed() + return self._mode == _MODE_WRITE + + # Mode-checking helper functions. + + def _check_not_closed(self): + if self.closed: + fname = getattr(self._fp, 'name', None) + msg = "I/O operation on closed file" + if fname is not None: + msg += " {0}".format(fname) + msg += "." + raise ValueError(msg) + + def _check_can_read(self): + if self._mode not in (_MODE_READ, _MODE_READ_EOF): + self._check_not_closed() + raise io.UnsupportedOperation("File not open for reading") + + def _check_can_write(self): + if self._mode != _MODE_WRITE: + self._check_not_closed() + raise io.UnsupportedOperation("File not open for writing") + + def _check_can_seek(self): + if self._mode not in (_MODE_READ, _MODE_READ_EOF): + self._check_not_closed() + raise io.UnsupportedOperation("Seeking is only supported " + "on files open for reading") + if not self._fp.seekable(): + raise io.UnsupportedOperation("The underlying file object " + "does not support seeking") + + # Fill the readahead buffer if it is empty. Returns False on EOF. + def _fill_buffer(self): + if self._mode == _MODE_READ_EOF: + return False + # Depending on the input data, our call to the decompressor may not + # return any data. In this case, try again after reading another block. + while self._buffer_offset == len(self._buffer): + try: + rawblock = (self._decompressor.unused_data or + self._fp.read(_BUFFER_SIZE)) + + if not rawblock: + raise EOFError + except EOFError: + # End-of-stream marker and end of file. We're good. + self._mode = _MODE_READ_EOF + self._size = self._pos + return False + else: + self._buffer = self._decompressor.decompress(rawblock) + self._buffer_offset = 0 + return True + + # Read data until EOF. + # If return_data is false, consume the data without returning it. + def _read_all(self, return_data=True): + # The loop assumes that _buffer_offset is 0. Ensure that this is true. + self._buffer = self._buffer[self._buffer_offset:] + self._buffer_offset = 0 + + blocks = [] + while self._fill_buffer(): + if return_data: + blocks.append(self._buffer) + self._pos += len(self._buffer) + self._buffer = b"" + if return_data: + return b"".join(blocks) + + # Read a block of up to n bytes. + # If return_data is false, consume the data without returning it. + def _read_block(self, n_bytes, return_data=True): + # If we have enough data buffered, return immediately. + end = self._buffer_offset + n_bytes + if end <= len(self._buffer): + data = self._buffer[self._buffer_offset: end] + self._buffer_offset = end + self._pos += len(data) + return data if return_data else None + + # The loop assumes that _buffer_offset is 0. Ensure that this is true. + self._buffer = self._buffer[self._buffer_offset:] + self._buffer_offset = 0 + + blocks = [] + while n_bytes > 0 and self._fill_buffer(): + if n_bytes < len(self._buffer): + data = self._buffer[:n_bytes] + self._buffer_offset = n_bytes + else: + data = self._buffer + self._buffer = b"" + if return_data: + blocks.append(data) + self._pos += len(data) + n_bytes -= len(data) + if return_data: + return b"".join(blocks) + + def read(self, size=-1): + """Read up to size uncompressed bytes from the file. + + If size is negative or omitted, read until EOF is reached. + Returns b'' if the file is already at EOF. + """ + with self._lock: + self._check_can_read() + if size == 0: + return b"" + elif size < 0: + return self._read_all() + else: + return self._read_block(size) + + def readinto(self, b): + """Read up to len(b) bytes into b. + + Returns the number of bytes read (0 for EOF). + """ + with self._lock: + return io.BufferedIOBase.readinto(self, b) + + def write(self, data): + """Write a byte string to the file. + + Returns the number of uncompressed bytes written, which is + always len(data). Note that due to buffering, the file on disk + may not reflect the data written until close() is called. + """ + with self._lock: + self._check_can_write() + # Convert data type if called by io.BufferedWriter. + if not PY26 and isinstance(data, memoryview): + data = data.tobytes() + + compressed = self._compressor.compress(data) + self._fp.write(compressed) + self._pos += len(data) + return len(data) + + # Rewind the file to the beginning of the data stream. + def _rewind(self): + self._fp.seek(0, 0) + self._mode = _MODE_READ + self._pos = 0 + self._decompressor = zlib.decompressobj(self.wbits) + self._buffer = b"" + self._buffer_offset = 0 + + def seek(self, offset, whence=0): + """Change the file position. + + The new position is specified by offset, relative to the + position indicated by whence. Values for whence are: + + 0: start of stream (default); offset must not be negative + 1: current stream position + 2: end of stream; offset must not be positive + + Returns the new file position. + + Note that seeking is emulated, so depending on the parameters, + this operation may be extremely slow. + """ + with self._lock: + self._check_can_seek() + + # Recalculate offset as an absolute file position. + if whence == 0: + pass + elif whence == 1: + offset = self._pos + offset + elif whence == 2: + # Seeking relative to EOF - we need to know the file's size. + if self._size < 0: + self._read_all(return_data=False) + offset = self._size + offset + else: + raise ValueError("Invalid value for whence: %s" % (whence,)) + + # Make it so that offset is the number of bytes to skip forward. + if offset < self._pos: + self._rewind() + else: + offset -= self._pos + + # Read and discard data until we reach the desired position. + self._read_block(offset, return_data=False) + + return self._pos + + def tell(self): + """Return the current file position.""" + with self._lock: + self._check_not_closed() + return self._pos + + +class BinaryGzipFile(BinaryZlibFile): + """A file object providing transparent gzip (de)compression. + + If filename is a str or bytes object, it gives the name + of the file to be opened. Otherwise, it should be a file object, + which will be used to read or write the compressed data. + + mode can be 'rb' for reading (default) or 'wb' for (over)writing + + If mode is 'wb', compresslevel can be a number between 1 + and 9 specifying the level of compression: 1 produces the least + compression, and 9 (default) produces the most compression. + """ + + wbits = 31 # zlib compressor/decompressor wbits value for gzip format. + + +# Utility functions/variables from numpy required for writing arrays. +# We need at least the functions introduced in version 1.9 of numpy. Here, +# we use the ones from numpy 1.10.2. +BUFFER_SIZE = 2 ** 18 # size of buffer for reading npz files in bytes + + +def _read_bytes(fp, size, error_template="ran out of data"): + """Read from file-like object until size bytes are read. + + Raises ValueError if not EOF is encountered before size bytes are read. + Non-blocking objects only supported if they derive from io objects. + + Required as e.g. ZipExtFile in python 2.6 can return less data than + requested. + + This function was taken from numpy/lib/format.py in version 1.10.2. + + Parameters + ---------- + fp: file-like object + size: int + error_template: str + + Returns + ------- + a bytes object + The data read in bytes. + + """ + data = bytes() + while True: + # io files (default in python3) return None or raise on + # would-block, python2 file will truncate, probably nothing can be + # done about that. note that regular files can't be non-blocking + try: + r = fp.read(size - len(data)) + data += r + if len(r) == 0 or len(data) == size: + break + except io.BlockingIOError: + pass + if len(data) != size: + msg = "EOF: reading %s, expected %d bytes got %d" + raise ValueError(msg % (error_template, size, len(data))) + else: + return data From 31bbbfe892801aec120ad6ac23470e8c819f8935 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Thu, 18 May 2017 10:39:38 +0200 Subject: [PATCH 23/26] import fix --- mlens/parallel/__init__.py | 12 ++++++++++-- mlens/parallel/estimation.py | 5 ++--- mlens/parallel/manager.py | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/mlens/parallel/__init__.py b/mlens/parallel/__init__.py index c1987831..ae1528f7 100644 --- a/mlens/parallel/__init__.py +++ b/mlens/parallel/__init__.py @@ -10,7 +10,15 @@ from .subset import SubStacker from .single_run import SingleRun from .evaluation import Evaluation +from .estimation import BaseEstimator from .manager import ParallelProcessing, ParallelEvaluation -__all__ = ['ParallelProcessing', 'ParallelEvaluation', - 'Stacker', 'Blender', 'SubStacker', 'SingleRun', 'Evaluation'] +__all__ = ['ParallelProcessing', + 'ParallelEvaluation', + 'Stacker', + 'Blender', + 'SubStacker', + 'SingleRun', + 'Evaluation', + 'BaseEstimator' + ] diff --git a/mlens/parallel/estimation.py b/mlens/parallel/estimation.py index 0d551323..1afb7e1e 100644 --- a/mlens/parallel/estimation.py +++ b/mlens/parallel/estimation.py @@ -8,10 +8,9 @@ """ import os -from abc import ABCMeta, abstractmethod -from time import sleep - import numpy as np +from time import sleep +from abc import ABCMeta, abstractmethod from ..externals.joblib import delayed from ..utils import (check_is_fitted, diff --git a/mlens/parallel/manager.py b/mlens/parallel/manager.py index 55a956f8..ca2ae6fc 100644 --- a/mlens/parallel/manager.py +++ b/mlens/parallel/manager.py @@ -16,7 +16,7 @@ import numpy as np from . import Blender, Evaluation, SingleRun, Stacker, SubStacker -from joblib import Parallel, dump, load +from ..externals.joblib import Parallel, dump, load from ..utils import check_initialized from ..utils.exceptions import (ParallelProcessingError, ParallelProcessingWarning) From 92403c3269bded7a11367a0e00585227d2c89006 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Thu, 18 May 2017 10:40:12 +0200 Subject: [PATCH 24/26] scale benchmark --- benchmarks/scale_comp.py | 181 +++++++++++++++++++---------------- docs/img/scale_benchmark.png | Bin 0 -> 419579 bytes docs/img/scale_comp.png | Bin 384947 -> 0 bytes docs/index.rst | 20 ++-- docs/memory.rst | 76 ++++++++++++--- docs/scaling.rst | 67 +++++++++++++ 6 files changed, 238 insertions(+), 106 deletions(-) create mode 100644 docs/img/scale_benchmark.png delete mode 100644 docs/img/scale_comp.png diff --git a/benchmarks/scale_comp.py b/benchmarks/scale_comp.py index 04bca9c5..74c4b542 100644 --- a/benchmarks/scale_comp.py +++ b/benchmarks/scale_comp.py @@ -1,60 +1,76 @@ """ML-ENSEMBLE -Comparison of multithreading performance as dataset scale increases. +Comparison of multiprocessing performance as data scales. Example Output -------------- ML-ENSEMBLE -Threading performance test for data set dimensioned up to (1000000, 10) +Threading performance test for data set dimensioned up to (10000, 50) Available CPUs: 4 Ensemble architecture Num layers: 2 -Fit per base layer estimator: 4 + 1 -layer-1 | Estimators: 4x Lasso -layer-2 | Meta Estimator: Lasso +Fit per base layer estimator: 2 + 1 +layer-1 | Estimators: ['svr-1', 'svr-2', 'svr-3', 'svr-4']. +layer-2 | Meta Estimator: svr FIT TIMES -samples | cores: 1 | cores: 2 | cores: 4 | +samples + 1000 SuperLearner (1) : 0.88s | BlendEnsemble (1) : 0.35s | + 1000 SuperLearner (4) : 0.71s | BlendEnsemble (4) : 0.41s | + 2000 SuperLearner (1) : 2.82s | BlendEnsemble (1) : 0.76s | + 2000 SuperLearner (4) : 1.51s | BlendEnsemble (4) : 0.59s | + 3000 SuperLearner (1) : 6.04s | BlendEnsemble (1) : 1.56s | + 3000 SuperLearner (4) : 2.96s | BlendEnsemble (4) : 0.90s | + + 4000 SuperLearner (1) : 10.94s | BlendEnsemble (1) : 2.79s | + 4000 SuperLearner (4) : 7.92s | BlendEnsemble (4) : 1.53s | + + 5000 SuperLearner (1) : 18.45s | BlendEnsemble (1) : 4.58s | + 5000 SuperLearner (4) : 8.52s | BlendEnsemble (4) : 2.26s | + + 6000 SuperLearner (1) : 27.48s | BlendEnsemble (1) : 7.24s | + 6000 SuperLearner (4) : 15.06s | BlendEnsemble (4) : 3.41s | + + 7000 SuperLearner (1) : 38.73s | BlendEnsemble (1) : 8.62s | + 7000 SuperLearner (4) : 18.21s | BlendEnsemble (4) : 4.41s | + + 8000 SuperLearner (1) : 52.08s | BlendEnsemble (1) : 12.10s | + 8000 SuperLearner (4) : 23.43s | BlendEnsemble (4) : 4.95s | + + 9000 SuperLearner (1) : 61.70s | BlendEnsemble (1) : 14.58s | + 9000 SuperLearner (4) : 28.55s | BlendEnsemble (4) : 8.45s | + + 10000 SuperLearner (1) : 75.76s | BlendEnsemble (1) : 18.72s | + 10000 SuperLearner (4) : 32.71s | BlendEnsemble (4) : 7.52s | + +Benchmark done | 00:09:00 + +Plotting results... done. +Figure written to .../scale_comp_1.png """ +import os import numpy as np -import os -from mlens.base import FoldIndex -from mlens.ensemble.base import LayerContainer -from mlens.ensemble import SuperLearner, Subsemble, BlendEnsemble +from mlens.ensemble import SuperLearner, BlendEnsemble from mlens.utils import print_time -from sklearn.datasets import make_friedman1 +from sklearn.svm import SVR from sklearn.base import clone - - -from mlens.utils.dummy import OLS -from sklearn.linear_model import Lasso -from sklearn.neighbors import KNeighborsRegressor +from sklearn.datasets import make_friedman1 from time import perf_counter PLOT = True -if PLOT: - try: - import matplotlib.pyplot as plt - plt.ion() - - except ImportError: - print("Could not import matplotlib. Will ignore PLOT flag.") - PLOT = False - - ENS = [SuperLearner, BlendEnsemble] -KWG = [{'folds': 2, 'backend': 'threading'}, {}] -MAX = int(1e6) -STEP = int(1e5) -COLS = 100 +KWG = [{'folds': 2}, {}] +MAX = int(1e4) +STEP = int(1e3) +COLS = 50 SEED = 2017 np.random.seed(SEED) @@ -64,41 +80,25 @@ def build_ensemble(kls, **kwargs): """Generate ensemble of class kls.""" ens = kls(**kwargs) - ens.add([OLS() for _ in range(20)]) - ens.add_meta(OLS()) + ens.add([SVR() for _ in range(4)]) + ens.add_meta(SVR()) return ens if __name__ == '__main__': - X, y = make_friedman1(n_samples=int(1e6), - n_features=100, random_state=SEED) - - ens = SuperLearner(n_jobs=-1, folds=4, verbose=100) - ens = LayerContainer(n_jobs=-1, verbose=100) - ens.add([OLS() for _ in range(4)], 'stack', - indexer=FoldIndex(2)) - - t0 = perf_counter() - ens.fit(X, y) - t1 = perf_counter() - - print(t1 - t0) - - -if __name__ == 'sd': - - print("\nML-ENSEMBLE\n") - print("Threading performance test for data set dimensioned up " - "to (%i, %i)" % (MAX, COLS)) c = os.cpu_count() - print("Available CPUs: %i\n" % c) - cores = [1, c] ens = [[build_ensemble(kls, n_jobs=i, **kwd) for kls, kwd in zip(ENS, KWG)] for i in cores] + ########################################################################### + # PRINTED MESSAGE + print("\nML-ENSEMBLE\n") + print("Threading performance test for data set " + "dimensioned up to (%i, %i)" % (MAX, COLS)) + print("Available CPUs: %i\n" % c) print('Ensemble architecture') print("Num layers: %i" % ens[0][0].layers.n_layers) print("Fit per base layer estimator: %i + 1" % ens[0][0].folds) @@ -106,25 +106,33 @@ def build_ensemble(kls, **kwargs): for lyr in ens[0][0].layers.layers: if int(lyr[-1]) == ens[0][0].layers.n_layers: continue - print('%s | Estimators: %r.' % (lyr, [e for e, _ in - ens[0][0].layers.layers[ - lyr].estimators])) - print("%s | Meta Estimator: %s" % ('layer-2', ens[0][0].layers.layers[ - 'layer-2'].estimators[0][0])) + + print('%s | Estimators: %r.' % + (lyr, [e for e, _ in ens[0][0].layers.layers[lyr].estimators])) + + print("%s | Meta Estimator: %s" % + ('layer-2', ens[0][0].layers.layers['layer-2'].estimators[0][0])) print('\nFIT TIMES') print('%7s' % 'samples', flush=True) - ts = perf_counter() + ########################################################################### + # ESTIMATION times = {i: {kls().__class__.__name__: [] for kls in [SuperLearner, BlendEnsemble]} for i in cores} + ts = perf_counter() for s in range(STEP, MAX + STEP, STEP): + X, y = make_friedman1(n_samples=s, n_features=COLS, random_state=SEED) + # Iterate over number of cores to fit with for n, etypes in zip(cores, ens): + print('%7i' % s, end=" ", flush=True) + + # Iterate over ensembles with given number of cores for e in etypes: name = e.__class__.__name__ e = clone(e) @@ -143,26 +151,33 @@ def build_ensemble(kls, **kwargs): print_time(ts, "Benchmark done") if PLOT: - print("Plotting results...", end=" ", flush=True) - x = range(STEP, MAX + STEP, STEP) - - cm = [plt.cm.rainbow(i) for i in np.linspace(0, 1.0, - int(3 * len(cores))) - ] - plt.figure(figsize=(8, 8)) - - i = 0 - for n in cores: - for s, e in times[n].items(): - ax = plt.plot(x, e, color=cm[i], marker='.', - label='%s (%i)' % (s, n)) - i += 1 - - plt.title('Benchmark of time to fit') - plt.xlabel('Sample size') - plt.ylabel('Time to fit (sec)') - plt.legend(frameon=False) - - f = os.path.join('scale_comp_1.png') - plt.savefig(f, bbox_inches='tight', dpi=600) - print("done.\nFigure written to %s" % f) + try: + import matplotlib.pyplot as plt + + plt.ion() + print("Plotting results...", end=" ", flush=True) + + plt.figure(figsize=(8, 8)) + + x = range(STEP, MAX + STEP, STEP) + cm = [plt.cm.rainbow(i) + for i in np.linspace(0, 1.0, int(3 * len(cores)))] + + i = 0 + for n in cores: + for s, e in times[n].items(): + ax = plt.plot(x, e, color=cm[i], marker='.', + label='%s (%i)' % (s, n)) + i += 1 + + plt.title('Benchmark of time to fit') + plt.xlabel('Sample size') + plt.ylabel('Time to fit (sec)') + plt.legend(frameon=False) + + f = os.path.join(os.getcwd(), 'scale_benchmark.png') + plt.savefig(f, bbox_inches='tight', dpi=600) + print("done.\nFigure written to %s" % f) + + except ImportError: + print("Could not import matplotlib. Will ignore PLOT flag.") diff --git a/docs/img/scale_benchmark.png b/docs/img/scale_benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..fea68cccb3e54d3ef33d053dbebdae8b1abab42a GIT binary patch literal 419579 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 z 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%0AUA2R$=YC`}o4-@@C@mc+$|b!Eph zOf7?O)o8=Dm<`r-*&TZsnFZ>sT6qIR@)`4h(a5JtUpvSo%$2C)GLl#Jex!QY|Ixoq zboOK?N5U42`@wv;E=W*GUx6N)8@zcZ#pEY=Zp8fHdC6ggv`1Lh{$fK!e;gM(yEzt< z+#b%!abDWH-!tU1&(qs1^z$75+&nn!mgw|BZ~;!Ak=J!xMZ~&(9C4Z?jR<|kOUmq$ zZw~^U5#xq$tv=M8r;#tnAuPLx9bY!UbT4hv*B7q`E#A>`Z-r^ao9HWT(%lMEs%WM) zpf1|7zgGTaAR$p;UGBK_NCg}2Pks&ooBY?U46Tm-0d{~k>_+C=0e1aa+s5k8@ z`LOxAHc18;d)cFJSRXD!DZ5P#iInz2j#^|sm{n^zEc7rm`ll&F`SyFbiYcr34JL3PYls=%pgYCY)M$iHRTX3r=`jdhnXb~wfjEw}-9VhL-;jWhh zNf}goSvfay)H+UYLjY@?N(v@q*;`I<>30W7ELc3Qx?qrtyF%H^!a|ZRXWDq;Up=pa z?(_4Z`zRV0bqJ@mZt)$^4mGu7cl~__n31dRq=aRuiT-zF33y8NaCo$z?=~zavnVxG z1}7&jGVN`Fu2-W7dD=+*;n}syJ|Bt<7}2X}HU%)7y0UN4T?&Froa~shKF8%Gvw(I9 zF(E{)^l;m1l~4x0Tj!&hiE&RFt>$Eyym5qx||$ zRHN53OMV*$lb2z7k6uu3Zw-<#YMn0f^=)-lwIaJ=(wVulq_bx8O(27W(u;GR36fb4 za(x4%#9K<+#0h zUNF&Yw;@M3oaCb*1JbShPnb)VFjF!BDZBu!#&*CNmO2L#AFP9gWszWop?5r53LE@; z|4z0;pN{kLgYi=Z+ic8iJD0tItA@}Rkg*DZsy(yoNuZ<~*@cHHTo!q%3YNI5f)B3x z`ua&KUOG;=G>d3-$1|7@&=2IKSKVzW~x?;i(#gSOyW>13GDcf-s+*f8p5S3wdBsy zryKqz$s)%pOXEG#j{aR16>VUghI{@}$;I&Z#Z7Wy0?Y!T&GqSt}X z`80YeZd361G~61*dY3f!2J@~2z7ib-yE)`{ha%@{@M6pgeYg1tGgbWf98aLkub-AU z@}=FW=?usHF-H}s^>22tqJfh$sXDFxW`@G9~&;&s#P`V zW`e6IUw1T*bQ|CEMAv3=PE_3+-or2fU1}<>!_I^-@60F2BzZ`W6)JtD>$MaUT;P4g z(sA9vJev~xu19EMl-yji&oUp2#p-jo>9wlKW>}w1g3Hs!?1Hn;*{$GasB}OrILJTI zBQ^yI``@9v=FM&zsb^S<)U8>PtI5{x0pqbxxqdGA_}!&XGvs=&Sx8L4Z1S#KL(%*MI^cV9ogS`hSGPMzMwZ#c<*#utv zBQ*Z$%^eTle);i_pM3xHd@2>=|Kw%U1x=UM$=%_2^Ng3l8P~O4`0E^Yy{aQqsD_J& zBCQ(dJf+at$x^Y_3+i$QK(O57So>0VWI99C-fN_GM~Rny3N>=fxZuJyl=t%Rq(yAF z#=|}0*GL%U8k*>6>NiMJ&@n7bTTV(+R^)-0vx>gEMu?yYFYxLNxi;%Z`cf(W0<) zYZ!15GKlgn&Kc>KNTg)R!PzhWA{M)O=zh~Z+@^}+n+ zmW*CxSW#>+Ix24O0WaFiKlnE3&at1_G3;XB?<79FnAq661q{_+vR&XWh&A$DX*j^I zVb)^9@FCc*ggV()G$#%cGS#-R?Ah@#`fBvE0%`xtxjx%`ww#ijm~29mH5)@0wF@f9Z#$;R^`4aQryN;wBOG} z?as9TJC3NN)6YdDwk5~LZ(0->*1V5l{QqUW;+4>QMs(xgJ=7~McmuNuL-ruqk1dCq zCHefnW5uxUJhgd&Fl@SLt)jJIt&CLRG<7rhV(WQeAy(V+M9}^{o$z;xkR{x-7?Lg+ z`YWjcz2Y$QD=sGPB+so~LUlK5@qUNAZpIlKd428mz(j@s$WQWviHp20PQ}mAluTm2 zV@;A|tLnOCz00=i3<*QprOf=A+AmeXyxLmYdKTx+YA&5sO&M21%Uj=CC>XMQuC+s7 zPdD~ep-i*sP|3~@;stN5dm2v&`~Vv!$HqJXSQ0)8bFndXFfik;7n3*Nr{{3H z|2!In81pE84!MY<638hJQqc9PE)=k|NE>HZTUV?NLN0o>6Zoi?Y~4!WL^m1!#O_)Q zs~U5c`IOxM*sC78oK@IyT1DL2Q2f@l%i4^i8#$78edbZERD_Xk>|n?>1GAEhJO8Y; zva7M?Joh7Loxgu%vMWe>)5^Fix8_!!x%(!S)g9xE1C)0?!;wOXvBr7678V3qF|}Cs zG(yiq7K`zT31l9_n?^sA)rbq`=bYv=0xkzEdaPd`-9NMoskybygpyC8njtt?imnsl zXer{+G$NT_k%sO~7vpg3j(f(u5LpTrLnfBr5Kk%z6qq`};n-z)D1`8_WvurEQG|+N zZ~J~LCMbp#UiHcuc%ZreKu|k1=$G`oE(REoQb1^oxj(3>bH%PI@}fB`M&g~YXib}% z5`ST*i0!1l-?nsv&o;}CEM#GdrjhsTf#751Eq09D%;c7&i`sU=nU#T6f-~39Fs!?H z9Ui7f2*7e^A7=jduihMv@HT5~ziP1Z%s4nf(P&N3#TQ7I{3@0e|K|76#)WMx_m4i1 z@vn^@YEiX3)Ix!Y5Sb?uj}#PzFO@qb!|U5ilNQYjD#o@8jGeX3%We#bsuXlku{_iA zDz%QXFR0prBUrX3IOmnmHcY-R^SVA;J06u^PK)CW#b4xwG8isM`R!MRJ$SKL(~i-9 zh}AzCNKQH)pcVqQMP6EcMRWS1*ztpsT||v;zIeGKehs8xvn=kQjJCYPf!XB-4!lN+jWJ{ z&(AwLI-H;|}HOQ}Q-7Lr) zO1vnmbS%B1W>B;J`U4-|q`fmOuz(3Cjs=7Ayuu=9TTg;cCecRAUk-XtYZ0k|3Gl;mZuRFQ|W*|D3cjjj3L^Q@GxJ zaHkA+9b|9Nt@1~|>Z>bmGpM~g^RP?TFr>!mXZ91%-So|5)GPn=yA@Z*f~8zd20gWE z_}$`rl-R#Kz^`-xns~?6aR9-m;!)^LC#MO6i<7#F)lU?1bbUITaqwV!w^5`ypPKceTmFq zm|ygokqO-XXPr4&M1jQF72}ASV*|D|{SrlPx60t4CLgPNP?Gk%^ngzZ4%%b2@|yg1 zp`){tib?|8q0)c~6$h_GBeOYiSr-> zn;)=^DM-kUyjb6Ax}~PevEH6#)!O#Al5|7EcFJLvk9%=e)IarG#1$xP?J5-*jOW>U z%%^(jnD`6|gyc|qbJFFgMUS4uFvCd5K{>)HZSysF6@FGgLnx}hy+?xj;)aGN2~&7e zxzjS7K}gIKUp~)XyD+56iEAZ<;fUzmJ34kEnHLFxEUbPn55JO8uQnBKqP{zfH?dK1 zh^uAsNm@0;IR6s}XbobaP!7d&5lwIKK}2UJ^0x2pbpg+%omPq0$f(2vk??s=;*H{J zkt9M7mXh;riR`I;T}S^ssPxAc>4Rs{pO1}o6v~);y%u%>!{40e!H%QkEXjeFLqEx; zpEz8!_s<=eD@u1++g?jaOPirW2`C?mgC3G*VFu1*=q4&*^(ooW$q5~7odP=pZlE+4 z(tYy>;`ozZSRJ?bjzSBAawa%9IIIeR#<({I77rhFnst}b@)U8@V6qY@08m+;+!1K6 z2eO9>o$Lls<8s6&5bXCzYkuBu~3>QZ;hg`kFOD239jI{YaxSBs-2 zY0&ONx>XdIl2PRo^u9#h)3B)vP{9?R=`kpX`c)JuSkq;IZmUYiJSGH3=;|+qBtOw! z$Z4jw6s*$JHOhe=9okok8cUhgUr4GJ%^M7hv2HYY;P#>E+eH%T&&U4|!ze4I zjA!aR*p`%?eH_uwF{-?>%eku{O(Gbv>Opmk-L8{g;|=e#9lc;}ZOzE@K!nmIa93dJ z$Mw<~*%iQc__{;=a~(A6G(x1+?fo&R=M(S>)usBe5hM4goj8nI0iohXPLi$@ciXagSz~RM^hA zP?w$UnsB*RGOoP7F0fMk{p@{Cd*bm2JYKFKIa|#o(3z@^mX(0hrysbWIQx9}U`~}t z=Y$(jNmK!$h7#rCO$FbCU6n+ ziSni6`cdxk`m*Bwa6^vs%c!5fbjqENq})fV50jc*_^w{NXF9-T7Kxy-f?hAgXc_|7 zan^NmBsH@Z&UXR6Ck&|Kxm8#Zb1txc=BGUIJ$ew)DT7*g3?1Aaxu7&hGH=-R=8bX_ zpP0^viC}1G8F_y?bD9w&ORfzz;G$hD50)+Mf4-cw>o7~v-pHBNFLnf*Z?n-lHv7ae zB%dP|nEWQ_2g+z%UM@F2K2Cr=&9|;abfJhTQlW}`Kmw6ff$XrI_JF+5DwH2>AhFtnvaL~B z+#`yCfdOH*@sjms&q|+|59t(s!7xp2IgeXlL^t*+w4>44B%CXf9;)IBr1W#`rYsnU z&e4e3_me!5-{M8ABVwB#1&d!NftMd0zb)ApXr`kb8!ssIpd{hciC$2ya7hZw<#_1d z%A4A5MA<6>AKr{MWCJPmpz6%Rq9SYY-RL{;_;7W8nJisa*ZdhB@TWyBw-2K~cD}LO zC65vmP)?PB5rC`Zsfhez9+8Qs-Y^0rc3$>nU&gR*&%ANv2qNYVq|_1%j;{#pt^EZj&7&x zq(1G}*KywPVGZ5b?S(R*OwFvHha=CrNmBaq{nG|!-zgiRBZrzfao3dx@)&9MLT8A> zsA3|}1zH@xO>wucL9)1?hDxR1?+`Ts%{m@TTl+A`0mDa`=l2^Kn%+4qyHaWLvLF%t zX37Y;^b_FHU#iMYD=HR|a1muAN8hpzu;K_l3lkkv{(h&jKQdnxVi7~4=3Frl2;$}A zAVrx^Jyu_HGQAyax?Ct18M=SKus-{7$6ymBka4N8q2ttIxu94BeMGx^jN-raO zmZbI)ocJE??^wB0G)N@w`-da+Y-*kY2GDj2iJh#38;}hjNC9S(QrWBj zkQKO=59;*O}MF#&kP(o@>G$#bDNY1f-|*pkmQL3TmaQ=~>W> zh+g_>34w|ouhyFF!I#+O_ZvMGDj|Zug$X0c$%MO1CaJ!vESBNlI)PH&mtF#E8S zESwImihw+Jn#ss?UMJdSpLYqV*T~+E88vx>gEWnWq{8a1g6F)GLis~a%B~&*w;#)Y z)B=-oT_lVO1+cQHZ3(D8YDC=tDs$D8=;-LkvDB#RWuFA^t8!{STwHWjZ_O}4pEEiHg>TB!9QUsz##i=B}&$6j)kus72d&MxAUnDVlC_C0^ zw8eB~an22NK(6cbm*wd|@9Ld0U8oq}K5rF_!)jniXzc3JpWCGuh3rqZgW@koRy$uL zCh|ginhKx_%6B!diIno(VvJ{L^;9~)-#hdFZa2$y^TZ${=M1t_;-HS;K{<|WJ79C)snL)4FJ{tk(B4IrcWS}8)w z8+k#&!NO|!w|7j2_UlQc-}$G(&^8j57a0yf((wcloTFk0acFH2IY06B>(^-@m;Njj zQvjLe4vq>4dI1hDPQ0IPVvJL3Zj-%yHN1jhwIww#+bMeZOXa9{4^xMqBzc( zqIH&Rp+pE`*vFQ`S@Tt3bz#@zP_G`;jUAf!Qn&{x1;SI(3KK`9pQ1~v|s)zS6+QJU!@@L)+3UC(1F?wx57Y!TjCbA9S*?r+R3$E<=r%L=k?GUu3S% z!O2;WO3&};h)y5h((BKO$0NLl&|Ph9ARjkMTLVmI;{pKCI+j_fUI~B}*ZUuW2Byjy zBJ`r49bN1k=A^LPg$(kFlhqC&S+dyPrt4M6Q# zriAzEGAicNoNW8_i5g~MZtht^>*)C0qRMWpJIlxa zv%eWAtmJdb-Z)WECQN&XKXIQ$ zU3%PPCy7+JUbDkZxj=HKxJgAP_K&WG5C7#%Bl^E7!(Tg2MQP>nuuoQGC%F2|zb#qu&msSYe>Jh2qW^rC^XOjGG`NnX6~wb$1* zdwV)`>q#y14EO@(kG-u&!{VstQZnPF+f7D(S{L(+9an~{i8Z1FD&v7ji?mlR7 zUOd;*rlbdlT{ZjK1D1UJ?jJdP1i0{H*{HXW;*{_1Sy%fHemmjH_2f1`m@}%G`uw4w zqlmjD(+JEJXzams+vc=;!u6FXgMrO$qsar|kJh!AQ%*)>grJO4-0nQl8mYlS%S;s# z>CR3oV1)$TRRJbYp_|h@LF#w!R_>Fx~aROya|pE3<)1EZ~?8pzG+e$onD5vskVhh1qwCR|N83}L>3h2 z0t{wKwhpCM@^haw6k^rk0w7qaiEHEY$(ed|0i9`Or##_3LG9Z7J1?)BY8^W529*WU zO2N4@B31qfS4?-ih1{*&2V+m~?5y!Txf|1V5+Ywvl~dElHQ*M$HeU@yc!_E2*${F z?dj~h3m2I_-1KT;%Q7A@Z&o2+=6PMRT2XgYLp`~h5sCX$HZxHZVPsXs6_eVe2>?vv zlTrjIJwkxe@v|8Azlf(*{4YmJz6L`8OqGR{USxiwYCb)ABj_`mxj5IdW|qI(&eOGJ zi6#fml%b#up}25S!ThL1>3X=eO|i}eBInoiyc!66-A>`HL4L5ex73cQRiN;cSiD=J z9|xzD)%8FMl*bg0ER@NVWS3J>&24I`pufL=@ko&{!Vy3(%(W-0^F@O~;#I%{m#IwkN2imRprxPh)CH=ND+gT#JxzS4CjPI|Pj~ zq~aJ+d-#&Fr!YZWXEtVJRJ~OEU><(`9-UNoaTzFt`8LsR2{?tz0Kk&R09Y!fPLF#( z6~NTHAm>Vf;amkClt|KE@!Q1}c_iS(?}(MFz?FgsJL10IiTd3r#MXr$KLRw^uW9;d zcIaW=SiYr_bmt}Xr}cPsC#QkJnHdNt=8J4&Noai5^k@%terVeA7q9^DT~qNE#mEH# zh$aGTP!rR&NGEhJ{JBT%>+~|>X3E6dJsQm{1S6)(L9PkbRsfX4H&8`nN%8DS88)C6|pIJ!9qHpI*G z$l^?pb~jvz0S1de3e+Xrb3-#P!-a7&YMX*6>K;*`RX3`bdxBvUtY59K{JOSck*+@1iQAF_fJ1> z^?U^dL(oX^O}U)WQb((McL6_u@br#;+B%3^l(g0n7#21;j#r!aQHh4<%CI(Hf;(M~ z(Oa->SD@n>Qql@YNyf?V*&Yi^Qlh_b(+Wa|(T1!1%zfc|AFlh_PRUQfQ9pw06+Dp& zTx01Yt2~f{;w}#j9IKGe4oFFTIvRcS4R$(Phe2eP#vp|^+&dtZ(I4GVaVvSIggR?xU{ z4z;qc%H?WmYTST$UT5wxVx2`b%=_!0u}nB>b*H&N&s3ayt!@edDLwf(z*Z1@NsGyT z^f~m*X-=FUii>#GnVQ<`a8{gpXW-j#f`ZhU2xvOPUHYP0lmR5rGEY@ z2`u<5VrA|JR7T#^V>qaODm4pYbEu7=+wycdp6Jq|V{ZEX&!05w4g!9JXshO2DM+6I zlj)VY$43beX%dI#=-iX~uAlE8ghoKlH5&>o-dkw-M$VVj5i7ki{#*+0rfjEAKsp6Y zzdV8FSe`)0+_jA*_-6#_)Oq9%lA_z>6>9)@z&@Zf$8yyoG6U5Jab7yrd$rD{>ut8W zxdO=e2w4X+FQ6+}aLv3SgdCTi2{(XXZUPF@)gObZ+mT(GIzk7tjmK0?-qB+TF_x3QO-Ox>yIy%b?BE>xjOsSdf8;*WG zT}vUlYxXmsHp{9xlYg&UfMJ@Dr_f0di5qd1JYefCbg5`b5sO`T|HQ+i!jN{h%Gb@B z`c`t^&z_2VFzh$J-{>+2m>-KY_($B0H;irI>`Q`tfD0n}a~(8bVwI58SmdCYC0s5b^kBa+LD z5OR)U7pPet#4$#vCyIJkCZG#?QLEhMgi3+)e?xq6M^qDEu8FU)F_e;0PrIhrFnwO6 zXV#T_Bx6R@-u))-L;dpjlVa*zD2qg{n+*qG2_&`Dbx{9PBdS@2ReWA92a*cPs%uds z3B_@tzt=%IXB#BTAx@iSRH}$VD`f6AFM?r7^o%zwRjM0Q3 zTera|&UW~|d`tJ$un4>qTMf#Bu|E{U`uRJ|*nm9GVh)PeEvmp@1qV6?6~Wh;9di0~ zmGIe*(~28dcMw!zThJW}-B1Q1%wyX}Rsf(gg*IiHb)CQpzOI(&)~ue&$&{47zYQ zR~GoPwNZ;EW&UV!O9S2Z!Z!CB7i?jZkyZL22p|{=1S$pr!iH5?TT@7%f5DS{S#I*u6jlNq+_%Xg#Ic{;@tBpVh3X_b+WP08UxPo13Y|LHvMf8sbs* z(Q?unlw~f6pe&y?DC-{QImm^>}yDF%}U&Eu)Ugh-?w%IplrQE_wd^ zFygdCEP044)2(~dQ2U;3fe{{$NA$)Xhzb$waS2jv# zfLpwjs}%PiF)ZTPsv9}5*T8e7$nL^Ce%-!mJLsq>Kr^L8q9`H_Ql?b#yx6`uB*>%O z6lYCQkQb5bp>5)Z^ngZr_6dZ**;Ce*N9%EqH z$^x@4gDn+>HxSaly6WgYi&{N@et#d4sUR+O)Vx=x)XNiPc7%q8q9%yo`JMv|DHJip zy8#vu3#u-&w3Yih@yW)iU}*qVUbXAOMb4B|r7ulTG<#(YRCG3p0UQ$yWGVpi#A|RI zTcrXjbZXMwZ2M7uY5k?x-JUucV8P8vLPsyuJy{m&DwgmeiVKmgM7~V78tX;;W-xgq zx$CLE(yPTMzT|U9%U2E7g0F2?Lj=2NZWL%xU{&=HC7YEXtjuT^>~tIVT}CjDF;eG$ z04&`RdR<%2Mjuxub>W^%2vW7P$@;^!btknci`VqDG%KAV+-~<*prj^WbYD28j~w2Z zrwb94>sXfKw|8gKY;s^QL_4%I{#8}@%k&y z11y#c`4u}VZFMw;)2gZqBqxFZ+iow&P6V9s-x9@qPNkuB;6G-YoZ&U|3pv|cdwsdT zj}kB-f!BvX+4H39=;@)c4I<6S33>*oH z*jNeHsJW2Zt{b`$oK*u&c;rOo&Ao65kEQ&s}}eB%+T=$fB?IbJei^}zpv1H&)K$nq(moG5y-4G_zk`nWHl|Ev(r>pr%Y*ZmQc}63fxF+Su}y#NY_Y!3>`q)x?h1_y z)qbT9KzM;nVBK&{uz3DEBNBKc_n6N3wh3SBASJINbWNU&i4)fL^;2cpMeP=?lT8s5 zl8J{Cc3ieRCaKkIZR&EYHLPO>(i?}<00w)4vRkHQ0jxk!0fzP9sSS$NOpjw3pN^2$cK}cug!TOAJJ%g0*wJY|SoNbh`rs$eo zOYj=|;b4Tth?+SR0w{Xg)WPs;S9C8#i(CNSGL9@8faLVC7O~mV-qD_DTH+w>3?&qrBQ9nL6hGm-DA*XA zA@KVScl&>GI9T1eg$D0;fMZnb7fietvnUWt<+*Gp5BvQ=DS|jOu$K2)uUF@2UwMWr z(DZVmep3l&qh^y=rkM$cgYKPMYId@|v3_G{a32~8#~|Z#?KXb^iqrM8=bn&` zcK}aJ(pn&9rTAjz*fonv%bGn7*C5#*xx!<8%!B!Dhf?gDZf%3{tZed_bx_&RT1+J? z{Ujtd_b2gh*Q_9YJ*{CTrC#}WO+O>`AS;;pGAqm9wuQ?Kj!g&CW$szLN)Qfoa+zJ= z=rkD<+{R*W%^i36zTYYof5vAp4*;{Z8c&&51Ms4}#KD!~GA(~mNpolF%R{~LB4^Ml zs4=aAveIbRGbG*9Gc&vbKLi=m*ONDATR<*5CN=h2+cf-n+M)K3{Gqo=*_Qj!0t}$< zPtkK-C=Efab1_rBr74A)-HtNF4NJDaoVoM&)qB54{?lJ5WW~wFB`F$d}1`)ksyGpemQE;at~@G6wc_Nvevg%J)~ zFrltyIWn+%8%BO#-qp=~4NSQ0MDg+eoUgcZNcUCk^Fd=5>_6?pV3Kw+4f8>Lz*2B$ zkHohn?NzmzE}7j7Vg!s&#oAMZ)M|-}uLE~7SPDocUA>)gr6;~M zU2Q!dBqZRWzYEj%dM0KA_{WeA-=6e`rUJOBg;z!qLLOyPi)edQ%X)I6tWWCAMEw0g zBcM<<=sf-CISghk7eMojpu?lZWC(};+rS0#`&S3@7uZ%;_f4t?$U3=tqBpT>hMJaq z>W-+Ai^?e)3n;8rk}FhnVXV_Wrghpk!mVnj8|FCAHV^3Xz`y9?U5vtpd*3W4l|`)W ztBY5P6EglEVebLfWVW>pGq3;XIb&hYv4J4Wj1*~tAYi0K4})|NQIXC_lNwC~q~kcs zu>g|L2|=lf6afJvfuJZFN|4?Y8A2i*0t5po|9%q25w6>h&^`UvHOae(5C^wm!bzfyo(A z%>9lp$NRcWy2tm~a>Dzz!(E-Z!FZo5E=uRY++j{V$7??iM4ffpCgC}9T+9=_!<*p4 z8@X>NWG5{4ddzuwnGiuojjT+YQPho*s1-5FK8Ve}PsqCVs4iThXjE`m7(H={snEO<<+ zp()t8BaVNcYWr>Zapv{vsL^*UXccZxC%+~;)D=p#%ae^xsRfkVI|4wc6Ys^Dbx&mP z>%tnp7weNBl$B#Wg%c5rlV4@|#zdLKj=(Ql@K6B>Q)N|Y_}D8}3ybnn&I{eOcy=Sq zOd2HGnF`{4y2jZ2W*E|g%6}Qg*TFEBGSbw~p=oH`$%4n}L!Ai>wGC0XX*|lbN^C*3 zzpESjG@KpMb_*q=f(%3XQ1t44Nz9kJ;w2G3EOsYbv%+|k19II1*!-#*#?)+&(7TBP zYVBj)F()1C>%Bc9)5cC#RVge6m6PB88CR*IcmEeZT}Qg3%md~gtVPF?`_}x(X|D*WSV&Ncx*t;3t~6? zht0-1(I1Q-W?zj$$=TGSWt2}Gn0iakRxj68PSdG>Dgz{7sqe%VdE2W+I&A?i&jFIS z!h#2dx^XrXs8)1>uv#JOu}8!JKymo{vVPtqsL@9 z+~q~9q=Cb6Ku`l~sh2-5l%Kd?vqrzm-+X%ry5v})~zXuWFWU83i8txtsL$16o zfW@mn@-#%LcK07t@e^4TS7uMQVc?HcSX~Y zij6QikJuxCa4m!28TpPKqcSVw6r3e9W4{;vsV;7EW+%8jO;I1rg?PBJ>yFV^4(GG~ zyBpUyG|VxI$pg{RSE634B;cs#DZQ=fj57ND4wV^`t{oDdtKy^i-XIn$u(jkk4`hdn zFsf(fE-WmN6Gmie%I7Yi`S}|h*B; z5lwt`l{Vg~8*$O=`u+T;G!Ug762uloc^OZ&sN;-70nL(3`1zTBf*`zS9#(3L4aptC z%^JA$TEJF0&S?Eajdp|V=h~G|C5_}I;-888=iXO~=`|dDe9+?S3@D&aH1_X zL^0p6?gpuk0=IE6P|tWdKp$RfQ6+)7n9&yD>Jn;>V}TrP*bx`UK`3?^1PdZV{P1sP zalgpV2eoB17^smv9!17B)}B(|^QDu(lR!M*?0!S3jEF$?$V&>> zwPvkN8ytReu3|oj1mFXI-O|hd*wu3K#GT~y?<6{Wn`Hjl2qEEH%ffk6>k0=gW;(qo z_X}%(Vvj8WcV!17^Brjb83_uEkg*URVNoiDoE&&%aAizdx)GNUbuTEBZcGLsKsyq>RJ+Jclv9)muZph_`0s7b4lj`wfx+%$m(M}I-79vvx@YUinkRBH zivE@}J(4mr;R*bBA6uzoPBM&=-3u$}8&_7QL_G$+O z*S44UM?Qfanwi65F0Ru?=iuN$ z8hYU7Kp*`AT2i99L+s#!%;R$G5?VWd{YfLcoS#CNLwir7_RPD1Mm%SRM-Ysb`9yrf z`c*}?)%_|$30{fVb2&Bts4D(DiRL-6V?Q#FH?c}Ah}jQjXhPT&N$&X^&;PR6_~THyeI@TKfHD=9N67i)aK@(k}}^y+i&9P z0^||}E4d2=>~m3GdTH~P%sh{r3@hhA)Pjf+7R#wg7Kbr3taY zp$BJC(0c+WSLLR|kr99@jErBj;7$0`+{*jewXNvB`}t@Y(1`ngYvh*Z!>>HXZbYV%io#eRhB+l)o`hTPFI&agXeAgk${5W!b zO+a?!=H$y1_)fKW{L5Os4}FY_U>PL%V%M&Ejsz}RgpI*R_82VKor=QHIo&L1Gme&fKUva$fVkB{+hynJ;co^Yf#6GuxAg8#J7*2ndJoLlA(; z3rFy!jj*WR=d{+qLl0IeKme{t6!aij>`))A`L$C8AxoLhdZ5|PBy2`))-*N#44+x7 zREP@>wms&b#4t_#9*Pmod&T&wb<`UDsf?j-=_=IU?e+C@^lWl^bl9I0t7;z+Md>v; zYAfkgKGJFd`@v3wcx7?hW6{f{LT`WQ$omDtsQ40aUug8R2Azy>J)iL5a$2j}%+3|u zz|Hjjvi<)hq2(;LJpPrnKRF?90HWF*dKr162Md1rFCf9XD7A}toz{Gs50g!m?*wHp!j~~`^4sn)$O&-SAl1;=JBmd4fmCCU z5fMkz@M=c^>PtVc_JjeJPfP5;kK)FLSU9^uGMOG0tR6A7X@-Jk<7U9Zv~jj%oxXSA z@G}Me_q7p_;ey??mmtG!5j(OZbAU%r##C}iUlxcPa7C*;9pOTBt)C-ehyjSU!N>+c z+Ag19F3__H#Z@P_Mp7z{9d%8O#%vBzew=&pgA$P$RnP!|m|;_h6TR-KrijkjQ({efZ7k?Rp4`ir}^b7H(4={r(e)O^bDX{yAo4(ei*1>cl!I zQpD%g*1%KLPUSG)FOUU}xYPML3WWI?Q+pDCh?5t@FuAwwwuf!VDV^zXGgMrE73p=3 z;QEl}3*G;jOb{uqxu&&M0{c8C#x<;EauzL&!vcDYZhk=wwxS*RXP9cloW7W1Xt>3H z$gi<{Ko$j(rl$)0k0V&u5$BwPeGErveF}u$FPN9i19H6Ikn^(`K>u|Pp)mR8N-X%A zzSj!+U~Ue9$tCqLcEt)D0B7W*57Hc3(n5=h+Q+;cXR?1qTh52{BKv&;&+QiT9_xq( zo*#0JMB*jv=*p})88PUHZh>4P({PCmq7f-+GmaIQA)8wUE@+u~N4qnNhV9%z1hH6R zmmN`k<^4iZ^vgzAaypUPq`p&7(J{ID-f$AZcKib235^&w^z|gd4z+H##$&v^f{d@}wLeB*n^ByP%#nr`8hZro3`B@G*ZrfxxWz<0t^L zx~i$a!0eegekz8t6bBnshFR;k{r1(;9?oL?a!(T6p@yE=r~B~g>eb}^5p78zAj@bz zm&dKwwboP*lmc2HQLHK!0aJTt74&f_L0?B`ND4B7$*JE{0*O4=z6AYWvj@VTq<#dzz#NkU}s-!skm{`cGz=mze zl08p}2Z+D>WJNE8V-`96G-T3dC#|3Fe=-*|5kC{W7|u*#wMG}zH=sGDrbiCy4bm^Ym)+!%Z zJzf=vI}ls)JS8?Q568wc6g|F5V%l#~TrduB?7rHG8&KdbU1?mvLFspEwHr_+0u!bn zzTFTj;ImreVt{#eW^+(6jw^#{KM4%`;Ve3v_zwuW9Y&IPzZ#DWr)q|W1L*!~&GnOW zE=I=6K}{H`tv|;-hpL@|=g3NdonqdrpDbWETeBz8HSnwx^j+lw`sdwP-Qi(pm>Ou{ zQVr)?hG54oXL}$7xr8;~T$p9IZxsuze@e!x;HT#;hGh)B*qRCqUMO&bm(JiPnjdjr z)N5wc>eFuVZdo#uOFKIi%a;v_3zB~WRmNvxt}KhpA?8NU^%X{4TYC7u%aYunlhxpT zvk^2BKN0bAj$X>5j}6BZqB;0yQ)Bc}f`5?H7U*R@69c`3K9hCDL4xu0++jm6UMY>! zfd2mZ-9gBaq>=y)saQyI9j2rjOMkk{QB6sNErJ`3{a7G9Gjb8ufdl(-($KLD{>iJChiB>((qs6iJ$Q|R4Q z{6;5x1p@&`+{98Ov;dfT;MF65qD21X)lQvhu$XUpfM=MP@m^SHCevmd(7A9q!vcyW zxk=Y)g*mYXnT!&++%&pK$X5Iyw$eVk6J;N0bE!`l@`J=gpQji6Jdoo#=y|HVVZl>n zKguK7wUMo6{JezuLey5i5P<;d211Z8NcifAfZ?IEMCq(=9DO&G*ZwL5LPF;1IgD8bodG^9J zp}b{T=+E&V#60nCg*s+b)0Q^@&etQ*;mRMlqe36rUSCTkCydIV!WX-Ny0I_Obx5}B z?}?^c?%d25qYYA})z%Bqam?{{;PAV3&~Mv~xKslM{;UILVv?kR+?a(*Gr9~!PutJSeZ2xnu5-I_RUA{20q>MQS>9a}H1e4=e+-DEQ7B{T zxV;6B(1!xqzdJna*DXi>JS~QiyMlVhNoxp;$oV%q2jB)UKG}QWPob^iE)&&Je(Nc& z{S<6t*1O2hdvDr!U8nTBV%`fWO#B-$q}u5|R1XUt2pg_FvRw}j?S$|^La9rH2TL#KqkqD0&}hv`Z*=I#Y{-1q>MvO)&mqV) zyw&KVKNwa=)7dLo;&CQctrk1(npOW$qy4h|^UuIXwbaGdsl=x%oi>9(8|Ccix=OYq zbFHiAzHgZoG}Hvty`lwj^vfERhPDtzeRq40%=MS8HDv=(+Abj_R<3Gx2=g>UcB+ub zdAo4-2t~#iu8ch;9F`o_ZgWR9?{h2XF|i)aNi)>}%ggjd|F)#>6X6>o%+bE(5cUgofy9Ks)?CE(&ul|wB4Bt zv{bmw{VPJs@xicfkybg9!>pwMzdm>%k?+gg)iI2YTh&sS&n$Xg$q z{N7KgB=+M+Fs~B396%Lh^BpU??0-l~RzYy}Riz3~oq|5ie@pd9i)MkvS)Ox1*Sll- zW`r}V0RJ-Ixxu>2c^UTt%_-R88zn-%(cJf&Abp2gkof8cC+OnW#xd=eH`~0&KVZ%V z3WnlYH#(g6aerMp zNwxyAa8p1QJnJ?}C{3;dK&Ic^p-O^R>nTH0?432X0I3{uMA12Os*e8?p0%6wt_eU) znFX1smPNcGY(;Ox1=1<47QPr`tAB?$#~je|PSqJE=06p<^kLDk;+=vRcIfAJ7JKHT z3@2Y4L9f6wfHJ(*9dL1*$Cm|YhKAk3)bPt{iKh4$cqOwwL7pMeE2dFr7O{dXDvV*n z4L(Z`>A%y)x|G^+Z~=GM8Z{KpCqTh8jtb7UpL8ZB@>RFtYd=R1|JSqw-RlZa^XaiR9O=igCiJ+=ky?YTHn}so4x&z|< zvL^aqqt})JUd`Z+jSZ)}DAg6^AiuEJ6iSlI!REsKSq^;(IKap{#NgNSz|l=o@IfUw zhX#nprWr}oifDt#KUxr4G|B&KDt0^=r9x;&|PpgX$>)r!@UTS zk@uUJy*#df0W}A`Xrz+NMr2kJDGR`>_XFnPigDCE0B+ZVR5A%2jM(%}G;#7U2<|Yz zh7BBz2Dgazg#s;Z?EjHS#Ak_xr4CQ(SH7Igq0EN|2}Thskw+lWZ0SODWrH%{r`1&u z>lhpP4N^_ID&#LgYPObvnB_{(G&m}Ra~c5a*bF6&R#*hY!hQiw7(U76-gBk=XBJVj z9bk(!T5KG*coTcUi~`0mU#Tz~0_q6@8Wx}R)Dc{c^{xe9Tmu6|a9S%Vv537kFeB^! z_2`eF8?v#l!4C<6j>lB+C6 zHLI2L0)FofQTavj)hYDA2;o)LV`x+MaA1NI5w2inh!Fau(vSxW z87x+P@OA@LW`I~*)dvZwkV8jQmA67>PM7-Aql;+OfhYF?? zifh&-dl@KVH#>+OHW7rL(zZ2m?jB&F`dzl9Geti;Ed|I7h6W_DPEtDw9;VcIx>Jt zTe#)ZPw$J(%I|v7M)--`(_bTM-d8gpMG8e&E3qVT*MUmL=~7%tmlXK4btrsczRPERH`_k$ zpYRLtTea^&W^w3SW+5)qHt&PBxq#gMcEk3rlR-|%H*Vjs!P+MZKozLw`YFlT5`X7h z3V=1>wGq-T=~elc-hh-L-bCD~|B)PGS#e5bxIXwVbg;@Z5PIXqG@mTZ&~SP|uFdd8 zKtrxa$NY9IAkojM+)3aBN5z7IiYLE?)UT}Ez-N4xPQ;T8jC0E(r-h(*VXc>Us|^0? zIQ+|Exk8*zcLxaB5l&lfT_C14oGs&C1;~j`;QzMt(D{f{xE1r^ULgV(=Wp}T)W12yAv_@eAIXLFem*=ZT<++! z+aQ~_a-kpA@6waIV7qv@E^=7zFIc@@qZ5AIjF z_PJ*b>K`mTdf%A>K9FfC`)z}M{6CKFASGy8H-#~-<<^7!ex(nd3$l6#n|fK=z`ag< zQ3GtRirS(+n&1^=L6-7JhndzeAy~UGC4yL4a9!6JcM+}Wq2tQfO+*tWGD?NbbTXnE zz_z7ey|i)X4b9+=PM`Vy2wPN`Mhq~nXB{H1IoWKy97v*aNY@e_-LeT&^`*lQ7&(vz z&gjRDIOXlwGzggP(sX8%miM!l2i}6zOmJPTL#`;AUXw5ahZ}Aq!dxex>Hykwa@h^A z35jA1p#J208u+FLl}(+e1P=vRY|wS`VGmryoytD&0i7H>Q}9RdT#Jw9#gMqfldh9@ zlob{^o;_DD)j(%+6#q_Kgr~F{1g_-1;W=-Z>CtJ`tQo=!SV=lG9dBC2#v&otq{#kg zCpmcXPaBfIzH(<(fF49hpUz8J)41ci*}o!OG`M(wI)`;%cGNl5*S?PlYFf>2K8hN7 zI(%eZsUDY`dYh!5PSl3YlD#`5-GSobc?jB;Fdy8RO>UjDAg1e6#+);EwmN#BX?YKN z5+Bzo)=2jV*r;b~v3)NFp}uj8hK)iytvnxv#DD_k8V~16amp~;9u+t(-<_FeHToQN z0p%`On(1b-Mo7h)ii5aE*1MJ)@3GAk7~^>zMugXHpb@Pf>{1)crh__+8p~AzzjRq1 z@k`WfxA3y+QN4f29eg0uSj^ZC8S>U>*5 zXM=Wk4FsVH|I@)*N8jsS1i|#)m=sytg`mOL-kmNOBNrv=)h;`7qo&hp{!AD&!M9lR zye2THoP-@w0n?hABlyBb)ykm5&Q<{JJzpb5`KIbiMwNHxaT0max~V%m7aQYPJvY@q z57d7k%`fv_iEF^*lV7C>#_;Y*6=ageeZn$zPxqBurNXnn#`S*P?xr zLJp_r9}S2AKJTf75-pR`bQeF6iEmE`UzrT$dKz*e`RmKlr&{-#i2#k=@laHkzwu zFk4+W=3&J*O@!gg8c%6nB|n4KrWt-+)C*h@u~8Mz=O3zA&fkj(kN!#JP?|MlDkDMi z*0h<0jp)+)#&jOx#L5D2=w9d4yMcgOOYHbVgiTB89Ig$??3i@LGPVE{KAw8wgAgJ^ zA#cVFWe2{Nsn);kOt~2t_#0*1J%xQok_5GZ7Head5z-DhinnNkAVC#2+d>+eYlG6d z(^E|&RE*lGz?IH7P0kx#!5wW7&{_z+8Pv+f8;NH0k`hZ4Zr>y6A0VEDt>X$~u7);% z-+FA>(B^JDH2i2YGI_8kFZV22&I7mi!yY?u4I#8L@g)qA7aAtocvx2$9G~93Y$D5m zE5jCf-sC?8Zg~3QcAu=|wYsUUQ?oS&Trehwz%$2WJTP$mLguJ;@eFXm!ED+-GdB~gN{klZP_SHD7!p8XPfcK&o z2GQaC2pff{{&Gj?&Z=`7oA|nh1TFxm-oS9qMdBzT+mhd_ASuQSf`84jslQK z24pdF&Iat(AuMgK0qvt%83H9zyTA=rhMz`Lo;S=^m(TSxTLZIKP}ie;()C7aSHT)c zC5bgtIY-TMU8$oj$7Mzr98bqyH>=)Q6ZYq~a+$fVwA@@QtPap5i3a`m}`G&8=5ZVvd6XEpHVkh~#u&g+~W z8>a|j3hiB03ySrX*`bo125n1tnkSmtj+^rQE)vxp1o?ix9($SZ-YEwf$t=@kg-rpF zEYmcoUG*5t%mLwy$)RHf1}7^enpUj>?$n}E9DB4y*F7u*$>Cex&(F32O)Lc&8E1a% z9}kUqTwjpR``MrVJFAUQRI9aH9=z8mu_scj4KMC|6egL=yq0({H!5VGs`Tek$OS=2OgiXIyHUvK zD0Ws^DuEwru3@I}_TmXOdelR6l|_6`>zwO|d+tGf#sFj@o;O4bQJ8}I;7I#g_1^!0aA~xh#fDQ5y?KjP z?0`9gU?#SBWMfg`J;sFsOIx}Dd>P<@pN*eMScylwj9LAj_B)e6)AlNZBC~|UZLzhH zl7Z*B#$D+d)n~W<&QM}dGCG`GhtVg%!U&HS7@KogsxM<{B^j!c03UubtQ1S?&_#Ntz+3IVsmIh zTJ4Z70sKny1+k0!dMV^Zg}@{Wma!hYwd{LR#Jb|n~+Oz zLwD6hg;`Nm1PhJ!2hMyKf}WF?MMRmUu~fQZS2 zoCF%0Ra$mc=+n(_-it7^I2WM8bRW$iPp)ExwXUcMD-ybax8Ckk5eVSagOF3(A5VWU zqPDU@|NSq@EgLPiTF%m|n9(jPIlSL1@^wCfd4H#nC{PPr_8>>!(Z|NdvG-Eb)@3Xx z#&rsQNt*50e5VKqzi;P=498jqBoLua%ys?UgKT|bI$`0UFgo%_pacTq8|k^i1fmGU zwGd$fA+aY`%!Y%b=N!>p9=fiRy6_CnP^F_ba25&Po$}iuyq7h`lC1E)o;;72$Twf_ z6Y#ZQtC@gvOZ1A_ul3G6P~dz+JzTNOT*1_HfBUlmyc;TU;hAGP9(Bd4VlkwRw@Y>L zpao^X8M`vlu2Z>m@gLv=IGkNF_#=2^SB=9>nalhWu9G_`DFkkeMfX!*Xk&{4iMpQm z5%K`CXPgH2hzttp6m`*k2?u~KVGYCKpT+l&f7LsF?C7O;R@wWX`KMIJ-5&PFA2n! zOZSSwt!!!&_aLcr(QMue?W(U=Sxh zV07TAWs$+c$$^0s;x_j%yO+FS=x*D`Y)w8P+4+9{q7&t+fG@=J#n#H&f82-^3Qq~* z_0VL%rFCm}X>7zZVShf{1s4bpJ7s9Dh7b05xIUcvlT`|V-d}FO5u;>UK5Gpmn-Zl! zd0BuA&oLQT*G?s1Qoc!mb(D{Hg15U+5bMy#5KuxXupAPt`MudWC`%BWL@jZb|#&pt5%e`BCjwmZ`e@&gIneKA;ofjw0;G;Ja$ zVOEwqOPY;sLR)~(bo`jS`!&9_=2+hJVp$RK@ztrf%W1IJp_jpn8B>r#0^XzhCX{Fu zfvfNMnu;Dbsn>D`dC|z#%8O8}j-N*4%hFmvtiHQYd_(&wfohKA4E>4K0cZaI;K2Z` zc)pC*{>z;_E!nGlYu?QI-9W;hztdj9%{iXtP#l@afrJHZ!VKa7LJOh1p>ge_88r<7m7rAGr^TbaLrCE)jh?_ z49JXimwEt9oqWbYwAKUKeR$`pvaCj-nS9fH0w9N8Y@Q{KyofGFr|u+c!~B z;a0}Oqd42`cI-g?^xUAiQ08fb8D-EZPd@N)I_5)$x2e}9G_9LQfdrMxJ*>X!P@itH z;{3%3)7ekL$vY?--^tHm(P~a8a6Z&BN#9q~n%n?~%|!^Y`46CayC~@~iWiDk&l}HD zsidFQS>W*Us8M9w5E`U1?5l{`UaV>+_CFJubDCnm@fbI>I(}qZ!=PQ$abrywW5Jsw zc}W12-NS}oXyGh)w%PX0yCG}m>BaXt_m@Q?Djcf~y9Jx|2~w5--nA-C+8c1nCt~O%o)rSHNJ^rW2sn0dI zE8~}G-s2v-2O~c8lO9m*1rT-iIj9Qea+7VRk8IOKklPjK`3NaiK0YAH zNv7$Q3uuviNdn)`f8R?n6(oSxb%UyC!!?)2zcJT_D$J{ zZ;N3iW9&FH*Ag?ZXzVIwE02kPHgSu>x}hxvj*cT$m7BtdjlU!uXmW?Lla4m>VwLWyg}3C=9o-5KxCc*0w-xBIvvQ-ku43UwdD8VFWE>z_PTX!j@d z#J6!;5-RE#m&Ycwd(FJD?Eg;RJ!;5dX}_Y*=RP4+RH5h&nzLi$uGosuD1P)bty9nbDJv z_LJE1R&3le?s4^$77ORM*Vt zGyn3rmuCeB(w=Qo_WJ8vxZ0RebYPNIU7VM|M}cBICDd1&`%WBfk0#V>$bTu5UrSZj z9LaLCPQyTh)DjaMmdbAAnOAJy^KLi6Aog|AUglsJyvxGSkl)lx%~-!NK%aPnv$wNA z%MN3WggqB?iKT~Yryyx*))>?Qa^=lqKNkuzS}oI1kl}v`X*;|(r&oS0Gmh@lX|go{ zvM9RYQqE}N=jUiS>ym>oUNR;l*G1rz#l>A~Vf6bTsZnVF(4g62c?1!3SZ_ue>c9BU zzic~$WV|Oih5*TNk_ZmP@DoUm&3!eYpE~ox1{iO6Nw^eypmhoN0@&L{oQLw+v3%Hn zHkR6^jbDc=d2pHmZQv%*Z1_b2@?m|PTixLXXu}AU;(PX?a2M1}ZRI?)g-s}mrD_fv z52)t64ao$+8Q#){s8(A_gY{vL*+o*6P_6@=u=IPV*?zyZ%)SeZC|>1_XiAzYiM#?D zhQAIuXf}4$-3(HCi*t;8;6N}$uD=^dEs$F|krdQHe&%ImW&|ReMDZ>W&fPrkvEhmA z>XID1`KAgIl@omh2qV=9wgL)bm|MoY4+0Eg;4OGl-f%X;A0H3d1z)Tb(e%L)o*Mn- z?Zlzy9(mYUm!1Ge0fFis)%rqfBaZ-GI;zhBmvZO*@ zXz9I}YB;;KCqvOMMnO8yWefNL4I2RE8GM5ZRBGz7(m~z#txFwm%Qn;VWn}mnbqTJ% zxG4tzOUVOqdU&3|i9^*5wPEW`-mKq*0B{46bwQn`rfIIP2VPfulu_^KZJUh`y@Cpv z3$aA}+iQFIJ{SsUfYL76m+UXRg8Eu4CRCZD!8_ixkx9%wBMd^eS{t_LMIsal8$S`Y zONq$?f^R+~_@WNgfE+H=eFVFn%%6VowE(-KzT=hr^(Zqr_0m+Q(4)uY{8Ra;Ch`RFv+zLHd> z=)eE{I)}eM(TP3mWJdcP>0>-Tiql*VXQc3&g47MDD}fmY=Yf0XX6QrYMw3A4cUdxp4P1R}+L&zR)A(G8Kw~y9q;KA@V^_8ht zJ1xntb)1$yT z*2D1=xugxE+%M-rd9Q|Msw~9gZC|R+=sSiEOzCiQfq>YTiD@5szViE)fY?kENjX|A zyCO;Deu~Ml(XYsVk3(}l4GR*R&&|^yug2a~9}Ly^joY5K&M3|TA_2-Z@H$|*kmeyF zg%iaF9dnquakM?N-{9^nfgPt%*;FP-2V_rr%rBCFP7rb9MP)j#ySxQC@wH8MK-i3n9 zIbD%w`u^LFTTiQr1A0Y*rezX)yzr<%dO6()QcqyVD@_Xq1#7V(=?e2W#5| z&73w8Tb}QXSBOnfS3RXPjWl4(KL~JY&w<$;n;I0y%pG7>&c8Yf zHL^odG?wD3$}wE@*OI$|Ww9p6jdBYVK`^C#j0cTw`23nY38T?bi+JVZsjGWD~fMrH|4Xc4SR?rW-$^~J*e^ek2udy#6qBOV+J>Mz6 z5i{C*8~Gn0r#>ZeYR^N?>shqB;Y!>Epmlg;Vo`S5foBBi{L_KQ>L|qGa`cOupQCyz z32?PUV5jN`c^9;={ROB9CvjG6dHsC>&8}5e*c+upJ$d6IlJ@}}VI`0ZPuI%LFLvgE za2$BM5m@UWHV@PlkvE0aQVA`w^w;{xXj6(SDyTYclO}^YpbS-S;rRk>7rd=8+!YGs zRMekUpwOv#tQBbi&}=l@!{jjNO6Ct@%c~TIFb8^xVU<5Kk@bXxUsrnIAtdgl&|6=x zi8_n(W$gpVd}izsl0j=aq|9cyolskZB9cRb$n1NYDIXwi^PvEPcF?zhgysHusN4^yoKlCwnzVNw^4jW6y9iWn_km;r>B}s)+cn6(*N!P5mkAWVmQgnr z(=QjiqqlxjgPUe*kWuHzm?}3BB%l%wV#>{qC&))2z|!Q6Pq;EP_&V$qD}fU>Ujt64 z965>%1?qc|V?>;~sjZAhy2FQb@3N~xgV`e|LUmbhz*!gv(VCUg6)PJamXxn*LdoUi zEJ#Tr{DK8CHGhAniNFs}2n$#7w;za>XGfMDFOoUTH*%d!gXa>~>eaHq3O4_EYU(Hb zaQ&&edm7V4Wdula$zQ$*g*za*5FlKV#fq%u=BK%lT--AWf4o8N*A zw~>tjkw<&T#frby`91z=qxJ)tigpND>_ipHc$J`e4@LbZ@UkqZ)U4*y#-cDzTY{rb zP5m4LkjXLK<;!T~{NS&#IvZs8(XBSgkxeP&b+lsa?fsK?o@*cQwRJpC_V zFl@BBZ3`)MU2Ea}J#qeCA+g1cr_4_H2{cEEVz|hGiZk72F_KNX!!;4#fWiHOAS~lX zeuaHJyw?Tk74GmF5IcFa@3E_u9WKs0dyn211d!&AiEjmEuum;Ku$rFf&8Uaif-Sj8 z&573{U|pY|abx)R2qiUofjc0P4V2^#zI61CJ$^}`7-l+&P0uf<8qk5sc6G5n%*3;5 zFzx{D-}*w?V-W#Fs7-^}m1Rnu^TzWBPWT`oJN6qE3d&eoI${C-d+Rx?keg=J6DX5k z@6%|3=!0?|f+|*1GN8@i`vhW*aYHWvaNI8?$(rpXFDva!CsYMkrz57C92v+n4}l$F z4=5+hVsH8&`=kZi20p7qmk>1ZIPxWv6|`0c(6MQzw+nAAv1ysY@S{?y?GS; zOxlP8tERZ&=Wx3q8z+-Er{g%Vvt^}p;E8S@hh zrV1vo)XZs!G({OOOU6To-C3&tLt(zTMznFR`MVdaH?&p^=FK~r%!AmUU<{o107t-( zJ8sDA$OUVYBM|K2rN=chI-PU-6P*MwC!r*UPuam6=aKV&C%vP9EJ8j78y=^;%}UbMENw%*3QkSh7X3iwY%Xj>^xtn+JE*z+5KPscE<1Um7t2S(D}RBS)k zN4ZK>fGt;e_tqcK2i4MM&)UMCoW; zf5PY=qcr?9wS84zqn7@VMH+61z@%ChZ6AaB@ad#zWcv!oa>k->FqxXOv$By9)xF*C zJHQ4mEh(eEdWDSeE^=TR zp`{nldAK~oShtwm@VH~c48;8`Km|OtR2)_DHS4vmgF2dS)0zahdME5z%)jXUr|?bi}`NMO{>|!x!4fqo4BLCVADtZ8(J2V>Dpstpt)8VWX^BYC_p)n7CsCK z2o|igXUvOlO6TJ}M7A??R&#Lh=IAo%%|S)ueV{1o*%^9i0~xwb80%k;RNei>?r1Gz z4$NwikN372sQq=0clv)W*s9=r^)kZq}A&D>}}$zHRaw=vjf=g}{EcC}Oq#F^-;GFn3Nkpa=5r=J z=`P7A1|z{}rPrlP((CyPi)V@@bvA9AE@w+FsO}de8AG2gf7_Vw;s9^;G;%Tl!=sGI zc-7n4aw2++tA&PJ3SZS|_ZhEQu`Fu%nY+zJuah*tSBF5GUjt)m{ydTPBQ!_giPv47 z@gjvLD8#4*B7&-YkUd5gABO&fF2RxdHwA3`SdVlk5!V{KAMw&{Ou&m#2Zoy>E^iG? zTWny>Z~ZWVlIE{7`Y2L$?7WO!53#NScid(J+_3?;W9b6k2?yMfbz5!)YaLt z=q;3vO2}*zwRFjgG)J4^qNjESAa+ToVQ)HCPuB@O=@a3Cdy3U-KSmaB|L*Cm3xHLCO%h%=tJ>~53RuQ21xc0$dH*#;4(6jT2=N*u=HPS%u{Tv9O zA7B0i_W!+R(4Gi9GEm@=+O_zCpP}6>@rhX?`{P^SmGSH^G&^ExC2FW1b2wSu7gTrS zZ{=5>Cmn9wi3Ee1wvC(M{^n0s0n1(P(|aP#@(#2QOJe(fiDsC0n}s*q6d@=Bfg zS<lQI#qu;IHmg>X3 zI?i4mUem3Mj6<&4SfB!bJ_05_=%w$fMkmydfTEJ6Fcs37axc`C(LZ)+MyNsi$xeg) z*ih{OdUiQ?an`ji>YMH09Q=m zz1=kFO`RN7qJ0|Z>~Y;f7^yO`rg9^6(6f>@8zgJcMd2*=H3UiV& z*h7uyy*lp#d9;zUp8sh`$cTUUElhj<=)^3cWpgq6EBh%@+N!YW1@8_$fk(eM{uJPN zaD+wExRLTswZ=Q^IT()5>?_$`J!2EgPNB_w4HxUtTjuw1?%FSIgv}=oBmwTAl(Q%V zE1BDln_yGGI+oK!c=pzo-^V_!1Vo-!A;5p>gcZe{X9Y@Qinn5<1cEFY+v!=i6xX=R%o(p* zeM=is%Am5#qK5!IWnL?{=i*;Rh4K2R{f~G%Tv};f^LuM7p4AHQLE@5#$aprZt}Eyt z&f-iDu7&Q|w5@JQcp!+_CiO3SG8V&$5Gm3vgyZ{gsF4y{u*MOg@p!I@jj0eo!>k2q z1zuT+YSzcN8DHwK1`8om4K8h(j(NarTyU&bpL)9)tTJ^ZcoOyN?5l5_>IHaN3NmBp z*^aeTWRqYdjDG)M#Nt78B0|-$ttz9)jCoHfNwyj zgyE#GRn*F9_L?J_8eQAeI%;RThm&`Ycni4Y_G+_@bb9r|aF)lk3c<}1X+G-BP*pj8|foDoX0P_5Nhn$H3z*P~tdq6(T9sjf6fTF(M} zip@&{;Qid^f-NEkYx5U)KfWw7f0^2hxU8}03qpj*MNh_M|Ai2{-!Ls3S3fG7r11hSFgYWE>poJQ(#)K zi>n=^e9OZ*!IwtQglgB#mFabq3i9_w8g(_Ix=m4P>y--xEe>d6A_O-I~ z@hSnE8K{roj^hbYVR9Opf#z`~#S<{UkF=of6EB56aHvbHm71?pLX;Q;D6!FHwY@dS zP2fqh4u~RnJ?q#<8>7l%<+Qh(M|!XhqsmjaHN3z@p~AG_#e#@I1YJ1A;75>}dtkNt z&IyXj9ChjSgF?J9HnMk5w|edCXA7|_u5&A`U>>7gP1E=S4Qksh#|Y>zc;XY!4*m%Z z%CxJWay7&%snIBlLl(}ENBRYjSFMj(FS_(S;-wb<46Bc^3=5Fk@`TxhZ-Kx0?2~X) zLM z?d3%581f2}(*+WgB{(J=dtQJMvnGy3SeYpI&fvzK=R;1%SwGYDtFt3hI&%sysOo+e zaA3WCVrEzdFk;z>RK7b9Er$?Pf*RM^)lCQ_evuaBx`;Ndi5^b&RO)+ z>XNQh?S@TgBsN49^-*}up%ia(cb|CFyl8rSY&jbmCG(OZhw~5^8oqw zfl%LP>upT$dG&a$B5xA6q?R?8d=zKj!A$)YM!A$x(vjd%$r@vYlCwL)H&-A}x}_29 zZ7!)lM`A-=!yn{M6txOJ#g1x|Uy z%^Po}I87opHn$w@r*!H_5tBWgktp$zv9qRpECvsE%Wrh_S_C^U+7kB9n>>h; z6#$Y;lLdx)@tfq0^sp@~;=ESK`cBGNvF}LXQ6}9t`P*i&!Az%ixT_VOmZDAqhJ2zD8o_7uoCMT+( z#~;d&nh-ra5Y;__8E>V5aCS-H!k=fXi%)?_CFna|MikB-?w4_$>dNWIu~JJwaLgqw zbh-aI{~RAA@>&tmxwMTLG!DeQ%oP)?aOD*hD9zbY^L;uiACH2rXuk)!y5~~{Vhms! zPQAP-D96qOXD(kF{LK7Mn$&23oM87~E3%FB z{wq!qj@A6et$nwy{xv;**YOF!I?-e1g7Ys9z-Cw8E}klE2cpz7UOXwW?vq&492R zuPa+8&N&K|b&vRE<4?&mE*ENlZ@m~Y8#%tr>>DIr2^P>r7d|-1k(;EzuZ-|ZTyl>) z9r&4&P=f|FuQ!qz2$x#-0A0Vb$L;hDM@L7{v#l8l9F0VTI7>ht{PzJwzZ}`iLGLOB z^K6qgv<@dRC1AkK&D&dXCaUa5IGq &6s165bj+9ixAo_PX(Sa*JZsnFRX)YnW@* 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
QYw|CuU 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 -me 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�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

y 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 diff --git a/docs/index.rst b/docs/index.rst index a6f8ca76..316b0ee6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -50,16 +50,16 @@ unacceptable memory consumption if each sub-process requires a copy of the training data, but ML-Ensemble avoids this issue by using memory mapping. Training data is persisted to a memory cache that each sub-process has access -to, allowing parallel processing to require no more memory than processing -on a single thread. For more details, see :ref:`memory`. - -Expect 95-97% of training time to be spent fitting the base estimators - -*irrespective* of data size. The time it takes to fit an ensemble depends -therefore entirely on how fast the chosen base learners are, -and how many CPU cores are available. - -Moreover, ensemble classes that fit estimators on subsets scale more -efficiently than the base learners when these do not scale linearly. +to, completely circumventing serialization of input data to be sent between +the parent process and sub-processes. Moreover, if no copying takes place +during estimation, parallel processing require no more memory than processing +single-process estimation. For more details, see :ref:`memory`. + +Expect 95-97% of training time to be spent fitting the base estimators. In +general therefore, the time it takes to fit an ensemble depends +therefore on the speed of the chosen base learners and the number of CPU cores +available. Some ensembles will even scale more efficiently than their base +learners if these scale superlinearly. Modular build of multi-layered ensembles ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/memory.rst b/docs/memory.rst index 645e37bb..e26beec9 100644 --- a/docs/memory.rst +++ b/docs/memory.rst @@ -12,10 +12,21 @@ Memory mapping .. :currentmodule:: mlens.utils When training data is stored in-memory in the parent process, training a -ensemble in parallel entails copying the array in the parent process into -the subprocess. This is both time consuming, as the data must first be sent -to the sub-process, and memory intense as several copies of the same -data must be kept in memory. +ensemble in parallel entails sending the array from the parent process to +the subprocess through serialization of the data. Even for moderately sized +datasets, this is a time consuming task. Moreover, it creates replicas of the +same dataset to be stored in-memory, and so the effective size of the data +kept in memory scales with the number of processes used in parallel. For +large datasets, this can be catastrophic. + +ML-Ensemble overcomes this issue by using memmapping_, which allows +sub-processes to share memory of the underlying data. Hence, input data need +not be serialized and sent to the subprocesses, and as long as no copying +takes place in the sub-process, memory consumption remains constant as the +number of sub-processes grows. Hence, ML-Ensemble can remain memory neutral as +the number of CPU's in use increase. This last point relies critically on +avoiding copying, which may not be possible, see gotchas_ for further +information. We can easily illustrate this issue by running a dummy function in parallel that merely holds whatever data it receives from a few seconds before closing. @@ -75,10 +86,12 @@ With such a memory profile, an ensemble would not be very scalable. .. image:: img/mem_profile_copy.png :align: center -ML-Ensemble overcomes this issue by using memmapping_, thereby allowing -sub-processes to share memory of the underlying data. In so doing, ML-Ensemble -can remain memory neutral as the number of CPU's in use increase. To see this -first hand, we can modify the above example to convert the toy array to +Memmapping allows us to overcome these issues for two reaons. First, it entirely +overcomes serialization of the input data as processes share memory and hence +the subprocesses can access the input arrays directly from the parent process. +Second, insofar no copying of the input data takes place, memmapping avoids +scaling the data size requirement by the number of processes running. +To see this first hand, we can modify the above example to convert the toy array to a memmap and again monitor memory usage. :: >>> import os @@ -205,14 +218,51 @@ estimator. :: .. image:: img/memory.png +.. _gotchas: + Gotcha's ^^^^^^^^ -The above analysis only concerns the memory profile of ML-Ensemble. If -the ensemble is comprised of base learners that copies data *internally*, -the ensemble will not be memory neutral. Nevertheless, memmapping -always avoids array serialization between sub-processes and copying of the -full input array. +The above analysis holds under two conditions: (1) no copying of the input +data is triggered during slicing the K-folds and (2) the base estimators +do not copy the data internally. However memmapping always avoids array +serialization between sub-processes which can be significant burden on time +consumption. + +**(1)** +Because of the structure of `numpy's memory model`_, slicing an array returns +a view_ only if the slice contiguous. In particular, this means that we +**cannot** slice a numpy array to retrieve two partitions separated by one or +more partitions. Technically, this limitation arises since it breaks the +stride patterns numpy arrays relies on to know where find a row. ML-Ensemble +can therefore **only** avoid copying training data when the number of folds +is 2, in which case the first half is used for training and the latter for +predictions. For 3 of more folds, the training set is no longer contiguous and +hence slicing the original array triggers `advanced indexing`_, in turn +causing a copy of the underlying data to be returned. Being a limitation within +numpy, this issue is beyond the control of ML-Ensemble. + +Also note that if the data is preprocessed within ML-Ensemble, transformers +automatically return copies of the input data (i.e. breaks the link with the +memory buffer) and will therefore **always** trigger a copying. In fact, if +it does not, transforming the memmapped original data will raise an ``OSError`` +since the memory map of the original data is read-only to avoid corrupting the +input. + +**(2)** +The user must take not what input requirements are necessary for a Scikit-learn +estimator to not copy the data, and ensuring the input array is in the given +format. Note that prediction arrays are always dense C-ordered float64 arrays. +For instance, several Scikit-learn linear models defaults to copying the input +data, Scikit-learn random forests estimators copy the data if it is not +Fortran contiguous. Similarly, Scikit-learn SVM models copy data that does not +satisfy its particular requirements. + +.. _numpy's memory model: https://docs.scipy.org/doc/numpy/reference/internals.html + +.. _view: http://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html + +.. _advanced indexing: https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html .. _mprof: https://pypi.python.org/pypi/memory_profiler diff --git a/docs/scaling.rst b/docs/scaling.rst index 1a799a0d..d10e01e3 100644 --- a/docs/scaling.rst +++ b/docs/scaling.rst @@ -2,5 +2,72 @@ .. _scaling: + +.. currentmodule:: mlens.ensemble + Scale benchmarks ================ + +Single process vs multi-process +------------------------------- + +This benchmark compares the performance of the :class:`SuperLearner` and the +:class:`BlendEnsemble` when fitted with a single process and when fitted with +four cores. The ensembles have four SVR base estimators and an SVR as final +meta learner. Hence, while the single-processed ensembles need to fit 5 +SVR models consecutively, the multiprocessed ensembles need only the time +equivalent to fit 2 consecutively. As the figure below shows, there are clear +benefits to multi-processing. + +.. image:: img/scale_benchmark.png + :align: center + + +To replicate the benchmark, in the ``mlens`` benchmark folder, execute:: + + >>> python scale_comp.py + + ML-ENSEMBLE + + Threading performance test for data set dimensioned up to (10000, 50) + Available CPUs: 4 + + Ensemble architecture + Num layers: 2 + Fit per base layer estimator: 2 + 1 + layer-1 | Estimators: ['svr-1', 'svr-2', 'svr-3', 'svr-4']. + layer-2 | Meta Estimator: svr + + FIT TIMES + samples + 1000 SuperLearner (1) : 0.88s | BlendEnsemble (1) : 0.35s | + 1000 SuperLearner (4) : 0.71s | BlendEnsemble (4) : 0.41s | + + 2000 SuperLearner (1) : 2.82s | BlendEnsemble (1) : 0.76s | + 2000 SuperLearner (4) : 1.51s | BlendEnsemble (4) : 0.59s | + + 3000 SuperLearner (1) : 6.04s | BlendEnsemble (1) : 1.56s | + 3000 SuperLearner (4) : 2.96s | BlendEnsemble (4) : 0.90s | + + 4000 SuperLearner (1) : 10.94s | BlendEnsemble (1) : 2.79s | + 4000 SuperLearner (4) : 7.92s | BlendEnsemble (4) : 1.53s | + + 5000 SuperLearner (1) : 18.45s | BlendEnsemble (1) : 4.58s | + 5000 SuperLearner (4) : 8.52s | BlendEnsemble (4) : 2.26s | + + 6000 SuperLearner (1) : 27.48s | BlendEnsemble (1) : 7.24s | + 6000 SuperLearner (4) : 15.06s | BlendEnsemble (4) : 3.41s | + + 7000 SuperLearner (1) : 38.73s | BlendEnsemble (1) : 8.62s | + 7000 SuperLearner (4) : 18.21s | BlendEnsemble (4) : 4.41s | + + 8000 SuperLearner (1) : 52.08s | BlendEnsemble (1) : 12.10s | + 8000 SuperLearner (4) : 23.43s | BlendEnsemble (4) : 4.95s | + + 9000 SuperLearner (1) : 61.70s | BlendEnsemble (1) : 14.58s | + 9000 SuperLearner (4) : 28.55s | BlendEnsemble (4) : 8.45s | + + 10000 SuperLearner (1) : 75.76s | BlendEnsemble (1) : 18.72s | + 10000 SuperLearner (4) : 32.71s | BlendEnsemble (4) : 7.52s | + + Benchmark done | 00:09:00 From 0a04d984de50f6c0c9d2882148894d70234cf48a Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Thu, 18 May 2017 10:43:55 +0200 Subject: [PATCH 25/26] scale benchmark --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 316b0ee6..fe06af51 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -43,7 +43,7 @@ ensemble, to train it call the ``fit`` method:: Memory Efficient Parallelized Learning ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Because base learners in an ensemble are independent of each other, ensembles -benefit greatly from multithreading and the fundamental philosophy of +benefit greatly from multiprocessing and the fundamental philosophy of ML-Ensemble is to enable as much parallel processing as possible with minimum impact on memory consumption. Estimation in parallel can easily lead to unacceptable memory consumption if each sub-process requires a copy of the From 9273cbd63f6badc844de55b83367e9da08c90276 Mon Sep 17 00:00:00 2001 From: Flennerhag Date: Thu, 18 May 2017 11:11:11 +0200 Subject: [PATCH 26/26] rem superflous try-except block in _summarize --- mlens/model_selection/model_selection.py | 16 +------ .../tests/test_model_selection.py | 45 +++++++++++-------- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/mlens/model_selection/model_selection.py b/mlens/model_selection/model_selection.py index e903e0ea..4f3af960 100644 --- a/mlens/model_selection/model_selection.py +++ b/mlens/model_selection/model_selection.py @@ -541,23 +541,11 @@ def _summarize(self, cv_res): if best_data is None: best_data, best_draw = draw_data, draw_num - - try: - best_data['params'] = \ - self.params[case_est][best_draw] - except KeyError: - best_data['params'] = \ - self.params[case_est][best_draw] + best_data['params'] = self.params[case_est][best_draw] if draw_data['test_score_mean'] > best_data['test_score_mean']: best_data, best_draw = draw_data, draw_num - - try: - best_data['params'] = \ - self.params[case_est][best_draw] - except KeyError: - best_data['params'] = \ - self.params[case_est][best_draw] + best_data['params'] = self.params[case_est][best_draw] # Assign data associated with best test score to summary dict # We invert the dictionary nesting here diff --git a/mlens/model_selection/tests/test_model_selection.py b/mlens/model_selection/tests/test_model_selection.py index 200c0e4c..b9d98ce3 100644 --- a/mlens/model_selection/tests/test_model_selection.py +++ b/mlens/model_selection/tests/test_model_selection.py @@ -92,13 +92,15 @@ def test_w_prep(): evl = Evaluator(mape_scorer, cv=5, shuffle=False, random_state=100) # Preprocessing - evl.preprocess(X, y, {'pr': [Scale()], 'no': []}) + with open(os.devnull, 'w') as f, redirect_stderr(f): + + evl.preprocess(X, y, {'pr': [Scale()], 'no': []}) - # Fitting - evl.evaluate(X, y, - estimators=[OLS()], - param_dicts={'ols': {'offset': randint(1, 10)}}, - n_iter=3) + # Fitting + evl.evaluate(X, y, + estimators=[OLS()], + param_dicts={'ols': {'offset': randint(1, 10)}}, + n_iter=3) np.testing.assert_approx_equal( evl.summary['test_score_mean'][('no', 'ols')], @@ -114,13 +116,16 @@ def test_w_prep(): def test_w_prep_fit(): """[Model Selection] Test run with preprocessing, single step.""" - evl = Evaluator(mape_scorer, cv=5, shuffle=False, random_state=100) + evl = Evaluator(mape_scorer, cv=5, shuffle=False, random_state=100, + verbose=True) - evl.fit(X, y, - estimators=[OLS()], - param_dicts={'ols': {'offset': randint(1, 10)}}, - preprocessing={'pr': [Scale()], 'no': []}, - n_iter=3) + with open(os.devnull, 'w') as f, redirect_stderr(f): + + evl.fit(X, y, + estimators=[OLS()], + param_dicts={'ols': {'offset': randint(1, 10)}}, + preprocessing={'pr': [Scale()], 'no': []}, + n_iter=3) np.testing.assert_approx_equal( evl.summary['test_score_mean'][('no', 'ols')], @@ -136,18 +141,20 @@ def test_w_prep_fit(): def test_w_prep_set_params(): """[Model Selection] Test run with preprocessing, sep param dists.""" - evl = Evaluator(mape_scorer, cv=5, shuffle=False, random_state=100) + evl = Evaluator(mape_scorer, cv=5, shuffle=False, random_state=100, + verbose=True) params = {('no', 'ols'): {'offset': randint(3, 6)}, ('pr', 'ols'): {'offset': randint(1, 3)}, } - # Fitting - evl.fit(X, y, - estimators={'pr': [OLS()], 'no': [OLS()]}, - param_dicts=params, - preprocessing={'pr': [Scale()], 'no': []}, - n_iter=3) + with open(os.devnull, 'w') as f, redirect_stderr(f): + + evl.fit(X, y, + estimators={'pr': [OLS()], 'no': [OLS()]}, + param_dicts=params, + preprocessing={'pr': [Scale()], 'no': []}, + n_iter=3) np.testing.assert_approx_equal( evl.summary['test_score_mean'][('no', 'ols')],

oh*HHqNG0G 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%0A~k9xt*$T4+SI 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 Ti;WNIYt&UWRpNj7_4oe+8G~pi literal 0 HcmV?d00001 diff --git a/docs/img/scale_comp.png b/docs/img/scale_comp.png deleted file mode 100644 index a47e29c001f432ce52262340f6b91ff80cfc93b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384947 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