多处理在改装时卡在 ARMAX 上

Multiprocessing getting stuck with ARMAX while refitting

我正在尝试在 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 循环中定义一个新的 class 实例,同时将 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。谢谢

这个问题一定是由于 tqdm 与多处理一起使用造成的。

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

我使用

解决了它
from tqdm import tqdm
tqdm.get_lock().locks = []