问题描述
我在 Windows Server 2016 上使用 DEAP 并不断遇到多处理器问题,要么它产生的作业数量与 cpu 数量不同,要么它在一段时间后停止并似乎挂起。我实际上运行一个外部 .NET 进程并返回一个值,该值稍后由 DEAP 优化器读取。
if self.n_jobs == 0:
raise ValueError("n_jobs == 0 has no meaning.")
elif self.n_jobs > 1:
pool = multiprocessing.Pool(processes=self.n_jobs)
toolBox.register("map",pool.map)
elif self.n_jobs < 0:
pool = multiprocessing.Pool(processes=max(cpu_count() + 1 + self.n_jobs,1))
toolBox.register("map",pool.map)
pop = toolBox.population(n=self.n_population)
hof = tools.HallOfFame(1,similar=np.array_equal)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg",np.mean,axis=0)
stats.register("std",np.std,axis=0)
stats.register("min",np.min,axis=0)
stats.register("max",np.max,axis=0)
if self.verbose > 0:
print("Selecting features with genetic algorithm.")
_,log = _eaFunction(pop,toolBox,cxpb=self.crossover_proba,mutpb=self.mutation_proba,ngen=self.n_generations,ngen_no_change=self.n_gen_no_change,stats=stats,halloffame=hof,verbose=self.verbose)
if self.n_jobs != 1:
pool.close()
time.sleep(2)
pool.join()
...
def main():
#set_start_method("spawn")
genetic = genetic_markov_selection(
verbose=1,n_population=40,crossover_proba=0.5,mutation_proba=0.3,n_generations=40,crossover_independent_proba=0.5,mutation_independent_proba=0.05,tournament_size=3,n_gen_no_change = 40,caching=True,n_jobs=-1)
genetic.fit()
if __name__ == '__main__': main()
这是代码的摘录,我已经遵守了文档中的说明,但它仍然不稳定。来自文档:
"警告 正如多处理指南中所述,在 Windows 下,由于进程的方式,必须在 if name == "main" 部分保护进程池已初始化。"
作为一种解决方法,是否可以只使用 HTCondor/pycondor 并删除 DEAP 多处理器池并从那里运行作业,因为我每次都已经调用了一个外部进程?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)