簡體   English   中英

pytorch 從 RuntimeError 中恢復:CUDA 錯誤:在不重啟腳本的情況下觸發設備端斷言

[英]pytorch recover from RuntimeError: CUDA error: device-side assert triggered without restarting script

我想每個用過 Pytorch 的人都知道這個錯誤
RuntimeError: CUDA error: device-side assert triggered
在某種程度上。
我在腳本中使用 GPU 代碼生成了大量數據(200k+ 長向量),所以需要一段時間。 我正在通過生成器批量執行此操作,因為我沒有內存可以一次將所有向量存儲在我的 GPU 中。 生成器具有以下結構:

    for i in range(0, len(inputs), batch_size):
        try:
            <generate the vectors>
            yield 1, <the vectors>  # Here it was successful
        except RuntimeError:
            print(f'could not generate vectors {index} to {index + batch_size}')
            yield 0, (i, i+ batch_size)  # Here the input was malformed

我知道一些輸入的格式錯誤,以至於從它生成向量會因運行時錯誤而失敗,這很好,它甚至不是我數據集的 1%。 我想獲取索引並稍后處理。

這是我的問題
一旦矢量創建失敗,GPU 基本上會變磚,並將響應上述錯誤的所有請求。 事先驗證所有輸入既麻煩又緩慢。 我不想這樣做。 我想翻轉所有格式錯誤的輸入並稍后處理。

我的問題是
如何盡可能輕松快速地從這種磚砌狀態中恢復 GPU? 到目前為止,我發現的所有問題都是關於修復潛在錯誤的,我不需要這樣做。 我只想繼續從我的數據集生成向量。

一種方法可能是通過生成的輸入向量記錄您的進度,並在 GPU 變磚時重新啟動進程/機器。 如果畸形輸入的百分比足夠小,重置 GPU/機器的成本可能可以忽略不計。 你可以有一個周期性的工作,它檢查你是否完成了工作,如果沒有完成,則重新啟動它。 這是解決這個問題的粗略方法,但它應該有效。

例如:

for i in range(0, len(inputs), batch_size):
    try:
        exist = check_if_current_index_has_succeded_or_failed()
        if exist:
            continue
        else:
            log_current_index()
        <generate the vectors>
        log_success()
        yield 1, <the vectors>  # Here it was successful
    except RuntimeError:
        log_failure()
        print(f'could not generate vectors {index} to {index + batch_size}')
        yield 0, (i, i+ batch_size)  # Here the input was malformed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM