이 블로그글은 2019년 조재영(Kevin Jo), 김승수(SeungSu Kim)님의 딥러닝 홀로서기 세미나를 수강하고 작성한 글임을 밝힙니다.
💡 도움이 되셨다면 ♡와 팔로우 부탁드려요! 미리 감사합니다.
💡 CPU와 GPU는 서로 다른 목적을 위해 설계된 처리 장치이다.
CPU
- 범용 처리 장치
- 복잡한 작업을 하나씩 차례대로 처리하는 데 적합한 구조를 가지고 있다.
- 일반적으로 코어 수가 적고, 각 코어가 매우 강력한 연산을 처리할 수 있지만, 병렬 처리 능력은 제한적이다.
GPU
- 대규모 병렬 처리에 최적화된 장치
- 수천 개의 코어로 구성되어 있어 한 번에 많은 작업을 동시에 처리할 수 있다.
- 특히, 그래픽 처리와 같은 병렬 처리가 중요한 작업이나 딥러닝, 과학 계산에서 GPU는 매우 빠른 성능을 발휘한다.
따라서 CPU는 복잡한 논리적 연산을 처리하는 데 적합하고, GPU는 병렬 작업이 많은 연산을 빠르게 수행하는 데 적합하다고 볼 수 있다.
모델
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_X
와 true_y
데이터들을 .to(device)
를 CPU에서 GPU로 이동시켜야함손실함수
cirterian = nn.MSELose()
criterian = criterian.to(device)
criterion.to(device)
: 손실 함수를 특정 장치(device
)로 이동시키는 명령💡 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값이 일반적으로 스칼라 값이므로 동일하게 동작한다.