About memory problem caused by attending, I forgot that I already included the line
self.backbone.features.clear()

at main model’s forward method.
By additional experiments, I found that it is difficult to conclude that the usage of hook causes valid delay, because; first experiments using hooks appear faster in many cases, and second time difference between two methods is very small in every case.
About memory, it will depend on the training conditions such as the model or dataset, but in my condition, ‘forward-method’ spends 156438 B on average and ‘hook-method’ spends 157681.5 B for whole 1 epoch training, so hook causes about 1KiB more memory.
Anyway, I appreciate you again and I’ll load the final code.
class FeatureExtractor(nn.Module):
    def __init__(self, model: nn.Module, hook_layers: List[str]):
        super(FeatureExtractor, self).__init__()
        self.model = model
        self.hook_layers = hook_layers

        for name, module in self.model.named_modules():
            if name in self.hook_layers:
                module.register_forward_hook(self.extract())

        self.features = []

    def extract(self):
        def _extract(module, f_in, f_out):
            self.features.append(f_out)

        return _extract

    def forward(self, input):
        self.features.clear()
        _ = self.model(input)

        return tuple(self.features)