python - 多 GPU 在内存分配方面如何扩展?
问题描述
我有一台具有以下规格的 PC:
- 处理器:AMD Ryzen Threadripper 2990wx(32核)
- 内存:32GB
- 显卡:(GPU:1)GTX1080 Ti(11GB),(GPU:0)GTX1070(8GB)
- 固态硬盘:2TB 三星 Evo 890
我的问题是,当我在大约 60k 图像 (GPU:1) 上使用 Keras 运行我的训练程序时,程序加载图像并且数据矩阵为 12922.20MB
在此之后,程序一分钟内什么都不做,并被自动终止。相同的代码似乎正在 GPU:1 上进行训练,并且可以在 10k 图像上正常工作。
- 这可能是因为我的 GPU:1 只能存储 11GB 并且数据大小约为 12GB?
- 并行化 GPU:1 和 GPU:0 会解决我的问题吗?如果是这样,是 16GB VRAM(8+8) 还是 19GB (11+8)?
- 难道我做错了什么?我指的帖子是:https ://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python稍作修改.
我确实尝试在网上和 SO 上进行搜索,但在使用多 GPU 和 Keras 时,我找不到/了解有关如何分配/扩展 GPU 内存的很多信息。
任何帮助,将不胜感激!
解决方案
我首先建议您在单个 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')
- 现在验证在这种情况下使用了多少 VRAM:
然后,您可以在终端nvidia-smi
中检查分配了多少 GPU 内存;同时,使用watch -n K nvidia-smi
当您使用多 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)
推荐阅读
- hadoop - 从 twitter 流式传输数据时如何解决水槽中的 404 错误?
- ios - CMMotionActivityManager startActivityUpdates 保持在调用 stopActivityUpdates() 后检测用户活动
- r - 在不使用 R 硬编码的情况下迭代模型
- sql - 这是一个子查询还是只是一个内部连接
- reactjs - Redux Store 和来自 Axios API 的嵌套 JSON
- python - Tensorflow:tf.contrib.seq2seq.TrainingHelper 如何工作?
- python - 在 nagiosplugin 中返回除了指标之外的信息
- java - 在调用参数为 (int, int) 的方法、带有签名 (int, int) 或 (Integer, Integer) 的方法时,将给出首选项
- c - 从 C 中的函数返回数组时出错
- javascript - 如何将模糊功能传递和应用到父组件上的特定输入?