티스토리 뷰

딥러닝을 처음 공부할때 나를 정말 힘들게 했던 에러다...하지만 차근차근 생각해보니 쉽게 해결할 수 있는 에러였다. 

 

먼저, CPU와 GPU는 엄연히 다른 기기이다. 메모리 공간이 분리되어 있기 때문에 CPU에 있는 텐서와 GPU에 있는 텐서를 비교할 수 없는 것이다. 그래서 우리가 텐서끼리의 연산을 할 때 반드시 같은 기기인지 확인을 해야한다. 

 

1. 텐서끼리 같은 기기에 있는지 확인해보자.

텐서가 CPU에 있는지 GPU에 있는지 확인하기 위해서 is_cuda()함수를 사용한다.

 

# CPU에 있는 텐서 
t = torch.randn(2,2)
t.is_cuda  # returns False

# GPU에 있는 텐서
t = torch.randn(2,2).cuda()
t.is_cuda  # returns True

False라면 .cuda()로 GPU에 싣어준다. 

t = torch.randn(2,2)
t.is_cuda  # returns False
t = torch.randn(2,2).cuda()
t.is_cuda  # returns True

 

또는 .to() method를 사용하는 방법도 있다.

y = x.to(device. dtype=torch.float64)
  • 그 외에도 기기는 .cpu(), .cuda()로 기기를 변경할 수 있습니다.

 

이렇게 해서 해결이 나지 않는다면 다른 여러 이유를 생각해볼 수 있다. 

  • 연산시 CPU Tensor와 GPU Tensor를 같은 device로 통일했는가? # 이미 해봄
  • data가 Tensor로 변환이 되는 data인가? => 이걸 해보자.
  • 연산하고 있는 Tensor간 data type이 같은가?

2. Data가 Tensor로 변환이 안되고 있을 수 있다.

torch.as_tensor 함수를 사용해서 data type을 tensor로 바꿔보자.

y = torch.as_tensor(x, dtype=torch.half, device='cpu')
device = torch.device("cuda")
x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.int32, device=device)
  • 자료형은 .half(), .float(), .double()로 변경할 수 있다. 

 

3. 연산하고 있는 Tensor간 data type이 같은지 확인해보자.

print(x.dtype)

으로 확인해서 연산하려고 하는 텐서의 데이터 타입이 다르다면, 2번 방법을 사용해서 데이터 타입을 바꿔주자!

 


 

저는 이정도 선에서 해결이 다 되었는데

혹시 해결 안되시는 분은 댓글로 남겨주시면

같이 고민해 드리겠습니다 :)

 

댓글로 남기실때는 각 텐서의 타입, 기기를 명시해주시면 디버깅이 빠릅니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함