Windows 上的 Python DEAP 和多处理:AttributeError

Posted

技术标签:

【中文标题】Windows 上的 Python DEAP 和多处理:AttributeError【英文标题】:Python DEAP and multiprocessing on Windows: AttributeError 【发布时间】:2020-07-18 18:30:40 【问题描述】:

我有以下情况:

Windows 10 Python 3.7 deap 1.3.1

有一个 main.py 与

def main():
    ...
    schedule.schedule()
    ...

if __name__== "__main__":
    main()

然后,我还有一个文件 schedule.py 与

def schedule()
   ...
    toolbox = base.Toolbox()

    creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
    creator.create("Individual", list, fitness=creator.FitnessMin)

    toolbox.register('individual', init_indiv, creator.Individual, bounds=bounds)
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)

    toolbox.register("evaluate", fitness, data=args)
    toolbox.register("mate", tools.cxTwoPoint)
    toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
    toolbox.register("select", tools.selTournament, tournsize=3)

    # Further parameters
    cxpb = 0.7
    mutpb = 0.2

    # Measure how long it takes to caluclate 1 generation
    MAX_HOURS_GA = parameter._MAX_HOURS_GA
    POPSIZE_GA = parameter._POPSIZE_GA
    pool = multiprocessing.Pool(processes=4)
    toolbox.register("map", pool.map)
    pop = toolbox.population(n=POPSIZE_GA * len(bounds))
    result = algorithms.eaSimple(pop, toolbox, cxpb, mutpb, 1, verbose=False)

现在,执行此操作会出现以下错误:

Process SpawnPoolWorker-1:
Traceback (most recent call last):
  File "C:\Users\...\lib\multiprocessing\process.py", line 297, in _bootstrap
    self.run()
  File "C:\Users\...\lib\multiprocessing\process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\...\lib\multiprocessing\pool.py", line 110, in worker
    task = get()
  File "C:\Users\...\lib\multiprocessing\queues.py", line 354, in get
    return _ForkingPickler.loads(res)
AttributeError: Can't get attribute 'Individual' on <module 'deap.creator' from 'C:\\Users...

现在,我确实注意到 DEAP 文档 (https://deap.readthedocs.io/en/master/tutorials/basic/part4.html) 说

警告 如多处理指南中所述,在 Windows 下,由于进程的初始化方式,必须在 >if __name__ == "__main__" 部分中保护进程池。

但这并没有真正帮助我,因为我当然不想在我的主目录中拥有所有 toolbox.register(...),甚至可能无法这样做。只是移动池的创建

    pool = multiprocessing.Pool(processes=4)
    toolbox.register("map", pool.map)

对主要没有帮助。

似乎还有其他人有类似的问题,即使是最近 (https://github.com/rsteca/sklearn-deap/issues/59)。对于他们中的大多数人来说,似乎存在某种解决方法,但它们似乎都不适合我的情况,或者至少我不知道如何让它们工作。 我也尝试过按照注册函数和初始化池的顺序移动,但没有运气。我也尝试过使用 SCOOP,但结果相似。

有什么想法吗?

【问题讨论】:

【参考方案1】:

解决办法是在全局范围内,即main.py中创建“FitnessMin”和“Individual”:

import ...

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

def main():
    ...
    schedule.schedule()
    ...

if __name__== "__main__":
    main()

【讨论】:

以上是关于Windows 上的 Python DEAP 和多处理:AttributeError的主要内容,如果未能解决你的问题,请参考以下文章

尝试python多处理的Windows上的RuntimeError

JCM参数配置及查看deap

Python—操作系统和多线程

Python多进程和多线程

Python的多线程和多进程模块对比测试

011_Python中单线程多线程和多进程的效率对比实验