본문 바로가기
컴퓨터/ML-DL

[TIL] 파이썬 float32, float64 자료형

by 봄여름가을 2023. 10. 13.

문제상황

PyTorch로 간단한 내용을 구현하는 공부를 하다가, numerical gradient와 체크를 해 보니 차이가 크게 벌어지는 현상이 나타났다. 그래서 코드를 잘못 짰으리라고 생각하고 오래 고민하고 이것저것 시도를 해보았으나 고쳐지질 않았다. 그래서 다른 사람이 같은 내용을 구현해 놓은 코드를 가지고 돌려 본 뒤, 문제의 원인이 자료형에 있음을 발견했다. 

 

원인

위의 코드 어딘가에서 $torch.softmax(..., dtype=float32)$로 값을 받아온 게 있었는데, 해당 부분에서는 실제로 float32의 인풋이 이루어졌으나, 뒤에는 보다 정밀한 계산을 위해 float64가 사용되었다. 그러다 보니 에러메시지 "RuntimeError: expected scalar type Double but found Float"가 계속해서 나왔는데, 나는 float64로 바꿔야하는 줄 모르고 모두 강제로 float32로 바꿔주다 보니 의도한 대로 작동하지 않았던 것이다.

 

해결책

dtype=float32 파라미터를 삭제했다.

 

재발방지

  • 일단 float32로 한다고 생각해도 좋을 것 같다. float64는 특수한 경우에만 고려하자.
  • 굳이 자료형을 넘나들어야 한다면 데이터타입을 중간중간에 체크하도록 하거나, 아니면 함수의 파라미터로 넣게 하여 실수를 방지할 수 있다.
  • 내가 했던 것처럼 항상 강제로 변환하는 것은 코드가 복잡해질 때 별로 좋은 방법은 아닌 것 같다.

 

참고사항

float32는 single-precision, float64는 double-precision이다.

double-precision은 훨씬 더 큰 수를 표현할 수 있지만 길이가 두배(32*2 = 64)이기 때문에 메모리도 많이 잡아먹고 무엇보다 연산속도에 영향을 준다. 따라서 정밀한 계산이 필수적이지 않은 딥러닝 분야에서는 float32를 기본적으로 많이 사용한다고 한다.

댓글