CUDA랑 관련된 오류가 날 상황이 아닐 때 RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling cublasCreate(handle) 이 오류를 보았는가? 보통은 CUDA 오류가 뜰 만한 짓을 하지 않았는데도 이런 오류가 떠서 당황스러울 수밖에 없다. 심지어 이 오류는 어디에서 발생하는지 명확하게 표시해주지 않아서 사람의 멘탈을 붕괴시킨다. 그럼 어디에서 해결할 수 있을까? 같이 알아보자!
에러가 나는 코드 어딘가에는 torch.nn.Embedding이 사용되었을 것이다. 이것이 에러의 핵심이다.
torch.nn.Embedding에서는 첫 번째 인자로 num_embeddings, 두 번쨰 인자로 embedding_dim을 받는다.
이렇게 선언하게 되면 GPU 메모리에 4 byte * num_embeddings * embedding_dim만큼의 공간이 할당된다. 그런데 이때 forward 함수에서 num_embedding보다 작은 값을 받으면 정상적으로 값을 참조할 수 있지만, num_embedding 이상의 값을 받게 되면 이 공간을 벗어나는 지점의 값을 참조하게 된다. 즉 초기화 되지 않은 쓰레기 값을 참조하게 되는 것이다.
CUDA에서는 쓰레기 값을 참조하는 것을 방지하기 위해 에러를 보이는 것이다.
나의 경우 nn.Embedding(vocab_size, input_size) 이런 식으로 모델을 정의한 부분이 있었는데 vocab_size를 input이었던 네이버 영화리뷰 데이터에 비하여 매우 작은 값으로 설정하여 오류가 발생했었다! 이를 vocab_size=10000으로 설정하니 해결되었다.
(vocab_size=8000 이상만 해도 된다고 했는데 딱 8000하니까 오류가 나서 10000으로 했다)
이 오류가 발생한 상황에서 다른 코드를 실행하게 되면 다른 CUDA 에러가 발생하였다.

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.
Compile with TORCH_USE_CUDA_DSA to enable device-side assertions.
이 오류는 다른 블로그를 찾아보니 classification 수행 도중 class 수가 맞지 않을 때 발생하는 오류라고 했는데 나의 경우는 그것이 아니라 앞서 발생한 CUBLAS_STATUS_NOT_INITIALIZED 오류 때문에 CUDA가 계속 에러를 발생시키는 것 같았다. (확실한? 사유는 모르겠다..) 이 경우 코랩을 다시 실행하고, CUBLAS_STATUS_NOT_INITIALIZED 오류를 해결하였더니 더이상 발생하지 않았다.