Mar*_*ruf 13 python batch-processing tensorflow
我是tensorflow和机器学习的新手.最近我正在研究一个模型.我的模型如下,
字符级嵌入向量 - >嵌入查找 - > LSTM1
字级嵌入矢量 - >嵌入查找 - > LSTM2
[LSTM1 + LSTM2] - >单层MLP-> softmax层
[LSTM1 + LSTM2] - >单层MLP-> WGAN鉴别器
他的模型代码
当我正在研究这个模型时,我得到了以下错误.我以为我的批次太大了.因此,我尝试将批量大小从20减少到10,但它不起作用.
ResourceExhaustedError(参见上面的回溯):OOM在分配张量形状时[24760,100] [[节点:字符/ 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 /副本:0 /任务:0 /设备: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 /任务:0 /装置: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
Run Code Online (Sandbox Code Playgroud)
从这个命令判断你可以猜出你可以使用多少额外的内存.
但是这些问题的解决方案在于减少批量大小,
对于我的情况,将批量的大小减少到3个.这可能会因模型而异.
但是如果你使用的模型嵌入矩阵要大得多,你就无法将它们加载到内存中呢?
解决方案是编写一些痛苦的代码.
您必须在嵌入矩阵上查找,然后将嵌入加载到模型中.简而言之,对于每个批处理,您必须将查找矩阵提供给模型(通过其中的feed_dict参数提供它们sess.run()).
接下来你将面临一个新问题,
你不能trainable以这种方式进行嵌入.解决方案是在a中使用嵌入placeholder并将它们分配给Variable(例如A).在每批训练之后,学习算法更新变量A.然后A通过tensorflow 计算向量的输出,并将它们分配给模型外部的嵌入矩阵.(我说这个过程很痛苦)
现在你的下一个问题应该是,如果你不能将嵌入查找提供给模型,因为它太大了.这是一个你无法避免的根本问题.这就是NVIDIA GTX 1080,1080ti和NVIDA TITAN Xp价格差异的原因,尽管NVIDIA 1080ti和1080具有更高的运行频率.