RuntimeError: CUDA error: device-side assert triggered

해당 오류는 많은 이유에서 발생할 수 있지만, 나의 경우에서는 값을 0으로 나누려는 과정에서 에러가 발생했고, 그리하여 다음과 같은 에러들을 만나게 되었다.

 

RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
/opt/conda/conda-bld/pytorch_1670525552843/work/aten/src/ATen/native/cuda/Loss.cu:92: operator(): block: [0,0,0], thread: [0,0,0] Assertion `input_val >= zero && input_val <= one` failed.
/opt/conda/conda-bld/pytorch_1670525552843/work/aten/src/ATen/native/cuda/Loss.cu:92: operator(): block: [0,0,0], thread: [1,0,0] Assertion `input_val >= zero && input_val <= one` failed.
/opt/conda/conda-bld/pytorch_1670525552843/work/aten/src/ATen/native/cuda/Loss.cu:92: operator(): block: [0,0,0], thread: [2,0,0] Assertion `input_val >= zero && input_val <= one` failed.
/opt/conda/conda-bld/pytorch_1670525552843/work/aten/src/ATen/native/cuda/Loss.cu:92: operator(): block: [0,0,0], thread: [3,0,0] Assertion `input_val >= zero && input_val <= one` failed.

 

 

 

다음과 같이 값을 0으로 나누려는 지점에 학습에 지장주지 않은 엄청 작은 epsilon을 더해 문제를 해결하였다.

    def standardization_norm(self, input_img):
        # epsilon을 더해주지 않으면, 0으로 값을 나누려는 경우가 생겨 device-side assert triggered가 발생할 수 있음.        
        epsilon = 1e-10
        mean_intensity = np.mean(input_img) # 의료 이미지의 평균 intensity 값을 계산        
        std_intensity = np.std(input_img) # 의료 이미지의 표준편차 intensity 값을 계산
        input_img = (input_img-mean_intensity) / (std_intensity+epsilon)
        # input_img /= 10
        
        return input_img

 

 

 

 

참고자료