Skip to content

srm: Can't save SRM object due to MPI #428

Description

@snastase

I want to fit brainiak.funcalign.srm.SRM on some subset of data, save this fitted SRM object to disk, then (e.g., weeks) later retrieve the fitted SRM object and use its transform_subject method to project a new subject into the shared space. I tried using numpy.save, e.g.:

from brainiak.funcalign.srm import SRM
srm = SRM(features=50)
srm.fit(data)
np.save('/path/to/saved_srm.npy', srm)

but the pickling used to save object arrays conflicts with MPI:

/jukebox/pkgs/PYGER/0.9/envs/pyger/lib/python3.6/site-packages/numpy/lib/npyio.py in save(file, arr, allow_pickle, fix_impor
ts)
    534         arr = np.asanyarray(arr)
    535         format.write_array(fid, arr, allow_pickle=allow_pickle,
--> 536                            pickle_kwargs=pickle_kwargs)
    537     finally:
    538         if own_fid:

/jukebox/pkgs/PYGER/0.9/envs/pyger/lib/python3.6/site-packages/numpy/lib/format.py in write_array(fp, array, version, allow_
pickle, pickle_kwargs)
    631         if pickle_kwargs is None:
    632             pickle_kwargs = {}
--> 633         pickle.dump(array, fp, protocol=2, **pickle_kwargs)
    634     elif array.flags.f_contiguous and not array.flags.c_contiguous:
    635         if isfileobj(fp):

TypeError: can't pickle mpi4py.MPI.Intracomm objects

Is there any other way to save the SRM object to disk and load it at a later time? If not, we should probably restructure the SRM object to make this possible. (I tried setting allow_pickle=False in numpy.save, but then it can't save the object array at all.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions