import ipyparallel as ipp
cluster = ipp.Cluster(engine_launcher_class="slurm", controller_ip="0.0.0.0", profile_dir="/data/profile")
cluster.config.SlurmEngineSetLauncher.batch_template = """\
#!/bin/sh
#SBATCH --ntasks={n}
#SBATCH --export=ALL
#SBATCH --job-name=ipengine-{cluster_id}
#SBATCH --mem=1gb
#SBATCH --time=00:05:00
#SBATCH --ntasks-per-node=1
env | sort
srun {program_and_args}
"""
cluster.start_cluster_sync(n=2)
rc = cluster.connect_client_sync()
rc.wait_for_engines(2)
Using existing profile dir: '/data/profile' Starting 2 engines with <class 'ipyparallel.cluster.launcher.SlurmEngineSetLauncher'> Job submitted with job id: '14' 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:08<00:00, 4.36s/engine]
!squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 14 normal ipengine root R 0:06 2 c[1-2]
import socket
rc[:].apply_async(socket.gethostname).get_dict()
{0: 'c1', 1: 'c2'}
The rendered template:
!cat slurm_engine.sbatch
#!/bin/sh #SBATCH --ntasks=2 #SBATCH --export=ALL #SBATCH --job-name=ipengine-1634581693-wslm #SBATCH --mem=1gb #SBATCH --time=00:05:00 #SBATCH --ntasks-per-node=1 env | sort srun /usr/bin/python3 -m ipyparallel.engine