python - 是否可以使用一种型号的 GPU 的所有内存?
问题描述
有一个model
和两个 GPU。我把model
GPU 和model.cuda()
. 如果我将一个大图像传递给model
,它会分配 GPU0 的所有内存,然后它会引发CUDA out of memory
错误而不分配 GPU1 的任何内存。
因为每个图像只有一张forward()
,所以我不能用这样torch.nn.DataParallel
的东西来分割输入。
将图像传递给时,有什么方法可以使用 GPU 的所有内存model
?
我正在使用 Python3.7 和 Pytorch1.1。
解决方案
您可以将模型拆分为两个子模块。像这样:
class MyModel(nn.Module):
def __init__(self, split_gpus):
self.large_submodule1 = ...
self.large_submodule2 = ...
self.split_gpus = split_gpus
if split_gpus:
self.large_submodule1.cuda(0)
self.large_submodule1.cuda(1)
def forward(self, x):
x = self.large_submodule1(x)
if split_gpus:
x = x.cuda(1) # P2P GPU transfer
return self.large_submodule2(x)
推荐阅读
- pandas - 创建条件以替换 pandas 中的缺失值,包括字符串、日期和时间
- regex - 搜索模式,在该行使用 sed 仅更改文件的第 3 列和第 4 列
- python - 提取价格文本 Pandas
- javascript - 检查机器人是否仅被提及
- tridion - 如何使用核心服务从出版物中读取 Tridion 页面 URL?
- c++ - 在 C++ 中构建用户输入数组时尝试忽略空格
- r - R / plotly:拖动滑块而不是自动播放
- javascript - 如何将数据数组插入表中
- deep-learning - 在 GPU 上运行 huggingface Bert 分词器
- linux - linux内核如何监听解锁事件?