Agents.jl调用paramscan触发ProgressMeter相关KeyError报错
报错原因
这个报错和M1芯片、Julia 1.7.3版本没有直接关联,核心触发逻辑是:paramscan函数默认开启多进程并行计算+进度条展示功能,自动拉起的worker进程没有提前加载所需的ProgressMeter依赖包,跨进程传输任务做反序列化时找不到对应模块,直接抛出KeyError。测试其他ABM模型也报同样错误,是因为所有调用paramscan的流程都会走相同的并行、进度条逻辑。
解决方法
按易用性排序,选任意一种方案即可:
- 小规模参数扫描直接关闭并行和进度条,零额外配置就能跑通,调用时补充两个关键字参数:
adf, _ = paramscan(parameters, initialize; adata, agent_step!, n = 3, parallel = false, show_progress = false)
- 需要并行加速的话,在执行参数扫描前手动给所有worker进程提前加载依赖,注意所有自定义的模型初始化、步进、数据收集逻辑也要同步到worker:
using Distributed # 按自身CPU核心数设置worker数量,比如8核CPU可设置为4 addprocs(4) # 所有worker统一加载依赖包 @everywhere using Agents, ProgressMeter # 后续的模型定义、initialize函数、agent_step!函数、参数配置代码 # 全部要放在@everywhere宏覆盖的作用域下,避免worker找不到自定义对象 # 之后再正常调用paramscan即可
- 如果是在VS Code Julia插件、Pluto这类交互式环境运行,这类环境默认会把代码放在临时工作模块下,worker无法自动同步主进程的临时模块内容:要么把代码写到独立的
.jl脚本里通过命令行julia 脚本路径.jl执行,要么把所有自定义逻辑、包加载语句都用@everywhere包裹,避免跨进程传输时找不到对应对象。
内容的提问来源于stack exchange,提问作者CTP
相关产品推荐
相关产品推荐

