티스토리 뷰
MachineLearning
[ML][PyTorch] Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! 에러 해결하기
SweetDev 2021. 10. 31. 21:02딥러닝을 처음 공부할때 나를 정말 힘들게 했던 에러다...하지만 차근차근 생각해보니 쉽게 해결할 수 있는 에러였다.
먼저, 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번 방법을 사용해서 데이터 타입을 바꿔주자!
저는 이정도 선에서 해결이 다 되었는데
혹시 해결 안되시는 분은 댓글로 남겨주시면
같이 고민해 드리겠습니다 :)
댓글로 남기실때는 각 텐서의 타입, 기기를 명시해주시면 디버깅이 빠릅니다.
'MachineLearning' 카테고리의 다른 글
[MachineLearning] 몬테카를로 샘플링이란?(Monte-Carlo Sampling) (0) | 2022.01.19 |
---|---|
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running. 오류 해결하기 (0) | 2021.11.05 |
[ML] PyTorch 기본 함수들 (0) | 2021.10.14 |
[ML] PyTorch Dataset, DataLoader (0) | 2021.10.13 |
[MachineLearning] pytorch register buffer? (0) | 2021.10.11 |