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