def run(self, **inputs): """Execute this interface. This interface will not raise an exception if runtime.returncode is non-zero. Parameters ---------- inputs : allows the interface settings to be updated Returns ------- results : an InterfaceResult object containing a copy of the instance that was executed, provenance information and, if successful, results """ from ...utils.profiler import ResourceMonitor enable_rm = config.resource_monitor and self.resource_monitor force_raise = not getattr(self.inputs, 'ignore_exception', False) self.inputs.trait_set(**inputs) self._check_mandatory_inputs() self._check_version_requirements(self.inputs) interface = self.__class__ self._duecredit_cite() # initialize provenance tracking store_provenance = str2bool( config.get('execution', 'write_provenance', 'false')) env = deepcopy(dict(os.environ)) if self._redirect_x: env['DISPLAY'] = config.get_display() runtime = Bunch(cwd=os.getcwd(), returncode=None, duration=None, environ=env, startTime=dt.isoformat(dt.utcnow()), endTime=None, platform=platform.platform(), hostname=platform.node(), version=self.version) mon_sp = None if enable_rm: mon_freq = float( config.get('execution', 'resource_monitor_frequency', 1)) proc_pid = os.getpid() iflogger.debug( 'Creating a ResourceMonitor on a %s interface, PID=%d.', self.__class__.__name__, proc_pid) mon_sp = ResourceMonitor(proc_pid, freq=mon_freq) mon_sp.start() # Grab inputs now, as they should not change during execution inputs = self.inputs.get_traitsfree() outputs = None try: runtime = self._run_interface(runtime) outputs = self.aggregate_outputs(runtime) except Exception as e: import traceback # Retrieve the maximum info fast runtime.traceback = traceback.format_exc() # Gather up the exception arguments and append nipype info. exc_args = e.args if getattr(e, 'args') else tuple() exc_args += ( 'An exception of type %s occurred while running interface %s.' % (type(e).__name__, self.__class__.__name__), ) if config.get('logging', 'interface_level', 'info').lower() == 'debug': exc_args += ('Inputs: %s' % str(self.inputs), ) runtime.traceback_args = ('\n'.join( ['%s' % arg for arg in exc_args]), ) if force_raise: raise finally: # This needs to be done always runtime.endTime = dt.isoformat(dt.utcnow()) timediff = parseutc(runtime.endTime) - parseutc(runtime.startTime) runtime.duration = (timediff.days * 86400 + timediff.seconds + timediff.microseconds / 1e6) results = InterfaceResult(interface, runtime, inputs=inputs, outputs=outputs, provenance=None) # Add provenance (if required) if store_provenance: # Provenance will only throw a warning if something went wrong results.provenance = write_provenance(results) # Make sure runtime profiler is shut down if enable_rm: import numpy as np mon_sp.stop() runtime.mem_peak_gb = None runtime.cpu_percent = None # Read .prof file in and set runtime values vals = np.loadtxt(mon_sp.fname, delimiter=',') if vals.size: vals = np.atleast_2d(vals) runtime.mem_peak_gb = vals[:, 1].max() / 1024 runtime.cpu_percent = vals[:, 2].max() runtime.prof_dict = { 'time': vals[:, 0].tolist(), 'cpus': vals[:, 1].tolist(), 'rss_GiB': (vals[:, 2] / 1024).tolist(), 'vms_GiB': (vals[:, 3] / 1024).tolist(), } return results
def run(self, cwd=None, **inputs): """Execute this interface. This interface will not raise an exception if runtime.returncode is non-zero. Parameters ---------- cwd : specify a folder where the interface should be run inputs : allows the interface settings to be updated Returns ------- results : an InterfaceResult object containing a copy of the instance that was executed, provenance information and, if successful, results """ from ...utils.profiler import ResourceMonitor # Tear-up: get current and prev directories syscwd = rgetcwd(error=False) # Recover when wd does not exist if cwd is None: cwd = syscwd os.chdir(cwd) # Change to the interface wd enable_rm = config.resource_monitor and self.resource_monitor self.inputs.trait_set(**inputs) self._check_mandatory_inputs() self._check_version_requirements(self.inputs) interface = self.__class__ self._duecredit_cite() # initialize provenance tracking store_provenance = str2bool( config.get('execution', 'write_provenance', 'false')) env = deepcopy(dict(os.environ)) if self._redirect_x: env['DISPLAY'] = config.get_display() runtime = Bunch( cwd=cwd, prevcwd=syscwd, returncode=None, duration=None, environ=env, startTime=dt.isoformat(dt.utcnow()), endTime=None, platform=platform.platform(), hostname=platform.node(), version=self.version) mon_sp = None if enable_rm: mon_freq = float( config.get('execution', 'resource_monitor_frequency', 1)) proc_pid = os.getpid() iflogger.debug( 'Creating a ResourceMonitor on a %s interface, PID=%d.', self.__class__.__name__, proc_pid) mon_sp = ResourceMonitor(proc_pid, freq=mon_freq) mon_sp.start() # Grab inputs now, as they should not change during execution inputs = self.inputs.get_traitsfree() outputs = None try: runtime = self._run_interface(runtime) outputs = self.aggregate_outputs(runtime) except Exception as e: import traceback # Retrieve the maximum info fast runtime.traceback = traceback.format_exc() # Gather up the exception arguments and append nipype info. exc_args = e.args if getattr(e, 'args') else tuple() exc_args += ( 'An exception of type %s occurred while running interface %s.' % (type(e).__name__, self.__class__.__name__), ) if config.get('logging', 'interface_level', 'info').lower() == 'debug': exc_args += ('Inputs: %s' % str(self.inputs), ) runtime.traceback_args = ('\n'.join( ['%s' % arg for arg in exc_args]), ) if not self.ignore_exception: raise finally: # This needs to be done always runtime.endTime = dt.isoformat(dt.utcnow()) timediff = parseutc(runtime.endTime) - parseutc(runtime.startTime) runtime.duration = (timediff.days * 86400 + timediff.seconds + timediff.microseconds / 1e6) results = InterfaceResult( interface, runtime, inputs=inputs, outputs=outputs, provenance=None) # Add provenance (if required) if store_provenance: # Provenance will only throw a warning if something went wrong results.provenance = write_provenance(results) # Make sure runtime profiler is shut down if enable_rm: import numpy as np mon_sp.stop() runtime.mem_peak_gb = None runtime.cpu_percent = None # Read .prof file in and set runtime values vals = np.loadtxt(mon_sp.fname, delimiter=',') if vals.size: vals = np.atleast_2d(vals) runtime.mem_peak_gb = vals[:, 1].max() / 1024 runtime.cpu_percent = vals[:, 2].max() runtime.prof_dict = { 'time': vals[:, 0].tolist(), 'cpus': vals[:, 1].tolist(), 'rss_GiB': (vals[:, 2] / 1024).tolist(), 'vms_GiB': (vals[:, 3] / 1024).tolist(), } os.chdir(syscwd) return results
def run(self, cwd=None, ignore_exception=None, **inputs): """Execute this interface. This interface will not raise an exception if runtime.returncode is non-zero. Parameters ---------- cwd : specify a folder where the interface should be run inputs : allows the interface settings to be updated Returns ------- results : :obj:`nipype.interfaces.base.support.InterfaceResult` A copy of the instance that was executed, provenance information and, if successful, results """ from ...utils.profiler import ResourceMonitor # if ignore_exception is not provided, taking self.ignore_exception if ignore_exception is None: ignore_exception = self.ignore_exception # Tear-up: get current and prev directories syscwd = rgetcwd(error=False) # Recover when wd does not exist if cwd is None: cwd = syscwd os.chdir(cwd) # Change to the interface wd enable_rm = config.resource_monitor and self.resource_monitor self.inputs.trait_set(**inputs) self._check_mandatory_inputs() self._check_version_requirements(self.inputs) interface = self.__class__ self._duecredit_cite() # initialize provenance tracking store_provenance = str2bool( config.get("execution", "write_provenance", "false")) env = deepcopy(dict(os.environ)) if self._redirect_x: env["DISPLAY"] = config.get_display() runtime = Bunch( cwd=cwd, prevcwd=syscwd, returncode=None, duration=None, environ=env, startTime=dt.isoformat(dt.utcnow()), endTime=None, platform=platform.platform(), hostname=platform.node(), version=self.version, ) runtime_attrs = set(runtime.dictcopy()) mon_sp = None if enable_rm: mon_freq = float( config.get("execution", "resource_monitor_frequency", 1)) proc_pid = os.getpid() iflogger.debug( "Creating a ResourceMonitor on a %s interface, PID=%d.", self.__class__.__name__, proc_pid, ) mon_sp = ResourceMonitor(proc_pid, freq=mon_freq) mon_sp.start() # Grab inputs now, as they should not change during execution inputs = self.inputs.get_traitsfree() outputs = None try: runtime = self._pre_run_hook(runtime) runtime = self._run_interface(runtime) runtime = self._post_run_hook(runtime) outputs = self.aggregate_outputs(runtime) except Exception as e: import traceback # Retrieve the maximum info fast runtime.traceback = traceback.format_exc() # Gather up the exception arguments and append nipype info. exc_args = e.args if getattr(e, "args") else tuple() exc_args += ( "An exception of type %s occurred while running interface %s." % (type(e).__name__, self.__class__.__name__), ) if config.get("logging", "interface_level", "info").lower() == "debug": exc_args += ("Inputs: %s" % str(self.inputs), ) runtime.traceback_args = ("\n".join( ["%s" % arg for arg in exc_args]), ) if not ignore_exception: raise finally: if runtime is None or runtime_attrs - set(runtime.dictcopy()): raise RuntimeError("{} interface failed to return valid " "runtime object".format( interface.__class__.__name__)) # This needs to be done always runtime.endTime = dt.isoformat(dt.utcnow()) timediff = parseutc(runtime.endTime) - parseutc(runtime.startTime) runtime.duration = (timediff.days * 86400 + timediff.seconds + timediff.microseconds / 1e6) results = InterfaceResult(interface, runtime, inputs=inputs, outputs=outputs, provenance=None) # Add provenance (if required) if store_provenance: # Provenance will only throw a warning if something went wrong results.provenance = write_provenance(results) # Make sure runtime profiler is shut down if enable_rm: import numpy as np mon_sp.stop() runtime.mem_peak_gb = None runtime.cpu_percent = None # Read .prof file in and set runtime values vals = np.loadtxt(mon_sp.fname, delimiter=",") if vals.size: vals = np.atleast_2d(vals) runtime.mem_peak_gb = vals[:, 2].max() / 1024 runtime.cpu_percent = vals[:, 1].max() runtime.prof_dict = { "time": vals[:, 0].tolist(), "cpus": vals[:, 1].tolist(), "rss_GiB": (vals[:, 2] / 1024).tolist(), "vms_GiB": (vals[:, 3] / 1024).tolist(), } os.chdir(syscwd) return results