0

私は、マルチプロセッシングを使ってsklearn(この場合はガウス混合モデル)からの分類子の訓練を並列化しようとしています。さらに、訓練のたびに、コードがスレッドセーフでないかのように結果が異なります。誰が私に何が起こっているか説明できますか?ここでは、コードと終了時にスレッド関数は次のとおりです。Pythonスケルトンとマルチプロセッシング

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 

答えて

0

だから、解決策は、推定のディープコピーを行いsklearnからクローン機能を使用することです。