[PyTorch] RuntimeError: CUDA error: device-side assert triggered 오류 해결
⚠️ 클래스의 개수와 관련된 코드에서 주로 발생하는 오류! ⚠️
RuntimeError: CUDA error: device-side assert triggered
누가 봐도 GPU 관련 에러처럼 보이는 위 에러는 사실 차원(dimension) 에러입니다.
즉 텐서의 shape(size)이 맞지 않는다는 뜻이지요.
다른 분들이 남긴 trouble shooting 기록을 보면 모델의 입출력 사이즈를 맞춰주지 못해서 발생한 에러였다,
class index를 잘못 설정해줬다, 등등 차원과 관련된 문제임을 알 수 있습니다.
상황이 다 다를 수 있기 때문에 확언할 수는 없지만, 종합적으로 내용을 합쳐보면 '클래스의 개수'에 따라 문제가 발생하는 경우가 많았습니다.
즉 multi-class classification, 혹은 그와 유사한 상황에서 주로 발생하는 오류라는 것이죠.
저의 경우에는 cross entropy loss 함수에서 오류가 발생했습니다.
cross entropy loss는 (predictoin, target)을 입력으로 받는데, 모델이 기대하는 것과 다른 차원의 텐서가 입력으로 주어지면서 에러가 발생한 것이죠.
좀 더 자세히 설명하면 제가 정의한 모델의 forward 함수에 의해 반환되는 output의 차원이, target의 class 개수와 일치하지 않았던 것입니다.
예를 들어 10개의 클래스로 구분하는 태스크였다고 한다면, output도 이것과 동일한 10차원 텐서를 반환하여 CELoss를 계산해야 하는데, 제가 잘못 판단한 바람에 12차원 텐서가 반환되고 있었던 것이죠.
따라서 위 에러를 만나게 되시는 경우, 클래스의 개수와 관련해서 문제가 발생할 수 있는 코드상 위치가 어디인지 파악해보는 것을 권장드립니다.
일반적으로 발생하지 않는 오류이기 때문에, 임의로 차원이나 값을 조작한 부분에서 발생한 오류일 가능성이 굉장히 높고, 그중에서도 모델의 출력이나 loss function에 주어지는 입력 등을 중심적으로 살펴보면 도움이 될 것 같습니다.
참고 사이트 : https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
참고 블로그 1 : https://brstar96.github.io/devlog/shoveling/2020-01-03-device_error_summary/
참고 블로그 2 : https://mopipe.tistory.com/180
참고 블로그 3 : https://ndb796.tistory.com/509