python - 使用 HTCondor 的 DEAP 替代方案进行多处理
问题描述
我在 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 多处理器池并从那里运行作业,因为我每次都已经调用了外部进程?
解决方案
推荐阅读
- r - 如何在 ggplot 中添加注释
- xcode - APP启动错误:服务无法初始化:18E226:xpcproxy + 11291
- python - python中的记录器模块不会创建多个文件
- javascript - Angular 6:如何通过检查属性的条件来更新本地存储中的所有属性值?
- javascript - 异步需要 AsyncTestZoneSpec - Angular
- python - 如何将竞争词而不是单个词输入到fasttext模型
- javascript - 无法在javascript中读取数组元素的属性
- c# - 如何使用 swig 从`unsigned int *`返回`uint []`
- azure - 无需登录即可使用 Azure API(使用角色)
- mongodb - 如何从 mongodb 集合中查找最后读取的索引/记录以避免在进一步读取中重复?