Python sklearn и многопроцессорная обработка

Я пытаюсь распараллелить обучение классификаторов из sklearn (в данном случае Гауссовская модель смеси) с помощью многопроцессорной обработки и получаю намного худшие классификаторы по сравнению с их последовательным запуском. Кроме того, каждый раз после обучения результаты отличаются, как если бы код не был потокобезопасным. Кто-нибудь может объяснить мне, что происходит? Здесь код и в конце функция потока:

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

1 ответ

  1. Таким образом, решение заключается в использовании функции клонирования из sklearn, которая делает глубокую копию оценки.