RuntimeError: словарь изменил размер во время итерации при загрузке модели sklearn - PullRequest
0 голосов
/ 14 декабря 2018

Когда я пытаюсь загрузить модель логистической регрессии sklearn из рассола, используя следующий код

def _feed(gpu):
    log_info("prediction process started")
    model = pickle.load(open(model_path, 'rb'))

    while True:
        X = pending_q.get()
        if not X:
            log_info("stop pending thread")
            return
        # first_elem_non_neg_one_count = (X[-1][0] == -1).sum()
        # log_info("non negative one inside X: %d" % first_elem_non_neg_one_count)
        if X[0] > WINDOW_SIZE:  # only begin prediction when we've got enough frames to compute means and stds
            predicted = model.predict(X[-1])
            # TODO: count consecutive and recent X # only
            # sum_count = (predicted.flatten()[MOST_X_FRAME:] >= THRESHOLD).sum()
            # log_info("***** got %d frames > %.1f in most recent %d frames" % (sum_count, THRESHOLD, abs(MOST_X_FRAME)))
            log_info("frame: %d, predicted: %d" % (X[0], predicted))
            predicted = X[:2] + predicted
        else:
            log_info("warming up, skip inference...")
            predicted = X[:2] + [-1]
        predicted_q.put(predicted)  # TODO: batch prediction

, я получаю следующую ошибку:

Exception in thread Thread-6:
Traceback (most recent call last):
  File "/home/support/.pyenv/versions/3.6.6/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/home/support/.pyenv/versions/3.6.6/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/app/xxxxx/04_predict_ps.py", line 106, in _feed
    model = pickle.load(model_file)
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/sklearn/linear_model/__init__.py", line 12, in <module>
    from .base import LinearRegression
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/sklearn/linear_model/base.py", line 38, in <module>
    from ..preprocessing.data import normalize as f_normalize
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/sklearn/preprocessing/__init__.py", line 8, in <module>
    from .data import Binarizer
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 19, in <module>
    from scipy import stats
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/scipy/stats/__init__.py", line 345, in <module>
    from .stats import *
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/scipy/stats/stats.py", line 171, in <module>
    from . import distributions
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/scipy/stats/distributions.py", line 13, in <module>
    from . import _continuous_distns
  File "/home/support/.pyenv/versions/va-worker-3.6.6/lib/python3.6/site-packages/scipy/stats/_continuous_distns.py", line 6692, in <module>
    pairs = list(globals().items())
RuntimeError: dictionary changed size during iteration

Я сохраняю модель, используя приведенную ниже:

sk_logistic_regr = LogisticRegression()
sk_logistic_regr.fit(x_train, y_train)
with open(SK_MODEL_NAME, 'wb') as file:
    pickle.dump(sk_logistic_regr, file)

Я не уверен, так ли это, потому что я не закрываю файл рассола должным образом, когда убиваю свой скрипт.Любая идея о причине, вызывающей это?Кажется, что код загрузки модели успешен только в первый раз.

PS функция _feed запускается в отдельном потоке, предназначенном для вывода

Между тем в качестве обходного пути я использовал from joblib import dump, load, который рекомендуется в sklearn doc, который решает мою проблему.

...