Progetto HPC - Calcolo Scientifico dell'Università e dell'INFN di Parma -
Guida per l'utente - OBSOLETO vedi guida in Inglese
** [[ calcoloscientifico:progetto | Descrizione del Progetto ]] ** ===== Accesso ===== Per poter accedere alle risorse occorre essere inseriti nel database LDAP del servizio HPC. Le richieste di accesso o in generale di assistenza vanno inviate a es_calcolo@unipr.it. Una volta abilitati l'accesso avviene via SSH sull'host di login ssh @login.hpc.unipr.it L'accesso con password è consentito solo all'interno della rete di Ateneo (160.78.0.0/16) e della rete del Gruppo Collegato INFN di Parma (192.135.11.0/24). Al di fuori di questo contesto è necessario utilizzare la [[http://noc.unipr.it/public/vpn/home|VPN]] di Ateneo oppure l'accesso con chiave pubblica. ==== Accesso password-less tra i nodi ==== ** Per utilizzare il cluster è necessario eliminare la necessità di utilizzare la password tra i nodi**, utilizzando l'autenticazione a chiave pubblica. Occorre generare su login.hpc.unipr.it la coppia di chiavi, senza passphrase, e aggiungere la chiave pubblica nel file di autorizzazione (authorized_keys): Generazione delle chiavi. Accettare i default premendo invio. ssh-keygen -t rsa Copia della chiave pubblica in authorized_keys: cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ==== Accesso dall'esterno con chiave pubblica ==== Occorre generare la coppia di chiavi con il client SSH. La chiave privata dovrebbe essere protetta da una passphrase adeguata (non è obbligatorio ma è consigliato). La chiave pubblica deve essere inserita tra le vostre chiavi autorizzate (.ssh/authorized_keys) sull'host di login. Se utilizzate il client SSH per Windows **PuTTY** (http://www.putty.org) è necessario generare la coppia di chiavi pubblica e privata con PuTTYgen e salvarle su un file. La chiave privata deve essere inserita nella configurazione di Putty (o WinSCP): Configuration -> Connection -> SSH -> Auth -> Private key file for authentication La chiave pubblica deve essere inserita nel file .ssh/authorized_keys di login.hpc.unipr.it Link utili per la configurazione dei cliest SSH: [[ https://kb.iu.edu/d/aews | Linux, MacOS X, PuTTY ]], [[ https://kb.iu.edu/d/amzx | Windows SSH Secure Shell ]] La chiave pubblica del client (esempio ''client_id_rsa.pub'') deve essere inserita nel file ''~/.ssh/authorized_keys'' della macchina di login: Copia della chiave pubblica in authorized_keys: cat client_id_rsa.pub >> ~/.ssh/authorized_keys ==== Trasferimento di file ==== SSH è l'unico protocollo per la comunicazione con l'esterno e può essere utilizzato anche per il trasferimento dei file. In ambiente unix-like (Linux, MacOS X) si possono usare i comandi scp o sftp. In ambiente Windows il programma più utilizzato è WinSCP (https://winscp.net/eng/docs/lang:it). In fase di installazione di WinSCP è possibile importare i profili di Putty. SSH può essere utilizzato anche per il mount di un file-system remoto utilizzando SshFS (vedi http://www.fis.unipr.it/dokuwiki/doku.php?id=calcoloscientifico:guidautente#sshfs) ===== Hardware ===== L'attuale cluster è composto dai nuovi nodi di calcolo e dai nodi del preesistente cluster di Fisica / INFN. {{:calcoloscientifico:hpcschema.png?200|}} **Nuovi nodi di calcolo** * Cluster1 ([[ https://ark.intel.com/products/91766/Intel-Xeon-Processor-E5-2683-v4-40M-Cache-2_10-GHz | BDW]]) * 8 nodi con 2 Intel Xeon E5-2683v4 (2x16 cores, 2.1GHz, 40MB smartcache), 128 GB RAM. * 1 nodo con 2 Intel Xeon E5-2683v4 (2x16 cores, 2.1GHz, 40MB smartcache), 1024 GB RAM. * Cluster2 ([[http://www.nvidia.com/object/tesla-p100.html | GPU]]) * 2 nodi con 2 Intel Xeon E5-2683v4 (2x16 cores, 2.1GHz), 128 GB RAM, 5 GPU NVIDIA P100-PCIE-12GB (Pascal architecture). * Cluster3 ([[https://ark.intel.com/it/products/94035/Intel-Xeon-Phi-Processor-7250-16GB-1_40-GHz-68-core | KNL]]) * 4 nodi con 1 Intel Xeon PHI 7250 (1x68 cores, 1.4GHz, 16GB MCDRAM), 192 GB RAM. Dettaglio dei nodi: [[ http://www.fis.unipr.it/dokuwiki/doku.php?id=calcoloscientifico:nodicalcolo | Elenco ]] - [[ http://cm01.hpc.unipr.it/ganglia/ | Utilizzo ]] (intranet) Prestazioni di picco (doppia precisione): 1 Nodo BDW -> 2x16 (cores) x 2.1 (GHz) x 16 (AVX2) = 1 TFlops, Max memory Bandwidth = 76.8 GB/s 1 GPU P100 -> 4.7 TFlops 1 nodo KNL -> 68 (cores) x 1.4 (GHz) x 32 (AVX512) = 3 TFlops, Max memory bandwidth = 115.2 GB/s ** Interconnessione con [[https://www.intel.com/content/www/us/en/high-performance-computing-fabrics/omni-path-edge-switches-100-series.html | Intel OmniPath ]] ** Prestazioni di picco: Bandwidth: 100 Gb/s, Latency: 100 ns. **[[ calcoloscientifico:benchmarks | Benchmarks: IMB, NBODY, HPL]]** ===== Software ===== Il sistema operativo per tutte le tipologie di nodi è CentOS 7.X. Ambiente Software (librerie, compilatori e tools): [[ http://www.hpc.unipr.it/dokuwiki/doku.php?id=calcoloscientifico:softwareapplicativo | Elenco ]] Alcuni componenti software devono essere caricati per poter essere utilizzati. Per elencare i moduli disponibili: module avail Per caricare / scaricare un modulo (esempio intel): module load intel module unload intel Per elencare i moduli caricati: module list ===== Storage ===== Il nodo di login e i nodi di calcolo condividono le seguenti aree di storage: ^ Mount Point ^ Env. Var. ^ Backup ^ Quota ^ Nota ^ Supporto ^ ^ /hpc/home | $HOME | si | 50? GB | Programmi e dati | NAS | ^ /hpc/group | $GROUP | si | 50? GB | Programmi e dati | NAS | ^ /hpc/scratch | $SCRATCH | no | 1? TB, max 1 mese | Dati run-time | NAS high perf. | ^ /hpc/archive | $ARCHIVE | no | | Archivio | NAS / cloud | ^ /hpc/share | | | | Software applicativo e database | NAS | [[ http://www.fis.unipr.it/dokuwiki/doku.php?id=calcoloscientifico:priv:cluster:storage | Area privata ]] ===== Acknowledgement===== Ricordarsi di citare il progetto nelle pubblicazioni tra gli Acknowlegements: **// This research benefits from the High Performance Computing facility of the University of Parma, Italy ([[ https://HPC.unipr.it | HPC.unipr.it ]]) //** Gli autori sono pregati di comunicare i riferimenti delle pubblicazioni , che verranno elencati sul sito. ===== Sottomissione dei job con PBSpro===== Le code sono gestite con [[ http://www.pbspro.org/ | PBSpro ]]. I job vengono sottomessi sulla coda di routing e smistati automaticamente su una coda di esecuzione in base alle risorse richieste. [[http://www.fis.unipr.it/dokuwiki/doku.php?id=calcoloscientifico:code | Dettaglio code batch]] ==== Comandi utili ==== Visualizza in forma sintetica lo stato delle code: qstat -Q Visualizza in dettaglio lo stato delle singole code: qstat -Qf Elenco dei nodi e loro stato: pbsnodes -av Per la sottomissione di un job: qsub -I # modalità interattiva qsub script.sh # modalità batch Visualizza i job in coda: qstat === Opzioni principali === **-q ** Questa opzione seleziona la coda da utilizzare. Su nostro cluster non è necessaria poiché la coda di default (route) seleziona automaticamente la coda di esecuzione in base alle risorse selezionate. **-l ** È l'opzione più importante poiché permette di indicare le risorse richieste: * **select**: numero di chunk (gruppi di cores sullo stesso nodo) * **ncpus**: numero di core per nodo (default 1) * **ngpus**: numero di GPU per nodo * **mem**: memoria richiesta per nodo * **mpiprocs**: numero di processi MPI per nodo * **ompthreads**: numero di thread OpenMP per processo * **place=scatter**: possibilmente alloca i chunk su host separati (default) * **place=pack**: possibilmente raggruppa i chunk sugli host * **place=excl**: alloca gli host in modo esclusivo (non condivisi con altri job) * **cluster**: seleziona il tipo di nodo (bdw | knl | gpu | fat | std) Il cluster di default è std (standard) che sul cluster nuovo può essere bdw o fat, mentre sul cluster INFN può essere nhl o wmr. Esempi di selezione delle risorse: -l select=2:ncpus=2 **-l walltime=** Tempo massimo di esecuzione del job. Questo dato seleziona la coda da utilizzare. Default: 24:00:00 Esempio: -l walltime=00:30:00 **-A ** consente di specificare l'account su cui addebitare l'utilizza delle risorse. Esempi -A nome.cognome -A G_HPC17A **-W group_list=** consente di eseguire il job utilizzando il gruppo secondario specificato. **-j oe** redirige lo standard error sullo standard output. **-M ** L'opzione -M permette di indicare uno o più indirizzi e-mail, separati da virgola, che riceveranno le notifiche del gestore di code. Se l'opzione non viene specificata, il sistema di code spedisce le notifiche all'indirizzo e-mail di Ateneo dell'utente. Nel caso degli ospiti le notifiche vengono inviate all'indirizzo e-mail personale dell'utente. **-m ** L'opzione -m permette di indicare gli eventi che generano l'invio della notifica: * **a**: notifica in caso di interruzione del job * **b**: notifica all'avvio del job * **e**: notifica alla fine del job Se l'opzione non viene specificata, il sistema di code spedisce le notifiche solo in caso di interruzione del job. Esempio: -M @unipr.it -m abe ===== Job interattivi ===== Per verificare l'elenco delle risorse assegnate si può utilizzare la sottomissione interattiva con opzione -I. Una volta entrati in modo interattivo il comando **cat $PBS_NODEFILE** visualizza l'elenco delle risorse assegnate. Il comando **qstat -f** lista maggiori dettagli riguardo le risorse assegnate. qsub -I -l cat $PBS_NODEFILE qstat -f exit Esempi: # 1 gruppo (chunk) di 2 CPU tipo STD qsub -I -l select=1:ncpus=2 # 2 chunk da 2 CPU di tipo KNL (possono stare sullo stesso nodo) qsub -I -l select=2:ncpus=2:cluster=knl # i chunk devono stare su nodi diversi qsub -I -l select=2:ncpus=2:cluster=knl,place=scatter # 1 chunk con 2 GPU sul cluster GPU qsub -I -l select=1:ngpus=2:cluster=gpu # 1 chunk da 1 cpu sul nodo wn51 e un chunk con 2 CPU sul nodo wn52 qsub -I -l select=1:ncpus=1:host=wn51:cluster=knl+1:ncpus=2:host=wn52:cluster=knl # 2 chunk ciascuno con 2 GPU su nodi diversi qsub -I -l select=2:ngpus=2:cluster=gpu,place=scatter:excl # mpiprocs dice a MPI quanti processi devono essere attivati per ogni chunk qsub -I -l select=2:ncpus=2:mpiprocs=1 ===== Batch job ===== Occorre creare uno shell script che include le opzioni PBS e i comandi che devono essere eseguiti sui nodi. per sottomettere il job: qsub scriptname.sh Ad ogni job viene assegnato un identificativo numerico univoco . Al termine dell'esecuzione verranno creati i due file contenenti stdout e stderr nella directory da cui è stato sottomesso il job. Per default i due file prendono il nome dello script con una estensione aggiuntiva: Stdout: .o Stderr: .e ==== Job seriali, compilatore GNU ==== Compilazione dell'esempio mm.c per il calcolo del prodotto di due matrici: cp /hpc/share/samples/serial/mm.* . g++ mm.cpp -o mm Script ''mm.bash'' per la sottomissione dell'eseguibile seriale ''mm'': #!/bin/bash # Richiedi un chunk con 1 CPU #PBS -l select=1:ncpus=1 # Dichiara che il job durerà al massimo 30 minuti #PBS -l walltime=00:30:00 #stampa il nome del nodo assegnato cat $PBS_NODEFILE # Entra nella directory che contiene lo script cd "$PBS_O_WORKDIR" #esegui il programma ./mm Sottomissione: qsub mm.bash Visualizza e lo stato: qstat Per cancellare eventualmente il job in esecuzione: qdel ==== Job seriali, compilatore Intel ==== Compilazione dell'esempio cpi_mc.c per il calcolo di Pi Greco: cp /hpc/share/samples/serial/cpi/cpi_mc.c . module load intel icc cpi_mc.c -o cpi_mc_int Script ''cpi_mc.bash'' per la sottomissione dell'eseguibile seriale ''cpi_mc_int'': #!/bin/bash #opzini PBS di default, si possono omettere #PBS -l select=1:ncpus=1 #PBS -l walltime=00:30:00 #stampa il nome del nodo assegnato cat $PBS_NODEFILE #carica il modulo del compilatore Intel module load intel # Entra nella directory che contiene lo script cd "$PBS_O_WORKDIR" #esegui il programma N=10000000 ./cpi_mc_int -n $N Sottomissione: qsub cpi_mc.bash ==== Job seriali, compilatore PGI ==== Compilazione dell'esempio cpi_sqrt.c per il calcolo di Pi Greco: cp /hpc/share/samples/serial/cpi/cpi_sqrt.c . module load pgi pgcc cpi_sqrt.c -o cpi_sqrt_pgi Script ''cpi_sqrt_pgi.bash'' per la sottomissione dell'eseguibile seriale ''cpi_sqrt_pgi'': #!/bin/bash # Opzioni PBS di default. Si possono omettere #PBS -l select=1:ncpus=1 #PBS -l walltime=00:30:00 cat $PBS_NODEFILE module load pgi cd "$PBS_O_WORKDIR" N=10000000 ./cpi_sqrt_pgi -n $N qsub cpi_sqrt_pgi.bash ==== Job OpenMP con GNU 4.8 ==== cp /hpc/share/samples/omp/omp_hello.c . gcc -fopenmp omp_hello.c -o omp_hello Script ''omp_hello.bash'' con la richiesta di 12 CPU in uso esclusivo. #!/bin/bash #PBS -l select=1:ncpus=32,place=excl #PBS -l walltime=00:30:00 #Unisci strerr con stdout #PBS -j oe cat $PBS_NODEFILE echo #OMP_NUM_THREADS : $OMP_NUM_THREADS cd "$PBS_O_WORKDIR" ./omp_hello ==== Job OpenMP con Intel ==== module load intel cp /hpc/share/samples/omp/mm/omp_mm.cpp . Script ''mm_omp.bash'' con la richiesta di 1 nodo intero con almeno 32 core: #!/bin/bash #PBS -l select=1:ncpus=32,place=excl #PBS -l walltime=00:30:00 #PBS -j oe #PBS -W group_list= cat $PBS_NODEFILE cd "$PBS_O_WORKDIR" module load intel icpc -qopenmp omp_mm.cpp -o omp_mm # Per variare il numero di threads: export OMP_NUM_THREADS=8 echo OMP_NUM_THREADS : $OMP_NUM_THREADS ./omp_mm ==== Job OpenMP con PGI ==== cp /hpc/share/samples/omp/mm/omp_mm.cpp . Script ''omp_mm_pgi.bash''. Il cluster BDW è composto da nodi con 32 cores. La variabile OMP_NUM_THREADS è per default pari al numero di core. Se vogliamo un numero di thread diverso lo possiamo indicare nella select: #!/bin/sh #PBS -l select=1:ncpus=32:ompthreads=4:cluster=bdw #PBS -l walltime=00:30:00 #PBS -j oe cat $PBS_NODEFILE cd "$PBS_O_WORKDIR" module load pgi pgc++ -mp omp_mm.cpp -o omp_mm_pgi echo OMP_NUM_THREADS : $OMP_NUM_THREADS ./omp_mm_pgi qsub omp_mm_pgi.bash ==== Job OpenMP con GNU 5.4 ==== cp /hpc/share/samples/omp/cpi/* . qsub cpi2_omp.bash python cpi2_omp.py ==== Job MPI, GNU OpenMPI ==== module load gnu openmpi cp /hpc/share/samples/mpi/mpi_hello.c . mpicc mpi_hello.c -o mpi_hello Script ''mpi_hello.sh '' per l'utilizzo della versione GNU OpenMPI: #!/bin/bash # 4 chunk da 16 CPU ciascuno. Esegui un processo MPI per ogni CPU #PBS -l select=4:ncpus=16:mpiprocs=16 #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load gnu openmpi cd "$PBS_O_WORKDIR" mpirun mpi_hello qsub mpi_hello.bash ==== Job MPI con Intel MPI ==== module load intel intelmpi which mpicc cp /hpc/share/samples/mpi/mpi_mm.c . mpicc mpi_mm.c -o mpi_mm_int Script ''mpi_mm_int.sh '' per l'utilizzo di Intel MPI: #!/bin/sh # 4 chunk da 16 CPU ciascuno. Esegui un processo MPI per ogni CPU #PBS -l select=4:ncpus=16:mpiprocs=16 #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load intel intelmpi cd "$PBS_O_WORKDIR" mpirun mpi_mm_int ==== Job MPI con PGI ==== module load pgi openmpi which mpicc cp /hpc/share/samples/mpi/mpi_hello.c . mpicc mpi_hello.c -o mpi_hello_pgi Script ''mpi_hello_pgi.sh '' per l'utilizzo di openmpi di PGI: #!/bin/sh #PBS -l select=4:ncpus=16 #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" NPUSER=$(cat $PBS_NODEFILE | wc -l) module load cuda pgi openmpi cd "$PBS_O_WORKDIR" mpirun -hostfile $PBS_NODEFILE --npernode 1 mpi_hello_pgi ==== Job MPI + OpenMP con GNU OpenMPI ==== module load gnu openmpi cp -p /hpc/share/samples/mpi+omp/mpiomp_hello.c . mpicc -fopenmp mpiomp_hello.c -o mpiomp_hello_gnu #!/bin/sh # 4 chunk da 16 CPU ciascuno, 1 processo MPI per ogni chunk, 16 thread OpenMP per processo MPI #PBS -l select=4:ncpus=16:mpiprocs=1:ompthreads=16 #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load gnu openmpi cd "$PBS_O_WORKDIR" mpirun mpiomp_hello_gnu ==== Job MPI + OpenMP con Intel MPI ==== module load intel intelmpi cp /hpc/share/samples/mpi+omp/mpiomp-hello.c . mpicc -qopenmp mpiomp_hello.c -o mpiomp_hello_int #!/bin/sh # 4 chunk da 16 CPU ciascuno, 1 processo MPI per ogni chunk, 16 thread OpenMP per processo MPI #PBS -l select=4:ncpus=16:mpiprocs=1:ompthreads=16 #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load intel intelmpi cd "$PBS_O_WORKDIR" mpirun mpiomp_hello_int ===== Utilizzo del cluster KNL ===== Il compilatore da utilizzare è intel. La selezione del cluster KNL avviene specificando cluster=knl come risorse richiesta. Il massimo numero di core (ncpus) selezionabili per nodo è 68. Ogni core fisico include 4 core virtuali con tecnologia hyperthreading, per un totale di 272 per nodo. #!/bin/sh # 4 nodi interi. Esegui un processo MPI per ogni nodo e 128 thread per processo #PBS -l select=4:ncpus=68:mpiprocs=1:ompthreads=128:cluster=knl #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load intel intelmpi cd "$PBS_O_WORKDIR" cp /hpc/share/samples/mpi+omp/mpiomp_hello.c . mpicc -qopenmp mpiomp_hello.c -o mpiomp_hello_knl mpirun mpiomp_hello_knl ===== Utilizzo del cluster GPU ===== Il cluster GPU è costituito da 2 macchine con 5 GPU ciascuna. Le GPU di una singola macchina sono identificate da un ID numerico intero che va da 0 a 4. Il compilatore da utilizzare è nvcc: [[http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html|NVIDIA CUDA Compiler]] Esempio di compilazione: cp /hpc/share/samples/cuda/hello_cuda.cu . module load cuda nvcc hello_cuda.cu -o hello_cuda La selezione del cluster GPU avviene specificando cluster=gpu e ngpus=<1-5> tra le risorse richieste. Esempio di sottomissione su 1 delle 5 GPU disponibili in un singolo nodo del cluster GPU: #!/bin/sh # 1 nodo con 1 GPU #PBS -l select=1:ncpus=1:ngpus=1:cluster=gpu #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load cuda cd "$PBS_O_WORKDIR" ./hello_cuda Esempio di sottomissione del benchmark N-BODY su tutte e 5 le GPU disponibili in un singolo nodo del cluster GPU: #!/bin/sh # 1 nodo con 5 GPU #PBS -l select=1:ncpus=1:ngpus=5:cluster=gpu #PBS -l walltime=00:30:00 #PBS -j oe echo "### PBS_NODEFILE ###" cat $PBS_NODEFILE echo "####################" module load cuda cd "$PBS_O_WORKDIR" /hpc/share/tools/cuda/samples/5_Simulations/nbody/nbody -benchmark -numbodies=1024000 -numdevices=5 Nel caso di N-BODY il numero di GPU da utilizzare viene specificato utilizzando l'opzione -numdevices (il valore specificato non deve superare quello del numero di GPU richieste con l'opzione ngpus). In generale gli ID delle GPU da utilizzare vengono ricavati dal valore della variabile d'ambiente CUDA_VISIBLE_DEVICES. Nel caso dell'ultimo esempio si ha CUDA_VISIBLE_DEVICES=0,1,2,3,4 ===== Utilizzo del cluster INFN ===== Attualmente il cluster INFN è gestito da un diverso Batch server: ce01.pr.infn.it Per utilizzare il cluster INFN bisogna aggiungere: #PBS -q route@ce01.pr.infn.it In alternativa si può utilizzare l'host di login dell'INFN: ssh login.pr.infn.it Da login.pr.infn.it è possibile utilizzare il Batch server del nuovo cluster specificando: #PBS -q route@ce01.hpc.unipr.it Esempio mm: cp /hpc/share/samples/serial/mm.cpp . g++ mm.cpp -o mm Script di esecuzione mm.sh #!/bin/sh #PBS -l select=1:ncpus=1 #PBS -l walltime=00:30:00 #PBS -j oe # Esegui il job utilizzando il seguente gruppo: #PBS -W group_list=T_RETI1617 # Esegui il job sul cluster INFN: #PBS -q route@ce01.pr.infn.it # Entra nella directory che contiene lo script cd "$PBS_O_WORKDIR" #stampa il nome del nodo assegnato cat " # $PBS_NODEFILE " ./mm -n 10000 Esecuzione: qsub mm.sh Verifica lo stato della coda: qstat @ce01.pr.infn.it ===== Lavoro di gruppo ===== Per condividere i file tra i membri di un gruppo è necessario distinguere il tipo di attivita': Nella **modalità interattiva** sul nodo di login il comando ''newgrp'' modifica il gruppo primario e i permessi dei nuovi file: newgrp Il comando newgrp sul cluster HPC esegue automaticamente anche il comando per entrare nella directory di gruppo ( /hpc/group/ ) : cd "$GROUP" Nella **modalità Batch** occorre indicare il gruppo da utilizzare con la seguente direttiva: #PBS -W group_list= ===== Scaling test ===== Per lanciare in sequenza una batteria di run in serie nello stesso job, ad esempio per verificare lo scaling di un algoritmo: cp /hpc/share/samples/serial/cpi/cpi_mc.c . gcc cpi_mc.c o cpi_mc Script launch_single.sh #!/bin/bash cd "$PBS_O_WORKDIR" for N in $(seq 1000000 1000000 10000000) do CMD="./cpi_mc -n $N" echo "# $CMD" eval $CMD >> cpi_mc_scaling.dat done qsub launch_single.sh Gli output dei diversi run vengono scritti nel file cpi_mc_scaling.dat. Per generare un plot dello scaling possiamo utilizzare la libreria matplotlib di python: cp /hpc/share/samples/serial/cpi/cpi_mc_scaling.py . python cpi_mc_scaling.py ===== Job Array ===== Utilizzando un'unico script PBS è possibile sottomettere una batteria di Job, che possono essere eseguiti in parallelo, specificando un parametro numerico diverso per ogni job sottomesso. L'opzione -J consente di specificare la sequenza numerica dei parametri. Ad ogni lancio il valore del parametro è contenuto nella variabile $PBS_ARRAY_INDEX Esempio: Lancia N job per il calcolo di Pi greco con un numero di intervalli crescente da 100000 a 900000 con incremento di 10000: cp /hpc/share/samples/serial/cpi/cpi_mc . gcc cpi_mc.c o cpi_mc Script pbs_launch_parallel.sh #PBS -J 100000-900000:10000 cd "$PBS_O_WORKDIR" CMD="./cpi_mc -n ${PBS_ARRAY_INDEX}" echo "# $CMD" eval $CMD qsub pbs_launch_parallel.sh Riunisci gli output: grep -vh '^#' pbs_launch_parallel.sh.o*.* ===== Job MATLAB ===== [[https://www.mir.wustl.edu/Portals/0/Documents/Uploads/CHPC/PCT_Masterclass.pdf|Parallel Computing with MATLAB]] == Esecuzione di un programma seriale MATLAB == cp /hpc/share/samples/matlab/pi_greco.m . Script matlab.sh #PBS -l walltime=00:30:00 #PBS -l select=1:ncpus=1 cd "$PBS_O_WORKDIR" module load matlab matlab -nodisplay -r pi_greco qsub matlab.sh == Esecuzione di un job parallelo con MATLAB == cp /hpc/share/samples/matlab/pi_greco_parallel.m . Script ''matlab_parallel.sh''. La versione di Matlab installata sul cluster consente l'utilizzo massimo di 12 cores dello stesso nodo. #PBS -l walltime=00:30:00 #PBS -l select=1:ncpus=12 cd "$PBS_O_WORKDIR" module load matlab matlab -nodisplay -r pi_greco_parallel qsub matlab_parallel.sh == Esecuzione di un programma MATLAB su GPU == cp /hpc/share/samples/matlab/matlabGPU.m . # da fare Script matlabGPU.sh #PBS -l walltime=00:30:00 #PBS -l select=1:ncpus=1:ngpus=1 cd "$PBS_O_WORKDIR" module load matlab cuda matlab -nodisplay -r matlabGPU.m qsub matlabGPU.sh ===== Job MPI Crystal14 ===== Script ''crystal14.sh'' per la sottomissione della versione MPI di Crystal14. Richiede 4 nodi da 8 core ed avvia 8 processi MPI per nodo: #!/bin/sh #PBS -N crystal14 #PBS -l select=4:ncpus=8:mpiprocs=8 #PBS -l walltime=168:00:00 # input files directory CRY14_INP_DIR='input' # output files directory CRY14_OUT_DIR='output' # input files prefix CRY14_INP_PREFIX='test' # input wave function file prefix CRY14_F9_PREFIX='test' source '/hpc/software/bin/hpc-pbs-crystal14' Si consiglia di creare una cartella per ogni simulazione. In ogni cartella deve essere presente una copia dello script ''crystal14.sh''. Lo script contiene la definizione di quattro variabili: * **CRY14_INP_DIR**: il file o i file di input devono trovarsi nella sottocartella 'input' della cartella corrente. Per utilizzare la directory corrente commentare la riga con la definizione della variabile CRY14_INP_DIR. Per cambiare sottocartella modificare il valore della variabile CRY14_INP_DIR. * **CRY14_OUT_DIR**: i file di output verranno creati nella sottocartella 'output' della cartella corrente. Per utilizzare la directory corrente commentare la riga con la definizione della variabile CRY14_OUT_DIR. Per cambiare sottocartella modificare il valore della variabile CRY14_OUT_DIR. * **CRY14_INP_PREFIX**: il file o i file di input hanno un prefisso che deve coincidere con il valore della variabile CRY14_INP_PREFIX. La stringa 'test' è puramente indicativa e non corrisponde ad un caso reale. * **CRY14_F9_PREFIX**: il file di input, con estensione 'F9', è il risultato di una precedente elaborazione e deve coincidere con il valore della variabile CRY14_F9_PREFIX. La stringa 'test' è puramente indicativa e non corrisponde ad un caso reale. Lo script ''crystal14.sh'' include, a sua volta, lo script di sistema ''/hpc/software/bin/hpc-pbs-crystal14''. Quest'ultimo non può essere modificato dall'utente. == Sottomissione dello script di shell == Spostarsi nella cartella che contiene ''crystal14.sh'' e lanciare il comando seguente per sottomettere lo script al job scheduler: qsub ./crystal14.sh == Analisi dei file prodotti da Crystal14 durante l'esecuzione del job == Durante l'esecuzione del job viene creata una cartella temporanea ''tmp'' che contiene i due file: nodes.par machines.LINUX Il file ''nodes.par'' contiene i nomi dei nodi che partecipano al calcolo parallelo. Il file ''machines.LINUX'' contiene i nomi dei nodi che partecipano al calcolo parallelo con una molteplicità pari al numero di processi MPI avviati sul nodo. Per individuare le cartelle temporanee prodotte da Crystal14 durante l'esecuzione del job, lanciare il comando seguente direttamente dal nodo di login: eval ls -d1 /hpc/node/wn{$(seq -s, 81 95)}/$USER/crystal/* 2>/dev/null Fare attenzione perché il precedente comando contiene i nomi dei nodi di calcolo attualmente disponibili. Questo elenco ed il corrispondente comando potranno cambiare in futuro. Per verificare il contenuto dei file prodotti da Crystal14 durante l'esecuzione del job, l'utente può spostarsi in una delle cartelle evidenziate dal precedente comando. Al termine dell'esecuzione del job, i due file ''machines.LINUX'' e ''nodes.par'' vengono cancellati. La cartella temporanea ''tmp'' viene cancellata solo se è vuota. Non è dunque necessario accedere con SSH ai nodi che partecipano all'elaborazione per verificare il contenuto dei file prodotti da Crystal14. ===== Job Gromacs ===== Per definire la variabile d'ambiente GMXLIB aggiungere le righe seguenti al file ''$HOME/.bash_profile'': GMXLIB=$HOME/gromacs/top export GMXLIB Il percorso ''$HOME/gromacs/top'' è puramente indicativo. Modificatelo secondo le vostre preferenze. ==== Job Gromacs OpenMP ==== Script ''mdrun_omp.sh'' per richiedere in esclusiva un nodo con 32 core ed avviare 16 thread OpenMP: #!/bin/sh #PBS -l select=1:ncpus=32:ompthreads=16,place=excl #PBS -l walltime=24:00:00 test "$PBS_ENVIRONMENT" = 'PBS_BATCH' || exit cd "$PBS_O_WORKDIR" module load gnu openmpi source '/hpc/share/applications/gromacs/5.1.4/mpi_bdw/bin/GMXRC' gmx mdrun -s topology.tpr -pin on In questo modo verrà avviato un solo processo MPI e si otterranno prestazioni non ottimali. ==== Job Gromacs MPI ed OpenMP ==== Script ''mdrun_mpi_omp.sh'' per richiedere in esclusiva un nodo con 32 core ed avviare 8 processi MPI (il numero di thread OpenMP verrà calcolato automanticamente): #!/bin/sh #PBS -l select=2:ncpus=32:mpiprocs=8,place=excl #PBS -l walltime=24:00:00 test "$PBS_ENVIRONMENT" = 'PBS_BATCH' || exit cd "$PBS_O_WORKDIR" module load gnu openmpi source '/hpc/share/applications/gromacs/5.1.4/mpi_bdw/bin/GMXRC' NNODES=$(cat $PBS_NODEFILE | sort -u | wc -l) NPUSER=$(cat $PBS_NODEFILE | wc -l) OMP_NUM_THREADS=$((OMP_NUM_THREADS/(NPUSER/NNODES))) mpirun gmx mdrun -s topology.tpr -pin on In questo modo verranno avviati più processi MPI e si otterranno prestazioni ottimali. ===== Job Abaqus ===== ==== Job Abaqus MPI ==== Esempio di script ''abaqus.sh'' per eseguire Abacus su 1 nodo, 32 core, 0 GPU: #!/bin/bash # Le opzioni PBS di default si possono omettere. # select : numero dei nodi di calcolo # ncpus : numero dei core per nodo (max 32) # cluster : tipologia del nodo di calcolo # walltime: tempo di esecuzione stimato, max 240 ore (meglio una stima di poco superiore a effettiva) #PBS -l select=1:ncpus=32:cluster=bdw #PBS -l walltime=00:30:00 cat $PBS_NODEFILE # Moduli necessari per l'esecuzione di Abacus module load gnu intel openmpi cd "$PBS_O_WORKDIR" abaqus j=testverita cpus=32 # j= nomefile.inp ==== Job Abaqus MPI con GPU ==== Esempio di script ''abaqus-gpu.sh'' per eseguire Abacus su 1 nodo, 6 core, 1 GPU: #!/bin/bash # Le opzioni PBS di default si possono omettere. # select : numero dei nodi di calcolo # ncpus : numero dei core per nodo (max 6) # cluster : tipologia del nodo di calcolo # walltime: tempo di esecuzione stimato, max 240 ore (meglio una stima di poco superiore a effettiva) #PBS -l select=1:ncpus=6:ngpus=1,cluster=gpu #PBS -l walltime=00:30:00 cat $PBS_NODEFILE # Moduli necessari per l'esecuzione di Abacus module load gnu intel openmpi cuda cd "$PBS_O_WORKDIR" abaqus j=testverita cpus=6 gpus=1 # j= nomefile.inp ===== SSHFS ===== Per scambiare dati con una macchina remota su cui è installato un server ssh è possibile utilizzare [[ https://wiki.archlinux.org/index.php/Sshfs | SSHFS ]]. SSHFS è un file-system per sistemi operativi Unix-like (MacOsX, Linux, BDS). Questo file system permette di montare in locale una cartella posizionata su un host in cui gira SSH server. Questo software implementa il modulo del Kernel FUSE. Attualmente è installato solo su login.pr.infn.it. In alternativa può essere installato sulla macchina linux remota per accedere ai propri dati sul cluster. Per utilizzarlo: mkdir remote # creiamo il mount-point sshfs @: remote # mount del file-system remoto df -h # vedi i file-system montati ls remote/ fusermount -u remote # smonta il file-system ===== VTune ===== VTune e' un perfomance profiler di Intel ed e' disponibile sul cluster HPC. Informazioni generali di Intel : https://software.intel.com/en-us/get-started-with-vtune-linux-os Guida locale [[vtune]] (work in progress) ===== Guide CINECA ===== * {{:calcoloscientifico:hpc-access.pdf| Access to HPC resources in Italy and Europe }} * [[https://wiki.u-gov.it/confluence/display/SCAIUS/UG3.1%3A+MARCONI+UserGuide | Marconi UserGuide ]] * [[https://wiki.u-gov.it/confluence/display/SCAIUS/UG2.4%3A+Data+storage+and+FileSystems | Marconi storage]] ===== Altre risorse ===== [[ https://hpc.llnl.gov/training/tutorials | LLNL HPC tutorials ]]