관리 메뉴

A seeker after truth

pytorch "Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!" 에러 해결 본문

Data

pytorch "Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!" 에러 해결

dr.meteor 2020. 12. 10. 23:40

별 에러도 아닌데 해결한다고 많은 시간이 들어갔다.

 

때문에 pytorch 를 돌릴 때 gpu, cpu 각각에 작업을 분할해서(?) 한다는 사실이라던지

cpu, gpu 위에 올라가는 텐서 정의가 따로 있다던지

코어 라이브러리 코드, 공식 문서, 여러 에러 디버깅 질답사이트 등을 탐독했지만

 

정말 간단하게 해결됐다. 이것도 그냥 해본건데, 우연히 잘 되더라.

 

원래

 

model = Model()

...

model = model.cuda()

criterion = criterion.cuda()

 

 

와 같이 코드가 되어있었는데, 이를

 

model = Model().cuda()

이거 한줄로 바꿨더니, 걍 바로 해결됐다. ㅠㅠㅠㅠ 착안한 코드가 있는데, 위쪽에 다른 코드는 이렇게 되어있길래 혹시나 해서 이렇게 해봤더니 잘 되더라...

 

 

다만, 도움이 됐던 자료 몇 개를 소개하자면

1. 아까 말했던 것처럼 cpu, gpu 둘다 사용한다는 것과 텐서 정의도 따로 있다는 것

subinium.github.io/pytorch-Tensor-Variable/

 

2. 

subinium.github.io/pytorch-dataloader/

여기서 num_workers, pin_memory 밑에 달려있는 링크도 좋고, 이 파라미터가 무슨 역할 하는지 알수있는 부분도 유용했다.

 

3. pytorch.org/docs/master/optim.html

이 에러 관련한 다른 문답글에서 이 문서의 "Constructing it" 파트를 보라고 했는데, 이 부분과 step, zero_Grad 가 정확히 어떤 것을 반환하고 어떤 역할을 하는지를 보고서야 마침내 코드에서 어떤 부분이 cpu 텐서로 넘어가서 문제가 생길만한 부분이었을지 예상을 했다.

optimizer.Adagrad 에서 에러가 난건 확실한데, 변수 중에서도 "model" 이라고 정의된 부분이 문제가 생길 부분이라는 것을 눈치챈 것.