오뚝이개발자

RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling `cublasSgemm 에러 해결 본문

AI/AI 개발

RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling `cublasSgemm 에러 해결

땅어 2022. 7. 9. 14:41
728x90
300x250

 

Error 발생 상황


모델 학습을 돌리다보면 다음과 같은 에러를 종종 만나게 된다.

device-side assert triggered
Assertion `srcIndex < srcSelectDimSize` failed.
RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling `cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)`

 

Error의 원인


GPU단에서의 에러 메시지는 이처럼 자세한 이유를 드러나지 않아 디버깅이 쉽지 않다. 위와 같은 에러의 원인은 대게 차원(dimension)이 일치하지 않아 발생하는 문제이다. 즉, input으로 모델에 주입하는 데이터의 차원과 모델의 차원이 일치하지 않는 경우이다. 예컨대, input 데이터의 차원은 1025인데 model의 차원이 1024인 경우 위와 같은 에러가 발생한다. 비슷한 예시로는 classification을 할 때에 데이터의 클래스가 모델의 마지막 layer에서 정해둔 차원수(클래스 갯수)와 일치하지 않는 경우도 위 에러가 발생할 수 있다.

 

나의 경우


Device side의 에러는 워낙 원인이 다양한지라...내가 직접 실험을 돌리며 해결한 사례를 아래에 예시로 설명하고자 한다. 나의 경우 huggingface의 transformers를 사용해 distilbart 모델로 text generation을 하는 task를 학습 중이었다. 그런데 위와 같은 에러가 발생하였고, 분석해보니 모델의 차원 수보다 더 큰 차원의 text를 생성하도록 한 것이 원인이었다는 사실을 알게 되었다.

아래는 내가 사용한 모델의 config.json 파일 내용이다. 모델에서 사용하는 변수들에 대한 정보가 담겨져 있다. 모델의 이름은 sshleifer/distilbart-xsum-9-6이었고 d_model=1024로 해당 모델의 차원이 1024라는 것을 알 수 있다. 

model config 파일

모델을 직접 다운받아 사용하지 않는 경우라면 아래와 같이 허깅페이스 사이트에서 해당 모델의 default configuration을 볼 수 있다.

huggingface model configuration

나의 경우는 text를 generation하는 task를 학습시키고 있었고 내 용도에 따라 모델의 최소, 최대 생성길이를 별도로 설정해주었다. 별문제가 없을 거라고 치부해 그냥 충분히 긴 텍스트를 생성하도록 model.config.max_length=2000으로 설정해주었는데 이는 모델의 최대 텍스트 생성 길이를 2000으로 한다는 것이다.(설마 2000이나 되는 길이의 텍스트를 생성할 일이 있겠어....하면서 말이다...) 일부 데이터 샘플 중 길이 1024 이상으로 text generation이 되는 것들이 있었고 이에 따라 학습 도중 위와 같은 에러가 나면서 학습이 중단되었다.따라서, model config값에서 model.config.max_length의 값을 모델의 차원과 같은 1024로 해주었더니 에러를 해결할 수 있었다.

 

결론


결론은 위와 같은 에러를 만나면 우선 모델의 layer들의 차원과 데이터의 차원 간에 불일치하는 곳이 없는지 살펴보는 것이 중요하다. 중간 층(intermediate layer)에서 문제가 발생하는 경우는 거의 없는 것 같고, 대부분 처음 layer(data가 주입되는 layer)나 마지막 layer를 살펴보면 된다. 처음 layer에서 문제인 경우 데이터의 차원 수와 모델의 차원 수가 맞지 않아서인 경우가 많고, 마지막 layer에서 문제인 경우는 대게 자신이 설정한 모델의 output 값(결국 마지막 layer의 차원 수가 되는 값)이 feeding해주는 데이터와 일치하지 않아서인 경우가 많다.

 

 

 

728x90
300x250
Comments