0

Ich versuche Parallelisierung Training von Klassifikatoren von Sklearn (Gauß-Gemisch-Modell in diesem Fall) mit Multiprocessing und ich bekomme viel schlechtere Klassifikatoren im Vergleich zu sequenziell ausgeführt werden. Außerdem sind die Ergebnisse jedes Mal nach dem Training unterschiedlich, als wäre der Code nicht Thread-sicher. Kann mir jemand erklären, was vor sich geht? Hier ist der Code, und am Ende der Thread-Funktion:Python sklearn und multiprocessing

nrProc = 8 
semaphore = Semaphore(nrProc) 
m = Manager() 
models = m.list() 
modelsOut = m.list() 
processes = [] 

cnt = 0     
for event_label in data_positive:       
    models.append(mixture.GMM(**classifier_params)) 
    models.append(mixture.GMM(**classifier_params)) 

for event_label in data_positive: 
    if classifier_method == 'gmm':       
     processes.append(Process(target=trainProcess, args=(models[cnt], data_positive[event_label], semaphore, modelsOut))) 
     cnt = cnt + 1       
     processes.append(Process(target=trainProcess, args=(models[cnt], data_negative[event_label], semaphore, modelsOut))) 
     cnt = cnt + 1 
    else: 
     raise ValueError("Unknown classifier method ["+classifier_method+"]") 

for proc in processes: 
    proc.start() 

for proc in processes: 
    proc.join() 


cnt = 0     
for event_label in data_positive: 
    model_container['models'][event_label] = {} 
    model_container['models'][event_label]['positive'] = modelsOut[cnt] 
    cnt = cnt + 1 
    model_container['models'][event_label]['negative'] = modelsOut[cnt] 
    cnt = cnt + 1 

def trainProcess(model, data, semaphore, modelsOut): 
    semaphore.acquire()  
    modelsOut.append(model.fit(data)) 
    semaphore.release() 
    return 0 

Antwort

0

So ist die Lösung Klon-Funktion von sklearn zu verwenden, die eine tiefe Kopie des Schätzers der Fall ist.