PyTorch GPU内存管理

PyTorch GPU内存管理,pytorch,Pytorch,在我的代码中,我想替换张量中的值,例如,某些索引的值为零 target\u mac\u out[avail\u actions[:,1::][=0]=-999999 但是,它返回OOM RuntimeError: CUDA out of memory. Tried to allocate 166.00 MiB (GPU 0; 10.76 GiB total capacity; 9.45 GiB already allocated; 4.75 MiB free; 9.71 GiB reserve

在我的代码中,我想替换张量中的值,例如,某些索引的值为零

target\u mac\u out[avail\u actions[:,1::][=0]=-999999
但是,它返回OOM

RuntimeError: CUDA out of memory. Tried to allocate 166.00 MiB (GPU 0; 10.76 GiB total capacity; 9.45 GiB already allocated; 4.75 MiB free; 9.71 GiB reserved in total by PyTorch)
我认为没有内存分配,因为它只是访问
target\u mac\u out
的张量,检查值并替换一些索引的新值


我的理解正确吗?

很难猜测,因为我们甚至不知道所涉及的张量的大小,但是你的索引
avail\u actions[:,1::==0
创建了一个需要内存分配的临时张量。

很难猜测,因为我们甚至不知道所涉及的张量的大小,但是您的索引
avail\u actions[:,1::==0
创建了一个临时张量,它确实需要内存分配。

avail\u actions[:,1:::==0创建了一个新的张量,并且可能整行本身会在完成操作后删除旧的张量之前创建另一个张量

如果速度不是问题,那么您可以使用
进行
循环。像

for i in range(target_mac_out.size(0)):
    for j in range(target_mac_out.size(1)-1):
        if target_mac_out[i, j+1] == 0:
            target_mac_out[i, j+1] = -9999999

avail\u actions[:,1:::==0
创建一个新的张量,并且可能整行本身在完成操作后删除旧的张量之前创建另一个张量

如果速度不是问题,那么您可以使用
进行
循环。像

for i in range(target_mac_out.size(0)):
    for j in range(target_mac_out.size(1)-1):
        if target_mac_out[i, j+1] == 0:
            target_mac_out[i, j+1] = -9999999

你的张量需要渐变吗?@Ivan
target\u mac\u out
需要渐变,而
avail\u actions
不需要渐变。你能显示一个代码示例来说明这些张量是如何创建和初始化的吗?@trialNerror代码很复杂,
avail\u actions
是GPU中的张量,
target\u mac\u out
是从网络返回的张量。你的张量需要grad吗?@Ivan
target\u mac\u out
需要grad,而
avail\u actions
不需要。你能显示一个显示这些张量是如何创建和初始化的代码示例吗?@trialNerror代码是复杂的,
avail\u actions
是GPU中的张量,
target\u mac\u out
是从网络返回的张量。