TensorflowランタイムResourceExhaustedError(see above for traceback):OOM when allocating tensor with shape

2261 ワード

Tensorflowライブラリを使用してcifar-10モデルのテストを行うと、次のエラーが発生します.
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[10000,32,32,32] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
	 [[Node: Conv2D = Conv2D[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](Conv2D-0-TransposeNHWCToNCHW-LayoutOptimizer, Variable/read)]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

	 [[Node: Mean/_21 = _Recv[client_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_67_Mean", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

プログラムでは、一度に10000個のテストデータをニューラルネットワークに一度に供給する[10000,32,3]最初のパラメータはテストセットの大きさを表し、2、3番目のパラメータは画像の長さと幅を表し、4番目のパラメータは画像のチャネル数を表し、ここでこのようなエラーの原因が発生するとGPUのメモリを超えてしまう.
解決策
1.テストセットを小さいブロックに分けてニューラルネットワークに供給する
この方法は実行可能であるが,試験セットのランダム性を増大させ,訓練モデルの正確な判別に不利である.
2.CPUによる運転
テストセットは運転速度を上げる必要がないので、CPUに置いて運転するのが良い.方法は以下の通りである:xが範囲を超えただけであるため、x値をCPUで運転するだけであるが、スペースを空けてトレーニングセットに訓練するため、y値をCPUに入れるコードの一部は以下の通りである.
with tf.Graph().as_default() as g:#,   tf.Graph()          ,
       with tf.device('/cpu:0'):
            x = tf.placeholder(tf.float32,[Num_test,cifar_forward.IMAGE_SIZE,
                                      cifar_forward.IMAGE_SIZE,cifar_forward.NUM_CHANNELS])
            y_ = tf.placeholder(tf.int64,[None,1])
            y = cifar_forward.forward(x,False, None)
       #            
       ema=tf.train.ExponentialMovingAverage(cifar_backward.MOVING_AVERAGE_DECAY)
       ema_restore=ema.variables_to_restore()
       saver=tf.train.Saver(ema_restore)

これにより、同様に、運転中のテンソルの記憶位置を任意に割り当てることができる.