首页 > 解决方案 > 多 GPU 在内存分配方面如何扩展?

问题描述

我有一台具有以下规格的 PC:

我的问题是,当我在大约 60k 图像 (GPU:1) 上使用 Keras 运行我的训练程序时,程序加载图像并且数据矩阵为 12922.20MB

程序截图

在此之后,程序一分钟内什么都不做,并被自动终止。相同的代码似乎正在 GPU:1 上进行训练,并且可以在 10k 图像上正常工作。

  1. 这可能是因为我的 GPU:1 只能存储 11GB 并且数据大小约为 12GB?
  2. 并行化 GPU:1 和 GPU:0 会解决我的问题吗?如果是这样,是 16GB VRAM(8+8) 还是 19GB (11+8)?
  3. 难道我做错了什么?我指的帖子是:https ://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python稍作修改.

我确实尝试在网上和 SO 上进行搜索,但在使用多 GPU 和 Keras 时,我找不到/了解有关如何分配/扩展 GPU 内存的很多信息。

任何帮助,将不胜感激!

标签: pythontensorflowkerasdeep-learning

解决方案


我首先建议您在单个 GPU 上训练时检查内存使用情况;我怀疑您的数据集没有加载到 GPU 内存中,而是加载到 RAM 中。

您可以尝试设置:

1.

  import os
  #Enable system to see only one of the video cards
  os.environ["CUDA_VISIBLE_DEVICES"] = "0"/"1" 

检查以查看确切的映射(tensorflow 看到您的 GPU):

tf.config.list_physical_devices('GPU') 
  1. 现在验证在这种情况下使用了多少 VRAM:

然后,您可以在终端nvidia-smi中检查分配了多少 GPU 内存;同时,使用watch -n K nvidia-smi

  1. 当您使用多 GPU 时,请确保您使用tf.distribute.MirroredStrategy()并声明您的模型创建+拟合逻辑,如下所示:

     strategy = tf.distribute.MirroredStrategy()
     print('Number of devices: {}'.format(strategy.num_replicas_in_sync))
    
     # Open a strategy scope.
     with strategy.scope():
       # Everything that creates variables should be under the strategy scope.
       # In general this is only model construction & `compile()`.
       model = Model(...)
       model.compile(...)
    

战略范围之外

model.fit(train_dataset, validation_data=val_dataset, ...)

model.evaluate(test_dataset)

推荐阅读