Scikit-learn: GridSearchCV зависает на неопределенное время с включенной многопоточностью (т.е. w / n_jobs! = 1)

Созданный на 12 авг. 2015  ·  88Комментарии  ·  Источник: scikit-learn/scikit-learn

Я периодически сталкивался с этой проблемой (в теме) с GridSearchCV уже более года, через python 2.7, 3.3 и 3.4, две работы, несколько разных платформ / ноутбуков mac osx и множество разных версий numpy и scikit- учиться (я держу их в курсе).

Я пробовал все эти предложения, и ни одно из них не всегда работает:

https://github.com/scikit-learn/scikit-learn/issues/3605 - Установка метода запуска многопроцессорной обработки на 'forkserver'
https://github.com/scikit-learn/scikit-learn/issues/2889 - Проблемы ТОЛЬКО при передаче пользовательских функций скоринга (у меня абсолютно была эта проблема, когда те же вызовы GridSearchCV с n_jobs! = 1 зависали с нестандартный бомбардир, но без него все отлично)
https://github.com/joblib/joblib/issues/138 - Установка переменных среды из счетчиков потоков MKL (я пробовал это при запуске numpy / sklearn, созданного для mkl из дистрибутива Anaconda)
Масштабирование входных данных и проверка отсутствия ошибок с n_jobs = 1 - я полностью уверен, что то, что я пытаюсь делать в нескольких потоках, выполняется правильно в одном потоке и за небольшой промежуток времени.

Это очень неприятная проблема, которая, кажется, всегда появляется снова, когда я уверен, что она исчезла, и ЕДИНСТВЕННЫЙ обходной путь, который работает для меня в 100% случаев , - это использование источника GridSearchCV в любом дистрибутиве sklearn, в котором я использую вручную изменив бэкэнд, установленный в вызове Paralell, на «threading» (вместо multiprocessing).

Я не тестировал разницу между этим хаком и установкой n_jobs = 1, но есть ли какие-либо причины ожидать каких-либо выгод от бэкэнда потоковой обработки при полном отсутствии распараллеливания? Конечно, это было бы не так хорошо, как многопроцессорность, но, по крайней мере, это более стабильно.

Кстати, самые последние версии, с которыми у меня была такая же проблема:

  • Mac OS 10.9.5
  • Python 3.4.3 :: Continuum Analytics, Inc.
  • scikit-learn == 0.16.1
  • scipy == 0.16.0
  • numpy == 1.9.2
  • панды == 0.16.2
  • joblib == 0.8.4

Самый полезный комментарий

@ eric-czech Если вы используете Python 3.4 или 3.5, попробуйте установить следующую переменную среды, а затем перезапустите программу Python:

export JOBLIB_START_METHOD="forkserver"

как описано в документации joblib . Режим forkserver не включен по умолчанию, так как он нарушает интерактивно определенные функции.

Все 88 Комментарий

У вас постоянно возникают проблемы на этой платформе?

Что касается многопоточности: есть некоторые оценщики, для которых многопоточность, вероятно, даст существенный выигрыш, те, в которых большая часть работы выполняется с помощью операций numpy или Cython без GIL. На самом деле, я не думаю, что это было оценено много; backend='threading' появилась совсем недавно.

Настоящий вопрос: что еще мы можем сделать, чтобы определить, в чем проблема?

Для начала, какие базовые оценщики вы рассматривали?

@jnothman По платформе у вас OSX 10.9.5? Если так, то да, это не первый раз, когда у меня возникает такая проблема.

Одна, возможно, важная деталь, которую я упустил раньше, заключалась в том, что я всегда использую ноутбуки IPython, когда у меня возникают проблемы. У меня сейчас загружено ядро ​​для записной книжки, и если я добавлю аргумент «подсчета очков» с n_jobs! = 1, то GridSearchCV зависнет навсегда, но если я удалю этот аргумент, все в порядке. Даже если функция оценки, которую я даю, ничего не делает, кроме как возвращает постоянное значение с плавающей запятой, она все равно зависает (но делает именно то, что вы ожидаете с n_jobs = 1).

Re: многопоточность, это приятно слышать, так что, возможно, тогда этот вариант для GridSearchCV действительно будет иметь смысл.

Что касается того, с какими оценками у меня возникают проблемы, я не уверен, что смогу сузить его. Обычно я пробую как можно больше из них, хотя, чтобы получить здесь некоторую полезную информацию, я просто проверил, что могу воспроизвести упомянутые выше условия с любым оценщиком, и обнаружил, что могу во всех случаях (или, по крайней мере, я пытался LogisticRegression, SGDClassifier, GBRT и RF).

Я бы хотел сделать все возможное, чтобы предоставить что-то еще, хотя я не знаю, какой контекст обычно наиболее полезен для подобных проблем с многопоточностью. Есть какие-нибудь предложения для меня?

Вы используете numpy, связанный с ускорительной структурой?

Нет, если я чего-то не упускаю. Я думал, что установленная версия numpy изменяется, когда вы это делаете, или, по крайней мере, будет присутствовать пакет ускорения:

(исследование3.4) eczech $ pip freeze | grep numpy
numpy == 1.9.2
(research3.4) eczech $ conda update ускорение
Ошибка: пакет ускорения не установлен в /Users/eczech/anaconda/envs/research3.4

Простите мое незнание за то, что я не смог ответить на этот вопрос со 100% уверенностью, но я определенно не делал ничего намеренно, чтобы установить его.

conda ускорение - это не то же самое, что ускорение яблока:
http://docs.continuum.io/accelerate/index
https://developer.apple.com/library/mac/documentation/Accelerate/Reference/AccelerateFWRef/

conda accelerate - это версии пакетов с ускорением MKL, apple accelerate - их альтернатива MKL.

можешь дать нам numpy.__config__.show() ?

многопроцессорность не работает с ускорением IIRC. пинг @ogrisel

конечно:

нп. config .show ()
atlas_3_10_blas_threads_info:
НЕДОСТУПЕН
atlas_info:
НЕДОСТУПЕН
atlas_3_10_info:
НЕДОСТУПЕН
atlas_threads_info:
НЕДОСТУПЕН
atlas_3_10_blas_info:
НЕДОСТУПЕН
blas_opt_info:
extra_compile_args = ['-msse3', '-DAPPLE_ACCELERATE_SGEMV_PATCH', '-I / System / Library / Frameworks / vecLib.framework / Headers']
extra_link_args = ['-Wl, -framework', '-Wl, Accelerate']
define_macros = [('NO_ATLAS_INFO', 3)]
lapack_mkl_info:
НЕДОСТУПЕН
atlas_blas_info:
НЕДОСТУПЕН
mkl_info:
НЕДОСТУПЕН
lapack_opt_info:
extra_compile_args = ['-msse3', '-DAPPLE_ACCELERATE_SGEMV_PATCH']
extra_link_args = ['-Wl, -framework', '-Wl, Accelerate']
define_macros = [('NO_ATLAS_INFO', 3)]
blas_mkl_info:
НЕДОСТУПЕН
atlas_3_10_threads_info:
НЕДОСТУПЕН
openblas_info:
НЕДОСТУПЕН
openblas_lapack_info:
НЕДОСТУПЕН
atlas_blas_threads_info:
НЕДОСТУПЕН

Да, это известная проблема, которую я не могу найти в системе отслеживания проблем. Accelerate не работает с многопроцессорной обработкой.

Я немного запутался. Бэкэнд с потоками делает что-то только тогда, когда выпускается GIL, верно?

Попался, ты знаешь, как мне тогда перестроить numpy? Должен ли я просто установить его по пипу вместо того, чтобы использовать для него пакет conda? Или мне было бы лучше собрать из исходников и убедиться, что аргументы Apple ускорения отсутствуют?

Похоже, это немного не проблема, в любом случае. Близко, если это просто избиение мертвой лошади.

если вы можете получить ускорение conda, это сработает;)

может мы могли бы попытаться внести залог в joblib ?

Ах, здорово, континуум, должно быть, заплатил Apple за это, ха-ха.

Есть предложения на $ 0? И в любом случае спасибо за понимание.

Да, и я знаю, что об этом спрашивали раньше, но разве тот факт, что у меня эта проблема возникает только на моей текущей платформе, когда я использую настраиваемую функцию оценки, что-то происходит? На всю жизнь я не понимаю, что может быть проблематичным, учитывая исходный код grid_search.py, но может ли это иметь какое-то отношение к травлению пользовательской функции?

И несколько не связанный с этим, я просто вспомнил, что я также пытался обойти это в прошлом, создав модифицированную версию GridSearchCV, которая вместо этого использует параллельный бэкэнд IPython, поэтому, предполагая, что я пересмотрел это решение, стоит ли каким-то образом поделиться? Это решение работало нормально, но было немного неудобно использовать, потому что любые настраиваемые классы и функции должны были быть доступны на пути python, а не в самих записных книжках, но если нет других лучших вариантов, возможно, у этого есть некоторые ноги.

Вы можете ссылаться на атлас, но это будет медленнее [яблоко] ускоряться, мне кажется.
Может быть, есть бесплатный numpy, связанный с MKL, для OS X? Есть один для окон.

[если вы академик, кстати, Continum Accelerate бесплатен]

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

Может быть, важен факт использования настраиваемой функции скоринга (например, могут быть актуальны проблемы травления или вложенный параллелизм). Можем ли мы увидеть код?

Или вы просто имеете в виду стандартную метрику с make_scorer ?

Конечно, вот соответствующая часть, и похоже, что с make_scorer все в порядке, но не с пользовательской функцией:

from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import StratifiedKFold
from sklearn.metrics import average_precision_score, make_scorer
import functools

res = []
clfs = []

for response in responses:
    X, y = d_in[features], d_in[response]
    for i, (train, test) in enumerate(StratifiedKFold(y, 5)):
        X_train, y_train, X_test, y_test = X.iloc[train], y.iloc[train], X.iloc[test], y.iloc[test]
        clf = LogisticRegression(penalty='l1')
        grid = {
            'class_weight': [{0: 1, 1: 10}, {0: 1, 1: 100}, {0: 1, 1: 1000}],
            'C': np.logspace(-3, 0, num=4)
        }

        # Using make_scorer doesn't cause any issues
        # clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 3),  
        #                    scoring=make_scorer(average_precision_score), n_jobs=-1)

        # This however is a problem:
        def avg_prec_score(estimator, X, y):
            return average_precision_score(y, estimator.predict_proba(X)[:, 1])
        clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 5),  
                           scoring=avg_prec_score, n_jobs=-1)

        clf = clf.fit(X_train, y_train)
        print('Best parameters for response {} inferred in fold {}: {}'.format(response, i, clf.best_params_))

        y_pred = clf.predict(X_test)
        y_proba = clf.predict_proba(X_test)

        clfs.append((response, i, clf))
        res.append(pd.DataFrame({
            'y_pred': y_pred, 
            'y_actual': y_test, 
            'y_proba': y_proba[:,1],
            'response': np.repeat(response, len(y_pred))
        }))

res = functools.reduce(pd.DataFrame.append, res)
res.head()

Я буду работать над автономной версией, которая включает в себя некоторую версию данных, которые я использую (но это займет больше времени). Между тем, обработка этих пользовательских функций звучит неплохо - я пробовал это несколько раз, чтобы убедиться, и он зависает 100% времени с пользовательской функцией и 0% времени при использовании make_scorer с некоторая известная импортированная метрическая функция.

И это в основном (т.е. интерпретируемый сценарий верхнего уровня) или
импортированный модуль?

15 августа 2015 года в 23:37 Эрик Чех [email protected] написал:

Конечно, вот соответствующая часть, и, похоже, все в порядке
с make_scorer, но не с пользовательской функцией:

from sklearn.linear_model import LogisticRegressionfrom sklearn.grid_search import GridSearchCVfrom sklearn.cross_validation import StratifiedKFoldfrom sklearn.metrics import average_precision_score, make_scorerimport functools

res = []
clfs = []
для ответа в ответах:
X, y = d_in [особенности], d_in [ответ]
for i, (train, test) in enumerate (StratifiedKFold (y, 5)):
X_train, y_train, X_test, y_test = X.iloc [поезд], y.iloc [поезд], X.iloc [тест], y.iloc [тест]
clf = логистическая регрессия (штраф = 'l1')
grid = {
'вес_класса': [{0: 1, 1: 10}, {0: 1, 1: 100}, {0: 1, 1: 1000}],
'C': np.logspace (-3, 0, число = 4)
}

    # Using make_scorer doesn't cause any issues
    # clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 3),
    #                    scoring=make_scorer(average_precision_score), n_jobs=-1)

    # This however is a problem:
    def avg_prec_score(estimator, X, y):
        return average_precision_score(y, estimator.predict_proba(X)[:, 1])
    clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 5),
                       scoring=avg_prec_score, n_jobs=-1)

    clf = clf.fit(X_train, y_train)
    print('Best parameters for response {} inferred in fold {}: {}'.format(response, i, clf.best_params_))

    y_pred = clf.predict(X_test)
    y_proba = clf.predict_proba(X_test)

    clfs.append((response, i, clf))
    res.append(pd.DataFrame({
        'y_pred': y_pred,
        'y_actual': y_test,
        'y_proba': y_proba[:,1],
        'response': np.repeat(response, len(y_pred))
    }))

res = functools.reduce (pd.DataFrame.append, res)
res.head ()

Я буду работать над автономной версией, включающей некоторую версию
данные, которые я тоже использую (но это займет больше времени). А пока,
обработка этих пользовательских функций звучит как хороший пример - я пробовал
несколько раз еще раз чтобы убедиться и зависает 100% времени с кастомной
функция и 0% времени при использовании make_scorer с некоторыми известными,
импортированная метрическая функция.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -131376298
.

Ой, это ipynb. Хммм интересно. Да, маринование могло быть проблемой ..?

15 августа 2015 года в 23:51 Джоэл Нотман джоэл. [email protected] написал:

И это в основном (т.е. интерпретируемый сценарий верхнего уровня) или
импортный модуль?

15 августа 2015 года в 23:37 Эрик Чех [email protected] написал:

Конечно, вот соответствующая часть, и, похоже, все в порядке
с make_scorer, но не с пользовательской функцией:

from sklearn.linear_model import LogisticRegressionfrom sklearn.grid_search import GridSearchCVfrom sklearn.cross_validation import StratifiedKFoldfrom sklearn.metrics import average_precision_score, make_scorerimport functools

res = []
clfs = []
для ответа в ответах:
X, y = d_in [особенности], d_in [ответ]
for i, (train, test) in enumerate (StratifiedKFold (y, 5)):
X_train, y_train, X_test, y_test = X.iloc [поезд], y.iloc [поезд], X.iloc [тест], y.iloc [тест]
clf = логистическая регрессия (штраф = 'l1')
grid = {
'вес_класса': [{0: 1, 1: 10}, {0: 1, 1: 100}, {0: 1, 1: 1000}],
'C': np.logspace (-3, 0, число = 4)
}

    # Using make_scorer doesn't cause any issues
    # clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 3),
    #                    scoring=make_scorer(average_precision_score), n_jobs=-1)

    # This however is a problem:
    def avg_prec_score(estimator, X, y):
        return average_precision_score(y, estimator.predict_proba(X)[:, 1])
    clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 5),
                       scoring=avg_prec_score, n_jobs=-1)

    clf = clf.fit(X_train, y_train)
    print('Best parameters for response {} inferred in fold {}: {}'.format(response, i, clf.best_params_))

    y_pred = clf.predict(X_test)
    y_proba = clf.predict_proba(X_test)

    clfs.append((response, i, clf))
    res.append(pd.DataFrame({
        'y_pred': y_pred,
        'y_actual': y_test,
        'y_proba': y_proba[:,1],
        'response': np.repeat(response, len(y_pred))
    }))

res = functools.reduce (pd.DataFrame.append, res)
res.head ()

Я буду работать над автономной версией, включающей некоторую версию
данные, которые я тоже использую (но это займет больше времени). А пока,
обработка этих пользовательских функций звучит как хороший пример - я пробовал
несколько раз еще раз чтобы убедиться и зависает 100% времени с кастомной
функция и 0% времени при использовании make_scorer с некоторыми известными,
импортированная метрическая функция.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -131376298
.

Это в записной книжке

Вместо этого я попробую импортировать его из модуля и посмотрю, как это пойдет

Хм что знаете, нормально работает при определении вне ноутбука.

У меня практически тот же код, работающий в python 2.7 (мне нужна более старая библиотека), а также этот код в python 3.4, и хотя у меня есть проблема с зависанием в 2.7, независимо от того, является ли это настраиваемой функцией или чем-то, использующим make_scorer, я Думаю, это решит все мои проблемы в новой версии, так что я могу просто жить с обходными путями в старой.

Что еще я могу сделать, чтобы выяснить, почему функции травления, определенные в записной книжке, могут быть проблемой?

Что ж, хотим понять:

  • является ли травление и распаковка, как правило, проблемой для локально определенных функций на этой платформе, или мы сталкиваемся с определенной проблемой?
  • почему, если травление является проблемой, оно скорее зависает, чем вызывает исключение? Не могли бы вы попробовать исправление обезьяны или что-то подобное, чтобы увидеть, заменяет ли pickle.dumps(function) check https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/externals/joblib/parallel. py # L150 с pickle.loads(pickle.dumps(function)) приводит к ошибке? (Чтобы пояснить, это проверка безопасности, чтобы гарантировать травление перед запуском многопроцессорной обработки.)

@ogrisel может быть заинтересован в этом.

Судя по тому, что я видел в Windows, ноутбуки странно взаимодействуют с многопроцессорностью.

Вы пробовали просто «засорять» и «распаковать» функцию, определенную в том же блокноте?

Сегодня я случайно увидел эту https://pythonhosted.org/joblib/parallel.html#bad -interaction-of-multiprocessing-and-сторонние-библиотеки, разве это не связано?
Может, стоит просто перейти на Python 3.4 или новее?

Жаль уехал в длительный отпуск. Однако, чтобы ответить на ваши вопросы:

  1. re @jnothman : я поместил pickle.loads(pickle.dumps(function)) в parallel.py и оператор печати после него, чтобы убедиться, что он выполняется правильно и там нет проблем. Чтобы было ясно, GridSearchCV.fit, вызванный из записной книжки, по-прежнему зависал, как и раньше, без каких-либо изменений (за исключением добавленного мной оператора печати, который отображался 16 раз с n_jobs = -1).
  2. re @amueller : Если я правильно вас понял, то я без проблем запустил в блокноте что-то вроде этого:
def test_function(x):
    return x**2
pickle.loads(pickle.dumps(test_function))(3)
# 9
  1. re @olologin : я использую 3.4.3. Или более конкретно: «3.4.3 | Continuum Analytics, Inc. | (по умолчанию, 6 марта 2015 г., 12:07:41) n [GCC 4.2.1 (Apple Inc., сборка 5577)] '

Я не читал вышеупомянутый разговор, но хотел бы отметить, что этот минимальный тест не проходит в сборке Python 2.6 Travis, но прошел в аналогичной конфигурации на моем ПК ... (предполагая, что он не работает, когда n_jobs = -1 установлен на одноядерной машине для старых версий python / joblib / scipy?)

def test_cross_val_score_n_jobs():
    # n_jobs = -1 seems to hang in older versions of joblib/python2.6
    # See issue 5115
    cross_val_score(LinearSVC(), digits.data, digits.target, cv=KFold(3),
                    scoring="precision_macro", n_jobs=-1)

+1 за эту проблему, с радостью предоставлю подробности, если это поможет

@ eric-czech Если вы используете Python 3.4 или 3.5, попробуйте установить следующую переменную среды, а затем перезапустите программу Python:

export JOBLIB_START_METHOD="forkserver"

как описано в документации joblib . Режим forkserver не включен по умолчанию, так как он нарушает интерактивно определенные функции.

Такая же проблема возникает как в OS X 10.11.4, так и в Ubuntu 14.04 с установленной последней версией программного обеспечения.

# Metrics
B_R = 10.0

def raw_TPR(y_true, y_pred):
    return np.sum((y_true == 1) & (y_pred == y_true))

def raw_FPR(y_true, y_pred):
    return np.sum((y_true == 0) & (y_pred != y_true))

def AMS(y_true, y_pred):
    print("Hello")
    tpr = raw_TPR(y_true, y_pred)
    fpr = raw_FPR(y_true, y_pred)
    score = np.sqrt(2 * ((tpr + fpr + B_R) * np.log(1 + tpr / (fpr + B_R))) - tpr)
    return score


# Grid search

param_grid = {
    "max_depth":[6, 10],
    "learning_rate":[0.01, 0.5],
    "subsample":[0, 1],
    "min_child_weight":[0.1, 1],
    "colsample_bytree":[0.1, 1],
    "base_score":[0.1, 1],
    "gamma":[0.5, 3.5]
}

scorer = make_scorer(AMS, greater_is_better=True)


clf = XGBClassifier()
gridclf = GridSearchCV(clf, param_grid, scorer, n_jobs=-1, verbose=2)
gridclf.fit(X_train, y_train)

Собственно, этот код не зависает, только если n_jobs=1 .

Теперь это должно работать по умолчанию на python 3 и быть исправлением на python 2, верно @ogrisel ? Мы должны закрыть?

Если он молча зависает на Python 2 без выдачи предупреждений или ошибок («n_jobs> 1 не поддерживается на Python 2»), это неприемлемо; мы можем выдать ошибку?

@amueller на Python 3 вы можете следовать https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383, чтобы обойти проблему, т.е. он не будет работать по умолчанию даже на Python 3.

Не уверен, следует ли нам закрыться, потому что исходный OP, похоже, говорил, что установка joblib start_method на forkserver не всегда работает ...

Кстати, xgboost известен, см. Https://github.com/scikit-learn/scikit-learn/issues/6627#issuecomment -206351138.

Изменить: приведенное ниже изменение может не исправить ситуацию. Было внесено не связанное с этим изменение в то, как я обрабатывал многопроцессорность с помощью Pathos, и это могло быть моим настоящим исправлением.

Быстрая починка:
np.random.seed(0)

Пояснение:
Я тоже сталкивался с этой проблемой, особенно остро в тестовом наборе для auto_ml . Первый (2?) Раза, когда я запускал GridSearchCV, все было нормально, но затем последующие запуски зависали без ошибок.

Я просто устанавливаю np.random.seed(0) внутри каждого из моих тестов, чтобы обеспечить воспроизводимость, и в то же время дать себе гибкость для изменения порядка тестов с течением времени, не вмешиваясь в случайность. Как только я это сделал, все тесты, которые зависали на ошибке GSCV, снова заработали.

def test_name():
    np.random.seed(0)
    test_code_involving_gscv_here

надеюсь, что это поможет с отладкой!

Среда разработки:
Mac OS X (Sierra)
Python 2.7
Актуальные версии библиотек.

@ClimbsRocks ну это, вероятно, какая-то ошибка в ваших оценках. Сообщите нам, если у вас есть воспроизводимый пример;)

@amueller : хороший звонок. Я бросился срезать ветку, чтобы вы, ребята, воспроизвели это, но на этот раз все прошло правильно.

Я думаю, что это, вероятно, проблема с распараллеливанием GSCV, когда я также использую распараллеливание Pathos в других частях программы. Это единственное, что я изменил за последнюю неделю или около того.

С тех пор я реорганизовался, чтобы более тщательно закрыть и открыть их многопроцессорный пул.

Что заставляет меня думать, что это не просто ошибка в одном из оценщиков, так это то, что при создании набора тестов каждый из тестов запускался и проходил индивидуально. И только когда я провел несколько тестов за один проход, все зависели от GSCV, он начал зависать.

Отредактировал предыдущий комментарий, чтобы отметить эту неопределенность.

если вы объедините joblib с любым другим распараллеливанием, очень вероятно, что он выйдет из строя, и вам не следует пытаться это сделать.

Извините за эту тему, но я тоже сталкиваюсь с этой проблемой.
Я создал ядро ​​Python 3.5 и определил метод запуска библиотеки задания для forkserver, но у меня все еще есть проблема.

На самом деле он даже не работает с n_jobs = 1. Я вижу, что он вычисляет, кроме последнего параметра.

Есть какие-либо Новости ?

На самом деле он даже не работает с n_jobs = 1. Я вижу, что он вычисляет, кроме последнего параметра.

Это странно и, скорее всего, не связано с этой проблемой (которая касается n_jobs != 1 ). Лучший способ получить хорошую обратную связь - открыть отдельную проблему с отдельным фрагментом, воспроизводящим проблему.

Я почти уверен, что сам сталкиваюсь с этой проблемой. После попытки многих комбинаций все, что я делаю с n_jobs> 1, просто зависает после нескольких складок. Я использую ноутбук Ubuntu Linux с sklearn = 0.19.0, так что это конфигурация, отличная от других, которые я читал. Вот «оскорбительный» код:

import xgboost as xgb
from sklearn.model_selection import GridSearchCV
cv_params = {'max_depth': [3,5,7], 'min_child_weight': [1,3,5]}

ind_params = {'learning_rate': 0.1, 'n_estimators': 1000, 'seed':0, 'subsample': 0.8, 'colsample_bytree': 0.8,  'objective': 'binary:logistic'}
optimized_XGB = GridSearchCV(xgb.XGBClassifier(**ind_params), 
                            cv_params, scoring = 'roc_auc', cv = 5, n_jobs = 1, verbose=2) 
optimized_XGB.fit(xgboost_train, label_train,eval_metric='auc')

Одна из интересных вещей заключается в том, что при импорте xgboost я получаю предупреждение об устаревании GridSearchCV, как если бы он не был импортирован из model_selection. Однако я использую xgboost 0.62, и, глядя на их репозиторий, похоже, что они импортируют правильный GridSearchCV. Чтобы было ясно, предупреждение об устаревании - это не проблема, которая меня беспокоит, а скорее проблема: остановка выполнения с n_jobs> 1. Просто указываю на случай, если это может помочь.

не могли бы вы предоставить данные, которые помогут воспроизвести проблему?

24 августа 2017 г., в 20:29, Ксавье Аматриан [email protected]
написал:

Я почти уверен, что сам сталкиваюсь с этой проблемой. После многих попыток
комбинации, все, что я делаю с n_jobs> 1, просто зависает через несколько
складки. Я использую ноутбук Ubuntu Linux с sklearn = 0.19.0, так что это
конфигурация отличается от других, которые я читал. Здесь
"оскорбительный" код:

`импортировать xgboost как xgb
из sklearn.model_selection import GridSearchCV
cv_params = {'max_depth': [3,5,7], 'min_child_weight': [1,3,5]}

ind_params = {'Learning_rate': 0,1, 'n_estimators': 1000, 'seed': 0,
'subsample': 0.8, 'colsample_bytree': 0.8, 'objective': ' binary: logistic '}
optimized_XGB = GridSearchCV (xgb.XGBClassifier (** ind_params),
cv_params, scoring = 'roc_auc', cv = 5, n_jobs = 1, verbose = 2)
optimized_XGB.fit (xgboost_train, label_train, eval_metric = 'auc') `

Интересно то, что когда я импортирую xgboost, я получаю
предупреждение об устаревании GridSearchCV, как если бы он не импортировался из
model_selection. Однако я использую xgboost 0.62 и смотрю на их
репозиторий похоже, что они импортируют правильный GridSearchCV. Быть
ясно, предупреждение об устаревании - это не проблема, которая меня беспокоит, а скорее
один под рукой: выполнение зависает с n_jobs> 1. Просто указывая на
случае это могло помочь.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-324597686 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz66DbfTlnU_-dcxLKa5zkrcZ-0qVOks5sbVCmgaJpZM4FqYlN
.

Конечно, вы можете скачать именно те файлы, которые я использую, с:
https://xamat.github.io/xgboost_train.csv
https://xamat.github.io/label_train.csv

HTTP404

Извините, в первой ссылке была ошибка, теперь ее нужно исправить. Второй тоже должен быть в порядке, я только что проверил.

Известная проблема с xgboost, см., Например, https://github.com/scikit-learn/scikit-learn/issues/6627#issuecomment -206351138.

К вашему сведению, локальный бэкэнд в joblib избавит от подобных проблем, но это будет доступно только в scikit-learn 0.20.

Это все еще ошибка? У меня такая же проблема со значениями по умолчанию (n_jobs = 1), а также с pre_dispatch = 1, используя RandomForestClassifier , с 80 комбинациями параметров и ShuffleSplit CV (n = 20).

Он также зависает для конвейера ( SelectKBest(score_func=mutual_info_classif, k=10) за которым следует RandomForestClassifier ), как в последней версии, так и в версии для разработки.

Дайте мне знать, если вы, ребята, нашли обходной путь или другие надежные методы выбора модели. Думаю о том, чтобы попробовать scikit-optimize .

Вы имеете в виду n_jobs = 1 или это опечатка? Эта проблема касается n_jobs! = 1.

Лучший способ получить качественную обратную связь - предоставить способ воспроизвести проблему. Пожалуйста, откройте отдельный вопрос в этом случае, если проблема, которую вы видите, действительно связана с n_jobs = 1.

Я написал то, что имел в виду, "многопоточность включена".
n_jobs! = 1 как в «не равно 1». Эквивалентно, n_jobs> 1. Например, n_jobs = 4

Вы говорите, что не можете воспроизвести остановку для n_jobs = 4?

Если это так, я предоставлю тестовую версию в течение месяца (я перехожу на новую машину).

12 сентября 2017 г. в 7:10 Лоик Эстев < [email protected] [email protected] > написал:

Вы имеете в виду n_jobs = 1 или это опечатка? Эта проблема касается n_jobs! = 1.

Лучший способ получить качественную обратную связь - предоставить способ воспроизвести проблему. Пожалуйста, откройте отдельный вопрос в этом случае, если проблема, которую вы видите, действительно связана с n_jobs = 1.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-328864498 или отключите поток https://github.com/notifications/unsubscribe- auth / ABH-rd7wgU5lcS6oD5VMl0YOB8CXfSTJks5shpDZgaJpZM4FqYlN .

@smcinerney , ты @raamana? Я думаю, что @lesteve ответила @raamana , написавшему n_jobs=1 , что, похоже, не связано с этой проблемой.

Ой, извини, я не @raamana. Да, проблема с @ raamana другая (но, вероятно, из-за того же кода)

12 сентября 2017 г. в 9:23 Андреас Мюллер < [email protected] [email protected] > написал:

@smcinerney https://github.com/smcinerney ты @raamana https://github.com/raamana ? Я думаю, что @lesteve https://github.com/lesteve ответил на @raamana https://github.com/raamana, который написал n_jobs = 1, что, похоже, не связано с этой проблемой.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-328905819 или отключите поток https://github.com/notifications/unsubscribe- auth / ABH-rYKQA3L5ifINBX6enrk5oDIsf1Lqks5shrASgaJpZM4FqYlN .

Плохо, я не хотел все перемешивать. Я открою еще одну проблему (с минимальным кодом для ее воспроизведения), но разве GridSearchCV не зависает даже со значением по умолчанию n_jobs = 1 (учитывая, что это значение по умолчанию и должно работать), чем n_jobs> 1.

@raamana: да, это более

@ eric-czech @jnothman
Итак, если вы решили использовать backend = 'threading'. Одним из простых способов без изменения кода sklearn было бы использование диспетчера контекста parallel_backend, а не изменение метода соответствия GSV.

from sklearn.externals.joblib import parallel_backend

clf = GridSearchCV()
with parallel_backend('threading'):
    clf.fit(x_train, y_train)

PS: Я не уверен, работает ли «многопоточность» для всех оценщиков. Но у меня была такая же проблема с моим оценщиком с GSV njob> 1, и использование этого работает, как ожидалось, без изменения библиотеки.

Система примерила:
ОС MAC: 10.12.6
Python: 3.6
numpy == 1.13.3
панды == 0.21.0
scikit-learn == 0.19.1

Хм ... Могут быть некоторые проблемы с параллелизмом при использовании бэкэнда потоковой передачи в
поиск по сетке, например ошибка в # 10329 создает условия гонки ...

22 декабря 2017 года в 03:59 Trideep Rath [email protected] написал:

@ eric-czech https://github.com/eric-czech @jnothman
https://github.com/jnothman
Итак, если вы решили использовать backend = 'threading'. Один простой способ без
изменение кода sklearn будет заключаться в использовании диспетчера контекста parallel_backend
и не изменять метод подгонки GSV.

из sklearn.externals.joblib import parallel_backend

clf = GridSearchCV ()
с parallel_backend ('threading'):
clf.fit (x_train, y_train)

PS: Я не уверен, работает ли «многопоточность» для всех оценщиков. А я был
имея ту же проблему с моей оценкой с GSV njob> 1 и используя это
у меня работает как положено, без изменения библиотеки.

Система примерила:
ОС MAC: 10.12.6
Python: 3.6
numpy == 1.13.3
панды == 0.21.0
scikit-learn == 0.19.1

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-353402474 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz64SfwYpjLU1JK0vukBRXJvWYs3LKks5tCo51gaJpZM4FqYlN
.

Пример: использование бэкэнда как «многопоточности» и использование Estimator, расширяющего BaseEstimator и ClassifierMixin. Я не уверен, в чем причина гонки. Не могли бы вы уточнить.

Согласно моему пониманию и экспериментам, я не наблюдал никаких условий гонки.

out = Parallel(
    n_jobs=self.n_jobs, verbose=self.verbose,
    pre_dispatch=pre_dispatch
)(delayed(_fit_and_score)(clone(base_estimator), X, y, scorers, train,
                          test, self.verbose, parameters,
                          fit_params=fit_params,
                          return_train_score=self.return_train_score,
                          return_n_test_samples=True,
                          return_times=True, return_parameters=False,
                          error_score=self.error_score)
  for parameters, (train, test) in product(candidate_params,
                                           cv.split(X, y, groups)))

_fit_and_score вызывается на клоне (base_estimator). Это делает deep_copy и копию собственных данных.

out - результат метода _fit_and_score. Итак, после этого все потоки завершили выполнение метода соответствия оценщика и сообщили результаты.

Результаты - это то, что вы получаете от GCV_clf.cv_results_

Не могли бы вы объяснить в этом конкретном случае, почему это может вызвать состояние гонки?

Состояние гонки возникает, если вы устанавливаете вложенные параметры, то есть когда
один измененный параметр - это оценка, а другой - параметр этого
оценщик.

У меня такая же проблема с использованием make_scorer в сочетании с GridSearchCv и n_jobs=-1 под Win 7 с последними версиями:

Windows-7-6.1.7601-SP1
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
NumPy 1.12.1
SciPy 1.0.0
Scikit-Learn 0.19.1

@mansenfranzen, спасибо, что разместили свои версии и платформу! Лучший шанс получить обратную связь хорошего качества - предоставить автономный фрагмент кода для воспроизведения проблемы. Пожалуйста, прочтите https://stackoverflow.com/help/mcve для получения более подробной информации.

Возникла та же проблема под Win7 с любыми пользовательскими шагами предварительной обработки.
Цепочка инструментов:

Python 3.6.2
NumPy 1.13.1, 1.14.2 (under both)
SciPy 1.0.0
SkLearn 0.19.1

MCVE:

from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
import numpy as np

class CustomTransformer:
    def fit(self, X, y):
        return self

    def transform(self, X):
        return X

pipeline = make_pipeline(CustomTransformer(),
                         SVC())

X_train = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])
y_train = np.array([1.0, 0.0, 0.0, 1.0])

print(cross_val_score(pipeline, X_train, y_train, cv=2, n_jobs=-1))

знаете ли вы, что многопроцессорность python не будет работать в Windows без if __name__ == '__main__' ?

Да, я. Извините, забыл сказать, что использую Jupyter.
Автономный скрипт с if __name__ == '__main__' печатает следующие трассировки, а затем все еще зависает:

Process SpawnPoolWorker-1:
Traceback (most recent call last):
  File "C:\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap
    self.run()
  File "C:\Python\Python36\lib\multiprocessing\process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python\Python36\lib\multiprocessing\pool.py", line 108, in worker
    task = get()
  File "C:\Python\Python36\lib\site-packages\sklearn\externals\joblib\pool.py", line 362, in get
    return recv()
  File "C:\Python\Python36\lib\multiprocessing\connection.py", line 251, in recv
    return _ForkingPickler.loads(buf.getbuffer())
AttributeError: Can't get attribute 'CustomTransformer' on <module '__mp_main__' from 'C:\\projects\\Python\\Sandbox\\test.py'>
< same for SpawnPoolWorker-3 here >

О, интересно. Я просто из лени поместил весь скрипт в if __name__ == '__main__' и получил результаты из предыдущего комментария.

Теперь я поместил только pipeline = make_pipeline... , и он успешно выполнился. Может дело в Jupyter?

В любом случае, я не знаю, допустимо ли поведение в предыдущем комментарии и вызвано ли оно неправильным использованием if __name__ == '__main__' или это вина SkLearn.

похоже, проблема не в нашей библиотеке, а в исполнении
контекст для многопроцессорной обработки в окнах ...

Это мерзко. И действительно, я не мог воспроизвести ни одну из проблем в Ubuntu с одинаковыми версиями всего. Спасибо за помощь!

Могу подтвердить, что эта ошибка жива и здорова.

Запуск в Windows 10 в ноутбуке jupyter, Python3, Sklearn 0.19.1

Та же проблема на Linux Mint (Ubuntu 16.10) Python 3.5

На первом этапе Epoch все застревает на каждом ядре, а процессоры простаивают, поэтому работы не выполняется.

@MrLobs, это похоже на ошибку травления, верно? поместите CustomTransformer в отдельный файл Python.

@ Chrisjw42 @avatsaev без дополнительного контекста мы мало что сможем сделать.
@avatsaev похоже, что вы используете тензорный поток?

@amueller да, это тензорный поток

@avatsaev , информации по-прежнему недостаточно. У вас есть минимальный пример для воспроизведения? что вы используете, используете ли вы графический процессор, какую версию scikit-learn вы используете ....

Хорошо, оказывается, это потому, что я использую TF GPU, поэтому установка n_jobs на> 1 на самом деле не работает, что нормально, потому что у меня только один GPU lol

да, вам в любом случае не стоит использовать n_jobs с TF.

почему бы и нет?

@amueller , да, помещение кастомных трансформаторов в отдельный файл решает эту проблему

Может ли n_jobs! = 1 выдать ошибку (или, по крайней мере, предупреждение) в среде, в которой он будет зависать? Я только что столкнулся с этой проблемой в записных книжках jupyter, и если бы я был более начинающим пользователем (как и весь мой класс), я бы никогда не понял, почему gridsearchcv продолжал зависать, на самом деле наш учитель даже посоветовал нам использовать n_jobs = - 1. Если проблема здесь известна, может ли пакет (keras или sklearn, в зависимости от того, что там) предупреждать о ее возникновении и предотвращать зависание?

Я не думаю, что кто-то знает, в какой среде это будет зависеть ... Я не верю, что кому-то удалось воспроизвести эту ошибку надежным способом.

но мы работаем над улучшением нашей многопроцессорной инфраструктуры.
Мне неясно, решит ли это все подобные проблемы.

@jnothman 👍

Приятно слышать!

Я не уверен, почему это помечено как 0.21. В большинстве случаев это решается в 0.20. Я считаю, что мы должны закрыть это и дать людям возможность открывать новые вопросы. Этот слишком длинный и неопределенный.

Я только что столкнулся с тем же на AWS Ubuntu с jupyter ...

Кажется, что использование parallel_backend работает ...


from sklearn.externals.joblib import parallel_backend

clf = GridSearchCV(...)
with parallel_backend('threading'):
    clf.fit(x_train, y_train)

@morienor, если вы можете воспроизвести эту проблему с помощью scikit-learn 0.20.1, откройте новую проблему со всеми необходимыми деталями, чтобы кто-то другой смог воспроизвести проблему (полный сценарий с операторами импорта на поддельном случайном наборе данных) вместе со всеми номерами версий для python, scikit-learn, numpy, scipy и операционной системы.

Я только что столкнулся с тем же на AWS Ubuntu с jupyter ...

Кажется, что использование parallel_backend работает ...


from sklearn.externals.joblib import parallel_backend

clf = GridSearchCV(...)
with parallel_backend('threading'):
    clf.fit(x_train, y_train)

У меня это работает! Большое спасибо!

@ jmq19950824 @morienor да, но нет смысла использовать threading backend из-за GIL.

Я только что столкнулся с тем же на AWS Ubuntu с jupyter ...

Кажется, что использование parallel_backend работает ...


from sklearn.externals.joblib import parallel_backend

clf = GridSearchCV(...)
with parallel_backend('threading'):
    clf.fit(x_train, y_train)

гений работает на меня

Была ли эта страница полезной?
0 / 5 - 0 рейтинги