.. _wwmgr:
WEST Work Manager
=================
Introduction
------------
WWMGR is the parallel task distribution framework originally included as part
of the WEMD source. It was extracted to permit independent development, and
(more importantly) independent testing. A number of different schemes can be
selected at run-time for distributing work across multiple cores/nodes, as
follows:
=========== =================================================== =========== =========== ===============================
Name Implementation Multi-Core Multi-Node Appropriate For
=========== =================================================== =========== =========== ===============================
serial None No No Testing, minimizing overhead
when dynamics is inexpensive
threads Python "threading" module Yes No Dynamics propagated by external
executables, large amounts of
data transferred per segment
processes Python "multiprocessing" module Yes No Dynamics propagated by Python
routines, modest amounts of
data transferred per segment
mpi `mpi4py `_ Yes Yes Distributing calculations
compiled and linked against system MPI across multiple nodes. Start
with this on your cluster of
choice.
zmq `ZeroMQ `_ Yes Yes Distributing calculations
and `PyZMQ `_ across multiple nodes. Use this
if MPI does not work properly
on your cluster (particularly
for spawning child processes).
=========== =================================================== =========== =========== ===============================
Environment variables
---------------------
For controlling task distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
While the original WEMD work managers were controlled by command-line options
and entries in wemd.cfg, the new work manager is controlled using command-line
options or environment variables (much like OpenMP). These variables are as
follow:
=========================== ======================= =================================== ===============================
Variable Applicable to Default Meaning
=========================== ======================= =================================== ===============================
WM_WORK_MANAGER (none) processes Use the given task distribution
system: "serial", "threads",
"processes", or "zmq"
WM_N_WORKERS threads, processes, zmq number of cores in machine Use this number of workers. In
the case of zmq, use this many
workers on the current machine
only (can be set independently
on different nodes).
WM_ZMQ_MODE zmq server Start as a server ("server") or
a client ("client"). Servers
coordinate a given calculation,
and clients execute tasks
related to that calculation.
WM_ZMQ_TASK_TIMEOUT zmq 60 Time (in seconds) after which a
worker will be considered hung,
terminated, and restarted. This
**must** be updated for
long-running dynamics segments.
Set to zero to disable hang
checks entirely.
WM_ZMQ_TASK_ENDPOINT zmq Random port Master distributes tasks at
this address
WM_ZMQ_RESULT_ENDPOINT zmq Random port Master receives task results at
this address |
WM_ZMQ_ANNOUNCE_ENDPOINT zmq Random port Master publishes announcements
(such as "shut down now") at
this address
WM_ZMQ_SERVER_INFO zmq ``zmq_server_info_PID_ID.json`` A file describing the above
(where PID is a process ID and endpoints can be found here (to
ID is a nearly random hex number) ease cluster-wide startup)
=========================== ======================= =================================== ===============================
For passing information to workers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
One environment variable is made available by multi-process work managers
(processes and ZMQ) to help clients configure themselves (e.g. select an
appropriate GPU on a multi-GPU node):
=============== =============== ===============================================
Variable Applicable to Meaning
=============== =============== ===============================================
WM_PROCESS_ID processes, zmq Contains an integer, 0 based, identifying the
process among the set of processes started on a
given node.
=============== =============== ===============================================
The ZeroMQ work manager for clusters
------------------------------------
The ZeroMQ ("zmq") work manager can be used for both single-machine and
cluster-wide communication. Communication occurs over sockets using the `ZeroMQ
`_ messaging protocol. Within nodes, `Unix sockets
`_ are used for efficient
communication, while between nodes, TCP sockets are used. This also minimizes
the number of open sockets on the master node.
The quick and dirty guide to using this on a cluster is as follows::
source env.sh
export WM_WORK_MANAGER=zmq
export WM_ZMQ_COMM_MODE=tcp
export WM_ZMQ_SERVER_INFO=$WEST_SIM_ROOT/wemd_server_info.json
w_run &
# manually run w_run on each client node, as appropriate for your batch system
# e.g. qrsh -inherit for Grid Engine, or maybe just simple SSH
for host in $(cat $TMPDIR/machines | sort | uniq); do
qrsh -inherit -V $host $PWD/node-ltc1.sh &
done