병렬화 관련 메모리 문제

NEURON + NetPyNE 로 병렬화가 매우 쉽게 처리가 되어서, Large-Scale로 쉽게 확장했다.
그런데, 시뮬레이션이 돌아가는건 괜찮은데 시뮬레이션 이후 Gather 과정에서 문제가 발생한다.

[comet-20-53:27930] *** Process received signal *** [comet-20-53:27930] Signal: Aborted (6) [comet-20-53:27930] Signal code: (-6) [comet-20-53:27930] [ 0] /lib64/libpthread.so.0[0x3aa140f7e0] [comet-20-53:27930] [ 1] /lib64/libc.so.6(gsignal+0x35)[0x3aa0832495] [comet-20-53:27930] [ 2] /lib64/libc.so.6(abort+0x175)[0x3aa0833c75] [comet-20-53:27930] [ 3] /opt/gnu/gcc/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x15d)[0x2b1e0b64c07d] [comet-20-53:27930] [ 4] /opt/gnu/gcc/lib64/libstdc++.so.6(+0x5e0e6)[0x2b1e0b64a0e6] [comet-20-53:27930] [ 5] /opt/gnu/gcc/lib64/libstdc++.so.6(+0x5e131)[0x2b1e0b64a131] [comet-20-53:27930] [ 6] /opt/gnu/gcc/lib64/libstdc++.so.6(+0x5e348)[0x2b1e0b64a348] [comet-20-53:27930] [ 7] /opt/gnu/gcc/lib64/libstdc++.so.6(+0x5e859)[0x2b1e0b64a859] [comet-20-53:27930] [ 8] /opt/gnu/gcc/lib64/libstdc++.so.6(_Znam+0x9)[0x2b1e0b64a8b9] [comet-20-53:27930] [ 9] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrnpython.so.0(+0x130d6)[0x2b1e0a84e0d6] [comet-20-53:27930] [10] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrniv.so.0(+0x802c7)[0x2b1e0903e2c7] [comet-20-53:27930] [11] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrnoc.so.0(hoc_call_ob_proc+0x2ab)[0x2b1e08d977cb] [comet-20-53:27930] [12] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrnoc.so.0(hoc_object_component+0x76e)[0x2b1e08d9868e] [comet-20-53:27930] [13] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrnpython.so.0(+0xb0fe)[0x2b1e0a8460fe] [comet-20-53:27930] [14] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrniv.so.0(_ZN10OcJumpImpl7fpycallEPFPvS0_S0_ES0_S0_+0x61)[0x2b1e090174e1] [comet-20-53:27930] [15] /projects/ps-nsg/home/nsguser/applications/osbneuron74_py/nrn-7.4/installdir/x86_64/lib/libnrnpython.so.0(+0xb392)[0x2b1e0a846392] [comet-20-53:27930] [16] /opt/python/lib/libpython2.7.so.1.0(PyObject_Call+0x43)[0x2b1e0aaa7b73] [comet-20-53:27930] [17] /opt/python/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x3b2e)[0x2b1e0ab5c00e] [comet-20-53:27930] [18] /opt/python/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5a5d)[0x2b1e0ab5df3d] [comet-20-53:27930] [19] /opt/python/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5a5d)[0x2b1e0ab5df3d] [comet-20-53:27930] [20] /opt/python/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5a5d)[0x2b1e0ab5df3d] [comet-20-53:27930] [21] /opt/python/lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x830)[0x2b1e0ab5f320] [comet-20-53:27930] [22] /opt/python/lib/libpython2.7.so.1.0(PyEval_EvalCode+0x19)[0x2b1e0ab5f449] [comet-20-53:27930] [23] /opt/python/lib/libpython2.7.so.1.0(PyImport_ExecCodeModuleEx+0x99)[0x2b1e0ab72c79] [comet-20-53:27930] [24] /opt/python/lib/libpython2.7.so.1.0(+0x11dfce)[0x2b1e0ab72fce] [comet-20-53:27930] [25] /opt/python/lib/libpython2.7.so.1.0(+0x11edb9)[0x2b1e0ab73db9] [comet-20-53:27930] [26] /opt/python/lib/libpython2.7.so.1.0(PyImport_ImportModuleLevel+0x1dd)[0x2b1e0ab74a2d] [comet-20-53:27930] [27] /opt/python/lib/libpython2.7.so.1.0(+0x1013e8)[0x2b1e0ab563e8] [comet-20-53:27930] [28] /opt/python/lib/libpython2.7.so.1.0(PyObject_Call+0x43)[0x2b1e0aaa7b73] [comet-20-53:27930] [29] /opt/python/lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x47)[0x2b1e0ab57ee7] [comet-20-53:27930] *** End of error message ***

모니터링을 해봤을 때는 딱히 메모리가 부족한 것으로 보이지는 않는데, 뭔가 데이터를 주고받기 위한 OpenMPI 내에서의 메모리 한계가 부족한 것으로 보인다.

NEURON 포럼에서는 데이터를 줄여서 하는 방법을 얘기하기는 하는데, 다 필요하니 그건 불가능한 옵션

최선의 방법은 따로 코드 수정 없이, 전체적인 시스템 설정을 수정해서 처리하는 방법인데, 메시지 전달 인터페이스의 크기가 MEMLock 설정과 연관되어 있다는 내용을 보게 되었다.

ulimit -a 해서 보이는 Memory Locking 과 관련

  1. /etc/security/limits.conf 수정 –> 이것만으로는 안됨
  2. /etc/systemd/system.conf, /etc/systemd/user.conf 의 defaultLimitMEMLOCK 을 수정
  3. /etc/sysctl.conf 파일에서 vm.max_map_count  변경

근데 안 됨..
다른 방법은 특정 Interval 마다 쪼개서 넣는 건데, 우선은 Synaptic weight 변화에 대한 메모리가 큰 것이고 해당 내용은 결국 개별 node에 저장되어 있기 때문에 우선 그냥 Node 에서 개별적으로 저장하도록 하는 코드를 작성.

NetPyNE에도 해당 method가 있긴 한데.. 라이브러리보다는 직접 짜는게 더 익숙

# save SynWeight without gather and remove 
if sim.nhosts > 1:
    sim.pc.barrier()

# # fix matlab save all sim data
print(f'Saving SynWeight Data on node {sim.rank}')
from scipy.io import savemat
for cell_key, cell in sim.simData['SynWeight'].items():
    weightData = {}
    for conn_key, conn in cell.items():
        weightData[conn_key] = list(conn)
    if cell_key != '__dict__':
        savemat(f'{sim.cfg.filename}_SynWeight_{cell_key}.mat', weightData)
print('  Done; ')
del sim.simData['SynWeight']

Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *