【文档学习】Pytorch——torch.autorgrad包
torch.autograd
提供了实现自动计算任意标量值函数的类别核函数,需要手动修改现有代码(需要重新定义需要计算梯度Tensor
,加上关键词requires_grad=True
)。本文更新于2019.06.12。
文章目录
- torch.autograd.backward
- torch.autograd.grad
- 局部梯度计算失效(Locally disabling gradient computation)
- In-place张量操作
- In-place正确性检查
- Variable(弃用)
- Tensor autograd functions
- Function
- Numerical gradient checking
- Profiler(分析工具)
- torch.autograd.profiler.profile
- torch.autograd.profiler.emit_vntx
- torch.autograd.profiler.load_nvprof
- Anomaly detection(异常检测)
torch.autograd.backward
torch.autograd.grad
局部梯度计算失效(Locally disabling gradient computation)
torch.autograd.no_grad
torch.autograd.enable_grad
torch.autograd.set_grad_enabled(mode)
In-place张量操作
在autograd中支持原位操作是很难的,PyTorch也不建议大家在大多数情况下使用这些操作。autograd的缓冲区冻结和再利用策略使其非常高效,因此极少数情况下才会为了减少内存使用而进行原位操作。除非任务内存消耗非常巨大,否则绝不要使用它们。
In-place正确性检查
所有张量都会跟踪发生在其上面的原位操作,如果检查到某个张量被保存下来用于某个函数的反向传播,但是后面它又被原位修改了,再反向传播开始的时候就会报错。这也确保了,如果你调用了原位函数而没有看见错误的情况下,所有梯度的计算应该都是正确的。
Variable(弃用)
Variable API已经被弃用了,即在调用tensor的autograd中,不再必需Variables。Autograd自动支持requires_grad
为真的张量。下面给出了具体的修改:
-
Variable(tensor)
和Variable(tensor, requires_grad
仍在使用,但是其返回Tensor而不是Variable。 -
var.data
与tensor.data
是同一个东西。 - 诸如
var.backward()
、var.detach()
、var.register_hook()
等操作现在都被移到张量上,方法名称相同。
此外,用户也可以利用创建requires_grad=True
的张量来调用factory methods, 比如torch.randn()
、torch.zeros()
、torch.ones
等,用法类似:autograd_tensor = torch.randn((2,3,4),requires_grad=True)
Tensor autograd functions
torch.Tesnor
backward
detach
detach_
grad
is_leaf
register_hook
requires_grad
retain_grad
Function
backward
forward
Numerical gradient checking
torch.autograd.gradcheck
torch.autograd.gradgradcheck
Profiler(分析工具)
autograd包含了一个分析器,可以观察模型中不同操作子的损失(CPU和GPU上的)。目前有两种实现模式:只支持CPU的profile
和基于nvprof的(CPU和GPU上都注册了)emit_nvtx
。
torch.autograd.profiler.profile
export_chrome_trace
key_averages
self_cpu_times_total
table
total_average
torch.autograd.profiler.emit_vntx
前向-反向相关
在查看用Nividia Visual Profiler中的emit_nvtx
创建的profile时,将反向传播操作和左营的前向传播操作联系起来有时是很困难的。为了使这个任务更容易,emit_nvtx
通过级联数字信息来排序其生成物。
在正向传播过程中,每个函数范围用seq=<N>
装饰,每增加一个反向函数目标就给反向传播存储一个。因此,seq-<N>
标注关系每个前向传播的函数范围,从而告诉用户一个反向传播的目标是否是由前向传播函数创建的。反向传播目标接收个数为N的序列。在反向传播过程中,top-level…
双反向
torch.autograd.profiler.load_nvprof
Anomaly detection(异常检测)
torch.autograd.detect_anomaly
torch.autograd.set_detect_anomaly
更多内容,欢迎加入星球讨论。