Niagara Quickstart
Niagara | |
---|---|
Installed | Jan 2018 |
Operating System | CentOS 7.4 |
Number of Nodes | 1500 nodes (60,000 cores) |
Interconnect | Mellanox Dragonfly+ |
Ram/Node | 188 GiB / 202 GB |
Cores/Node | 40 (80 hyperthreads) |
Login/Devel Node | niagara.scinet.utoronto.ca |
Vendor Compilers | icc (C) ifort (fortran) icpc (C++) |
Queue Submission | Slurm |
Specifications
The Niagara cluster is a large cluster of 1500 Lenovo SD350 servers each with 40 Intel "Skylake" cores at 2.4 GHz. The peak performance of the cluster is 3.02 PFlops delivered / 4.6 PFlops theoretical. It is the 53rd fastest supercomputer on the TOP500 list of June 2018.
Each node of the cluster has 188 GiB / 202 GB RAM per node (at least 4 GiB/core for user jobs). Being designed for large parallel workloads, it has a fast interconnect consisting of EDR InfiniBand in a Dragonfly+ topology with Adaptive Routing. The compute nodes are accessed through a queueing system that allows jobs with a minimum of 15 minutes and a maximum of 12 or 24 hours and favours large jobs.
- See the "Intro to Niagara" recording
More detailed hardware characteristics of the Niagara supercomputer can be found on this page.
Getting started on Niagara
Those of you new to SciNet and belonging to a group whose primary PI does not have an allocation, as granted in the annual Compute Canada RAC, must first follow the old route of requesting a SciNet Consortium Account on the CCDB site to gain access to Niagara.
Logging in
Otherwise, as with all SciNet and CC (Compute Canada) compute systems, access to Niagara is done via SSH (secure shell) only. Open a terminal window (e.g. Connecting with PuTTY on Windows or Connecting with MobaXTerm), then SSH into the Niagara login nodes with your CC credentials:
$ ssh -Y MYCCUSERNAME@niagara.scinet.utoronto.ca
or
$ ssh -Y MYCCUSERNAME@niagara.computecanada.ca
- The Niagara login nodes are where you develop, edit, compile, prepare and submit jobs.
- These login nodes are not part of the Niagara compute cluster, but have the same architecture, operating system, and software stack.
- The optional
-Y
is needed to open windows from the Niagara command-line onto your local X server. - To run on Niagara's compute nodes, you must submit a batch job.
If you cannot log in, be sure first to check the System Status on this site's front page.
home and scratch
You have a home and scratch directory on the system, whose locations will be given in the form
$HOME=/home/g/groupname/myccusername
$SCRATCH=/scratch/g/groupname/myccusername
For example:
nia-login07:~$ pwd /home/s/scinet/rzon nia-login07:~$ cd $SCRATCH nia-login07:rzon$ pwd /scratch/s/scinet/rzon
NOTE: home is read-only on compute nodes.
project and archive
Users from groups with RAC storage allocation will also have a project and/or archive directory.
$PROJECT=/project/g/groupname/myccusername
$ARCHIVE=/archive/g/groupname/myccusername
NOTE: Currently archive space is available only via HPSS
IMPORTANT: Future-proof your scripts
When writing your scripts, use the environment variables (HOME, SCRATCH, PROJECT, ARCHIVE) instead of the actual paths! The paths may change in the future.
Storage and quotas
You should familiarize yourself with the various file systems, what purpose they serve, and how to properly use them. This table summarizes the various file systems. See the Data Management page for more details.
location | quota | block size | expiration time | backed up | on login nodes | on compute nodes | |
---|---|---|---|---|---|---|---|
$HOME | 100 GB per user | 1 MB | yes | yes | read-only | ||
$SCRATCH | 25 TB per user (dynamic per group) | 16 MB | 2 months | no | yes | yes | |
up to 4 users per group | 50TB | ||||||
up to 11 users per group | 125TB | ||||||
up to 28 users per group | 250TB | ||||||
up to 60 users per group | 400TB | ||||||
above 60 users per group | 500TB | ||||||
$PROJECT | by group allocation | 16 MB | yes | yes | yes | ||
$ARCHIVE | by group allocation | dual-copy | no | no | |||
$BBUFFER | 10 TB per user | 1 MB | very short | no | yes | yes |
- Inode vs. Space quota (PROJECT and SCRATCH)
- dynamic quota per group (SCRATCH)
- Compute nodes do not have local storage.
- Archive space is on HPSS.
- Backup means a recent snapshot, not a replica of all data or version that ever was.
$BBUFFER
stands for the Burst Buffer, a faster parallel storage tier for temporary data.
I/O Tips
- $HOME, $SCRATCH, and $PROJECT all use the parallel file system called GPFS.
- Your files can be seen on all Niagara login and compute nodes.
- GPFS is a high-performance file system which provides rapid reads and writes to large data sets in parallel from many nodes.
- But accessing data sets which consist of many, small files leads to poor performance.
- Avoid reading and writing lots of small amounts of data to disk.
- Many small files on the system would waste space and would be slower to access, read and write.
- Write data out in binary. Faster and takes less space.
- The Burst Buffer is better for I/O heavy jobs and to speed up checkpoints.
Loading Software Modules
Other than essentials, all installed software is made available using module commands. These modules set environment variables (PATH, etc.) This allows multiple, conflicting versions of a given package to be available. module spider shows the available software.
For example:
nia-login07:~$ module spider --------------------------------------------------- The following is a list of the modules currently av --------------------------------------------------- CCEnv: CCEnv NiaEnv: NiaEnv/2018a anaconda2: anaconda2/5.1.0 anaconda3: anaconda3/5.1.0 autotools: autotools/2017 autoconf, automake, and libtool boost: boost/1.66.0 cfitsio: cfitsio/3.430 cmake: cmake/3.10.2 cmake/3.10.3 ...
Common module subcommands are:
module load <module-name>
: use particular softwaremodule purge
: remove currently loaded modulesmodule spider
(ormodule spider <module-name>
): list available software packagesmodule avail
: list loadable software packagesmodule list
: list loaded modules
On Niagara, there are really two software stacks:
A Niagara software stack tuned and compiled for this machine. This stack is available by default, but if not, can be reloaded with
module load NiaEnv
The same software stack available on Compute Canada's General Purpose clusters Graham and Cedar, compiled (for now) for a previous generation of CPUs:
module load CCEnv
If you want the same default modules loaded as on Cedar and Graham, then afterwards also
module load StdEnv
.
Note: the *Env
modules are sticky; remove them by --force
.
Tips for loading software
- We advise against loading modules in your .bashrc. This can lead to very confusing behaviour under certain circumstances. Our guidelines for .bashrc files can be found here
- The default .bashrc and .bash_profile files on Niagara can be found here
- Instead, load modules by hand when needed, or by sourcing a separate script.
- Load run-specific modules inside your job submission script.
- Short names give default versions; e.g.
intel
→intel/2018.2
. It is usually better to be explicit about the versions, for future reproducibility. - Handy abbreviations:
ml → module list ml NAME → module load NAME # if NAME is an existing module ml X → module X
- Modules sometimes require other modules to be loaded first.
Solve these dependencies by using module spider
.
Module spider
Oddly named, the module subcommand spider is the search-and-advice facility for modules.
Suppose one wanted to load the openmpi module. Upon trying to load the module, one may get the following message:
nia-login07:~$ module load openmpi Lmod has detected the error: These module(s) exist but cannot be loaded as requested: "openmpi" Try: "module spider openmpi" to see how to load the module(s).
So while that fails, following the advice that the command outputs, the next command would be:
nia-login07:~$ module spider openmpi ------------------------------------------------------------------------------------------------------ openmpi: ------------------------------------------------------------------------------------------------------ Versions: openmpi/2.1.3 openmpi/3.0.1 openmpi/3.1.0 ------------------------------------------------------------------------------------------------------ For detailed information about a specific "openmpi" module (including how to load the modules) use the module s full name. For example: $ module spider openmpi/3.1.0 ------------------------------------------------------------------------------------------------------
So this gives just more detailed suggestions on using the spider command. Following the advice again, one would type:
nia-login07:~$ module spider openmpi/3.1.0 ------------------------------------------------------------------------------------------------------ openmpi: openmpi/3.1.0 ------------------------------------------------------------------------------------------------------ You will need to load all module(s) on any one of the lines below before the "openmpi/3.1.0" module is available to load. NiaEnv/2018a gcc/7.3.0 NiaEnv/2018a intel/2018.2
These are concrete instructions on how to load this particular openmpi module. Following these leads to a successful loading of the module.
nia-login07:~$ module load NiaEnv/2018a intel/2018.2 # note: NiaEnv is usually already loaded nia-login07:~$ module load openmpi/3.1.0
nia-login07:~$ module list Currently Loaded Modules: 1) NiaEnv/2018a (S) 2) intel/2018.2 3) openmpi/3.1.0 Where: S: Module is Sticky, requires --force to unload or purge
Running Commercial Software
- Possibly, but you have to bring your own license for it. You can connect to an external license server using ssh tunneling.
- SciNet and Compute Canada have an extremely large and broad user base of thousands of users, so we cannot provide licenses for everyone's favorite software.
- Thus, the only commercial software installed on Niagara is software that can benefit everyone: Compilers, math libraries and debuggers.
- That means no MATLAB, Gaussian, IDL,
- Open source alternatives like Octave, Python, R are available.
- We are happy to help you to install commercial software for which you have a license.
- In some cases, if you have a license, you can use software in the Compute Canada stack.
Running Interactive Software
The usual open source interactive data analysis software tools are available on Niagara:
Please visit these pages for details on using these tools. For information on running MATLAB applications on Niagara, visit this page.
Compiling on Niagara: Example
Suppose one want to compile an application from two c source files, appl.c and module.c, which use the Gnu Scientific Library (GSL). This is an example of how this would be done:
nia-login07:~$ module list Currently Loaded Modules: 1) NiaEnv/2018a (S) Where: S: Module is Sticky, requires --force to unload or purge nia-login07:~$ module load intel/2018.2 gsl/2.4 nia-login07:~$ ls appl.c module.c nia-login07:~$ icc -c -O3 -xHost -o appl.o appl.c nia-login07:~$ icc -c -O3 -xHost -o module.o module.c nia-login07:~$ icc -o appl module.o appl.o -lgsl -mkl nia-login07:~$ ./appl
Note:
- The optimization flags -O3 -xHost allow the Intel compiler to use instructions specific to the architecture CPU that is present (instead of for more generic x86_64 CPUs).
- The GSL requires a cblas implementation, for is contained in the Intel Math Kernel Library (MKL). Linking with this library is easy when using the intel compiler, it just requires the -mkl flags.
- If compiling with gcc, the optimization flags would be -O3 -march=native. For the way to link with the MKL, it is suggested to use the MKL link line advisor.
Testing
You really should test your code before you submit it to the cluster to know if your code is correct and what kind of resources you need.
Small test jobs can be run on the login nodes.
Rule of thumb: couple of minutes, taking at most about 1-2GB of memory, couple of cores.
You can run the the ddt debugger on the login nodes after
module load ddt
.Short tests that do not fit on a login node, or for which you need a dedicated node, request an
interactive debug job with the salloc commandnia-login07:~$ salloc -pdebug --nodes N --time=1:00:00
where N is the number of nodes. The duration of your interactive debug session can be at most one hour, can use at most 4 nodes, and each user can only have one such session at a time.
Alternatively, on Niagara, you can use the command
nia-login07:~$ debugjob N
where N is the number of nodes, If N=1, this gives an interactive session one 1 hour, when N=4 (the maximum), it gives you 30 minutes.
Finally, if your debugjob process takes more than 1 hour, you can request an interactive job from the regular queue. Note, however, that this may take some time to run, since it will be part of the regular queue, and will be run when the scheduler decides.
nia-login07:~$ salloc --nodes N --time=M:00:00
where N is again the number of nodes, and M is the number of hours you wish the job to run.
Testing with Graphics: X-forwarding
If you need to use graphics while testing your code, e.g. when using a debugger such as DDT or DDD, you have the following options:
- You can use the
debugjob
command which automatically provides X-forwarding support.$ ssh niagara.scinet.utoronto.ca -X USER@nia-login07:~$ debugjob debugjob: Requesting 1 nodes for 60 minutes xalloc: Granted job allocation 189857 xalloc: Waiting for resource configuration xalloc: Nodes nia0030 are ready for job [USER@nia1265 ~]$
- If
debugjob
is not suitable for your case due to the limitations either on time or resources (see above #Testing), then you have to follow these steps: You will need two terminals in order to achieve this:- In the 1st terminal
- ssh to
niagara.scinet.utoronto.ca
and issue yoursalloc
command - wait until your resources are allocated and you are assigned the nodes
- take note of the node where you are logged to, ie. the head node, let's say
niaWXYZ
$ ssh niagara.scinet.utoronto.ca USER@nia-login07:~$ salloc --nodes 5 --time=2:00:00 .salloc: Granted job allocation 141862 .salloc: Waiting for resource configuration .salloc: Nodes nia1265 are ready for job [USER@nia1265 ~]$
- ssh to
- On the second terminal:
- ssh into
niagara.scinet.utoronto.ca
now using the-X
flag in the ssh command - after that
ssh -X niaWXYZ
, ie. you will ssh carrying on the '-X' flag into the head node of the job - in the
niaWXYZ
you should be able to use graphics and should be redirected by x-forwarding to your local terminal
ssh niagara.scinet.utoronto.ca -X USER@nia-login07:~$ ssh -X nia1265 [USER@nia1265 ~]$ xclock ## just an example to test the graphics, a clock should pop up, close it to exit [USER@nia1265 ~]$ module load ddt ## load corresponding modules, eg. for DDT [USER@nia1265 ~]$ ddt ## launch DDT, the GUI should appear in your screen
- ssh into
- In the 1st terminal
Observations:
- If you are using ssh from a Windows machine, you need to have an X-server, a good option is to use MobaXterm, that already brings an X-server included.
- If you are in Mac OS, substitute -X by -Y
- Instead of using two terminals, you could just use
screen
to request the resources and then detach the session and ssh into the head node directly.
Submitting jobs
Niagara uses SLURM as its job scheduler. More-advanced details of how to interact with the scheduler can be found on the Slurm page.
You submit jobs from a login node by passing a script to the sbatch command:
nia-login07:~$ sbatch jobscript.sh
This puts the job in the queue. It will run on the compute nodes in due course.
Jobs will run under their group's RRG allocation, or, if the group has none, under a RAS allocation (previously called `default' allocation).
Keep in mind:
Scheduling is by node, so in multiples of 40 cores.
For users with an allocation, the maximum walltime is 24 hours. For those without an allocation, the maximum walltime is 12 hours.
Jobs must write to your scratch or project directory (home is read-only on compute nodes).
Compute nodes have no internet access.
Download data you need beforehand on a login node.
Scheduling by Node
- On many systems that use SLURM, the scheduler will deduce from the specifications of the number of tasks and the number of cpus-per-node, what resources should be allocated. On Niagara, this is a bit different.
All job resource requests on Niagara are scheduled as a multiple of nodes.
- The nodes that your jobs run on are exclusively yours.
- No other users are running anything on them.
- You can ssh into them to see how things are going.
Whatever your requests to the scheduler, it will always be translated into a multiple of nodes allocated to your job.
Memory requests to the scheduler are of no use. Your job always gets N x 202GB of RAM, where N is the number of nodes.
You should try to use all the cores on the nodes allocated to your job. Since there are 40 cores per node, your job should use N x 40 cores. If this is not the case, we will be contacted you to help you optimize your workflow.
Limits
There are limits to the size and duration of your jobs, the number of jobs you can run and the number of jobs you can have queued. It matters whether a user is part of a group with a Resources for Research Group allocation or not. It also matters in which 'partition' the jobs runs. 'Partitions' are SLURM-speak for use cases. You specify the partition with the -p parameter to sbatch or salloc, but if you do not specify one, your job will run in the compute partition, which is the most common case.
Usage | Partition | Running jobs | Submitted jobs (incl. running) | Min. size of jobs | Max. size of jobs | Min. walltime | Max. walltime |
---|---|---|---|---|---|---|---|
Compute jobs with an allocation | compute | 50 | 1000 | 1 node (40 cores) | 1000 nodes (40000 cores) | 15 minutes | 24 hours |
Compute jobs without allocation ("default") | compute | 50 | 200 | 1 node (40 cores) | 20 nodes (800 cores) | 15 minutes | 12 hours |
Testing or troubleshooting | debug | 1 | 1 | 1 node (40 cores) | 4 nodes (160 cores) | N/A | 1 hour |
Archiving or retrieving data in HPSS | archivelong | 2 per user (max 5 total) | 10 per user | N/A | N/A | 15 minutes | 72 hours |
Inspecting archived data, small archival actions in HPSS | archiveshort | 2 per user | 10 per user | N/A | N/A | 15 minutes | 1 hour |
Within these limits, jobs will still have to wait in the queue. The waiting time depends on many factors such as the allocation amount, how much allocation was used in the recent past, the number of nodes and the walltime, and how many other jobs are waiting in the queue.
Example submission script (MPI)
#!/bin/bash #SBATCH --nodes=8 #SBATCH --ntasks=320 #SBATCH --time=1:00:00 #SBATCH --job-name mpi_job #SBATCH --output=mpi_output_%j.txt cd $SLURM_SUBMIT_DIR module load intel/2018.2 module load openmpi/3.1.0 mpirun ./mpi_example # or "srun ./mpi_example"
Submit this script with the command:
nia-login07:~$ sbatch mpi_job.sh
First line indicates that this is a bash script.
Lines starting with
#SBATCH
go to SLURM.sbatch reads these lines as a job request (which it gives the name
mpi_job
)In this case, SLURM looks for 8 nodes with 40 cores on which to run 320 tasks, for 1 hour.
Note that the mpifun flag "--ppn" (processors per node) is ignored.
Once it found such a node, it runs the script:
- Change to the submission directory;
- Loads modules;
- Runs the
mpi_example
application.
- To use hyperthreading, just change --ntasks=320 to --ntasks=640, and add --bind-to none to the mpirun command (the latter is necessary for OpenMPI only, not when using IntelMPI).
Example submission script (OpenMP)
#!/bin/bash #SBATCH --nodes=1 #SBATCH --cpus-per-task=40 #SBATCH --time=1:00:00 #SBATCH --job-name openmp_job #SBATCH --output=openmp_output_%j.txt cd $SLURM_SUBMIT_DIR module load intel/2018.2 export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK ./openmp_example # or "srun ./openmp_example".
Submit this script with the command:
nia-login07:~$ sbatch openmp_job.sh
- First line indicates that this is a bash script.
- Lines starting with
#SBATCH
go to SLURM. - sbatch reads these lines as a job request (which it gives the name
openmp_job
) . - In this case, SLURM looks for one node with 40 cores to be run inside one task, for 1 hour.
- Once it found such a node, it runs the script:
- Change to the submission directory;
- Loads modules;
- Sets an environment variable;
- Runs the
openmp_example
application.
- To use hyperthreading, just change
--cpus-per-task=40
to--cpus-per-task=80
.
Monitoring queued jobs
Once the job is incorporated into the queue, there are some command you can use to monitor its progress.
squeue
orsqc
(a caching version of squeue) to show the job queue (squeue -u $USER
for just your jobs);squeue -j JOBID
to get information on a specific job(alternatively,
scontrol show job JOBID
, which is more verbose).squeue --start -j JOBID
to get an estimate for when a job will run; these tend not to be very accurate predictions.scancel -i JOBID
to cancel the job.jobperf JOBID
to get an instantaneous view of the cpu and memory usage of the nodes of the job while it is running.sacct
to get information on your recent jobs.- SciNet: https://www.scinet.utoronto.ca
- Niagara: https://docs.computecanada.ca/wiki/niagara
- System Status: https://docs.scinet.utoronto.ca/index.php/Main_Page
- Training: https://support.scinet.utoronto.ca/education
- support@scinet.utoronto.ca
- niagara@computecanada.ca
Further instructions for monitoring your jobs can be found on the Slurm page. The my.SciNet site is also a very useful tool for monitoring your current and past usage.
Visualization
Information about how to use visualization tools on Niagara is available on Visualization page.
Further information
Useful sites
Support