मैं जुपिटर नोटबुक में नीचे दिए गए कोड का उपयोग करके कई समय श्रृंखला मॉडल को प्रशिक्षित करने की कोशिश कर रहा हूं।

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, कोड लूप में 17वें पुनरावृत्ति पर अटकता रहता है। अगर मैं एंडोग को 20 से घटाता हूं, तो यह 37 वें पुनरावृत्ति पर अटक जाता है।

कुछ अन्य चीजें हैं जिन्हें मैंने पहले ही आजमाया है:

  1. फ़ंक्शन को बाहरी दायरे से ट्रेन_डिक्ट और टेस्ट_डिक्ट को एक्सेस करने देने के बजाय सीधे डेटाफ्रेम पास करना।
  2. मल्टीप्रोसेसिंग में अधिकतम प्रक्रियाओं की संख्या कम करना।
  3. मेरी इनपुट सूची में फेरबदल।
  4. एंडोग और एक्सोग सूचियों में क्रमशः fut_endog और fut_exog सूचियों से मूल्यों को जोड़ते हुए लूप के लिए एक नए वर्ग के उदाहरण को परिभाषित करना।

मैंने अपने लिनक्स टर्मिनल में एक top किया और प्रक्रियाओं के निर्माण और निष्पादित होने के दौरान सीपीयू के उपयोग को देखा। प्रारंभ में जब प्रक्रियाएं उत्पन्न होती हैं, तो वे सीपीयू का उपयोग करती हैं और जब प्रक्रियाएं अटक जाती हैं तो% सीपीयू आवंटन 0 हो जाता है।

ऐसे कुछ उदाहरण हैं जब कोड काम करता है:

  1. जब मैं मल्टीप्रोसेसिंग के बिना सीधे फ़ंक्शन को कॉल करता हूं, तो यह काम करता है। लेकिन processes = 1 के साथ भी मल्टीप्रोसेसिंग का उपयोग करने से कोड रुक जाता है।
  2. जब मैं कोई बहिर्जात चर पास नहीं करता और एक साधारण एआरएमए मॉडल को प्रशिक्षित करता हूं तो यह काम करता है।

मैं statsmodels v0.12.1 का उपयोग कर रहा हूं और पायथन संस्करण 3.7.3 है। धन्यवाद

0
dbaheti 16 पद 2020, 15:03

1 उत्तर

सबसे बढ़िया उत्तर

यह समस्या मल्टीप्रोसेसिंग के साथ-साथ tqdm के उपयोग के कारण होनी चाहिए।

https://github.com/tqdm/tqdm/issues/461 इस समस्या का समाधान करता है .

मैंने इसका उपयोग करके इसे हल किया

from tqdm import tqdm
tqdm.get_lock().locks = []
0
dbaheti 19 फरवरी 2021, 13:16