The recommended way of using Monitor is opening it with the `with` statement. In this case
        the user doesn't need to call this function explicitly. Otherwise, the function should be
        called before starting the optimiser.

        The function evaluates the global_step variable in order to get its initial value. It also
        resets the starting timer since the time set in the __init__ may no longer be accurate.

def start_monitoring(self) -> None:
        """
        The recommended way of using Monitor is opening it with the `with` statement. In this case
        the user doesn't need to call this function explicitly. Otherwise, the function should be
        called before starting the optimiser.

        The function evaluates the global_step variable in order to get its initial value. It also
        resets the starting timer since the time set in the __init__ may no longer be accurate.
        """
        self._context.init_global_step = self._context.global_step
        self._start_timestamp = get_hr_time()
        self._last_timestamp = self._start_timestamp