火炬中的一些操作是就地執(zhí)行的。例如,像 += 這樣的速記運算符。是否可以就地執(zhí)行其他操作,例如softmax?我目前正在研究語言處理。該模型在大量詞匯表上生成一長串概率分布。這個最終輸出張量負責大約 60% 的分配內存。這是一個巨大的問題,因為我需要計算一個 softmax 并且將所需的內存加倍。這是問題的一個例子。我對張量 t 不感興趣,只對它的 softmax 感興趣:import numpy as npimport torchimport torch.nn.functional as Ft = torch.tensor(np.zeros((30000,30000))).cuda() #allocates 6.71 GB of GPUsoftmax = F.softmax(t, 1) #out of memory errordel t #too late, program crashed即使以下也不起作用:F.softmax(torch.tensor(np.zeros((30000,30000))).cuda(), 1)
2 回答

繁花如伊
TA貢獻2012條經(jīng)驗 獲得超12個贊
到目前為止,PyTorch 是不可能的。您可以嘗試推出自己的GPU 內核,但我看到前面有麻煩(如果不是墻的話),這可能是此操作最初不可用的原因。
除了歸一化需要減少之外,Softmax 可以很容易地并行應用。減少是非常重要的,它們可以是就地或并行的(請記住,原子的使用相當于并發(fā)但不是并行的操作)。這意味著您的就地操作無論如何都必須在幕后分配,這違背了目的,或者運行得非常慢。請考慮我的回答有點推測性,我不是 GPGPU 的專家,但我的觀點是,廉價、快速和正確地解決至少是一個困難的問題。
話雖如此,如果您只關心 softmax,在我看來,您似乎在進行推理。也許對于您的應用程序來說,將 logits 移動到 CPU 并在那里運行 softmax 是一個可行的選擇,而您的 GPU 已經(jīng)在處理下一批?
添加回答
舉報
0/150
提交
取消