Trillium Quickstart
| Trillium | |
|---|---|
| Installed | Aug 2025 |
| Operating System | Rocky Linux 9.6 |
| Number of Nodes | 1284 nodes (240768 cores) |
| Interconnect | Mellanox Dragonfly+ |
| Ram/Node | 768 GB |
| Cores/Node | 192 (CPU nodes) and 96 (GPU nodes) |
| Login/Devel Node | trillium.scinet.utoronto.ca |
| Queue Submission | Slurm |
System Overview
The Trillium system is a state-of-the-art high performance computing platform, consisting of three main components:
1. CPU Subcluster
- ~240,000 cores across homogeneous CPU nodes
- Non-blocking 400 Gb/s NDR InfiniBand interconnect
- Ideal for large-scale parallel workloads
2. GPU Subcluster
- 61 GPU nodes, each with 4 x NVIDIA H100 (SXM) GPUs
- 800 Gb/s bandwidth per node (200 Gb/s per GPU) over InfiniBand
- Optimized for AI/ML and accelerated science workloads
- Note: This subcluster is in high demand and not ideal for training extremely large models (multi-100B parameters)
3. Storage System
- Unified 29 PB VAST NVMe storage for all workloads
- No tiering — all flash-based for consistent performance
- Accessible via POSIX or S3 under a unified namespace
Specifications
The Trillium cluster is a large cluster comprised of two types of nodes:
| nodes | cores | available memory | CPU | GPU |
|---|---|---|---|---|
| 1224 | 192 | 768GB DDR5 | 2 x AMD EPYC 9655 (Zen 5) @ 2.6 GHz, 384MB cache L3 | |
| 60 | 96 | 768GB DDR5 | 1 x AMD EPYC 9654 (Zen 4) @ 2.4 GHz, 384MB cache L3 | 4 x NVIDIA H100 SXM (80 GB memory) |
Each node of the cluster has 768 GB RAM per node. Being designed for large parallel workloads, it has a fast interconnect consisting of NDR 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 24 hours.
Storage System
Trillium features a unified high-performance storage system based on the VAST platform, with no tiering. It serves the following directories:
/home– For personal files and configurations./scratch– High-speed, temporary storage for job data./project– Shared storage for project teams and collaborations.
The storage is accessible via the NDR InfiniBand fabric for maximum performance across all workloads.
Getting started on Trillium
Access to Trillium is not enabled automatically for everyone with an account with the Digital Reseach Alliance of Canada (formerly Compute Canada), but anyone with an active Alliance account can get their access enabled.
Trillium is not automatically available to all Alliance account holders. If you are new to SciNet or your Supervisor/PI does not hold a current Alliance (formerly Compute Canada) RAC allocation, you will need to request access on the Access Systems page on the CCDB site. After clicking the "I request access" button, it usually takes only one or two business days for access to be granted.
You can check if you already have Trillium access by attempting to log in. If you receive a "Permission denied" error (and your SSH key is correctly set up), you may need to opt in.
Please read this document carefully. The FAQ is also a useful resource. If at any time you require assistance, or if something is unclear, please do not hesitate to contact us.
Logging in
Trillium runs Rocky Linux 9.6, which is a type of Linux. You will need to be familiar with Linux systems to work on Trillium. If you are not it will be worth your time to review our Introduction to Linux Shell class.
As with all SciNet and Alliance (formerly Compute Canada) compute systems, access to Trillium is done via SSH (secure shell) only and authentication is only allowed via SSH keys. Please refer to this page to generate your SSH key pair and make sure you use them securely.
Open a terminal window (e.g. Connecting with PuTTY on Windows or Connecting with MobaXTerm), then SSH into the Trillium login nodes with your Alliance (formerly Compute Canada) credentials:
$ ssh -i /path/to/ssh_private_key -Y MYALLIANCEUSERNAME@trillium.scinet.utoronto.ca
- The Trillium login nodes are where you develop, edit, compile, prepare and submit jobs.
- These login nodes are not part of the Trillium compute cluster, but have the same architecture, operating system, and software stack.
- The optional
-Yenables X11 forwarding, allowing graphical programs to open windows on your local computer. - To run on Trillium compute nodes, you must submit a batch job.
If you cannot log in, be sure to first check the System Status on this site's front page.
Note: We plan to add browser access to Trillium via Open OnDemand in the future. In the meantime you can still access our existing Open OnDemand deployment by following the instructions in our quickstart guide.
Software Environment
Trillium uses the environment modules system to manage compilers, libraries, and other software packages. Modules dynamically modify your environment (e.g., PATH, LD_LIBRARY_PATH) so you can access different versions of software without conflicts.
A detailed explanation can be found on the modules page.
Commonly used module commands:
module load <module-name>– Load the default version of a software package.module load <module-name>/<module-version>– Load a specific version.module purge– Unload all currently loaded modules.module avail– List available modules that can be loaded.module list– Show currently loaded modules.module spiderormodule spider <module-name>– Search for available modules and their versions.
Handy abbreviations are available:
ml– Equivalent tomodule list.ml <module-name>– Equivalent tomodule load <module-name>.
Tips for Loading Software
Properly managing your software environment is key to avoiding conflicts and ensuring reproducibility. Here are some best practices:
- Avoid loading modules in your
.bashrcfile. Doing so can cause unexpected behavior, particularly in non-interactive environments like batch jobs or remote shells. For more information, see our .bashrc guidelines.
- Instead, load modules manually or from a separate script. This approach gives you more control and helps keep environments clean.
- Load required modules inside your job submission script. This ensures that your job runs with the expected software environment, regardless of your interactive shell settings.
- Be explicit about module versions. Short names like
gccwill load the system default (e.g.,gcc/12.3), which may change in the future. Specify full versions (e.g.,gcc/13.3) for long-term reproducibility.
- Resolve dependencies with
module spider. Some modules depend on others. Usemodule spider <module-name>to discover which modules are required and how to load them in the correct order. For more, see Usingmodule spider.
Using Commercial Software
You may be able to use commercial software on Trillium, but there are a few important considerations:
- Bring your own license. You can use commercial software on Trillium if you have a valid license. If the software requires a license server, you can connect to it securely using SSH tunneling.
- SciNet and the Alliance (formerly Compute Canada) do not provide user-specific licenses. Due to the large and diverse user base, we cannot provide licenses for individual or specialized commercial packages.
- Freely available commercial tools. Some widely useful commercial tools are available system-wide, such as compilers, math libraries, debuggers.
- Software not available (unless you bring your own license): tools like MATLAB, Gaussian, and IDL are not provided centrally. If you have your own license, you are welcome to install and use them.
- Open-source alternatives are available. Consider using freely available tools such as Python, R, and Octave, which are well-supported and widely used on the system.
- We're here to help. If you have a valid license and need help installing commercial software, feel free to contact us, we'll assist where possible.
A list of commercial software currently installed on Trillium (for which you must supply a license to use) is available on the Commercial Software page.
Technical Details
Cooling and Energy Efficiency
Trillium is fully direct liquid cooled using warm water (35–40 °C input), resulting in:
- PUE below 1.03 (high energy efficiency)
- Use of closed-loop dry fluid coolers, avoiding evaporative towers and new water usage
- Heat reuse: Trillium supplies excess heat to nearby facilities to minimize climate impact
Storage System
The VAST high-performance file system is comprised of a unified 29 PB NVMe-backed storage pool, with:
- 29 PB effective capacity (deduplicated via VAST)
- 16.7 PB raw flash capacity
- 714 GB/s read bandwidth, 275 GB/s write bandwidth
- 10 million read IOPS, 2 million write IOPS
- POSIX and S3 access protocols under a unified namespace
- 48 C-Boxes and 14 D-Boxes for data services
Backup and Archive Storage
An additional 114 PB HPSS tape-based archive is available for nearline storage:
- Dual-copy archive across geographically separate libraries
- Used for both backup and archival purposes
- Backups are managed using Atempo backup software
Testing and Debugging
Before submitting your job to the cluster, it's important to test your code to ensure correctness and determine the resources it requires.
- Lightweight tests can be run directly on the login nodes. As a rule of thumb, these should:
- Run in under a few minutes
- Use no more than 1–2 GB of memory
- Use only 1–2 CPU cores
- You can also run the DDT debugger on the login nodes after loading it with:
module load ddt-cpu
- For short tests that exceed login node limits or require dedicated resources, request an interactive debug job using the
debugjobcommand:
tri-login01:~$ debugjob --clean N
Replace N with the number of nodes (1 to 4). If N=1, you will get 1 hour of interactive time; with N=4 (the maximum), you will get 22 minutes.
The --clean flag is optional but recommended, as it starts the session with no modules loaded, better mimicking the clean environment of batch jobs.
- If your test job requires more time than allowed by
debugjob, you can request an interactive session from the regular queue usingsalloc:
tri-login01:~$ salloc --nodes=N --time=M:00:00 --x11
Nis the number of nodesMis the number of hours the job should run--x11is required for graphical applications (e.g., when using DDT or DDD)
Note: Jobs submitted with salloc may take longer to start, as they are scheduled like any other batch job. See the Testing with graphics page for more information on graphical testing options.
Submitting Jobs on the CPU Subcluster
Once you have compiled and tested your code or workflow on the Trillium login nodes, and confirmed that it behaves correctly, you are ready to submit jobs to the cluster. Your jobs will run on some of Trillium's compute nodes. When and where your job runs is determined by the scheduler.
Trillium 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:
tri-login01:scratch$ sbatch jobscript.sh
This puts the job in the queue. It will run on the compute nodes in due course. Note that you must submit your job from a login node. You cannot submit jobs from the datamover nodes.
In most cases, you should not submit from your $HOME directory, but rather from your $SCRATCH directory, so that the output of your compute job can be written out (as mentioned above, $HOME is read-only on the compute nodes).
Jobs will run under your group's RRG allocation, or, if your group has none, under a RAS allocation (previously called "default" allocation).
Some example job scripts can be found below.
Keep in mind:
- Scheduling is by node, so in multiples of 192 cores.
- Your job's maximum walltime is 24 hours.
- Jobs must write their output to your scratch (
homeandprojectare read-only on compute nodes). - Compute nodes have no internet access.
- Your job script will not remember the modules you have loaded, so it needs to contain
module loadcommands for all required modules (see examples below). - Move your data to Trillium before you submit your job.
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 Trillium, things are a bit different.
- All job resource requests on Trillium are scheduled as a multiple of nodes.
- The nodes that your jobs run on are exclusively yours, for as long as the job is running on them.
- No other users are running anything on them.
- You can SSH into them to see how things are going.
- Even if your resource request does not require a full node, the scheduler will still allocate one or more entire nodes to your job, as Trillium does not share nodes between users.
- Memory requests to the scheduler are of no use. Your job always gets
N × 768GBof RAM, whereNis the number of nodes and 768GB is the amount of memory on each node. - If you run serial jobs you must still use all 192 cores on the node. Visit the serial jobs page for examples of how to do this.
- Since there are 192 cores per node, your job should use
N × 192cores. If you do not, we will contact you to help you optimize your workflow—or you can contact us to get assistance.
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 job 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 | Limit on Running jobs | Limit on Submitted jobs (incl. running) | Min. size of jobs | Max. size of jobs | Min. walltime | Max. walltime |
|---|---|---|---|---|---|---|---|
| Compute jobs | compute | 50 | 1000 | 1 node (192 cores) | default: 20 nodes (3840 cores) with allocation: 1000 nodes (192000 cores) |
15 minutes | 24 hours |
| Testing or troubleshooting | debug | 1 | 1 | 1 node (192 cores) | 4 nodes (768 cores) | N/A | 1 hour |
| Archiving or retrieving data in HPSS | archivelong | 2 per user (5 in total) | 10 per user | N/A | N/A | 15 minutes | 72 hours |
| Inspecting archived data, small archival actions in HPSS | archiveshort vfsshort | 2 per user | 10 per user | N/A | N/A | 15 minutes | 1 hour |
Even if you respect these limits, your jobs will still have to wait in the queue. The waiting time depends on many factors such as your group's allocation amount, how much allocation has been used in the recent past, the number of requested nodes and walltime, and how many other jobs are waiting in the queue.
Example submission script (MPI)
#!/bin/bash #SBATCH --nodes=2 #SBATCH --ntasks-per-node=192 #SBATCH --time=01:00:00 #SBATCH --job-name=mpi_job #SBATCH --output=mpi_output_%j.txt #SBATCH --mail-type=FAIL cd $SLURM_SUBMIT_DIR module load StdEnv/2023 module load gcc/12.3 module load openmpi/4.1.5 mpirun ./mpi_example # or "srun ./mpi_example"
Submit this script from your scratch directory with the command:
tri-login01:scratch$ sbatch mpi_job.sh
- First line indicates that this is a bash script.
- Lines starting with
#SBATCHgo to SLURM. sbatchreads these lines as a job request (which it gives the namempi_job).- In this case, SLURM looks for 2 nodes each running 192 tasks, for 1 hour.
- Note that the mpifun flag
--ppn(processors per node) is ignored. - Once it finds such a node, it runs the script:
- Change to the submission directory;
- Loads modules;
- Runs the
mpi_exampleapplication (SLURM will informmpirunorsrunhow many processes to run).
- To use hyperthreading, change
--ntasks-per-node=192to--ntasks-per-node=384, and add--bind-to noneto thempiruncommand