-
[이거 어떡하지] RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`원인 및 해결법(pytorch)Pytorch 2021. 6. 5. 03:02
pytorch로 딥러닝 모델을 설계후 학습을 진행하다보면
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`
라는 메시지가 발생할 때가 있습니다. CUDA 관련된 문제로는 속썩을 만한 타이밍이 아닐때 해당 코드를 보게 되어 난처하실 경우가 많을 것입니다.
원인 및 해결책:
GPU로 학습하는 환경에서 설계하신 모델에 torch.nn.Embedding()이 포함되어 있으실 것입니다.
torch.nn.Embedding(num_input, output_dimension)
num_input이 입력하는 token의 종류 수가 될 것인데 예를 들어 num_input이 128인경우 입력으로 0~127까지의 int형 정수가 아닌 128 이상의 정수값이 들어갈 경우 위와 같은 오류를 발생시키게 됩니다.
학습할 모델에 들어가는 입력을 확인하여 torch.nn.Embedding 의 첫번째 argument 이상의 값을 forward에서 입력하게 된다면 확인해보고
- Initialize 단계에서 torch.nn.Embedding의 첫번째 argument값을 입력 후보 중 최대값만큼 높이거나
- 오류를 일으키는 정수 입력이 들어가는 것을 확인하여 범위내의 정수 입력만을 Embedding에 입력하여야 합니다.
그런데 왜 이런 식으로 에러가 발생할까요?
"Embedding에 입력을 32까지만 받게 코딩해놓고 75를 입력으로 넣고 잘 돌아가길 바라신다니.."
이런 식으로 뜨면 참 쉬울텐데 말입니다.
세부적인 원리로 들어가서 살펴보면 원인은 아래 "더보기"를 눌러 확인해주세요.
더보기- torch.nn.Embedding(arg1:int, arg2:int)을 선언하는 것은 {arg2} dimension의 벡터를 {arg1}개 만들어놓는 것입니다.
- 에러가 없는 상황에서 forward 함수에서 입력으로 0에서 {arg1}-1 사이의 숫자를 받으면 그 숫자번째에 해당하는 벡터를 내보내주는 것입니다.
- 메모리 안을 살펴보게 되면 이 torch.nn.Embedding이 선언될 때 {arg1} × {arg2} × {4 byte}만큼을 차지하게 되며 GPU에 올려질 때 GPU 메모리 중 임의의 여유공간에 {arg1} × {arg2} × {4 byte}를 올리게 되고, 해당 메모리의 제일 첫번째 주소를 Embedding이 기억해둡니다.
- forward 함수에서 0 ≤ n <{arg1}인 정수 n이 들어오게 되면 {Embedding에서 저장해둔 메모리 주소} + n × ({arg2} × {4 byte})의 위치를 참조하여 {arg2} × {4 byte} 의 메모리를 불러와서 Float vector 형태로 결과를 내보내게 됩니다.
- 만약 n ≥ {arg1}인 값이 들어온다면 GPU내에서 Embedding으로 사용되는 부분이 아닌 랜덤한 쓰레기 값이 저장되어 있는 메모리 지점을 참조하게 될 것이며, 정상적인 경우엔 참조되어서는 안 될 해당 메모리 주소가 참조될 때 CUDA에서 자동으로 error를 반환해주도록 설계되어 있기 때문에 CUDA error를 발생시키게 됩니다.
도움이 되셨길 바랍니다. 감사합니다.
'Pytorch' 카테고리의 다른 글