支持多处理的并行循环不能嵌套在线程下,设置n_jobs = 1

时间:2018-09-19 16:44:01

标签: python scikit-learn plotly-dash

我开发了一个Python脚本,该脚本基本上读取excel文件并使用n_jobs语句使用sklearns GridSearchCV训练模型:

def create_table():
    my_model = GridSearchCV(GradientBoostingRegressor(), tuned_parameters, cv=5, scoring='neg_mean_absolute_error', n_jobs=7)
    my_model.fit(x_data, y_data)
    return(my_model.predict(new_x_data))

这在执行时非常有效。但是现在我试图通过在Dash应用程序中单击按钮来执行它

Multiprocessing backed parallel loops cannot be nested below threads, setting n_jobs=1

我的Dash应用程序是这样的:

def generate_html_table(dataframe, max_rows=50):
    return html.Table(
    # Header
    [html.Tr([html.Th(col) for col in dataframe.columns])] +

    # Body
    [html.Tr( [html.Td(dataframe.index[i])] + [html.Td(dataframe.iloc[i][col]) for col in dataframe.columns]) for i in range(min(len(dataframe), max_rows))]
    )

app = dash.Dash()
app.layout = html.Div([
    html.H1(children='Region Forecast',
        style={'textAlign': 'center'} ),
    html.Button(id='submit-button', n_clicks=0, children='Submit',
            style={ 'margin': 'auto',
                    'display': 'block' }),
    html.Table(id='output-table', children = generate_html_table(pd.DataFrame()))
    ])

@app.callback(Output('output-table', 'children'),
        [Input('submit-button', 'n_clicks')])

def reactive_compute(n_clicks):
    print('inside reactive compute')
    my_table = create_my_table()
    return(generate_html_table(my_table))

if __name__ == '__main__':
    app.run_server(debug=True)

我已经看到了这个问题,但是它对我没有帮助,因为我自己不处理多重处理(这是scikitlearn函数):Multiprocessing backed parallel loops cannot be nested below threads

该应用只能在本地运行,我不打算将其放置在Web服务器上。

我可以从Dash应用程序中保持并行模型拟合吗,如果可能的话,我该如何最好地解决呢?

1 个答案:

答案 0 :(得分:1)

您是否正在使用Windows?我在Windows上遇到了完全相同的问题,因此我尝试在Ubuntu中运行该应用程序,并且工作正常。

如果您不想弄乱虚拟机或不想正确安装它,可以从Microsoft Store现在在Windows上安装Linux Shell。非常适合测试和开发。

编辑:GridSearchCV似乎可以解决它,但是当我自己运行回归器时,我仍然遇到该错误。

编辑2:GridSearchCV使用了所有线程,但仅将它们加载到10-20%。使用gunicorn运行该应用程序可以解决此问题。

gunicorn my_app:server

也将以下内容添加到my_app.py中:

server = app.server