天天看點

Pytorch問題:device-side assert triggered 未必是标簽越界導緻

詳細報錯資訊如下:
Pytorch問題:device-side assert triggered 未必是标簽越界導緻

關鍵錯誤為:

/pytorch/aten/src/ATen/native/cuda/Loss.cu:106: operator(): block: [73,0,0], thread: [30,0,0] Assertion

input_val >= zero && input_val <= one

failed.

THCudaCheck FAIL file=/pytorch/aten/src/THC/THCCachingHostAllocator.cpp line=278 error=710 : device-side assert triggered

除此之外還有一個錯誤資訊:

loss_base(b)=-inf

錯誤原因分析

  • 錯誤定位:

    網上大多數解決方案均是檢查标簽是否越界,如報錯資訊所知确實說的就是這個問題,有一些童鞋确實是标簽問題,但是也有不是的,比如我。另外我這裡還有一個額外的錯誤資訊就是報錯時的loss值為負無窮,這是不正确的,且必然會導緻程式出錯誤,我不知道标簽越界的那些同學是否有這個錯誤,至少我的有。是以經過排查,我并不是由于标簽越界導緻的,而是由于loss計算中的數學錯誤導緻的該錯誤資訊。

  • 具體原因:

    我的loss計算其中一個過程是這樣的:

    torch.log(torch.sum(F_loss))

    而我在出現上述錯誤地方的loss值為-inf,也就是負無窮大,是以可知

    torch.sum(F_loss)

    的計算結果為0時,0的對數值為負無窮大,是以程式就出現了問題,就導緻了上述報錯。
  • 不過尚不知道為何這個數學問題為何會報這個錯誤資訊。

解決方法

為防止取對數的值為0,需要加一個接近0的值(如:1e-6)就可以了

例如:

torch.log(torch.sum(F_loss) + 1e-6)

另:還會報類似錯誤地其他問題

如:當在兩類别分割中,未在BCELoss前使用torch.sigmoid()輸出時也會報類似錯誤。

RuntimeError: CUDA error: device-side assert triggered

總結

基本上該類問題除了标簽值不正确外,可能大部分與loss計算有關,是以在寫代碼的過程還是要注意下細節,如還有其他不同的問題導緻這個錯誤,歡迎大家評論補充。

繼續閱讀