多处理在改装时卡在 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 次迭代。
还有一些我已经尝试过的东西:
- 直接传递数据帧,而不是让函数从外部范围访问 train_dict 和 test_dict。
- 减少多处理中的最大进程数。
- 正在打乱我的输入列表。
- 在 for 循环中定义一个新的 class 实例,同时将 fut_endog 和 fut_exog 列表中的值分别附加到 endog 和 exog 列表中。
我在 linux 终端中执行了 top
并观察了 cpu 在创建和执行进程时的用法。最初,当进程产生时,它们用完 cpu,当进程卡住时,%CPU 分配变为 0.
在某些情况下代码确实有效:
- 当我直接调用函数时,没有多处理,它工作。但是即使使用
processes = 1
进行多处理也会使代码停止。
- 当我不传递任何外生变量并训练一个简单的 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 = []
我正在尝试在 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 次迭代。
还有一些我已经尝试过的东西:
- 直接传递数据帧,而不是让函数从外部范围访问 train_dict 和 test_dict。
- 减少多处理中的最大进程数。
- 正在打乱我的输入列表。
- 在 for 循环中定义一个新的 class 实例,同时将 fut_endog 和 fut_exog 列表中的值分别附加到 endog 和 exog 列表中。
我在 linux 终端中执行了 top
并观察了 cpu 在创建和执行进程时的用法。最初,当进程产生时,它们用完 cpu,当进程卡住时,%CPU 分配变为 0.
在某些情况下代码确实有效:
- 当我直接调用函数时,没有多处理,它工作。但是即使使用
processes = 1
进行多处理也会使代码停止。 - 当我不传递任何外生变量并训练一个简单的 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 = []