def METHOD_NAME(self, target, args, kwargs):
    # args[0] is the `self` object for this method call
    self_obj, *args_tail = args
    # Execute the method and return the result
    # test if is call_module
    assert isinstance(target, str)
    args, kwargs = move_args_kwargs_to_device(args, kwargs, self._device)
    with torch.no_grad():
        res = getattr(self_obj, target)(*args_tail, **kwargs)
    args, kwargs = move_args_kwargs_to_device(args, kwargs, "cpu")
    orig_res = res
    res, _ = move_args_kwargs_to_device(res, {}, "cpu")
    del orig_res
    del args
    del kwargs
    gc.collect()
    torch.cuda.empty_cache()
    return res