Julia中使用pmap并行拟合线性混合模型遇KeyError问题求助
Julia并行拟合线性混合模型pmap报错解决方案
问题场景
在Mac OSX 12.6.3系统、Julia 1.9环境下,尝试用pmap对同一数据集并行拟合不同线性混合模型:
- 单个模型拟合正常,
pmap执行原生函数(如pmap(sqrt, 1:100))也无问题 - 自定义
fit_mm函数用map运行正常,但用pmap时触发错误:
ERROR: On worker 3: KeyError: key StatsModels [3eaba693-59b7-5ba5-a881-562e759f1c8d] not found
用户提供的简化代码:
using Distributed @everywhere using MixedModels @everywhere using DataFrames @everywhere using DataFramesMeta @everywhere using CategoricalArrays @everywhere using CSV @everywhere using Term @everywhere using StatsModels @everywhere using DelimitedFiles addprocs(2) # Function to update formula @everywhere begin function fit_mm(testVar, f, data) .... end end # Load data of interest... # Run map pmap(x -> fit_mm(x, baseFormula, df), covs) # covs是用于修改baseFormula的变量列表,df为数据集
核心原因
代码中先执行@everywhere using ...加载依赖包,之后才调用addprocs(2)新增worker进程。@everywhere仅对执行该指令时已存在的进程生效,新增的进程并未加载所需的包,导致运行时找不到StatsModels依赖。
解决方法
方法一:调整代码顺序
先添加进程,再用@everywhere加载所有依赖包,确保新增的worker进程能获取到所需的库:
using Distributed # 先添加并行进程 addprocs(2) # 在所有进程(包括新增的)中加载依赖包 @everywhere using MixedModels @everywhere using DataFrames @everywhere using DataFramesMeta @everywhere using CategoricalArrays @everywhere using CSV @everywhere using Term @everywhere using StatsModels @everywhere using DelimitedFiles # 定义并行执行的拟合函数 @everywhere begin function fit_mm(testVar, f, data) # 你的模型拟合逻辑 end end # 加载数据集... # 执行并行拟合 pmap(x -> fit_mm(x, baseFormula, df), covs)
方法二:启动Julia时直接指定进程数
启动Julia时通过--procs参数指定并行进程数,这样所有进程启动时共享初始环境,无需在代码中动态添加:
# 启动Julia时指定2个并行进程 julia --procs 2
随后在代码中直接使用@everywhere加载包和定义函数即可,无需调用addprocs。
额外注意事项
- 确保
baseFormula和数据集df能被所有worker进程访问,若变量未自动传递,可通过@everywhere显式声明,或依赖Julia的自动序列化机制。 - 若数据集
df体积较大,建议使用SharedArrays等分布式数据结构,避免重复拷贝数据,提升并行效率。
内容的提问来源于stack exchange,提问作者Claudio Esteban Pérez Leighton
相关产品推荐
相关产品推荐

