LAMMPS - lncc-sered/manual-sdumont2nd GitHub Wiki
Página oficial, com documentação
Teste utilizando o exemplo "Lennard Jones = atomic fluid with Lennard-Jones potential".
Baixar o arquivo de entrada:
cd $SCRATCH wget https://www.lammps.org/inputs/in.lj.txt
Todos os exemplos abaixo utilizam 1 nó e 1 GPU.
Referência, lista de versões e documentação para LAMMPS GPU disponíveis para em: https://docs.lammps.org/Speed_gpu.html
Versão do exemplo: 29Ago2024
Os principais comandos, que exemplificam alguns senários prováveis está listados abaixo:
# 1 tarefa MPI usa 1 GPU
lmp -sf gpu -pk gpu 1 -in in.script
# 12 tarefas MPI compartilham 2 GPUs em um único
mpirun -np 12 lmp -sf gpu -pk gpu 2 -in in.script
# Ou a mesma tarefa acima utilizando 4 nós
mpirun -np 48 -ppn 12 lmp -sf gpu -pk gpu 2 -in in.script
Foram adicionadas informações de ajuda ao modulo acessível com o comando abaixo, onde é possível também verificar os alias criados para execução simplificada do lammps e Kokkos em somente uma gpu. Para acessar o modo ajuda do modulo digite o comando abaixo: ou somente o comando "module help lammps/2024.8_openmpi-5.0_gnu" caso os módulos anteriores já estejam carregados:
module load arch_gpu/current && lammps/2024.8_openmpi-5.0_gnu && module help lammps/2024.8_openmpi-5.0_gnu
### RESULTADO DO COMANDO ###
----------------- Module Specific Help for "lammps/2024.8_openmpi-5.0_gnu" -----------------
LAMMPS (Large-scale Atomic/Molecular Massively Parallel Simulator)
Versao: 29Ago2024 compilada com suporte a GPU e OpenMPI 5.0.5.1.0
Funcionalidades:
- Executavel principal: lmp
- Potenciais instalados em: $LAMMPS_POTENTIALS_PATH
- Scripts de benchmark em: $LAMMPS_BENCH_PATH
Exemplos de uso com GPU:
mpirun -np 4 lmp -sf gpu -pk gpu 1 < in.lj
lmp -k on g 1 -sf kk < in.lj
Foram criados alias para execucao simplificada do lammps e Kokkos em uma gpu
Alias para facilitar execucao do LAMMPS com GPU via MPI: O alias lmp-one-gpu executa o comand
o -> lmp -sf gpu -pk gpu 1
Alias para facilitar a execucao usando o pacote Kokkos (opcao alternativa de GPU). O alias lm
p-one-kokkos executa o comando -> lmp -k on g 1 -sf kk
OBS: A variavel de ambiente OMP_NUM_THREADS nao esta definida por padrao.
Isso significa que o LAMMPS usara apenas 1 thread OpenMP por processo MPI.
### FINAL DO RESULTADO DO COMANDO ###
Para sua comodidade tambémo exemplo de script SLURM abaixo possui a variável "EXEC=lmp", sendo necessário somente a modificação das flag do LAMMPS e arquivos de input. Caso seja de sua preferência utilize seu comando personalizado ao final deste script SLURM, substituindo a linha "srun -n $SLURM_NTASKS $EXEC -sf gpu -in in.lj.txt" por "srun SEU-COMANDO"
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=12
#SBATCH --ntasks=12
#SBATCH --gpus-per-node=1
#SBATCH -p lncc-h100_dev
#SBATCH -J lammps+LJ+compilado+GPU
# Exibe os nós alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST
cd $SLURM_SUBMIT_DIR
module load arch_gpu
module load lammps/2024.8_openmpi-5.0_gnu
# Executável compilado com suporte a GPU
EXEC=lmp
# Executa o exemplo com aceleração GPU
srun -n $SLURM_NTASKS $EXEC -sf gpu -in in.lj.txt
O suporte à GPU dessa arquitetura é implementada apenas através do Kokkos como pacote de aceleração. Na documentação oficial há a seguinte nota:
When using a GPU, you will achieve the best performance if your input script does not use fix or compute styles which are not yet Kokkos-enabled. This allows data to stay on the GPU for multiple timesteps, without being copied back to the host CPU. Invoking a non-Kokkos fix or compute, or performing I/O for thermo or dump output will cause data to be copied back to the CPU incurring a performance penalty.
Script sub_lammps_compilado_mi300a.srm:
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --gpus-per-node=1
#SBATCH -p lncc-mi300a_dev
#SBATCH -J lammps+HEAT+compilado
#Exibe os nos alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST
cd $SLURM_SUBMIT_DIR
#Carrega o modulo do lammps
module load arch_apu_amd
module load lammps/27Jun2024_openmpi-4.1_amd
#Configura o executavel
EXEC=$(which lmp)
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
export OMP_PROC_BIND=spread
export OMP_PLACES=threads
ldd $EXEC
#configura a quantidade de gpus disponiveis
gpu_count=${1:-$(amd-smi list | grep GPU | wc -l)}
srun --mpi=pmi2 $EXEC -k on g ${gpu_count} t $SLURM_CPUS_PER_TASK -sf kk -pk kokkos gpu/aware on neigh full comm device binsize 2.8 -in in.lj.txt
Referência: https://catalog.ngc.nvidia.com/orgs/hpc/containers/lammps
Lista de versões (tags) disponíveis em: https://catalog.ngc.nvidia.com/orgs/hpc/containers/lammps/tags
Versão do exemplo: 15Jun2023
ATENÇÃO: Os Containers fornecidos pela NVidia implementam apenas o Kokkos como pacote de aceleração para utilizar GPUs. Na documentação oficial há a seguinte nota:
When using a GPU, you will achieve the best performance if your input script does not use fix or compute styles which are not yet Kokkos-enabled. This allows data to stay on the GPU for multiple timesteps, without being copied back to the host CPU. Invoking a non-Kokkos fix or compute, or performing I/O for thermo or dump output will cause data to be copied back to the CPU incurring a performance penalty.
As imagens dos container disponíveis no catálogo da NVidia e compatíveis com o SDumont2nd já está presentes dentro do sistema de armazenamento, não sendo necessário o Download.
Os módulos disponíveis, conforme exemplos abaixo, configuram a variável de ambiente $LAMMPS_IMAGE com o caminho correto da imagem, visando facilitar a utilização do script.
Baixar o
Script sub_lammps_container_nvidia_h100.srm:
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=24
#SBATCH --ntasks=24
#SBATCH --gpus-per-node=1
#SBATCH -p lncc-h100_dev
#SBATCH -J lammps+LJ+container-nvidia
#Exibe os nos alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST
cd $SLURM_SUBMIT_DIR
#carrega os modulos de ambiente
module load arch_gpu
module load lammps/15Jun2023_nv_container
#configura a quantidade de gpus disponiveis
gpu_count=${1:-$(nvidia-smi --list-gpus | wc -l)}
export SINGULARITY="singularity run --nv -B ${PWD}:/host_pwd --pwd /host_pwd $LAMMPS_IMAGE"
srun --mpi=pmi2 $SINGULARITY lmp -k on g ${gpu_count} -sf kk -pk kokkos cuda/aware on neigh full comm device binsize 2.8 -in in.lj.txt
Script sub_lammps_container_nvidia_gh200.srm:
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=72
#SBATCH --ntasks=72
#SBATCH --gpus-per-node=1
#SBATCH -p lncc-gh200_dev
#SBATCH -J lammps+LJ+container-nvidia
#Exibe os nos alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST
cd $SLURM_SUBMIT_DIR
#carrega os modulos de ambiente
module load arch_gpu_sc
module load lammps/15Jun2023_nv_container
#configura a quantidade de gpus disponiveis
gpu_count=${1:-$(nvidia-smi --list-gpus | wc -l)}
export SINGULARITY="singularity run --nv -B ${PWD}:/host_pwd --pwd /host_pwd $LAMMPS_IMAGE"
srun --mpi=pmi2 $SINGULARITY lmp -k on g ${gpu_count} -sf kk -pk kokkos cuda/aware on neigh full comm device binsize 2.8 -in in.lj.txt