W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
原文: https://pytorch.org/docs/stable/notes/faq.html
如錯誤消息所暗示,您的 GPU 內(nèi)存已用完。 由于我們經(jīng)常在 PyTorch 中處理大量數(shù)據(jù),因此小錯誤可能會迅速導致您的程序用盡所有 GPU; 幸運的是,這些情況下的修復程序通常很簡單。 以下是一些常見的檢查事項:
不要在整個訓練循環(huán)中累積歷史記錄。 默認情況下,涉及需要漸變的變量的計算將保留歷史記錄。 這意味著您應避免在計算中使用此類變量,這些變量將不受訓練循環(huán)的影響,例如在跟蹤統(tǒng)計信息時。 相反,您應該分離變量或訪問其基礎數(shù)據(jù)。
有時,可微變量發(fā)生時可能不是很明顯。 考慮以下訓練循環(huán)(從源刪節(jié)):
total_loss = 0
for i in range(10000):
optimizer.zero_grad()
output = model(input)
loss = criterion(output)
loss.backward()
optimizer.step()
total_loss += loss
在這里,total_loss
會在您的訓練循環(huán)中累積歷史記錄,因為loss
是具有自動分級歷史記錄的可微變量。 您可以改寫 <cite>total_loss + = float(loss)</cite>來解決此問題。
此問題的其他實例: 1 。
不要使用不需要的張量和變量。 如果將 Tensor 或 Variable 分配給本地,Python 將不會取消分配,直到本地超出范圍。 您可以使用del x
釋放此參考。 同樣,如果將 Tensor 或 Variable 分配給對象的成員變量,則在對象超出范圍之前它不會釋放。 如果不使用不需要的臨時存儲,則將獲得最佳的內(nèi)存使用率。
當?shù)厝说姆秶赡軙瞿念A期。 例如:
for i in range(5):
intermediate = f(input[i])
result += g(intermediate)
output = h(result)
return output
這里,即使h
正在執(zhí)行,intermediate
仍保持活動狀態(tài),因為它的作用域超出了循環(huán)的結尾。 要提早釋放它,使用完后應del intermediate
。
不要對太大的序列運行 RNN。 通過 RNN 反向傳播所需的內(nèi)存量與 RNN 輸入的長度成線性比例; 因此,如果您嘗試向 RNN 輸入過長的序列,則會耗盡內(nèi)存。
這種現(xiàn)象的技術術語是到時間的反向傳播,關于如何實現(xiàn)截斷 BPTT 的參考很??多,包括字語言模型示例; 截斷由本論壇帖子中所述的repackage
功能處理。
請勿使用太大的線性圖層。 線性層nn.Linear(m, n)
使用
內(nèi)存:也就是說,權重的內(nèi)存要求與要素數(shù)量成正比關系。 以這種方式穿透內(nèi)存非常容易(請記住,您至少需要權重大小的兩倍,因為您還需要存儲漸變。)
PyTorch 使用緩存內(nèi)存分配器來加速內(nèi)存分配。 因此,nvidia-smi
中顯示的值通常不能反映真實的內(nèi)存使用情況。 有關 GPU 內(nèi)存管理的更多詳細信息,請參見內(nèi)存管理。
如果即使在退出 Python 后仍沒有釋放 GPU 內(nèi)存,則很可能某些 Python 子進程仍然存在。 您可以通過ps -elf | grep python
找到它們,然后使用kill -9 [pid]
手動將其殺死。
您可能會使用其他庫在數(shù)據(jù)集中生成隨機數(shù)。 例如,當通過fork
啟動工作程序子流程時,NumPy 的 RNG 被復制。 請參閱 torch.utils.data.DataLoade
的文檔,以了解如何通過worker_init_fn
選項在工人中正確設置隨機種子。
在 Module
與 DataParallel
或 data_parallel()
中使用pack
sequence -> recurrent network -> unpack sequence
模式是很微妙的。 每個設備上每個forward()的輸入僅是整個輸入的一部分。 由于默認情況下,拆包操作 torch.nn.utils.rnn.pad_packed_sequence()
僅填充其看到的最長輸入,即該特定設備上的最長輸入,因此,將結果匯總在一起時會發(fā)生大小不匹配的情況。 因此,您可以改而利用
pad_packed_sequence() 的total_length
自變量來確保forward()
調用相同長度的返回序列。 例如,您可以編寫:
from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
class MyModule(nn.Module):
# ... __init__, other methods, etc.
# padded_input is of shape [B x T x *] (batch_first mode) and contains
# the sequences sorted by lengths
# B is the batch size
# T is max sequence length
def forward(self, padded_input, input_lengths):
total_length = padded_input.size(1) # get the max sequence length
packed_input = pack_padded_sequence(padded_input, input_lengths,
batch_first=True)
packed_output, _ = self.my_lstm(packed_input)
output, _ = pad_packed_sequence(packed_output, batch_first=True,
total_length=total_length)
return output
m = MyModule().cuda()
dp_m = nn.DataParallel(m)
此外,當批處理尺寸為1
(即batch_first=False
)且數(shù)據(jù)平行時,需要格外小心。 在這種情況下,pack_padded_sequence padding_input
的第一個參數(shù)的形狀將為[T x B x *]
,并且應沿昏暗1分散,而第二個參數(shù)input_lengths
的形狀將為[B]
,并且應沿昏暗[[Gate] 0
。
將需要額外的代碼來操縱張量形狀。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: