본문 바로가기
ML & DL/Deep Learning with PyTorch

[PyTorch] 텐서를 GPU로 옮기기 & 텐서를 넘파이(Numpy)로 바꾸기

by Glory_Choi 2023. 2. 28.
반응형

https://product.kyobobook.co.kr/detail/S000061353646

 

파이토치 딥러닝 마스터 | 엘리 스티븐스 - 교보문고

파이토치 딥러닝 마스터 | 파이토치 핵심 개발진이 직접 집필한 책으로, 최고 실무자가 바로 옆에 앉아서 딥러닝의 기초부터 실제 프로젝트 활용까지, 모델 성능 평가와 개선 방안을 차근차근

product.kyobobook.co.kr

이 글은 파이토치 딥러닝 마스터를 정리한 내용입니다.

 

지금까지 살펴본 텐서 저장 공간은 CPU 메모리에 대한 것이다. 파이토치의 텐서는 CPU 외 다른 프로세서인 GPU를 위한 메모리 공간에도 저장할 수 있다. 모든 파이토치 텐서는 여러 GPU 중에 특정 GPU 메모리 영역으로 이동할 수 있고 이렇게 대량 병렬 처리 연산을 빠르게 할 수 있다. 이때의 텐서 연산은 파이토치가 지원하는 GPU 전용 루틴을 사용한다.

 

텐서 디바이스 속성 관리

dtype 외에 파이토치의 Tensor는 device라는 인자로 텐서 데이터가 실제 컴퓨터의 어디에 위치 할지도 지정할 수 있다. 다음은 생성자에 device 인자를 지정하여 텐서를 GPU에 만드는 방법이다.

또한 CPU에 만들어진 텐서를 to 메소드를 활용해 GPU로 이동할 수 있다.

이렇게 해서 숫자값이 동일한 새 텐서를 받을 수 있는데 이 텐서가 위치하는 장소는 일반 시스템의 RAM이 아닌 GPU의 RAM이다. 이제 GPU에 데이터가 저장되었으니 앞에서 설명했던 것 처럼 수학 연산이 얼마나 빨라지는지 확인해보자. 

대부분의 경우 CPU에 있는 텐서나 GPU에 있는 텐서 모두 동일한 사용자 API를 제공하기 때문에 복잡한 대량의 숫자 연산이 일어나는 정확한 장소에 상관없이 코드 작성이 훨씬 더 쉬워진다.

위의 points는 CPU에서 실행하는 곱셈이고, points_gpu는 GPU에서 실행하는 곱셈이다.

GPU에서 실행하는 곱셈의 경우 계산 완료 후 CPU 영역으로 옮겨지지 않으니 주의하자. 위의 코드의 두번째 줄은 다음 단계를 실행한다.

  1. points 텐서를 GPU에 복사한다.
  2. GPU에 새 텐서를 할당한 후 곱셈 결과를 저장한다.
  3. GPU 새 텐서 핸들을 반환한다. (핸들 : 주소)

그러므로 만일 우리가 결과에 상수를 더한다면 결과를 다음과 같다.

CPU로 값을 옮기지 않았기 때문에 device가 GPU인것을 확인할 수 있다.

텐서를 다시 CPU로 옮기려면 to 메소드에 cpu인자를 전달해야 한다.

같은 동작을 to 메소드 대신 cpu나 cuda라는 축약 메소드를 사용할 수 있다. 사용법은 다음과 같다.

to 메소드를 사용할 때 장점은 device와 dtype 인자를 동시에 사용해서 데이터 타입과 데이터 위치를 동시에 변경할 수 있다.

 

넘파이(Numpy) 호환

넘파이는 파이썬 데이터과학 생태계에서 매우 독보적이기 때문에 모쪼록 친숙해지기를 강력히 추천한다. 파이토치 텐서와 넘파이 배열의 변환은 매우 효율적으로 이뤄진다. 이런 변환을 통해 파이썬 생태계에서 넘파이 배열 타입을 위해 만들어진 다양한 기능들을 마음껏 누릴 수 있다.

points 텐서를 넘파이 배열로 바꾸는 방법은 다음과 같이 단순하다.

이렇게 하면 원하는 사이즈와 차원 정보, 타입을 가진 다차원 넘파이 배열을 얻을 수 있다. 흥미롭게도 이 배열은 텐서의 저장 공간을 그대로 버퍼로 사용한다. 즉 데이터가 CPU RAM 영역에 있는 한, numpy 메소드를 아무 추가 비용 없이 실행할 수 있다. 넘파이 배열을 수정하면 원래 텐서에도 그대로 적용된다. 만일 텐서가 GPU에 할당되어 있다면 파이토치는 넘파이 배열로의 변환 과정에서 CPU 영역으로 텐서 내용을 복사해서 배열을 만든다.

이번에는 반대로, 넘파이 배열을 파이토치 텐서로 만들어 보자.

 

반응형