본문 바로가기
  • Hello_
Deep Learning/Error

[Python_Error] TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

by LDwDL 2023. 2. 20.
728x90
반응형

본 포스팅은 업무 중 발생했던 오류들을 예시를 통해 어떻게 해결을 했는지 작성하고자 합니다.

 

TypeError: can't convert cuda:0 device type tensor to 
numpy. Use Tensor.cpu() to copy the tensor to host 
memory first.

위 오류는 cuda device로 선언된 변수와 cpu device로 선언된 변수들 간에 사칙연산이나 np 함수를 사용할때  발생한 오류입니다.

TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

 

오류가 발생한 경로로 가서 해당 코드만 돌려보면 역시나 문제가 발생합니다.

 

"np.maximum(x1[i] - w1[i] / 2., x2 - w2 / 2.)"에서 오류가 발생했으니, 코드 내에 변수들의 데이터 형태를 살펴봅시다.

x1과 w1이 일반 스칼라 값이며, x2와 w2가 텐서이고 cuda로 감싸져 있습니다.

각 변수 시각화

 

이 변수들을 계산해봅시다. 오류가 발생한 부분에 앞부분은 그대로 스칼라로 반환되며 뒷부분은 tensor로 나옵니다.

시각화

 

자 그럼 이 둘을 np.maximum의 인자들로 넣고 돌려봅시다.

오류 메시지

 

오류가 발생합니다. 해당 오류를 잘 읽어보면 먼저 .cpu() 텐서로 바꿔주고 cuda:0 device 타입의 텐서를 numpy로 바꿔주라고 합니다.

.cpu().item()

 

.cpu를 활용해서 device를 cuda에서 cpu로 바꿔준 뒤, .item을 활용하여 텐서가 아닌 스칼라 값으로 바꿔주면 문제는 쉽게 해결됩니다.

 

만약 스칼라 값이 아닌 리스트가 cuda로 감싸져있다면, 뒤에 .numpy()를 추가하면 변환이 가능합니다.

728x90
반응형

댓글