这些天,我已经做了很多调整以解决此问题。
最后,我还没有解决问题中描述的内存大小之谜。我想在计算梯度时,tensoflow会积累大量用于计算梯度的额外内存。我需要检查这个时候看起来很麻烦的张量流的来源。您可以通过以下命令从终端检查模型使用了多少内存,
nvidia-smi
从此命令判断,您可以猜测可以使用多少额外的内存。
但是解决这类问题的方法在于减小批量大小,
就我而言,将批处理的大小减少到3个作品。这可能因模型而异。
但是,如果您使用的模型中的嵌入矩阵大得多而无法将其加载到内存中,该怎么办?
解决方案是编写一些痛苦的代码。
您必须查找嵌入矩阵,然后将嵌入加载到模型。简而言之,对于每一批,您都必须将查找矩阵提供给模型(通过中的feed_dict参数提供它们
sess.run())。
接下来,您将面临一个新问题,
您不能
trainable以这种方式进行嵌入。解决方案是使用嵌入到中,
placeholder然后将它们分配给
Variable(例如
A)。在每批训练之后,学习算法都会更新变量
A。然后通过张量流计算
A向量的输出,并将它们分配给模型外部的嵌入矩阵。(我说这个过程很痛苦)
现在,您的下一个问题应该是,如果因为嵌入查找太大而无法将嵌入查找提供给模型,该怎么办。这是您无法避免的基本问题。这就是为什么NVIDIA GTX
1080、1080ti和NVIDA TITAN Xp具有如此高的价格差异的原因,尽管NVIDIA 1080ti和1080具有更高的执行频率。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)