CPU와 GPU의 경계는 분명해
PyTorch 텐서는 특정 장치에 올라가 있어. 어느 장치에 있는지는 x.device로 확인할 수 있어. 텐서끼리 연산하려면 두 텐서가 같은 장치에 있어야 하고, 다른 장치로 옮길 때는 .to(device)를 명시적으로 호출해야 해. 이걸 놓치면 PyTorch 입문자가 가장 흔히 마주치는 오류인 Expected all tensors to be on the same device가 발생해.
학습 속도를 높이려면 모델과 데이터가 모두 GPU에 있어야 해. 모델은 시작할 때 한 번 옮기고, 데이터는 학습 루프에서 배치마다 옮겨. 출력 텐서는 출력하거나 PyTorch가 아닌 후속 코드에 넘기려고 직접 가져오기 전까지 GPU에 그대로 남아 있어.
.to(device)를 둘 곳은 3군데야. 시작할 때 모델에 한 번, 학습 루프에서 입력 배치마다 한 번, 손실을 출력하고 싶을 때 손실 텐서에 한 번 써. 스칼라는 .item()으로 Python에 가져오면 돼. 그 밖의 거의 모든 텐서는 GPU에 그대로 두면 돼.알맞은 장치 고르기
NVIDIA, Apple Silicon, CPU 대체 경로라는 흔한 3가지 경우는 아래 코드의 한 줄로 처리할 수 있어. Apple MPS 백엔드는 많은 작업에서 빠르지만, 가끔 지원하지 않는 연산이 있어. 이때 NotImplementedError가 나오면 upstream에 신고해.
다중 GPU와 분산 학습
한 머신에서 여러 GPU를 쓸 때는 torch.nn.parallel.DistributedDataParallel (DDP)을 사용하고 torchrun으로 실행해. 여러 머신에서도 같은 DDP API를 쓰지만 실행 스크립트가 달라져. 더 높은 수준의 도구가 필요하면 Hugging Face accelerate launch로 반복 설정 코드를 감출 수 있어.