[딥러닝 홀로서기] Lab12. Run Pytorch on GPU

YJ·2024년 10월 15일
1

딥러닝 홀로서기

목록 보기
12/24
post-thumbnail

이 블로그글은 2019년 조재영(Kevin Jo), 김승수(SeungSu Kim)님의 딥러닝 홀로서기 세미나를 수강하고 작성한 글임을 밝힙니다.

💡 도움이 되셨다면 ♡와 팔로우 부탁드려요! 미리 감사합니다.

Run Pytorch on GPU

CPU vs GPU

  • CPU는 느리고 GPU는 빠르다???

아키텍쳐

  • ALU : 산술연산처리장치
    • CPU의 경우 : 복잡한 연산을 처리하기 위한 강력한 코어를 가진다.
    • GPU의 경우 : 수천 개의 작은 ALU로 구성되어 단순한 수학 연산(e.g. 대규모 행렬, 벡터 연산)을 동시에 대량으로 수행하는데 최적화되어있다.

GPU가 왜 빠른가?

  • 원래 게임이나 그래픽을 랜더링하기 위해 사용하기 위해 설계 되었다.
    • 행렬 연산을 하는데 최적화되어 있음
  • CPU로 행렬 연산을 하려면 for문으로 일일이 실행해야한다.
    • GPU의 경우에는 이를 병렬로 처리가 가능하다.

GPU vs CPU 산술 연산 속도 비교 그래프

  • GPU가 CPU에 비해 몇 배나 빠르다.

💡 CPU와 GPU는 서로 다른 목적을 위해 설계된 처리 장치이다.

CPU

  • 범용 처리 장치
  • 복잡한 작업을 하나씩 차례대로 처리하는 데 적합한 구조를 가지고 있다.
  • 일반적으로 코어 수가 적고, 각 코어가 매우 강력한 연산을 처리할 수 있지만, 병렬 처리 능력은 제한적이다.

GPU

  • 대규모 병렬 처리에 최적화된 장치
  • 수천 개의 코어로 구성되어 있어 한 번에 많은 작업을 동시에 처리할 수 있다.
  • 특히, 그래픽 처리와 같은 병렬 처리가 중요한 작업이나 딥러닝, 과학 계산에서 GPU는 매우 빠른 성능을 발휘한다.

따라서 CPU는 복잡한 논리적 연산을 처리하는 데 적합하고, GPU는 병렬 작업이 많은 연산을 빠르게 수행하는 데 적합하다고 볼 수 있다.

GPU를 Pytorch에서 사용하는 방법

모델

model = MLPModel(784, 10, [1000])
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
  • model.to(device) : 모델을 특정 장치(device)로 이동시키는 명령
    • ‘cuda:0’ : GPU 선택 ( '0'은 첫 번째 GPU 장치를 가리킴)
    • ‘cpu’ : CPU 선택

데이터

input_X = input_X.to(device)
true_y = true_y.to(device)
input_X = input_X.squeeze()
input_X = input_X.view(-1, 784)

pred_y = model(input_X)
  • input_Xtrue_y데이터들을 .to(device)를 CPU에서 GPU로 이동시켜야함

손실함수

cirterian = nn.MSELose()
criterian = criterian.to(device)
  • criterion.to(device) : 손실 함수를 특정 장치(device)로 이동시키는 명령
  • 대부분 필요는 없지만 loss에 따라 device dependent할 수 있다.

💡 torch에서 사용 가능한 GPU 개수 확인하는 법

import torch

if torch.cuda.is_available():
    print(f"사용 가능한 GPU 개수: {torch.cuda.device_count()}")
else:
    print("GPU가 없습니다.")

💡 GPU 텐서를 .numpy()로 변환하는법

1번 방법

loss = cls_loss(pred_y.squeeze(), true_y)
loss = loss.detach().cpu().numpy() 
  • GPU에 있는 텐서를 NumPy 배열로 변환하려면 .cpu() 메서드를 사용하여 CPU로 이동시킨 후 .numpy()를 호출해야 한다.
    • .numpy()PyTorch의 텐서 클래스의 메서드로 PyTorch 텐서를 NumPy 배열로 변환한다.

2번 방법

loss = cls_loss(pred_y.squeeze(), true_y)
loss = loss.detach().cpu().numpy() 
  • loss.item()만 호출한다.
    • item()는 tensor 객체에 포함된 스칼라 값을 Python의 기본 float 타입으로 값을 반환 (tensor 값이 스칼라 값일때만 오류없이 동작)

두 경우 모두 loss값이 일반적으로 스칼라 값이므로 동일하게 동작한다.

profile
제 글이 유익하셨다면 ♡와 팔로우로 응원 부탁드립니다.

0개의 댓글

관련 채용 정보