【问题标题】:Multiprocessing getting stuck with ARMAX while refitting改装时多处理卡在 ARMAX 上
【发布时间】:2020-12-16 12:03:02
【问题描述】:

我正在尝试使用 Jupyter Notebook 中的以下代码训练多个时间序列模型。

import statsmodels.api as sm
import multiprocessing
import tqdm

train_dict = dict() # A dictionary of dataframes
test_dict = dict() # A dictionary of dataframes

def train_arma(key):
    endog = list(train_dict[key].endog)
    exog = list(train_dict[key].exog)
    
    fut_endog = list(train_dict[key].endog)
    fut_exog = list(test_dict[key].exog)

    model = sm.tsa.arima.ARIMA(endog, order=(2, 0, 2), exog=exog,
                               enforce_stationarity=False,
                               enforce_invertibility=False).fit()
    predictions = list()
    yhat = model.forecast(exog=[fut_exog[0]])[0]
    predictions.append(yhat)

    for i in tqdm.tqdm_notebook(range(len(fut_vol))[:-1]):
        model = model.append([fut_vol[i]], exog=[fut_exog[i]], refit=True) #code gets stuck here
        predictions.append(model.forecast(exog=[fut_exog[i+1]])

    return predictions

secs = list(train_dict.keys())
p = multiprocessing.Pool(10)
output = p.map(train_arma, secs)
p.terminate()

len(endog) == 1006 时,代码一直卡在 for 循环的第 17 次迭代中。如果我将 endog 减少 20,那么它会卡在第 37 次迭代。

我已经尝试过其他一些事情:

  1. 直接传递数据帧,而不是让函数从外部范围访问 train_dict 和 test_dict。
  2. 减少多处理中的最大进程数。
  3. 随机播放我的输入列表。
  4. 在 for 循环中定义一个新的类实例,同时将来自 fut_endog 和 fut_exog 列表的值分别附加到 endog 和 exog 列表中。

我在我的 linux 终端中做了一个top,并在创建和执行进程时观察了 cpu 使用情况。最初,当进程产生时,它们会耗尽 cpu,当进程卡住时,%CPU 分配变为 0。

在某些情况下代码确实有效:

  1. 当我直接调用该函数而不进行多处理时,它可以工作。但是即使使用processes = 1 也使用多处理会使代码停止。
  2. 当我不传递任何外生变量并训练一个简单的 ARMA 模型时,它可以工作。

我使用的是 statsmodels v0.12.1,python 版本是 3.7.3。谢谢

【问题讨论】:

    标签: python-3.x python-multiprocessing statsmodels arima


    【解决方案1】:

    这个问题一定是由于在多处理的同时使用了 tqdm。

    https://github.com/tqdm/tqdm/issues/461 解决了这个问题。

    我通过使用解决了它

    from tqdm import tqdm
    tqdm.get_lock().locks = []
    

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      相关资源
      最近更新 更多