幸运的是,这两种设计的复杂性都包装在一个简单易用的 API 中 - 要使用的新实现是通过 use_reentrant 标志指定的,其中使用False(即新实现)将在将来的版本中成为默认值: fromtorch.utils.checkpointimportcheckpointcheckpoint(run_function,args,use_reentrant=False) 总结 本文介绍了 PyTorch 中的激活检查点技术,旨在...
激活检查点是一种减小内存占用的技巧,以牺牲部分计算资源为代价。这种方法通过仅在需要时重新计算反向传播所需的中间张量,从而避免保存这些张量。PyTorch中包含两种激活检查点实现,即可重新进入和不可重新进入版本。不可重新进入版本在解决可重新进入检查点的限制方面更为先进,可通过use_reentrant标志指定使用...
🐛 Describe the bug Hi! So this is quite straight-forward. import torch from torch.utils.checkpoint import checkpoint with torch.device('meta'): m = torch.nn.Linear(20, 30) x = torch.randn(1, 20) out = checkpoint(m, x, use_reentrant=False...
or try to use _set_static_graph() as a workaround if this module graph does not change during training loop.2) Reused parameters in multiple reentrant backward passes. For example, if you use multiple `checkpoint` functions to wrap the same part of your model, it would result in the sam...
create_selective_checkpoint_contexts, [ torch.ops.aten.sin_.default, torch.ops.aten.view.default, ], ) out=checkpoint(fn,x,y,use_reentrant=False,context_fn=context_fn) out[1].sum().backward() @skipIfTorchDynamo("compile tested in test/dynamo/test_activation_checkpointing.py") ...
这可以避免存储模型特定层中间运算结果,从而有效降低了前向传播中显存的占用。这些中间结果会在反向传播的时候被即时重新计算一次。要注意,被 checkpoint 包裹的层反向传播时仍然会在第一次反向传播的时候开辟存储梯度的空间。 因为checkpoint 是在torch.no_grad()模式下计算的目标操作的前向函数,这并不会修改原本的叶...
mutex non_reentrant_device_thread_mutex_;// stop() must be called before the destruction path goes down to the base// class, in order to avoid a data-race-on-vptr. Use this boolean to guard// whether stop() has already been called, so we can call this in every// destructor of ...
该技术的核心是一种使用时间换空间的策略。在现有的许多方法中被大量使用,例如 DenseNet、Swin Transformer 源码中都可以看到它的身影。
Reused parameters in multiple reentrant backward passes. For example, if you use multiplecheckpointfunctions to wrap the same part of your model, it would result in the same set of parameters been used by different reentrant backward passes multiple times, and hence marking a variable ready multipl...
代码中使用了PyMethodDef,该函数是用于描述扩展方法的struct。可以看到,除了我们要找的函数run_backward,此处还定义了函数queue_callback和函数is_checkpoint_valid。 [5] THPEngine_run_backward 关于函数THPEngine_run_backward的介绍是Implementation of torch._C._EngineBase.run_backward,而torch._C._Engine...