본문 바로가기
오류 해결

[Pytorch] TypeError: can't convert CUDA tensor to numpy

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

에러 메시지 설명

  이 오류는 CUDA 텐서(GPU 텐서)를 NumPy 배열로 직접 변환하려고 할 때 발생합니다. GPU 텐서는 CUDA 장치에 저장되며, NumPy는 CPU 메모리에서 동작하기 때문에, PyTorch에서 GPU 텐서를 바로 NumPy 배열로 변환할 수 없습니다.

 

발생 원인

  • GPU 텐서를 NumPy로 변환 시도: PyTorch의 텐서가 GPU에 할당된 상태에서 바로 numpy() 메서드를 호출할 경우, 메모리 위치가 다르기 때문에 변환할 수 없다는 오류가 발생합니다.
  • CPU에서만 NumPy 변환 가능: NumPy는 CPU 기반 라이브러리이므로, GPU에서 계산되는 텐서 데이터를 변환하려면 먼저 GPU에서 CPU로 이동해야 합니다​.

 

해결 방법

  • GPU 텐서를 CPU로 이동 후 변환: 먼저 GPU에 할당된 텐서를 CPU로 이동시킨 후, numpy() 메서드를 호출해야 합니다.
tensor_cpu = tensor.to('cpu')  # 텐서를 CPU로 이동
numpy_array = tensor_cpu.numpy()  # NumPy 배열로 변환

 

  • 조건문을 이용한 변환: 코드에서 텐서가 CPU에 있는지 GPU에 있는지 확인하고, GPU에 있으면 CPU로 이동시킨 후 NumPy 변환을 수행해야 합니다.
if tensor.is_cuda:
    tensor = tensor.cpu()
numpy_array = tensor.numpy()

 

  • 연산을 CPU에서만 수행해야 하는 경우: NumPy와의 호환성을 고려해, GPU가 필요하지 않은 연산은 처음부터 CPU에서 수행하도록 설계할 수 있습니다.
tensor = torch.tensor([1.0, 2.0, 3.0], device='cpu')  # CPU 텐서로 생성
numpy_array = tensor.numpy()  # 바로 변환 가능

 

관련 내용 및 추가 팁

  • 이 오류는 주로 PyTorch 텐서를 NumPy 배열로 변환하려는 시도에서 발생합니다. PyTorch 텐서가 GPU에 있을 때는 NumPy가 이를 처리할 수 없기 때문에, CPU로 이동시켜야만 변환할 수 있습니다.
  • GPU 텐서를 바로 numpy()로 변환하려고 하지 말고, 먼저 CPU로 이동한 후 변환하는 것을 습관화하세요.
  • 텐서 연산 중 NumPy가 필요한 경우는 CPU에서 처리하도록 설계하는 것이 좋습니다.
반응형