def _get_run_job_body(self): return tools.fill_template( self.RUN_JOB_BODY_TEMPLATE_FILE, task_order=" ".join(str(i) for i in self._get_task_order()), exp_path="../" + self.exp.name, python=tools.get_python_executable(), )
def _write_run_dispatcher(self): dispatcher_content = tools.fill_template( 'run-dispatcher.py', task_order=self._get_task_order()) self.exp.add_new_file('', 'run-dispatcher.py', dispatcher_content, permissions=0o755)
def _get_step_job_body(self, step): return tools.fill_template( self.STEP_JOB_BODY_TEMPLATE_FILE, cwd=os.getcwd(), python=tools.get_python_executable(), script=sys.argv[0], step_name=step.name)
def write_main_script(self): script = tools.fill_template( 'local-job.py', task_order=self._get_task_order(), processes=self.processes) self.exp.add_new_file('', self.EXP_RUN_SCRIPT, script, permissions=0o755)
def write_main_script(self): script = tools.fill_template( "local-job.py", task_order=self._get_task_order(len(self.exp.runs)), processes=self.processes, ) self.exp.add_new_file("", self.EXP_RUN_SCRIPT, script, permissions=0o755)
def _get_run_job_body(self, run_step): num_runs = len(self.exp.runs) num_tasks = self._get_num_tasks(run_step) logging.info(f"Grouping {num_runs} runs into {num_tasks} Slurm tasks.") return tools.fill_template( self.RUN_JOB_BODY_TEMPLATE_FILE, exp_path="../" + self.exp.name, num_runs=num_runs, python=tools.get_python_executable(), runs_per_task=self._get_num_runs_per_task(), task_order=" ".join(str(i) for i in self._get_task_order(num_tasks)), )
def _build_run_script(self): if not self.commands: logging.critical("Please add at least one command") exp_vars = self.experiment._env_vars run_vars = self._env_vars doubly_used_vars = set(exp_vars) & set(run_vars) if doubly_used_vars: logging.critical( f"Resource names cannot be shared between experiments " f"and runs, they must be unique: {doubly_used_vars}" ) env_vars = exp_vars env_vars.update(run_vars) env_vars = self._prepare_env_vars(env_vars) def make_call(name, cmd, kwargs): kwargs["name"] = name # Support running globally installed binaries. def format_arg(arg): if isinstance(arg, str): try: return repr(arg.format(**env_vars)) except KeyError as err: logging.critical(f"Resource {err} is undefined.") else: return repr(str(arg)) def format_key_value_pair(key, val): if isinstance(val, str): formatted_value = format_arg(val) else: formatted_value = repr(val) return f"{key}={formatted_value}" cmd_string = f"[{', '.join([format_arg(arg) for arg in cmd])}]" kwargs_string = ", ".join( format_key_value_pair(key, value) for key, value in sorted(kwargs.items()) ) parts = [cmd_string] if kwargs_string: parts.append(kwargs_string) return f"Call({', '.join(parts)}, **redirects).wait()\n" calls_text = "\n".join( make_call(name, cmd, kwargs) for name, (cmd, kwargs) in self.commands.items() ) run_script = tools.fill_template("run.py", calls=calls_text) self.add_new_file("", "run", run_script, permissions=0o755)
def _build_run_script(self): if not self.commands: logging.critical('Please add at least one command') exp_vars = self.experiment._env_vars run_vars = self._env_vars doubly_used_vars = set(exp_vars) & set(run_vars) if doubly_used_vars: logging.critical( 'Resource names cannot be shared between experiments ' 'and runs, they must be unique: {}'.format(doubly_used_vars)) env_vars = exp_vars env_vars.update(run_vars) env_vars = self._prepare_env_vars(env_vars) def make_call(name, cmd, kwargs): kwargs['name'] = name # Support running globally installed binaries. def format_arg(arg): if isinstance(arg, tools.string_type): try: return repr(arg.format(**env_vars)) except KeyError as err: logging.critical( 'Resource {} is undefined.'.format(err)) else: return repr(str(arg)) def format_key_value_pair(key, val): if isinstance(val, tools.string_type): formatted_value = format_arg(val) else: formatted_value = repr(val) return '{}={}'.format(key, formatted_value) cmd_string = '[{}]'.format(', '.join( [format_arg(arg) for arg in cmd])) kwargs_string = ', '.join( format_key_value_pair(key, value) for key, value in sorted(kwargs.items())) parts = [cmd_string] if kwargs_string: parts.append(kwargs_string) return ('Call({}, **redirects).wait()\n'.format(', '.join(parts))) calls_text = '\n'.join( make_call(name, cmd, kwargs) for name, (cmd, kwargs) in self.commands.items()) run_script = tools.fill_template('run.py', calls=calls_text) self.add_new_file('', 'run', run_script, permissions=0o755)
def _get_job_header(self, step, is_last): job_params = self._get_job_params(step, is_last) return tools.fill_template(self.JOB_HEADER_TEMPLATE_FILE, **job_params)
def _get_run_job_body(self): return tools.fill_template(self.RUN_JOB_BODY_TEMPLATE_FILE, task_order=' '.join( str(i) for i in self._get_task_order()), exp_path='../' + self.exp.name)