编程语言
首页 > 编程语言> > python – 训练破坏了ResourceExausted错误

python – 训练破坏了ResourceExausted错误

作者:互联网

我是tensorflow和机器学习的新手.最近我正在研究一个模型.我的模型如下,

>字符级嵌入向量 – >嵌入查找 – > LSTM1
>字级嵌入矢量 – >嵌入查找 – > LSTM2
> [LSTM1 LSTM2] – >单层MLP-> softmax层
> [LSTM1 LSTM2] – >单层MLP-> WGAN鉴别器
>他的模型代码

当我正在研究这个模型时,我得到了以下错误.我以为我的批次太大了.因此,我尝试将批量大小从20减少到10,但它不起作用.

ResourceExhaustedError (see above for traceback): OOM when allocating
tensor with shape[24760,100] [[Node:
chars/bidirectional_rnn/bw/bw/while/bw/lstm_cell/split =
Split[T=DT_FLOAT, num_split=4,
_device=”/job:localhost/replica:0/task:0/device:GPU:0″](gradients_2/Add_3/y,
chars/bidirectional_rnn/bw/bw/while/bw/lstm_cell/BiasAdd)]] [[Node:
bi-lstm/bidirectional_rnn/bw/bw/stack/_167 =
_Recvclient_terminated=false, recv_device=”/job:localhost/replica:0/task:0/device:CPU:0″,
send_device=”/job:localhost/replica:0/task:0/device:GPU:0″,
send_device_incarnation=1,
tensor_name=”edge_636_bi-lstm/bidirectional_rnn/bw/bw/stack”,
tensor_type=DT_INT32,
_device=”/job:localhost/replica:0/task:0/device:CPU:0″]]

张量形状[24760,100]表示2476000 * 32/8 * 1024 * 1024 = 9.44519043 MB内存.我在Titan X(11 GB)GPU上运行代码.怎么可能出错?为什么会发生这种错误?

*额外信息*:LSTM1的大小为100.对于双向LSTM,它变为200.
LSTM2的大小为300.对于双向LSTM,它变为600.

*注*:错误发生在32个纪元之后.我的问题是为什么在32个时代之后出现了错误.为什么不在最初的时代.

解决方法:

这几天我一直在调整以解决这个问题.

最后,我还没有解开问题中描述的内存大小的谜团.我想在计算梯度时,tensoflow会为计算梯度积累大量额外的内存.我需要检查张量流的来源,这在目前看来非常麻烦.您可以通过以下命令检查模型在终端上使用的内存量,

nvidia-smi

从这个命令判断你可以猜出你可以使用多少额外的内存.

但是这些问题的解决方案在于减少批量大小,

For my case reducing the size of the batch to 3 works. This may vary
model to model.

但是如果你使用的模型嵌入矩阵要大得多,你就无法将它们加载到内存中呢?

解决方案是编写一些痛苦的代码.

您必须在嵌入矩阵上查找,然后将嵌入加载到模型中.简而言之,对于每个批处理,您必须将查找矩阵提供给模型(通过sess.run()中的feed_dict参数提供它们).

接下来你将面临一个新问题,

你不能以这种方式训练嵌入物.解决方案是在占位符中使用嵌入并将它们分配给变量(例如,例如A).在每批训练之后,学习算法更新变量A.然后通过tensorflow计算A向量的输出,并将它们分配给模型外部的嵌入矩阵. (我说这个过程很痛苦)

现在你的下一个问题应该是,如果你不能将嵌入查找提供给模型,因为它太大了.这是一个你无法避免的根本问题.这就是NVIDIA GTX 1080,1080ti和NVIDA TITAN Xp具有如此价格差异的原因,尽管NVIDIA 1080ti和1080具有更高的运行执行频率.

标签:python,tensorflow,batch-processing
来源: https://codeday.me/bug/20190927/1823844.html