본문 바로가기
오류 해결

[Pytorch] RuntimeError: Expected all tensors to be on the same device

by First Adventure 2024. 9. 22.
반응형

에러 메시지 설명

  PyTorch에서 주로 GPU를 사용하는 환경에서 발생하는 이 오류는 모델 또는 데이터가 서로 다른 디바이스(CPU 또는 GPU)에 할당되어 있을 때 발생합니다. PyTorch는 텐서 연산을 수행할 때, 모든 텐서가 동일한 디바이스에 있어야만 연산이 가능합니다.
 

발생 원인

  • 일부 텐서는 CPU에, 다른 일부는 GPU에 할당된 경우.
  • 학습 데이터나 모델의 일부가 다른 디바이스에 분산된 경우.
  • 명시적으로 텐서나 모델을 GPU로 보내지 않았을 때.
    • 예를 들어, 모델이 GPU에 있지만, 입력 데이터는 CPU에 있을 때 이 오류가 발생할 수 있습니다​.

 

해결 방법

  • 텐서 및 모델을 동일한 디바이스로 이동: 모델과 데이터를 GPU로 이동시키기 위해 .to(device) 메서드를 사용합니다.
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)  # 모델을 GPU로 이동
inputs = inputs.to(device)  # 입력 데이터를 GPU로 이동
labels = labels.to(device)  # 레이블 데이터도 동일한 디바이스로 이동

 

  • 데이터 배치 시 동일한 디바이스로 할당: 데이터 로딩 시에도 GPU와 CPU 간의 불일치가 발생하지 않도록 주의합니다.
for data in dataloader:
    inputs, labels = data
    inputs = inputs.to(device)
    labels = labels.to(device)

 

  • 디바이스 확인 및 일치시키기: 디바이스를 직접 확인하려면 tensor.device 속성을 사용하여 현재 텐서가 할당된 디바이스를 확인할 수 있습니다. 이를 통해 모델과 데이터가 같은 디바이스에 있는지 점검할 수 있습니다.
print(inputs.device)  # 텐서가 어느 디바이스에 있는지 확인
print(model.device)

 

관련 내용 및 추가 팁

  •  오류는 특히 멀티-GPU 환경 또는 CPU-GPU 간의 혼합 환경에서 발생하기 쉽습니다. 분산 학습 시, 모든 프로세스가 동일한 디바이스에서 실행되도록 설정하는 것이 중요합니다. 만약 GPU에서 학습 중이라면, CPU와 GPU 간의 데이터 전송 비용도 성능에 영향을 줄 수 있으니 주의해야 합니다.
  • 모델을 GPU에서 실행할 경우, 모든 입력 데이터와 레이블도 GPU로 이동시키는 것이 좋습니다.
  • 데이터가 여러 디바이스에 분산되는 것을 방지하기 위해 코드를 주기적으로 점검하고, 디바이스 일관성을 유지하세요.
반응형