Есть ли способ для np.save работать с объектами файлов MPI? - PullRequest
1 голос
/ 08 ноября 2019

Я выполняю какой-то «смущающий параллель» код Python в кластере и хочу сохранить массивы в nnpy-файлах таким образом, чтобы каждый файл представлял точку данных (одномерный массив), которая регулярно обновляется (то есть становитсяболее статистически значимо);идея состоит в том, чтобы минимизировать усилия пост-обработки. Я пытаюсь использовать MPI для доступа к случайным файлам в наборе возможных файлов, возможно одновременно.

Я пытаюсь использовать метод MPI.File.Open(comm, filename, amode, info, fh) из mpi4py.

* 1006. *

В документации говорится, что отдельные процессы могут открывать файл независимо с MPI.COMM_SELF в качестве внутрикоммуникатора. Когда я пытаюсь сделать это вместе с np.save, я получаю TypeError:


Traceback (most recent call last):
File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/compat/py3k.py", line 229, in os_fspath
    path_repr = path_type.__fspath__(path)
AttributeError: type object 'mpi4py.MPI.File' has no attribute '__fspath__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "simpleMPItest.py", line 112, in <module>
    main()
  File "simpleMPItest.py", line 35, in main
    np.save(fh,np.random.rand(1))
  File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/lib/npyio.py", line 514, in save
    file = os_fspath(file)
  File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/compat/py3k.py", line 237, in os_fspath
    "not " + path_type.__name__)
TypeError: expected str, bytes or os.PathLike object, not File

Проходя трассировку:

  File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/lib/npyio.py", line 514, in save
    file = os_fspath(file)

мы получаем этот блок:

    own_fid = False
    if hasattr(file, 'read'):  
        fid = file
    else:
        file = os_fspath(file) #line 514
        if not file.endswith('.npy'):
            file = file + '.npy'
        fid = open(file, "wb")
        own_fid = True

    if sys.version_info[0] >= 3:
        pickle_kwargs = dict(fix_imports=fix_imports)
    else:
        # Nothing to do on Python 2
        pickle_kwargs = None

    try:
        arr = np.asanyarray(arr)
        format.write_array(fid, arr, allow_pickle=allow_pickle,
                           pickle_kwargs=pickle_kwargs)
    finally:
        if own_fid:
            fid.close()


Проблема в том, что когда я передаю MPI-файл в np.save, объект MPI-файла не имеет атрибута «read», npyio.py пытается изменить его, поскольку предполагает, что это не файловый объект, что приводит кОшибка типа.

Печать атрибутов файла MPI:

['Call_errhandler', 'Close', 'Delete', 'Get_amode', 'Get_atomicity', 'Get_byte_offset', 'Get_errhandler', 'Get_group', 'Get_info', 'Get_position', 'Get_position_shared', 'Get_size', 'Get_type_extent', 'Get_view', 'Iread', 'Iread_all', 'Iread_at', 'Iread_at_all', 'Iread_shared', 'Iwrite', 'Iwrite_all', 'Iwrite_at', 'Iwrite_at_all', 'Iwrite_shared',
'Open', 'Preallocate', 'Read', 'Read_all', 'Read_all_begin', 'Read_all_end', 'Read_at', 
'Read_at_all', 'Read_at_all_begin', 'Read_at_all_end', 'Read_ordered', 'Read_ordered_begin', 'Read_ordered_end', 'Read_shared', 'Seek', 'Seek_shared', 'Set_atomicity', 'Set_errhandler', 'Set_info', 'Set_size', 'Set_view', 'Sync', 
'Write', 'Write_all', 'Write_all_begin', 'Write_all_end', 'Write_at', 'Write_at_all', 'Write_at_all_begin', 'Write_at_all_end', 'Write_ordered', 'Write_ordered_begin', 'Write_ordered_end', 'Write_shared', '__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'amode', 'atomicity', 'f2py', 'group', 'info', 'py2f', 'size']

показывает, что файлы MPI имеют атрибуты «Чтение» и «Запись». Это поднимает еще одну проблему, когда я добираюсь до этого блока:

    try:
        arr = np.asanyarray(arr)
        format.write_array(fid, arr, allow_pickle=allow_pickle,
                           pickle_kwargs=pickle_kwargs)

, потому что format.write_array() получает file_like_object с методом .write().

Могу ли я дать объект файла MPI .read() и .write() методы? Я не думаю, что смогу внести какие-либо изменения в npyio.py, потому что это университетский кластер.

...