You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用neurolib进行模型拟合时持续遭遇PicklingError问题求助

解决neurolib网格搜索中的PicklingError问题

问题核心

在使用neurolib进行网格搜索时,触发如下PicklingError:

PicklingError: 
Can't pickle <class 'neurolib.utils.parameterSpace.ParameterSpace'>: 
it's not the same object as neurolib.utils.parameterSpace.ParameterSpace

问题根源

这个错误由类对象引用不一致导致:

  • 代码中通过importlib.reload(ps)重载parameterSpace模块后,重新赋值ParameterSpace = ps.ParameterSpace,使得当前代码中的ParameterSpace类与neurolib内部引用的类并非同一个对象
  • pickle序列化时会严格校验类的身份,引用不一致会触发该错误
  • 尽管代码中设置了multiprocessing=False,但neurolib/pypet的内部逻辑仍可能走多进程序列化路径,导致问题暴露

解决方案

1. 移除模块重载与类重赋值代码

删除以下干扰类引用的代码:

from importlib import reload
importlib.reload(ps)
ParameterSpace = ps.ParameterSpace 

改为直接导入类:

from neurolib.utils.parameterSpace import ParameterSpace

2. 恢复pickle默认设置

删除替换pickle序列化器的代码:

import pickle 
pickle.Pickler = dill.Pickler 
pickle.Unpickler = dill.Unpickler 

neurolib与pypet依赖原生pickle逻辑,替换为dill会引发兼容性问题。

3. 确保单进程模式完全生效

显式指定进程数为1,避免neurolib内部逻辑歧义:

search.run(
    multiprocessing=False,
    chunkwise=True,
    bold=True,
    backend="sequential",
    n_processes=1  # 显式强制单进程
)

4. 调整环境变量配置顺序

将环境变量配置移至代码最顶部,确保在导入任何模块前生效:

import os
# 环境变量配置放在最开头
os.environ["NO_PROXY"] = "localhost,127.0.0.1"
os.environ["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"] = "YES"
os.environ["OMP_NUM_THREADS"] = "1"
os.environ["HDF5_USE_FILE_LOCKING"] = "FALSE"
os.environ["PYTHONHASHSEED"] = "0"

# 之后再导入其他模块
import sys
import numpy as np

修改后的核心代码示例

# --- Core Imports & Env Config ---
import os
os.environ["NO_PROXY"] = "localhost,127.0.0.1"
os.environ["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"] = "YES"
os.environ["OMP_NUM_THREADS"] = "1"
os.environ["HDF5_USE_FILE_LOCKING"] = "FALSE"
os.environ["PYTHONHASHSEED"] = "0"

import sys
import numpy as np
from multiprocessing import set_start_method
import gc

# --- Configure multiprocessing ---
set_start_method("spawn", force=True)

# --- Add local module path ---
sys.path.append('/Users/pbj/Documents/Github/srg-wb-tms-modeling/wbm')

# --- Import custom model & neurolib ---
from wcisp import WCISP
from neurolib.optimize.exploration.exploration import BoxSearch
from neurolib.utils.parameterSpace import ParameterSpace

# --- Debug Information ---
print("\n=== Environment Verification ===")
print(f"Python executable: {sys.executable}")
print(f"NumPy version: {np.__version__}")

try:
    import tables
    print(f"PyTables version: {tables.__version__}")
    print(f"PyTables linked to HDF5: {tables.get_hdf5_version()}")
except ImportError as e:
    print(f"PyTables import failed: {e}")
    raise

# --- Main Execution Block ---
if __name__ == "__main__":
    # --- Load connectivity data ---
    Cmat = np.loadtxt('Abeysuriya_cmat.csv', delimiter=',')
    Dmat = np.loadtxt('Abeysuriya_dmat.csv', delimiter=',') * 100  # Convert to cm

    # --- Test model ---
    test_model = WCISP(
        Cmat=Cmat,
        Dmat=Dmat * 0.1,  # Convert cm to mm
        duration=30,
        exc_ext_baseline=0.31,
        K_gl=0.22,
        c_ie_0=-3.8
    )
    test_model.run()

    # --- Parameter Space ---
    params = ParameterSpace({
        "K_gl": np.linspace(0.1, 1.0, 5),
        "c_ee": np.linspace(2.5, 4.5, 3),
        "c_ei": np.linspace(2.5, 4.5, 3),
        "rho": [0.1, 0.15, 0.2],
        "exc_ext_baseline": np.linspace(0.1, 0.5, 5),
        "c_ie_0": np.linspace(-4.5, -1.5, 5),
    }, kind="grid")

    gc.disable()

    # --- Grid Search Setup ---
    search = BoxSearch(
        model=WCISP(Cmat=Cmat, Dmat=Dmat * 0.1, duration=30),
        parameterSpace=params,
        filename="wcisp-gridsearch.hdf"
    )

    # --- Safe Execution ---
    search.run(
        multiprocessing=False,
        chunkwise=True,
        bold=True,
        backend="sequential",
        n_processes=1
    )

    print("\nGrid search completed successfully!")

内容的提问来源于stack exchange,提问作者avezee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:32:03