하나의 프레임워크에서 여러 실행 장치를 다뤄
PyTorch는 CPU, NVIDIA CUDA, Apple Silicon MPS를 주요 장치로 지원해. AMD용 ROCm과 Intel용 XPU도 있지만 개인 프로젝트에서는 비교적 덜 흔해. 텐서는 항상 정확히 한 장치에 있고, 같은 연산에 들어가는 입력은 모두 같은 장치에 있어야 해. 장치 사이의 이동에는 .to(device)를 사용해.
장치 문자열을 재사용하는 관용 패턴
대부분의 PyTorch 프로젝트는 사용 가능한 가장 좋은 장치를 고른 뒤 그 문자열을 모델과 데이터 전체에서 재사용하는 코드로 시작해:
device = (
"cuda" if torch.cuda.is_available()
else "mps" if torch.backends.mps.is_available()
else "cpu"
)
이 문자열을 모델과 모든 배치의 .to(device)에 넘겨. 'expected cuda:0 got cpu' 오류는 대개 장치로 옮기지 않은 텐서 하나에서 시작돼.
MPS: Apple Silicon 실행 장치
MPS는 표준 연산 대부분을 지원하지만 아직 지원하지 않는 연산도 있어. 이런 연산을 CPU 대체 경로로 실행하려면 PYTORCH_ENABLE_MPS_FALLBACK=1을 설정해야 하고, 사용할 때는 경고가 나타날 수 있어. MPS의 torch.compile 지원은 계속 개선되고 있지만 CUDA만큼 성숙하지는 않아. Apple Silicon에서 최고 성능이 필요하다면 처음부터 통합 메모리를 중심으로 설계된 MLX가 더 적합할 때가 있어.