| from collections.abc import Iterable | |
| import torch.nn as nn | |
| from torch.utils.checkpoint import checkpoint, checkpoint_sequential | |
| def set_grad_checkpoint(model, use_fp32_attention=False, gc_step=1): | |
| assert isinstance(model, nn.Module) | |
| def set_attr(module): | |
| module.grad_checkpointing = True | |
| module.fp32_attention = use_fp32_attention | |
| module.grad_checkpointing_step = gc_step | |
| model.apply(set_attr) | |
| def auto_grad_checkpoint(module, *args, **kwargs): | |
| if getattr(module, "grad_checkpointing", False): | |
| if not isinstance(module, Iterable): | |
| return checkpoint(module, *args, **kwargs) | |
| gc_step = module[0].grad_checkpointing_step | |
| return checkpoint_sequential(module, gc_step, *args, **kwargs) | |
| return module(*args, **kwargs) | |