首先,我应该提一下我的火炬版0.3.1,但我很乐意在必要时进行升级。
我还在学习,所以如果我在这里误解了什么,请告诉我。
我正在使用变量强制构建几个图形。随着时间的推移,数学表达式可能会非常复杂,图表的某些部分可能会使用自动编程的梯度函数生成,然后可以对其进行操作。
我可以创造我想要的任何表达。唯一的问题是构建此图可能非常“慢” - 对于相对简单的操作(4x4矩阵相乘),可能需要几毫秒。
一旦生成了这些图形,我希望我能够更新某些变量的值,并且更快地评估图形(或任何节点)的输出。我认为这可能就是这种情况,因为评估应该能够在C后端完全发生,这对于速度来说应该是相当不合理的?换句话说,在python中构建图形可能会很慢,因为它涉及python for循环等,但重新评估具有静态拓扑的图形应该很快。
这种直觉是否正确?如果是这样,我如何有效地重新分配值并重新评估图表?
答案 0 :(得分:0)
如果您正在讨论更新输入变量的值,并且您只想评估图表的前进而不打算调用.backward()
,则可以在输入volatile=True
上使用Variable
1}}(s)在Pytorch 0.3。
此功能在0.4中被删除,有利于上下文管理器with torch.no_grad():
。
这通常在推理时完成。如果这样做,将不会创建图表,从而消除了开销。
来自Pytorch 0.3 docs:
当您确定不会调用.backward()时,建议使用Volatile进行纯推理模式。它比任何其他autograd设置更有效 - 它将使用绝对最小的内存量来评估模型。 volatile也确定requires_grad为False。
和
挥发性与requires_grad的不同之处在于标志的传播方式。如果操作中甚至存在单个易失性输入,则其输出也将是易失性的。波动率在图表上的传播比不需要的梯度更容易 - 您只需要一个易失性叶片来获得易失性输出,而您需要所有叶子不需要渐变来获得不需要渐变的输出。使用volatile标志,您无需更改模型参数的任何设置即可将其用于推理。它足以创建一个易失性输入,这将确保不保存任何中间状态。
因此,如果您使用Pytorch 0.3并希望进行有效的推理,则可以在输入中使用volatile=True
。
在Pytorch 0.4中引入了上下文管理器。来自The Pytorch migration guide between 0.3 and 0.4:
volatile标志现已弃用,无效。以前,任何涉及使用volatile = True的变量的计算都不会被autograd跟踪。现在已经被一组更灵活的上下文管理器所取代,包括torch.no_grad(),torch.set_grad_enabled(grad_mode)等。
所以当你说:“然后,如果有办法将该图形的所有变量都转换为非易失性,我可以执行推理。”,将输入设置为{{1或者使用volatile
就可以做到这一点。
关于使用no_grad
的示例,请查看this script中的torch.no_grad()
函数。
我不知道有任何方法可以避免在Pytorch的训练模式中每次迭代时创建图形。动态图表需要付出代价。如果你想要这个,可以将你的模型转换为Tensorflow / Caffe2 /任何支持静态图形的库,即使根据我的经验,它们也不一定会更快。