Compare commits

...

19 Commits

@ -1,19 +1,23 @@
install:
. ./script_install.sh
bash ./script_install.sh
run:
./run_simulation.sh
bash ./run_simulation.sh
fftma:
cd fftma_module/gen && python3 setup.py install --user
binaries:
./script_fortran.sh
test: binaries
test:
cd tests/integration && python3 -m unittest test.py
perf: binaries
perf:
cd tests/performance && python3 generation.py
cd tests/performance && python3 connectivity.py
cd tests/performance && python3 connectivity.py
run-slurm:
sbatch run-simulation-slurm
test-slurm:
sbatch run-test-slurm
perf-slurm:
sbatch run-perf-slurm

@ -0,0 +1,73 @@
# Paralelización de simulación de permeabilidad
## Clonar este repositorio
```
# Por HTTPS
git clone https://git.csc.gob.ar/ssantisi/simulacion-permeabilidad.git
# Por SSH
git clone git@git.csc.gob.ar:ssantisi/simulacion-permeabilidad.git
```
Entrar a la carpeta del proyecto
```
cd simulacion-permeabilidad
```
## Instalación de las librerías (Python 3)
Como requisitos previos a la instalación hace falta tener:
* `python3`
* `python3-pip`
* `gfortran`
* `gcc`
* `build-essentials`
```
make install
```
El instalador genera un entorno virtual en `venv`.
Para activar el entorno virtual:
```
source venv/bin/activate
```
Para desactivarlo `deactivate`.
## Correr la simulación
```
make run
```
## Correr los casos de prueba
```
make test
```
## Correr las pruebas de performance
```
make perf
```
## Branches de github
Explicacion sobre las branches que quedaron en github para entender cuales usar:
- `main` -> solo la migracion a python3 sin ninguna cambio sobre el modulo de FFTMA (sin mejoras)
- `improvement_NOMBRE` -> branch con el `NOMBRE` de la mejora que esta explicado que hace cada una en el analisis
donde la primera es `remove_generate_array` y la ultima es `multiple_buffers`
- `improvement_NOMBRE-logs` -> misma branch de mejora pero agregando informacion de logs que se utilizo para realizar los analisis y no deberian utilizarse porque degradan la performance considerablemente.
- `migrate_fortran` -> una branch donde se trato de migrar de fortran a C pero quedo inconcluso el trabajo y no se continuo.

@ -0,0 +1,126 @@
# Paralelización de simulación de permeabilidad en Cluster HPC (SLURM)
## ANTES DEL PRIMER USO
Seguir los siguientes pasos del tutorial:
1. Clonar este repositorio
2. Entrar al entorno NIX
3. Generar entorno Python para la simulación
## USO HABITUAL:
Habiendo completado las instrucciones previas al primer uso:
1. Entrar al entorno NIX
2. Activar el entorno python
3. Ejecutar las siimulaciones de interés
## Clonar este repositorio
```
# Por HTTPS
git clone https://git.csc.gob.ar/ssantisi/simulacion-permeabilidad.git
# Por SSH
git clone git@git.csc.gob.ar:ssantisi/simulacion-permeabilidad.git
```
Entrar a la carpeta del proyecto
```
cd simulacion-permeabilidad
```
## Entrar al entorno NIX
```
nix-shell
```
Para más info ver el archivo `shell.nix`.
## Generar entorno Python para la simulación
Los siguentes requisitos ya vienen provistos por `nix-shell`:
* `python3`
* `python3-pip`
* `gfortran`
* `gcc`
* `build-essentials`
```
make install
```
El instalador genera un entorno virtual en `venv`.
## Activar el entorno python
Para activar el entorno virtual (LUEGO DE HABER ACTIVADO EL ENTORNO NIX):
```
source venv/bin/activate
```
Para desactivarlo `deactivate`.
## Correr simulaciones de interés
Los siguientes comandos encolan trabajos en el cluster, que correrán tan pronto como les toque su lugar en la cola de trabajos.
Se puede monitorear el estado de el/los trabajos encolados con `squeue`.
Se puede cancelar un trabajo encolado con `scancel numero_de_trabajo`
### Correr la simulación (en SLURM)
Por defecto: 2 nodos, 32 tasks por nodo.
Para cambiarlo editar archivo `run-simulation-slurm`.
```
make run-slurm
```
Una vez en ejecución, la salida se escribe a los siguientes archivos:
* `simulation-nro-de-trabajo.out` la salida del trabajo.
* `simulation-nro-de-trabajo.err` los errores del proceso
### Correr los casos de prueba (en SLURM)
Por defecto: 1 nodo, 64 cpus por nodo.
Para cambiarlo editar archivo `run-tests-slurm`.
```
make test-slurm
```
Una vez en ejecución, la salida se escribe a los siguientes archivos:
* `test-nro-de-trabajo.out` la salida del trabajo.
* `test-nro-de-trabajo.err` los errores del proceso
### Correr las pruebas de performance (en SLURM)
Por defecto: 1 nodo, 64 cpus por nodo.
Para cambiarlo editar archivo `run-perf-slurm`.
```
make perf-slurm
```
Una vez en ejecución, la salida se escribe a los siguientes archivos:
* `perf-nro-de-trabajo.out` la salida del trabajo.
* `perf-nro-de-trabajo.err` los errores del proceso
## Branches de github
Explicacion sobre las branches que quedaron en github para entender cuales usar:
- `main` -> solo la migracion a python3 sin ninguna cambio sobre el modulo de FFTMA (sin mejoras)
- `improvement_NOMBRE` -> branch con el `NOMBRE` de la mejora que esta explicado que hace cada una en el analisis
donde la primera es `remove_generate_array` y la ultima es `multiple_buffers`
- `improvement_NOMBRE-logs` -> misma branch de mejora pero agregando informacion de logs que se utilizo para realizar los analisis y no deberian utilizarse porque degradan la performance considerablemente.
- `migrate_fortran` -> una branch donde se trato de migrar de fortran a C pero quedo inconcluso el trabajo y no se continuo.

@ -1,47 +1,9 @@
# Paralelización de simulación de permeabilidad
## Instalación de las librerías (Python 3)
## Corrida en PC de escritorio/laptop
```
make install
```
## Generación de los binarios de conectividad
```
make binaries
```
## Correr la simulación
```
make run
```
## Correr los casos de prueba
```
make test
```
## Correr las pruebas de performance
```
make perf
```
## Instalar el binario FFTMA
```
make fftma
```
## Instalación de las librerías (Python 2)
El sistema actualmente se encuentra migrado a Python3 por lo que no se recomienda correr este script.
```
./script_install_py2.sh
```
Ver archivo **README-LOCAL.md**.
## Corrida en cluster TUPAC
Ver archivo **README-TUPAC.md**.

@ -1,5 +0,0 @@
#!/bin/bash
source ~/miniconda3/etc/profile.d/conda.sh
conda activate py2_7
python --version

@ -1,10 +1,7 @@
from distutils.core import setup, Extension
import numpy
module_FFTMA = Extension('FFTMA', include_dirs = ['./include'],sources=["moduleFFTMA.c","./lib_src/Py_getvalues.c","./lib_src/Py_kgeneration.c","./lib_src/genlib.c","./lib_src/random.c","./lib_src/simpio.c","./lib_src/strlib.c","./lib_src/symtab.c","./lib_src/scanadt.c","./lib_src/stack.c","./lib_src/gammf.c","./lib_src/fftma.c","./lib_src/addstat.c","./lib_src/axes.c","./lib_src/cgrid.c","./lib_src/covariance.c","./lib_src/fourt.c","./lib_src/length.c","./lib_src/maxfactor.c","./lib_src/test_fact.c","./lib_src/cov_value.c","./lib_src/generate.c","./lib_src/gasdev.c","./lib_src/ran2.c","./lib_src/stable.c","./lib_src/gaussian.c","./lib_src/power.c","./lib_src/cubic.c","./lib_src/spherical.c","./lib_src/nugget.c","./lib_src/exponential.c","./lib_src/cardsin.c","./lib_src/nor2log.c","./lib_src/kgeneration.c","./lib_src/kgeneration2.c","./lib_src/fftma2.c","./lib_src/prebuild_gwn.c","./lib_src/build_real.c","./lib_src/addstat2.c","./lib_src/clean_real.c","./lib_src/pgeneration.c","./lib_src/pgeneration2.c","./lib_src/FFTPressure.c","./lib_src/FFTtest.c","./lib_src/build_pressure.c","./lib_src/build_velocity.c","./lib_src/total_pressure.c","./lib_src/total_velocity.c","./lib_src/clean_real2.c","./lib_src/waveVectorCompute3D.c","./lib_src/mat_vec.c","./lib_src/derivReal.c","./lib_src/inputdata.c","./lib_src/inputfiledata.c","./lib_src/debuginput.c","./lib_src/readdata.c","./lib_src/readfile_bin.c","./lib_src/writefile.c","./lib_src/writefile_bin.c","./lib_src/testmemory.c","./lib_src/testopenfile.c","./lib_src/readdata3.c"])
module_FFTMA = Extension('FFTMA', include_dirs=["./include", numpy.get_include()], sources=["moduleFFTMA.c","./lib_src/Py_getvalues.c","./lib_src/Py_kgeneration.c","./lib_src/genlib.c","./lib_src/random.c","./lib_src/simpio.c","./lib_src/strlib.c","./lib_src/symtab.c","./lib_src/scanadt.c","./lib_src/stack.c","./lib_src/gammf.c","./lib_src/fftma.c","./lib_src/addstat.c","./lib_src/axes.c","./lib_src/cgrid.c","./lib_src/covariance.c","./lib_src/fourt.c","./lib_src/length.c","./lib_src/maxfactor.c","./lib_src/test_fact.c","./lib_src/cov_value.c","./lib_src/generate.c","./lib_src/gasdev.c","./lib_src/ran2.c","./lib_src/stable.c","./lib_src/gaussian.c","./lib_src/power.c","./lib_src/cubic.c","./lib_src/spherical.c","./lib_src/nugget.c","./lib_src/exponential.c","./lib_src/cardsin.c","./lib_src/nor2log.c","./lib_src/kgeneration.c","./lib_src/kgeneration2.c","./lib_src/fftma2.c","./lib_src/prebuild_gwn.c","./lib_src/build_real.c","./lib_src/addstat2.c","./lib_src/clean_real.c","./lib_src/pgeneration.c","./lib_src/pgeneration2.c","./lib_src/FFTPressure.c","./lib_src/FFTtest.c","./lib_src/build_pressure.c","./lib_src/build_velocity.c","./lib_src/total_pressure.c","./lib_src/total_velocity.c","./lib_src/clean_real2.c","./lib_src/waveVectorCompute3D.c","./lib_src/mat_vec.c","./lib_src/derivReal.c","./lib_src/inputdata.c","./lib_src/inputfiledata.c","./lib_src/debuginput.c","./lib_src/readdata.c","./lib_src/readfile_bin.c","./lib_src/writefile.c","./lib_src/writefile_bin.c","./lib_src/testmemory.c","./lib_src/testopenfile.c","./lib_src/readdata3.c"])
setup(ext_modules=[module_FFTMA])

@ -7,6 +7,7 @@ import sys
from tools.Prealization import realization
from utilities.conditional_decorator import *
from memory_profiler import profile
import multiprocessing as mp
CONFIG_FILE_PATH = 'config.ini' if 'CONFIG_FILE_PATH' not in os.environ else os.environ['CONFIG_FILE_PATH']
IS_TEST = False if 'TEST' not in os.environ else True
@ -33,7 +34,10 @@ def sequential():
njobs = DotheLoop(-1,parser,iterables)
start_job=0
for job in range(start_job,njobs):
realization(job)
p = mp.Process(target=realization, args=(job,))
p.start()
p.join()
#realization(job)
return
def manager():
@ -59,7 +63,10 @@ def worker():
while job!=-1:
comm.send(rank,dest=0)
job = comm.recv(source=0)
realization(job)
p = mp.Process(target=realization, args=(job,))
p.start()
p.join()
#realization(job)
return

@ -1,11 +1,103 @@
numpy
scipy
matplotlib
ipython
jupyter
pandas
sympy
nose
mpi4py
anyio==3.6.2
argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
arrow==1.2.3
asttokens==2.2.1
attrs==23.1.0
backcall==0.2.0
beautifulsoup4==4.12.2
Benchmarker==4.0.1
memory_profiler
bleach==6.0.0
cffi==1.15.1
comm==0.1.3
contourpy==1.0.7
cycler==0.11.0
debugpy==1.6.7
decorator==5.1.1
defusedxml==0.7.1
executing==1.2.0
fastjsonschema==2.16.3
fonttools==4.39.3
fqdn==1.5.1
idna==3.4
ipykernel==6.22.0
ipython==8.13.1
ipython-genutils==0.2.0
ipywidgets==8.0.6
isoduration==20.11.0
jedi==0.18.2
Jinja2==3.1.2
jsonpointer==2.3
jsonschema==4.17.3
jupyter==1.0.0
jupyter-console==6.6.3
jupyter-events==0.6.3
jupyter_client==8.2.0
jupyter_core==5.3.0
jupyter_server==2.5.0
jupyter_server_terminals==0.4.4
jupyterlab-pygments==0.2.2
jupyterlab-widgets==3.0.7
kiwisolver==1.4.4
MarkupSafe==2.1.2
matplotlib==3.7.1
matplotlib-inline==0.1.6
memory-profiler==0.61.0
mistune==2.0.5
mpi4py==3.1.4
mpmath==1.3.0
nbclassic==0.5.6
nbclient==0.7.4
nbconvert==7.3.1
nbformat==5.8.0
nest-asyncio==1.5.6
nose==1.3.7
notebook==6.5.4
notebook_shim==0.2.3
numpy==1.24.3
packaging==23.1
pandas==2.0.1
pandocfilters==1.5.0
parso==0.8.3
petsc==3.19.4
petsc4py==3.19.4
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.5.0
platformdirs==3.5.0
prometheus-client==0.16.0
prompt-toolkit==3.0.38
psutil==5.9.5
ptyprocess==0.7.0
pure-eval==0.2.2
pycparser==2.21
Pygments==2.15.1
pyparsing==3.0.9
pyrsistent==0.19.3
python-dateutil==2.8.2
python-json-logger==2.0.7
pytz==2023.3
PyYAML==6.0
pyzmq==25.0.2
qtconsole==5.4.2
QtPy==2.3.1
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
scipy==1.10.1
Send2Trash==1.8.2
six==1.16.0
sniffio==1.3.0
soupsieve==2.4.1
stack-data==0.6.2
sympy==1.11.1
terminado==0.17.1
tinycss2==1.2.1
tornado==6.3.1
traitlets==5.9.0
tzdata==2023.3
uri-template==1.2.0
wcwidth==0.2.6
webcolors==1.13
webencodings==0.5.1
websocket-client==1.5.1
widgetsnbextension==4.0.7

@ -0,0 +1,22 @@
#!/usr/bin/env bash
#SBATCH -o perf-$j.out
#SBATCH -e perf-%j.err
#SBATCH -N 1
#SBATCH --ntasks-per-node 32
#SBATCH --partition=free-rider
hostname
date
source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
# vuelca lista de nodos asignados a un archivo "nodefile"
nodelist=$(scontrol show hostname $SLURM_NODELIST)
printf "%s\n" "${nodelist[@]}" > nodefile
source venv/bin/activate
# ejecuta mpirun con el nodefile creado
make perf
rm nodefile

@ -0,0 +1,22 @@
#!/usr/bin/env bash
#SBATCH -o simulation-%j.out
#SBATCH -e simulation-%j.err
#SBATCH -N 2
#SBATCH --ntasks-per-node 32
#SBATCH --partition=free-rider
hostname
date
source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
# vuelca lista de nodos asignados a un archivo "nodefile"
nodelist=$(scontrol show hostname $SLURM_NODELIST)
printf "%s\n" "${nodelist[@]}" > nodefile
source venv/bin/activate
# ejecuta mpirun con el nodefile creado
mpirun --hostfile nodefile python3 ./mpirunner.py
rm nodefile

@ -0,0 +1,23 @@
#!/usr/bin/env bash
#SBATCH -o test-%j.out
#SBATCH -e test-%j.err
#SBATCH -N 1
#SBATCH --ntasks-per-node 32
#SBATCH --partition=free-rider
hostname
date
source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
# vuelca lista de nodos asignados a un archivo "nodefile"
nodelist=$(scontrol show hostname $SLURM_NODELIST)
printf "%s\n" "${nodelist[@]}" > nodefile
source venv/bin/activate
# ejecuta mpirun con el nodefile creado
#mpirun --hostfile nodefile python3 ./mpirunner.py
make test
rm nodefile

@ -1,3 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
source venv/bin/activate
mpirun python3 mpirunner.py

@ -1,21 +1,9 @@
#!/bin/bash
python3 -m venv venv
source venv/bin/activate
export WORKSPACE=$(pwd)
rm -r ~/.cache/pip
# gfortran
sudo apt install build-essential
sudo apt install gfortran
gsettings set org.gnome.nautilus.preferences default-folder-viewer 'list-view'
pip3 install --user numpy scipy matplotlib ipython jupyter pandas sympy nose mpi4py
# install open mpi latest version
sudo apt install openmpi-bin
export PETSC_CONFIGURE_OPTIONS="--download-fblaslapack --download-chaco --download-hdf5"
pip3 install -r requirements.txt
# setup petsc4py
./script_fortran.sh
export PETSC_CONFIGURE_OPTIONS="--download-fblaslapack --download-chaco --download-hdf5"
pip3 install petsc petsc4py
cd fftma_module/gen && python3 setup.py install

@ -1,71 +0,0 @@
#!/bin/bash
export WORKSPACE=$(pwd)
# gfortran
sudo apt install build-essential
sudo apt install gfortran
gsettings set org.gnome.nautilus.preferences default-folder-viewer 'list-view'
# install open mpi 2.1.1
curl https://download.open-mpi.org/release/open-mpi/v2.1/openmpi-2.1.1.tar.bz2 --output openmpi-2.1.1.tar.bz2
tar -jxf openmpi-2.1.1.tar.bz2
cd openmpi-2.1.1
./configure --prefix=$HOME/opt/openmpi
make all
make install
echo "export PATH=\$PATH:\$HOME/opt/openmpi/bin" >> $HOME/.bashrc
echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$HOME/opt/openmpi/lib" >> $HOME/.bashrc
source ~/.$1rc
cd ..
# install miniconda
curl https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh --output Miniconda3-py39_4.10.3-Linux-x86_64.sh
bash Miniconda3-py39_4.10.3-Linux-x86_64.sh -b
source ~/.$1rc
# create python 2.7 environment
conda init $1
source ~/.$1rc
conda create -n py2_7 python=2.7
conda activate py2_7
pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
# setup petsc
git clone https://gitlab.com/petsc/petsc
cd petsc
git checkout maint-3.8
./configure --with-cc=mpicc --with-cxx=mpicxx --with-fc=mpif90 --download-fblaslapack --with-debugging=0 COPTFLAGS='-O3 -march=native -mtune=native' CXXOPTFLAGS='-O3 -march=native -mtune=native' FOPTFLAGS='-O3 -march=native -mtune=native'
make PETSC_DIR=$WORKSPACE/petsc PETSC_ARCH=arch-linux2-c-opt all
make PETSC_DIR=$WORKSPACE/petsc PETSC_ARCH=arch-linux-c-opt check
cd ..
# setup petsc4py
git clone https://Icolecchio@bitbucket.org/petsc/petsc4py.git
cd petsc4py
git checkout maint-3.8
export PETSC_DIR=$WORKSPACE/petsc
python setup.py build
python setup.py install --user
python setup.py test

@ -0,0 +1,17 @@
# nix-shell -p [ (python3Full.withPackages(ps: with ps; [ pip ])) gfortran zlib]
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "python-env-petsc";
nativeBuildInputs = [ m4 removeReferencesTo ];
buildInputs = [ (python3Full.withPackages(ps: with ps; [ pip ]))
gfortran
zlib
gcc
];
dontAddPrefix=true;
env.LD_LIBRARY_PATH = zlib + "/lib:" + stdenv.cc.cc.lib + "/lib";
}

@ -0,0 +1,20 @@
#!/usr/bin/env bash
#SBATCH -o slurm.out
#SBATCH -e slurm.err
#SBATCH -N 2
#SBATCH --ntasks-per-node 32
#SBATCH --partition=free-rider
hostname
date
source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
# vuelca lista de nodos asignados a un archivo "nodefile"
nodelist=$(scontrol show hostname $SLURM_NODELIST)
printf "%s\n" "${nodelist[@]}" > nodefile
source venv/bin/activate
# ejecuta mpirun con el nodefile creado
mpirun --hostfile nodefile python3 ./mpirunner.py
Loading…
Cancel
Save