DemonSpawn is a tool for quickly firing off a large number of SLURM jobs.
This can be used
- as a benchmarking tool for kernels / micro-apps
- as a stress test doing parametrized runs of a single test
- sanity test: after a system upgrade, see if everything still works.
Copyright Victor Eijkhout 2020-2022
For questions and problems, please submit a github issue.
Example configuration file:
# slurm script parameters
system frontera
user eijkhout
account A-ccsc
modules intel/18.0.2 impi/18.0.2
# point-to-point benchmark setup
queue development
nodes 2
ppn 1
# program to run
suite name:paw-ptp type:mpi dir:/home/me/paw p2p_*
# collective benchmark setup
queue normal
nodes 4,8,12,16
ppn 1,5,10
# program to run
suite name:paw-col type:mpi dir:/home/me/paw coll_*
Demonspawn is a script that schedules SLURM job. Invocation:
python3 spawn.py [ options ] configurationfile
Option flags:
-h --help
: print help and quit.-d --debug
: lots of debug output.-f --filesonly
: generate all script files, but do not submit.-o --outputdir
+dir
: specify output directory; omitting this gives a standard output name that includes the current date.-r --regression
+dir
: only run the regression tests on output generated in a previous run.-c --compare
+dir
: compare regression results in current output directory, and one generated in a previous run.
The python script stays active until all submitted SLURM jobs have finished. This is strictly necessary only for handling regression tests after the jobs have finished, but the python script also handles proper closing of files. Thus it is a good idea to
nohup python3 spawn.py myconf.txt &
The configuration is specified split over the file on the commandline, and a .spawnrc
file, which can be used for common options, such as your username, and the slurm account to bill your runs to. The current directory is search first for the .spawnrc
file, and then the home directory. This makes it possible to have system dependent settings. Since configuration files and rc
files have the exact same syntax, we will not distinguish between them, and mostly discuss the configuration file.
The configuration, specified in the file given on the commandline, is completely macro based. A macro is defined in a key/value line
key value
otherkey value1 value2 value3
Macros keys are evaluated with a %[macro]
syntax, because why not have yet another sytax? Example:
key value
otherkey another-%[key]
This syntax can also be used to substitute environment variables, if the key is not explicitly defined.
Some keys have special meanings; see below.
The keyword suite
is special in that it only defines a benchmark suite, but also triggers its execution.
Thus, you can have multiple suites in one configuration file. Each is invoked with the current value of all macros, so you can redefine macros between suite invocations. See the example above, which uses different node and process counts for the point-to-point and collective tests.
Demonspawn generates output:
- A single log file for the full configuration will be created in the current directory. It is identifiable by having the current date in the name.
- An output directory is generated based on the required
outputdir
key. This will contain subdirectoriesscripts
andoutput
with the SLURM scripts and their standard out/err respectively. - If you do regression, the output directory will also contain a single regression file for each
suite
line.
Some macros have special meaning for your SLURM script:
-
system
is set to the current hostname. If you specify this macro, it is enforced that this run can only happen on that particular system. -
account
is used in your slurm script as the value of the-A
or--account
flag. -
modules
is the list of modules that is loaded at the beginning of your slurm script. The value of%[modules]
has all spaces stripped. Special case:modules restore foo
will cause the savesetfoo
to be restored. -
queue
is the value of the slurm-p
flag: the partition, or queue, name where the jobs of the next suite will be submitted. The demonspawn manager will make sure that queue limits are not violated. The queue name has optional limits on the number of simultaneous jobs:queue somequeue limit:2
Suggestion: specify queue limits in the
.spawnrc
file. The last specified queue will be used as the default, or you can explicitly choose a queue in the configuration file. -
time
is ahh:mm:ss
specification for the slurm-t
flag.
It is possible to add custom #SBATCH foo=bar
lines to a script. For this, put one or more lines
sbatch foo=bar
in the configuration. This the only option that is cumulative: these options are gathered up and used for each script. Thus they can not be reset between suite
lines.
For an MPI run you want to specify:
nodes
: node count for the testsuite, unless the suite itself overrides this. This is either a single number or a comma-separated list, for scalability studies.ppn
: number of processes-per-node. A single number or a comma-separated list.threads
: OpenMP thread count. Single number or comma-separated list. A negative value indicates a thread count such that the product of MPI processes and OpenMP threads equalsSLURM_CPUS_ON_NODE
. (A zero value means that no threading is used; this value is ignored.)
Some macros related to running the benchmark programs.
-
jobname
: this is by default "spawn
". It is used for the name of the logfile. You can only once define this in your configuration. The logfile, by the way, has as time stamp, in case you re-use the output directory. -
env
: this is used to specify environment variables. At the moment this is strictly additive: each suite is started with the sum total of specified options at that point. Example:env PETSC_OPTIONS -ksp_max_it 100 -ksp_monitor
You can have multiple test suites. A test suite is specified by the keyword:
suite
: this is followed by a list of key:value pairs, followed by a list of programs, which can use wildcards
Example:
suite name:paw-mpi-p2p type:mpi dir:%[pawdir] p2p_*
This line defines the suite with the current value of all macros.
If there is more than one suite in a configuration file, each suite is fully finished before the next one is started. This is convenient if the suite runs a shell script that does a custom recompilation. You can redefine macros for the next suite in the same configuration file.
The available keys are:
name
: for identification purposestype
: choice ofseq
ormpi
; MPI jobs are started with ibrundir
: location of the programs
After these pairs, the programs are specified with wildcards but no path.
It is required that you define this macro:
outputdir
is the directory in which subdirectoriesscripts
,output
,regression
are created.
In order to create a unique output directory, the following macros are useful:
pwd
is set to the current working directory where you are running python on the configuration filedate
is set to current date-time.mpi
is set toLMOD_FAMILY_COMPILER
.
For example:
outputdir %[pwd]/spawn-mycode-%[mpi]-%[date]
It is easy to run a regression on all output files of a suite by specifying the regression
key. You can specify what to regress on:
regression grep:Result
This will grep through each result file in the suite. You can also
regression line:last
with possible options first
, last
. Since a regression definition stays in effect for subsequent jobsuites, you can disable a previously specified regression with
regression none
Regression results are written to a single file
%[outputdir]/regression-%[suitename].txt
Additionally, each job regression goes into a separate file
%[outputdir]/regression/<jobname>.out
Note: the regression specification is part of the suite definition, so it needs to come before the suite
line.
Further options:
field:5
extract only the 5-th whitespace-separated field; this numbering is 1-basedlabel:abcd
put a label in front of the regression line. This can be a literal string, or a macro. If multiplelabel
options are given, they are all used, in the sequence specified, separated by a space character.
If you want to run a regression on already generated output, run the configuration again, but with the -r
or --regression
flag.
You can compare the regressions of two runs by using the -c old_output_dir
option. This will compare the files in the regression
subdirectory, leaving the results in a file regression_compare
.
Normally, regression comparison results in both values being written to the regression_compare
file. However, numerical comparison is enabled by having an option margin:10percent
in the regression
line.
- Currently the software requires python version 3.8 or higher.
- The
system
keyword only works at TACC - The
mpi
keyword depends on Lmod.
0.1 somewhere around 2021/12/01
: posted on reddit
0.2 2022/02/15
: adding module restore, regressiononly
option
0.3 logfile now goes into output dir, regression flag is now regression
0.4 regressions go into separate files, new flag for regression comparing