Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

hpcbench

A set of benchmarking utilities for biomolecular simulation tools.

Features

  • Automatically generate and run benchmarks for different HPC systems and molecular simulation packages
  • Log and scrape data from running simulations
  • Analyse performance, scaling, system utilisation, temperature, energy conservation, etc

Current support

  • Supported simulations
    • GROMACS
    • AMBER
    • OpenMM
    • NAMD
    • LAMMPS
    • Psi4
    • Relion 5
  • Supported HPC systems
    • JADE
    • ARCHER2
    • BEDE-GH
    • ISAMBARD-AI

Getting started

  • Download or clone this repo
  • Run python setup.py install
  • Run hpcbench in the terminal for a list of tools. Run hpcbench <toolname> to run that tool.
  • import hpcbench in python for the API.

Example: attach hpcbench loggers to an existing simulation script

The following HPC submission script has been modified to create cpu and gpu logs, as well as dump the sytem information, slurm parameters and gromacs log to json files. The call to collate merges all the json files together.

#!/bin/bash#SBATCH --nodes=1 #SBATCH --time=00:30:00#SBATCH --job-name=benchmark#SBATCH --gres=gpu:1#SBATCH --cpus-per-task=4#SBATCH --partition=devel
module load gromacs
conda init
hpcbench infolog sysinfo.json # log system info
hpcbench gpulog gpulog.json & gpuid=$!# log GPU utilisation
hpcbench cpulog "'gmx mdrun -s benchmark.tpr'" cpulog.json & cpuid=$!# log gromacs CPU usage# Nvidia optimisationsexport GMX_FORCE_UPDATE_DEFAULT_GPU=true export GMX_GPU_DD_COMMS=true
export GMX_GPU_PME_PP_COMMS=true
gmx mdrun -s benchmark.tpr -ntomp 10 -nb gpu -pme gpu -bonded gpu -dlb no -nstlist 300 -pin on -v -gpu_id 0
kill$gpuidkill$cpuid
hpcbench sacct $SLURM_JOB_ID accounting.json # log slurm accounting data
hpcbench gmxlog md.log run.json # parse gromacs log file and log relevant performance data
hpcbench slurmlog $0 slurm.json # log slurm variables
hpcbench extra -e "'Software:GROMACS'" -e "'Machine:JADE2'" meta.json # any other useful info
hpcbench collate -l sysinfo.json gpulog.json cpulog.json accounting.json run.json slurm.json meta.json -o output.json # merge all json files together

Example: create and submit a large set of benchmark scripts from a template

hpcbench can create many jobs at once using a job template, which is similar to the above job, but with certain variables (like the number of cpus and gpus) replaced with $-based substitutions. Specifying multiple values will lead hpcbench to generate all possible combinations of those values. Running makejobs -h will list out all the built-in templates.

hpcbench makejobs \
-s jobname=test \
-s num_gpus=gres:1,gres:2,gres:4,gres:8 \
-s partition=small \
-s benchmarkfile=benchmark.tpr \
-s comment=exmple \
-s machine=JADE \
-s benchout=output \
-e /home/rob/benchmarks/gromacs/20k-atoms/benchmark.tpr \
-t jade_gromacs_gpu.sh \
-o testgmgpu \

Example: plot results

The following script searches through a directory for hpcbench output files matching the specified criteria, and plots the results. The values on the x and y axes are determined by the x and y parameters. The 'label' parameter works like the 'matching' parameters, but it will accept all values of that field, and assign each one a label on the resulting plot.

# Plot scaling across number of GPUs
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'slurm:gres'" \
--y "'run:Totals:Wall time (s)'" \
--l "'run:Totals:Atoms'" \
--d "'/path/to/hpcbench/json/files'" \
--outside \
--outfile jade_gpu_scaling.pdf
# Plot scaling with system size
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--x "'run:Totals:Number of atoms'" \
--y "'run:Totals:ns/day'" \
--l "'slurm:program'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile jade_nsday.pdf
# Make a stackplot
hpcbench scaling \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--y "'run:Cycles:?:Wall time (s)'" \
--x "'run:Totals:Number of atoms'" \
--d "'/path/to/hpcbench/json/files'" \
-- outside \
--outfile atoms_stack.pdf
# Plot GPU utilisation, with one log for each system size
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'slurm:gres=gpu:1'" \
--l "'gromacs:Totals:Atoms'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--outfile atoms_usage.pdf
# Plot GPU utilisation, with one log for every number of GPUs
hpcbench logs \
--matching "'meta:Machine=JADE2'" \
--matching "'run:Totals:Number of atoms=2997924'" \
--l "'slurm:gres'" \
--y "'gpulog:?:utilization.gpu [%]'" \
--x "'gpulog:?:timestamp'" \
--d "'/path/to/hpcbench/json/files'" \
--avgy \
--outfile ~/Downloads/avg_gpu_usage.pdf

Example outputs

ns/day on JADE2

jade_nsday

Energy usage on JADE2

jade_energy

GPU utilisation on JADE2

jade_utilisation

GROMACS stackplot on JADE2

stackplot

Populating data for the HECBioSim calculator

The hpcbench fits command outputs data files compatible with the online HPC Calculator at hecbiosim.ac.uk. Fits are created using the same syntax as plots. Running hpcbench fits multiple times with different parameters will append the fits to the same file.

# use --debug to check the quality of the fits as they are calculated
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=JADE2'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--debug \
-o fits.json
# add hardcoded data to file (e.g. text strings for warnings, unit descriptions, icon names)
hpcbench fits \
-d "'/path/to/hpcbench/json/files'" \
-m "'meta:Machine=ARCHER2'" \
-m "'meta:Best=yes'" \
-m "'slurm:slurm:nodes=1'" \
-l "'slurm:program'" \
-x "'run:Totals:Number of atoms'" \
-y "'run:Totals:ns/day'" \
-y "'run:Totals:J/ns'" \
--hardcode \
--debug \
-o fits.json

License

AGPLv3

About

A set of benchmarks for biomolecular simulation tools

Resources

Stars

13 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages