gpt4 book ai didi

deep-learning - PyTorch 在第一个可用的 GPU 上分配更多内存(cuda :0)

转载 作者:行者123 更新时间:2023-12-01 13:11:04 24 4
gpt4 key购买 nike

作为强化学习训练系统的一部分,我正在使用四个 GPU 并行训练四个策略。对于每个模型,有两个进程—— Actor 和学习者,它们只使用他们特定的 GPU(例如,对应于模型 #2 的 Actor 和学习者只使用 GPU #2 来处理他们所有的张量)。 Actor 和 learner 通过 torch 的 share_memory_() 共享模型层。由于四个训练“子系统”是完全对称的,我希望它们在四个 GPU 中的每一个上使用完全相同数量的 GPU 内存。然而,在实践中,我看到在第一个 GPU (cuda:0) 上分配了更多的 GPU 内存。

感觉所有内存共享都是通过 GPU #0 以某种方式完成的。有办法解决这个问题吗?

到目前为止,我尝试通过在进程 start 函数中显式更改 os.environ 来在子进程中设置 CUDA_VISIBLE_DEVICES。这似乎没有任何效果,可能是因为子进程是从主进程派生出来的,其中 PyTorch CUDA 已经初始化,此时 envvars 似乎被忽略了。

enter image description here

最佳答案

好的,到目前为止我想出了一个解决方法。我的假设是正确的,如果 PyTorch CUDA 子系统在子进程 fork 之前已经初始化,则将 CUDA_VISIBLE_DEVICES 设置为子进程的不同值不会执行任何操作。

更糟糕的是,调用 torch.cuda.device_count() 就足以初始化 CUDA,因此我们甚至无法从 PyTorch 查询 GPU 的数量。解决方案要么对其进行硬编码,作为参数传递,要么在单独的进程中查询 PyTorch API。我对后者的实现:

import sys


def get_available_gpus_without_triggering_pytorch_cuda_initialization(envvars):
import subprocess
out = subprocess.run([sys.executable, '-m', 'utils.get_available_gpus'], capture_output=True, env=envvars)
text_output = out.stdout.decode()
from utils.utils import log
log.debug('Queried available GPUs: %s', text_output)
return text_output


def main():
import torch
device_count = torch.cuda.device_count()
available_gpus = ','.join(str(g) for g in range(device_count))
print(available_gpus)
return 0


if __name__ == '__main__':
sys.exit(main())

基本上这个函数调用它自己的脚本作为单独的 python 进程并读取标准输出。

我不会将此答案标记为已接受,因为我想学习一个合适的解决方案(如果存在的话)。

关于deep-learning - PyTorch 在第一个可用的 GPU 上分配更多内存(cuda :0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59873577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com