snakemake/profiles/slurm-moz/submit.py (54 lines of code) (raw):

#!/usr/bin/env python3 import os import re import subprocess as sp import sys import yaml from snakemake.logging import logger from snakemake.utils import read_job_properties cluster_config_file = os.path.join(os.path.dirname(__file__), "config.cluster.yaml") cluster_config = yaml.load(open(cluster_config_file), Loader=yaml.FullLoader) jobscript = sys.argv[-1] job_properties = read_job_properties(jobscript) options = [] if job_properties["type"] == "single": name = job_properties["rule"] elif job_properties["type"] == "group": name = job_properties["groupid"] else: raise NotImplementedError( f"Don't know what to do with job_properties['type']=={job_properties['type']}" ) options += ["--job-name", name] partition = cluster_config["cpu-partition"] account = cluster_config["cpu-account"] if "resources" in job_properties: resources = job_properties["resources"] if "gpu" in resources and int(resources["gpu"]) >= 1: num_gpu = str(resources["gpu"]) options += [f"--gres=gpu:{num_gpu}"] account = cluster_config["gpu-account"] if num_gpu == "1": partition = cluster_config["single-gpu-partition"] else: partition = cluster_config["multi-gpu-partition"] # we don't need explicit memory limiting for now # if 'mem_mb' in resources: # memory = str(resources['mem_mb']) # options += [f'--mem={memory}'] cuda_dir = os.getenv("CUDA_DIR") if cuda_dir: options += ["--export", f'ALL,SINGULARITY_BIND="{cuda_dir}"'] options += ["-p", partition] options += ["-A", account] options += ["--nodes=1"] options += ["-t", str(cluster_config["time-limit"])] if "threads" in job_properties: options += ["--cpus-per-task", str(job_properties["threads"])] try: cmd = ["sbatch"] + ["--parsable"] + options + [jobscript] logger.info(f"Running command: {cmd}") res = sp.check_output(cmd) except sp.CalledProcessError as e: raise e # Get jobid res = res.decode() try: jobid = re.search(r"(\d+)", res).group(1) except Exception as e: raise e print(jobid)