【问题标题】:Inference on Large image using 2Gb gpu in keras在 keras 中使用 2Gb gpu 推断大图像
【发布时间】:2019-04-24 07:44:30
【问题描述】:

我想使用 Keras 在 2 Gb GPU 上推断 3584x2796 大小的 2D 图像。是否可以?网络架构是一个 Unet。

在推理过程中总是出现内存不足错误。即使是卷积,也只针对第一层失败。 Keras 似乎没有针对大图像卷积进行优化。即使是下面的网络在 2 Gb GPU 上进行推理时也会失败。

Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 3584, 2796, 1)     0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 3584, 2796, 32)     80        
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 3584, 2796, 32)     584       
_________________________________________________________________
instance_normalization_3 (In (None, 3584, 2796, 32)     2         
_________________________________________________________________
activation_3 (Activation)    (None, 3584, 2796, 32)     0         
=================================================================
Total params: 666
Trainable params: 666
Non-trainable params: 0

我得到以下错误:

OOM when allocating tensor with shape[1,32,3584,2796] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[{{node conv2d_2/convolution}} = 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_2/convolution-0-TransposeNHWCToNCHW-LayoutOptimizer, conv2d_2/kernel/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 activation_2/Relu/_11}} = _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_47_activation_2/Relu", 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.

【问题讨论】:

    标签: keras


    【解决方案1】:

    输入图像很大。

    即使是 11GB 的 Video Ram(例如 GTX 1080 Ti)也不足以处理这样的大小。

    2GB GPU 对于深度学习来说确实不够用,尤其是对于计算机视觉而言。

    首先,请使用至少具有 4GB 显存的 GPU。 6GB VRAM 是一个很好的起点,8GB 的​​ VRAM 会更合适。

    其次,尝试将初始图像尺寸 (3584x2796) 减小到 (448x350)。实际上,您将高度和宽度都除以 8。

    这不是关于 Keras 优化,而是关于你的 GPU 的内存大小和输入图像的巨大大小。

    【讨论】:

    • 感谢您的回复。我无法减小图像大小,因为我需要以相同的比例进行推理。这是图像翻译问题。该模型使用大型 GPU 进行训练,现在我正在尝试寻找一种推理方式。我不明白为什么它需要这么多内存,尤其是我附加的小模型?
    • 不幸的是,我认为没有办法在这样的 GPU 上进行推断。正如我所说,尝试更大的视频卡并减少输入图像。这样的内存分配并不完全取决于您在调用 model.summary() 时看到的参数数量。例如,138.000.000,即 VGG-19 包含的参数数量。输入图像为 224x224。这就是为什么我坚持要减小图像尺寸。复制只能通过使用非常强大的 GPU 来完成。你不能指望在 3 个具有 8GB VRAM 的 GPU 上训练,然后在 1 个具有 2GB VRAM 的 GPU 上训练网络。
    • 推理是通过神经网络的前向传递。这就像一张图像通过那个神经网络,只是为了预测而不是训练。如果您无法在具有特定配置的视频卡上进行训练,那么您也无法使用相同的配置进行测试。
    • 我认为,由于反向传播,训练需要更多内存。但是可能有一些方法可以在推理过程中优化 unet,例如一次使用小部分。我知道这是一个具有挑战性的可能性,您使用更大的 GPU 是正确的,但我没有那个选项。
    • 从这个意义上说你是对的,反向传播需要更多内存,因为它意味着权重会更新。是的,您确实需要一个非常强大的配置。您可以尝试检查是否将初始图像拆分为子部分,并将这些子部分而不是整个图像发送到 U-Net。空间信息可能会丢失,但至少我认为这可能是一种选择。当然,更好的 GPU 是解决此问题的方法,并且可以减小图像大小。
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2018-10-29
    • 2020-01-27
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2019-03-07
    • 2017-11-03
    相关资源
    最近更新 更多