簡體   English   中英

CUDA 運行時錯誤 (59):設備端斷言已觸發

[英]CUDA runtime error (59) : device-side assert triggered

THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1524584710464/work/aten/src/THC/generated/../generic/THCTensorMathPointwise.cu line=265 error=59 : device-side assert triggered
Traceback (most recent call last):
  File "main.py", line 109, in <module>
    train(loader_train, model, criterion, optimizer)
  File "main.py", line 54, in train
    optimizer.step()
  File "/usr/local/anaconda35/lib/python3.6/site-packages/torch/optim/sgd.py", line 93, in step
    d_p.add_(weight_decay, p.data)
RuntimeError: cuda runtime error (59) : device-side assert triggered at /opt/conda/conda-bld/pytorch_1524584710464/work/aten/src/THC/generated/../generic/THCTensorMathPointwise.cu:265

如何解決此錯誤?

我多次遇到這個問題。 我發現這是一個索引問題。

例如,如果您的真實標簽從 1 開始: target = [1,2,3,4,5] ,那么您應該為每個標簽減去1 ,將其更改為: [0,1,2,3,4] .

這每次都能解決我的問題。

通常,當遇到cuda runtine error時,建議使用CUDA_LAUNCH_BLOCKING=1標志再次運行程序以獲得准確的堆棧跟蹤。

在您的特定情況下,您的數據目標對於指定數量的類來說太高(或太低)。

我在運行 BertModel.from_pretrained('bert-base-uncased') 時遇到了這個錯誤。 當錯誤消息更改為“IndexError: index out of range in self”時,我通過移動到 CPU 找到了解決方案。 這導致我這篇文章。 解決方案是將句子截斷為長度 512。

引發“CUDA 錯誤:設備端斷言觸發” RuntimeError的一種方法是使用具有超出維度索引的list索引到 GPU torch.Tensor

因此,此代碼段將引發IndexError並顯示消息“IndexError:索引 3 超出尺寸 3 的維度 0 的范圍”,而不是 CUDA 錯誤

data = torch.randn((3,10), device=torch.device("cuda"))
data[3,:]

而這會引發 CUDA“設備端斷言觸發” RuntimeError

data = torch.randn((3,10), device=torch.device("cuda"))
indices = [1,3]
data[indices,:]

這可能意味着在類標簽的情況下,例如在@Rainy 的回答中,當標簽從 1 而不是 0 開始時,導致錯誤的是最終的類標簽(即當label == num_classes時)。

此外,當設備為"cpu"時,拋出的錯誤是IndexError ,例如第一個片段拋出的錯誤。

如果您先切換到 CPU,則可以使此錯誤更加詳細。 一旦切換到 CPU,它將顯示確切的錯誤,這很可能與索引問題有關,即 IndexError: Target 2 is out of bounds in my case,可能與您的情況有關。 問題是“您當前使用了多少個類,輸出的形狀是什么?”,您可以找到這樣的類

max(train_labels)
min(train_labels)

在我的情況下,這給了我 2 和 0,問題是由於缺少 1 索引引起的,所以快速破解是用 1s 快速替換所有 2s ,這可以通過以下代碼完成:

train_=train.copy()
train_['label'] =train_['label'].replace(2,1)

然后你運行相同的代碼並查看結果,它應該可以工作

class NDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item['labels'] = torch.tensor(self.labels[idx])
        return item

    def __len__(self):
        return len(self.labels)

train_dataset = NDataset(train_encodings, train_labels)
val_dataset = NDataset(val_encodings, val_labels)
test_dataset = NDataset(test_encodings, test_labels)

當我有一個無效值的標簽時,我發現我收到了這個錯誤。

我遇到了同樣的問題,發現這篇出色的文章描述了如何跟蹤它。 希望這可以幫助。

https://towardsdatascience.com/cuda-error-device-side-assert-triggered-c6ae1c8fa4c3

當 bce 或 ce 損失的目標或標簽 <= 0 時,多次發生在我身上。

這也可能是由模型輸入數據中的 nan 值引起的。 “處理”此問題的一種簡單方法是將任何彈出的內容即時轉換為零:

batch_data = batch_data[batch_data != batch_data] = 0

另一種可能發生這種情況的情況:您正在訓練一個數據集,其類比上一層預期的要多。 又是一個意料之外的指標情況

我希望你的問題得到解決,但是我遇到了這個問題,花了將近 2 個小時來解決它,所以我將在這里為像我這樣的人解釋問題和解決方法。
由於類標簽,我遇到了這個問題。
我的項目是關於三個類的情緒分析,所以我用值標記數據集:-1、0、1(輸出層中的 3 個節點)它導致了我的問題!
所以我用值 0、1、2 重新標記了數據集,它得到了解決。 從 0 開始標記樣本很重要(PyTorch 使用索引作為類標簽,所以你應該小心)。
對於遇到錯誤說 set CUDA_LAUNCH_BLOCKING = 1 的人,你應該在導入 PyTorch 之前使用這個命令:os.environ['CUDA_LAUNCH_BLOCKING'] = "1",如果你遇到同樣的錯誤(沒有關於錯誤的更多信息)你應該通過 CPU 運行腳本並重試(這次您可能會獲得有關問題的新信息)。

當我使用 Huggingface Transformer 模型 LongformerEncoderDecoder (LED)並將解碼器長度設置得太大時,我收到了這個錯誤。 在我的情況下,解碼器的默認最大長度是 1024。

希望這可以幫助某人

暫無
暫無

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

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