admin管理员组

文章数量:1590149

最近在使用Pytorch对一个强化学习算法做分布式/多进程的改造,其中有一步需要将主进程训练好的新权重使用multiprocessing库的Queue对象发送给子进程。然后在打包权重送入队列时出现以下错误:

cuda runtime error (801) : operation not supported at C:\w\b\windows\pytorch\torch/csrc/generic/StorageSharing.cpp:245

经过网络上的一些资料搜索了解到,可能是因为欲获取权重的模型目前放在GPU设备上,所以在对权重做一些操作时会提示这个错误。难道是一些GPU资源不能随意在CPU上操作?

那若假定A模型一定要放在GPU上跑,可不可能先获取A模型的参数,送到一个CPU上跑着的B模型,然后再从这个CPU上的B模型获取权重?试了试,问题解决了,具体参考代码如下。

def get_net_params(A, B):
    B.load_state_dict(A.state_dict())
    return B.state_dict()

主要是尽量避免直接去获取并传送(比如使用multiprocessing中的Queue类)GPU设备上的模型的权重资源。除了笔者这种做法,应当还有其他方法。具体为什么会出现这种错误,可能和Pytorch一些底层设计有关,笔者暂时不了解具体原因,如果有人知道了,可以在评论区分享想法。

// 全文完

因笔者能力有限,若文章内容存在错误或不恰当之处,欢迎留言、私信批评指正。
Email:YePeanut[at]foxmail

本文标签: ErrorRuntimePytorchCUDAoperation