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