Source code for habitat.tracking.operation

from habitat.analysis import SPECIAL_OPERATIONS
from habitat.analysis.arguments import Arguments
from habitat.analysis.operation import MeasuredOperation
from habitat.analysis.trace import Trace
from habitat.profiling.operation import OperationProfiler
from habitat.tracking.base import TrackerBase
from habitat.tracking.callable import CallableTracker


[docs]class OperationTracker(TrackerBase): def __init__(self, device, metrics=None, metrics_threshold_ms=0): super().__init__() self._device = device self._callable_tracker = CallableTracker(self._hook_creator) self._profiler = OperationProfiler( device, metrics, metrics_threshold_ms, ) self._processing_hook = False self._operations = []
[docs] def start_tracking(self): super().start_tracking() self._callable_tracker.start_tracking()
[docs] def stop_tracking(self): super().stop_tracking() self._callable_tracker.stop_tracking()
[docs] def get_tracked_trace(self): return Trace(self._device, self._operations)
[docs] def _hook_creator(self, func): def hook(*args, **kwargs): # NOTE: We use self._processing_hook to handle cases where we have # hooks on nested function calls. if self._processing_hook: return func(*args, **kwargs) self._processing_hook = True try: # We only track the arguments if the operation is "special" # (i.e. we use special handling to scale it to a different # device). is_special_op = func.__name__ in SPECIAL_OPERATIONS arguments = ( Arguments.from_raw_arguments(args, kwargs) if is_special_op else None ) if (func.__name__ == 'lstm' and isinstance(arguments.args[4], bool)): # Special case - we need this information for the lstm # operation arguments.special['batch_sizes'] = args[1].tolist() forward, backward = self._profiler.measure_operation( func, args, kwargs, ) self._operations.append(MeasuredOperation( name=func.__name__, arguments=arguments, forward=forward, backward=backward, device=self._device, )) # Actually run the hooked function return func(*args, **kwargs) finally: self._processing_hook = False return hook