modular-jobs.rst 8.98 KB
Newer Older
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
.. include:: system.rst

.. _het_modular_jobs:

Heterogeneous and Cross-Module Jobs
===================================

.. _het_modular_jobs_overview:

Overview
--------

.. _het_modular_jobs_slurm:

Slurm Support for Heterogeneous Jobs
------------------------------------
For detailed information about Slurm, please take a look on the :ref:`Quick Introduction <quickintro>` and :ref:`Batch system <batchsystem>` page.

19
With Slurm 17.11 support for Heterogeneous Jobs was introduced. This allows to spawn a job across multiple partitions of a cluster, and across different Modules of our Supercomputers. See the official Slurm documentation (SlurmHetJob_) for additional information on this feature.
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

.. _SlurmHetJob: https://slurm.schedmd.com/heterogeneous_jobs.html

**salloc/srun**

.. code-block:: none

  salloc -A <budget account> -p <batch, ...> : -p <booster, ...> [ : -p <booster, ...> ]
  srun ./prog1 : ./prog2 [ : ./progN ]

**sbatch**

.. code-block:: none

  #!/bin/bash
35
  #SBATCH -A <budget account>
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
  #SBATCH -p <batch, ...>
  #SBATCH packjob
  #SBATCH -p <booster, ...>

  srun ./prog1 : ./prog2


.. _het_modular_jobs_software:

Loading Software in a Heterogeneous Environment
-----------------------------------------------
Executing applications in a modular environment, especially when different Modules have different architectures or the dependencies of programs are not uniform, can be a challenging tasks.

**Uniform Architecture and Dependencies**

  As long as the Architecture of the given modules are uniform and there are not mutually exclusive dependencies for the binaries that are going to be executed, one can rely on the ``module`` command. Take a look on the :ref:`Quick Introduction <quickintro>` if ``module`` is new for you.

  .. code-block:: none

     #!/bin/bash -x
     #SBATCH ...
     module load [...]
     srun ./prog1 : ./prog2

**Non Uniform Architectures and Mutual Exclusive Dependencies**

  A tool called ``xenv`` was implement to ease the task of loading modules for heterogeneous jobs. For details on supported command line arguments, execute ``xenv -h`` on the given system.

  .. code-block:: none

      srun --account=<budget account> --partition=<batch, ...> xenv -L intel-para IMB-1 : --partition=<knl, ...> xenv -L Architecture/KNL intel-para IMB-1

.. ifconfig:: system_name == 'jureca'

.. _het_modular_jobs_mpi_bridges:

MPI Traffic Across Modules
--------------------------
When the nodes of a job belong to different interconnects and MPI communication is used, bridging has to take place. To support this workflow, e.g. run a job on a Cluster with Infiniband and a Booster with OmniPath, a Gateway Daemon (psgwd, ParaStation Gateway Daemon) was implemented that takes care of moving packages across fabrics.

76
To request gateway nodes for a job, the mandatory option ``gw_num`` has to be specified at submit/allocation time. In addition, communication with the psgwd has to be ensured via loading the software module **pscom-gateway** either via ``xenv`` or the ``module`` command.
77 78

There are in total 198 Gateways available.
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
79

80
To start an interactive pack job using two gateway nodes the following command must be used:
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
81

82
.. code-block:: none
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
83

84
  srun -A <budget account> -p <batch, ...> --gw_num=2 xenv -L pscom-gateway msa_fix_ld ./prog1 : -p <booster, ...> xenv -L pscom-gateway msa_fix_ld ./prog2
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
85

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
86 87 88 89
When submitting a job that will run later, you have to specify the number of gateways at submit time:

.. code-block:: none

90 91 92 93
  sbatch --gw_num=2 ./submit-script.sbatch

.. code-block:: none

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
94
  #!/bin/bash
95 96 97 98 99 100
  #SBATCH -A <budget account>
  #SBATCH -p <batch, ...>
  #SBATCH packjob
  #SBATCH -p <booster, ...>

  srun xenv -L pscom-gateway msa_fix_ld ./prog1 : xenv -L pscom-gateway msa_fix_ld ./prog2
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
101

102 103 104 105 106 107 108 109 110 111 112 113 114
Current MPI Workaround (April 2019)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For the time being, prefixing binaries via ``msa_fix_ld`` is necessary. This is due to the fact that the installed libmpi version does not support the psgwd. We hope this will go away soon.
``msa_fix_ld`` is modifying the environment, so it might influence the modules you load.

.. code-block:: none

  #!/bin/bash
  export PSP_PSM=1
  export LD_LIBRARY_PATH="/usr/local/jsc/msa_parastation_mpi/lib:/usr/local/jsc/msa_parastation_mpi/lib/mpi-hpl-gcc/:${LD_LIBRARY_PATH}"
  $*

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
115 116
PSGWD
~~~~~
117 118 119 120

PSGWD Slurm Extension
+++++++++++++++++++++

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
121 122 123 124
The psgw plugin for the ParaStation management daemon extends the Slurm commands salloc, srun and sbatch with the following options:

.. code-block:: none

125
  --gw_num=number Number of gateway nodes
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
126 127 128
  --gw_file=path Path to the gateway routing file
  --gw_plugin=string Name of the route plugin

129 130
A routing file will be generated in $HOME/psgw-route-$JOBID. The routing file is automatically removed when the allocation is revoked.

131 132 133 134 135 136 137
PSGWD Routing
+++++++++++++

The routing of MPI traffic across the Gateway nodes is performed by the ParaStation Gateway daemon on a per-node-pair basis.
When a certain number of gateway nodes is requested, an instance of psgwd is launched on each gateway.
By default, given the list of Cluster and Booster nodes obtained at allocation time, the system assigns each one of the Cluster node - Booster node pair to one of the instances of psgwd previously launched.
This mapping between Cluster and Booster nodes is saved into the routing file and used for the routing of the MPI traffic across the gateway nodes.
138

139
With the option ``gw_file`` an absolute path to a user-defined routing file can be specified:
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
140 141 142

.. code-block:: none

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
143
  srun --gw_file=$HOME/custom-route-file --gw_num=2 -N 1 hostname : -N 2 hostname
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
144

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
145 146

**Currently not available, will be available again with the next update:**
147 148
Since creating a routing file requires knowledge of the list of nodes prior to their allocation, it is more convenient to modify the logic with which the node pairs are assigned to the gateway daemons. 
This can be done via the ``gw_plugin`` option: 
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
149 150 151

.. code-block:: none

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
152
  srun --gw_plugin=$HOME/custom-route-plugin --gw_num=2 -N 1 hostname : -N 2 hostname
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
  
The ``gw_plugin`` option accepts either a label for a plugin already installed on the system, either a path to a user-defined plugin.

Currently two plugins are available on the JURECA system:
* ``plugin01`` is the default plugin (used when the ``gw_file`` is not used).
* ``plugin02`` is better suited for applications that use point-to-point communication between the same pairs of processes between Cluster and Booster, especially when the number of gateway nodes used is low..

The plugin file must include the functions associating a gateway node to a cluster node - booster node pair. 
As an example, the code for ``plugin01`` is reported here:

.. code-block:: python

  # Route function: Given the numerical Ids of nodes in partition A and B, the function
  # returns a tuple (error, numeral of gateway)
  def routeConnectionS(sizePartA, sizePartB, numGwd, numeralNodeA, numeralNodeB):
  numeralGw = (numeralNodeA + numeralNodeB) % numGwd

  return None, numeralGw

  # Route function (extended interface): Make decision based on names of nodes to 
  # take topology into account
  # def routeConnectionX(nodeListPartA, nodeListPartB, gwList, nodeA, nodeB):
  #       return Exception("Not implemented"), gwList[0]
  routeConnectionX = None


In the case of 2 Cluster nodes, 2 Booster nodes and 2 Gateway nodes, this function results in the following mapping:

Cluster node | Booster node | Gateway node
             |              |             
           0 |            0 |            0
           1 |            0 |            1
           0 |            1 |            1
           1 |            1 |            0



Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
190

Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
191

192 193 194 195
PSGWD Gateway Assignment
++++++++++++++++++++++++

If more gateways were requested than available the slurmctld prologue will fail for a interactive jobs
Benedikt von St. Vieth's avatar
Benedikt von St. Vieth committed
196 197 198 199 200 201 202 203 204 205 206

.. code-block:: none

  srun --gw_num=3 -N 1 hostname : -N 2 hostname
  srun: psgw: requesting 3 gateway nodes
  srun: job 158553 queued and waiting for resources
  srun: job 158553 has been allocated resources
  srun: PrologSlurmctld failed, job killed
  srun: Force Terminated job 158553
  srun: error: Job allocation 158553 has been revoked

207
If batch jobs run out of gateway resources they will be re-queued and have to wait for 10 minutes before becoming eligible to start again.
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223

Debugging
~~~~~~~~~

For debugging purposes, and to make sure the gateways are used, you might use

.. code-block:: none

  export PSP_DEBUG=3

You should see output like

.. code-block:: none

  <PSP:r0000003:CONNECT (192.168.12.34,26708,0x2,r0000003) to (192.168.12.41,29538,0x2,r0000004) via gw>
  <PSP:r0000004:ACCEPT  (192.168.12.34,26708,0x2,r0000003) to (192.168.12.41,29538,0x2,r0000004) via gw>
224 225 226 227 228 229 230 231 232 233 234

JuRoPA3
~~~~~~~
Because JUROPA3 has only one high-speed interconnect, using the ``psgwd`` is only possible using ``PSP_GATEWAY=2``. Via exporting this variable the Gateway protocols priority is boosted over the default interconnect.

.. code-block:: none

  export PSP_GATEWAY=2
  srun -A <budget account> -p <cluster, ...> --gw_num=2 xenv -L pscom-gateway ./prog1 : -p <booster, ...> xenv -L pscom-gateway ./prog2

JuRoPA3 has 4 Gateways available.