使用pathos ParallelPool并行优化时遇KeyError及NameError求助
解决方案
1. 把依赖移到独立模块并全局导入
ParallelPool的worker进程对局部封装的依赖兼容性差,哪怕你把导入塞进函数里也可能失效。把ComponentMap类和create_sub_problem函数单独放到一个模块文件(比如task_deps.py),然后在主脚本和并行任务函数里统一从这个模块导入:
# task_deps.py class ComponentMap: # 你的类实现代码 pass def create_sub_problem(params): # 你的函数逻辑 pass
主脚本代码:
from pathos.pools import ParallelPool from task_deps import ComponentMap, create_sub_problem def parallel_task(params): # 直接使用模块导入的类和函数 cm = ComponentMap() sub_prob = create_sub_problem(params) # 你的优化计算逻辑 return result if __name__ == "__main__": pool = ParallelPool(nodes=4) params_list = [你的参数列表] results = pool.map(parallel_task, params_list) pool.close() pool.join()
2. 显式注册依赖到dill序列化器
如果不想拆分模块,在主脚本开头把自定义类和函数注册到dill,确保ParallelPool能正确序列化传递:
import dill from pathos.pools import ParallelPool # 你的自定义类和函数定义 class ComponentMap: pass def create_sub_problem(params): pass # 注册到dill,让序列化器能识别 dill.register(ComponentMap) dill.register(create_sub_problem) def parallel_task(params): cm = ComponentMap() sub_prob = create_sub_problem(params) return result if __name__ == "__main__": pool = ParallelPool(nodes=4) results = pool.map(parallel_task, [1,2,3]) pool.close() pool.join()
3. 调整ParallelPool的序列化配置
部分HPC环境需要显式指定序列化后端,试试强制用dill作为序列化/反序列化工具:
from pathos.pools import ParallelPool from pathos.serial import dill pool = ParallelPool(nodes=4, serializer=dill, deserializer=dill)
4. 禁止在并行函数内动态定义依赖
别在parallel_task里面定义ComponentMap或者临时导入它,worker进程无法解析动态生成的命名空间,所有依赖必须在worker启动前就存在于全局或模块级的命名空间里。
错误根源说明
NameError: name 'ComponentMap' is not defined:ParallelPool的worker进程在自己的命名空间找不到这个类,要么是序列化时没带上类定义,要么是worker的导入路径和主进程不一致。KeyError: 'create_sub_problem':dill序列化函数时,worker进程找不到对应的函数引用,通常是因为函数是局部定义的,或者没有被序列化器正确识别。
内容的提问来源于stack exchange,提问作者Giddy
相关产品推荐
相关产品推荐

