====== Slurm ====== This is the front page for information to our compute resource sharing system. We use software called Slurm to fairly share compute resources. For job submission we will be using a piece of software called [[http://slurm.schedmd.com|Slurm]]. Simply put, Slurm is a queue management system; it was developed at the Lawrence Livermore National Lab. It currently supports some of the largest compute clusters in the world. The best description of Slurm can be found on its homepage: "Slurm is an open-source workload manager designed for Linux clusters of all sizes. It provides three key functions. First it allocates exclusive and/or non-exclusive access to resources (computer nodes) to users for some duration of time so they can perform work. Second, it provides a framework for starting, executing, and monitoring work (typically a parallel job) on a set of allocated nodes. Finally, it arbitrates contention for resources by managing a queue of pending work."((http://slurm.schedmd.com/)) Slurm is similar to most other queue systems in that you write a batch script, then submit it to the queue manager. The queue manager schedules your job to run on the queue (or partition in Slurm parlance) that you designate. Below is an outline of how to submit jobs to Slurm, how Slurm decides when to schedule your job, and how to monitor progress. ===== Communication ===== ==== Mailing List ==== If you are going to be a user of any of the CS Slurm clusters please sign up for the mailing list. Downtime and other relevant information will be announced here. [[ https://mailman.cs.uchicago.edu/cgi-bin/mailman/listinfo/slurm | Mailing List ]] ==== Discord ==== There is a dedicated text channel ''%%#slurm%%'' on the UChicago CS Discord server. Please note that this Discord server is //only// for UChicago-affiliated users. You can find a link to our Discord server on the [[start|front page]] of this wiki. ===== Clusters ===== We have a couple different clusters. If you don't know where to start please use the ''%%Peanut%%'' cluster. The ''%%AI Cluster%%'' is for GPU jobs and more advanced users. * [[slurm:peanut|Peanut Cluster]] * [[slurm:ai|AI Cluster]] ==== Peanut Cluster ==== Think of these machines as a dumping ground for discrete computing tasks that might be rude or disruptive to execute on the main (shared) shell servers (i.e., linux1, linux2, linux3). Additionally, this cluster is used for courses that require it. ==== AI Cluster ==== This cluster is mainly made up of GPU machines and is used primary for research. To use this cluster there are specific nodes you need to log into. Please visit the dedicated AI cluster page for more information. ===== Where to begin ===== Slurm is a set of command line utilities that can be accessed via the command line from **most** any computer science system you can login to. Using our main shell servers (linux.cs.uchicago.edu) is expected to be our most common use case, so you should start there. ssh user@linux.cs.uchicago.edu If you want to use the AI Cluster you will need to have previously requested access by sending in a ticket. Afterwards, you may login into: ssh user@fe.ai.cs.uchicago.edu Please read up on the specifics on the cluster you are interested in. ===== Documentation ===== The [[http://slurm.schedmd.com/documentation.html|Slurm website]] should be your primary source for documentation. A great way to get details on Slurm commands are the manuals that are already on the cluster. For example, if you type the following command: man sbatch you will get the manual page for the ''%%sbatch%%'' command. ===== Resources ===== * [[https://rc.fas.harvard.edu/resources/documentation/convenient-slurm-commands|Common Slurm commands]] * [[http://slurm.schedmd.com/|Official Slurm website]] * [[http://slurm.schedmd.com/documentation.html|Official Slurm documentation]] * [[http://slurm.schedmd.com/tutorials.html|Slurm tutorial videos]] * [[https://computing.llnl.gov/linux/slurm/quickstart.html|LLNL quick start user guide]] * [[http://research.computing.yale.edu/support/hpc/user-guide/slurm| Yale's User Guide]] ====== Job Submission ====== Jobs submitted to the cluster are run from the command line. Almost anything that you can run via the command line on any of our machines in our labs can be run on our job submission server agents. The job submission servers run the same software as you will find on our lab computers, but without the X environment. You can submit jobs from the departmental computers that you have access to. You will not be able to access the job server agent directly. ===== Command Summary ===== [[http://slurm.schedmd.com/pdfs/summary.pdf|Cheat Sheet]] | ^ Slurm ^ Example ^ ^ Submit a batch serial job | sbatch | sbatch runscript.sh | ^ Run a script interactively | srun | srun --pty -p interact -t 10 --mem 1000 \\ /bin/bash \\ /bin/hostname | ^ Kill a job | scancel | scancel 4585 | ^ View status of queues | squeue | squeue -u cnetid | ^ Check current job by id | sacct | sacct -j 999999 | ===== Usage ===== Below are some common examples. You should consult the [[http://slurm.schedmd.com/documentation.html|documentation]] of Slurm if you need further assistance. === Default Quotas === By default we set a job to be run on one CPU and allocate 100MB of RAM. If you require more than that you should specify what you need. Using the following options will do: ''%%--mem-per-cpu%%'', ''%%--nodes%%'', ''%%--ntasks%%''. === Exclusive access to a node === You will need to add the ''%%--exclusive%%'' options to your script or command line options. This option will ensure that when your job runs it is the only job running on that particular node. ==== sbatch ==== The sbatch command is used for submitting jobs to the cluster. sbatch accepts a number of options either from the command line, or (more typically) from a batch script. An example of a Slurm batch script is shown below: === Sample script === Make sure you create a directory in which to deposit the ''%%STDIN%%'', ''%%STDOUT%%'', ''%%STDERR%%'' files. mkdir -p $HOME/slurm/out #!/bin/bash # #SBATCH --mail-user=cnetid@cs.uchicago.edu #SBATCH --mail-type=ALL #SBATCH --output=/home/cnetid/slurm/out/%j.%N.stdout #SBATCH --error=/home/cnetid/slurm/out/%j.%N.stderr #SBATCH --chdir=/home/cnetid/slurm #SBATCH --partition=debug #SBATCH --job-name=check_hostname_of_node #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --mem-per-cpu=500 #SBATCH --time=15:00 hostname If any of the above options are unclear as to what they do please check the man page for ''%%sbatch%%'' man sbatch Make sure to replace all instances of the word ''%%cnetid%%'' with your CNETID. === Submitting job script === Using the above example you will want to place your tested code into a file. 'hostname.job' is the file name in this example. sbatch hostname.job You can then check the status via squeue or see the output in the output directory '$HOME/slurm/slurm_out'. ==== srun ==== Used to submit a job to the cluster that doesn't necessarily need a script. user@host:~$ srun -n2 hostname slurm2 slurm2 ''%%srun%%'' will remain in the foreground until the job has finished. user@host:~$ srun -n1 sleep 400 ==== squeue ==== This command will show jobs in the queue. user@host:~$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 29 debug sleep user R 0:11 1 research2 ==== scancel ==== Cancel one of your own jobs. Please read the ''%%scancel%%'' manual page (''%%man scancel%%'') as there are many ways of canceling your jobs if they are of any complexity. scancel 29 ==== sinfo ==== View information about Slurm nodes and partitions. The following code block shows the what happens when you run the ''%%sinfo%%'' command. You get a list of 'partitions' on which you can run your code. Each partition is comprised of certain types of nodes. In the case below the default (denoted by a *) is 'debug'. The job time limit is short and is meant only to debug your code. The other partitions will usually have a particular purpose in mind. 'hardware', for example, is to be used if you require direct access to the hardware instead of the KVM layer between the hardware and the OS. user@host:~$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up 1-00:00:00 1 mix slurm1 fast up 1-00:00:00 6 idle slurm[9-14] general up 21-00:00:0 6 idle slurm[2-6,8] pascal up 3-00:00:00 1 idle gpu2 quadro up 3-00:00:00 1 idle gpu1 titan up 3-00:00:00 1 mix gpu3 ====== Monitoring Jobs ====== ''%%squeue%%'' and ''%%sacct%%'' are two different commands that allow you to monitor job activity in Slurm. ''%%squeue%%'' is the primary and most accurate monitoring tool since it queries the Slurm controller directly. ''%%sacct%%'' gives you similar information for running jobs, and can also report on previously finished jobs, but because it accesses the Slurm database, there are some circumstances when the information is not in sync with squeue. Running ''%%squeue%%'' without arguments will list all currently running jobs. It is more common, though to list jobs for a particular user (like yourself) using the ''%%-u%%'' option... squeue -u cnetid or for a particular job id. squeue -j 7894 ====== Interactive Jobs ====== Though batch submission is the best way to take full advantage of the compute power in the job submission cluster, foreground, interactive jobs can also be run. An interactive job differs from a batch job in two important aspects: - The partition to be used is the interact partition - Jobs should be initiated with the srun command instead of sbatch. This command: srun -p general --pty --cpus-per-task 1 --mem 500 -t 0-06:00 /bin/bash will start a command line shell (''%%/bin/bash%%'') on the 'general' queue with 500 MB of RAM for 6 hours; 1 core on 1 node is assumed as these parameters (''%%-n 1 -N 1%%'') were left out. When the interactive session starts, you will notice that you are no longer on a login node, but rather one of the compute nodes dedicated to this queue. The ''%%--pty%%'' option allows the session to act like a standard terminal. ====== Job Scheduling ====== We use a [[http://slurm.schedmd.com/priority_multifactor.html|multifactor]] method of job scheduling. Job priority is assigned by a combination of fair-share, partition priority, and length of time a job has been sitting in the queue. The priority of the queue is the highest factor in the job priority calculation. For certain queues this will cause jobs on lower priority queues which overlap with that queue to be requeued. The second most important factor is fair-share score. You can find a description of how Slurm calculates Fair-share [[http://slurm.schedmd.com/priority_multifactor.html#fairshare|here]]. The third most important is how long you have been sitting in the queue. The longer your job sits in the queue the higher its priority grows. If everyone’s priority is equal then FIFO is the scheduling method. If you want to see what your current priority is just do ''%%sprio -j JOBID%%'' which will show you the calculation it does to figure out your job priority. If you do ''%%sshare -u USERNAME%%'' you can see your current fair-share and usage.((https://rc.fas.harvard.edu/resources/running-jobs)) We also have backfill turned on. This allows for jobs which are smaller to sneak in while a larger higher priority job is waiting for nodes to free up. If your job can run in the amount of time it takes for the other job to get all the nodes it needs, Slurm will schedule you to run during that period. **This means knowing how long your code will run for is very important and must be declared if you wish to leverage this feature. Otherwise the scheduler will just assume you will use the maximum allowed time for the partition when you run.**((https://rc.fas.harvard.edu/resources/running-jobs)) ====== Array Jobs ====== Instead of submitting multiple jobs to repeat the same process for different data (e.g. getting results for different datasets for a paper) you can use a ''%%job arrays%%''. #SBATCH start-finish[:step][%maximum concurrent] Examples: #SBATCH --array 0-15 0, 1, ..., 15 #SBATCH --array 1-3 0, 1, 2, 3 #SBATCH --array 1,3,4,6 1, 3, 4, 6 #SBATCH --array 1-8:2 1, 3, 5, 7 #SBATCH --array 1-10:3%2 1, 5, 9, but the only two of these will ever run concurrently. You can differentiate the various tasks using the variable ''%%SLURM_ARRAY_TASK_ID%%''. #!/bin/bash # #SBATCH --mail-user=cnetid@cs.uchicago.edu #SBATCH --mail-type=ALL #SBATCH --output=/home/cnetid/slurm/out/%j.%N.stdout #SBATCH --error=/home/cnetid/slurm/out/%j.%N.stderr #SBATCH --chdir=/home/cnetid/slurm #SBATCH --partition=debug #SBATCH --job-name=check_hostname_of_node #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --mem-per-cpu=500 #SBATCH --time=15:00 #SBATCH --array 1-4 input=("small_dataset" "medium_dataset" "large_dataset" "huge_dataset") ./process $input[$SLURM_ARRAY_TASK_ID] Additionally, tasks can be used to add job dependencies and other fancy features. For more information consult the [[https://slurm.schedmd.com/job_array.html|manual]] ====== Common Issues ====== ^Error ^What does it mean? ^ | JOB CANCELLED AT