본문 바로가기
오류 해결

[Pytorch] RuntimeError: CUDA error: device-side assert triggered

by First Adventure 2024. 9. 21.
반응형

에러 메시지 설명

  이 오류는 PyTorch에서 GPU를 사용해 학습하거나 예측 작업을 수행할 때, GPU 장치에서 발생하는 어설션(assertion) 실패로 인해 발생합니다. 이 오류는 주로 데이터와 모델 설정에서 발생하는 논리적 오류를 GPU가 감지할 때 발생합니다.

 

발생 원인

  • 잘못된 레이블 크기 또는 값: 주로 다중 클래스 분류에서 레이블 값이 범위를 벗어난 경우 발생합니다. 예를 들어, nn.CrossEntropyLoss()를 사용할 때 레이블 값이 클래스 수보다 큰 경우 이 오류가 발생할 수 있습니다.
    • 예: 모델이 10개의 클래스를 예측하는데, 레이블 값이 10 이상일 경우.
      CUDA 비동기 처리: CUDA 작업은 기본적으로 비동기적으로 처리되므로, 오류가 발생했을 때 특정 코드 라인에서 디버깅하기가 어려울 수 있습니다. 비동기적으로 처리되는 작업이 연속적으로 실행되다 보니 디버깅이 어려워질 수 있습니다.
  • 텐서 크기 불일치: 입력 데이터와 모델의 출력이 예상한 크기와 일치하지 않으면 이 오류가 발생할 수 있습니다. 예를 들어, 출력 클래스 수와 레이블의 값이 맞지 않으면 발생할 수 있습니다​.

 

해결 방법

  • CUDA 동기화 및 디버깅: 오류 메시지가 모호하거나 특정 코드에서 디버깅이 어려운 경우, 다음 코드를 사용하여 CUDA 작업을 동기화한 후 오류 메시지를 정확히 확인할 수 있습니다.
torch.cuda.synchronize()  # CUDA 동기화

  또는, 디버깅 모드를 활성화하여 더 많은 디버깅 정보를 얻을 수 있습니다.

 

  • 레이블 값 확인: nn.CrossEntropyLoss를 사용할 때, 레이블 값이 클래스 수 범위 내에 있는지 확인하세요. 예를 들어, 클래스가 10개라면 레이블 값은 0부터 9까지여야 합니다.
print(labels)  # 레이블 값 출력 및 확인

 

  • 디버깅 모드 활성화: PyTorch에서 GPU의 오류를 명확히 파악하려면 CUDA_LAUNCH_BLOCKING 환경 변수를 활성화하여 오류 발생 지점을 정확히 파악할 수 있습니다.
export CUDA_LAUNCH_BLOCKING=1

 

  • 텐서 크기 확인: 모델의 출력 크기와 입력 데이터, 레이블의 크기가 일치하는지 확인합니다. 예를 들어, 예측하는 클래스 수와 레이블의 범위가 맞는지 확인하는 것이 중요합니다.

 

관련 내용 및 추가 팁

  • 이 오류는 GPU에서 발생하는 특수한 문제로, CPU 환경에서 같은 코드가 정상적으로 동작하더라도 GPU에서 문제가 발생할 수 있습니다. 주로 다중 클래스 분류 문제에서 발생하는 경우가 많으며, 레이블의 크기와 모델의 출력 크기가 일치하지 않는 경우가 대표적입니다​.
  • 레이블 값을 항상 출력 클래스의 범위 내에 있도록 유지하세요.
  • CUDA_LAUNCH_BLOCKING=1 환경 변수를 통해 오류를 정확히 추적하세요.
  • 모델의 출력 크기와 레이블의 크기가 일치하는지 자주 확인하세요.
반응형