recon_show = reconstructed[i, 0].clamp(0, 1).detach().cpu().numpy() # unnormalize 생략
구조 자체(shape, dtype, 논리적으로 담고 있는 값)는 완전히 같아요. 다른 건 데이터가 물리적으로 어디에 저장되어 있고, 어떤 하드웨어가 그 값을 계산하느냐입니다.
같은 점
shape, dtype(예: float32), 텐서 안의 값 자체는 동일다른 점
| CPU 텐서 | GPU/MPS 텐서 | |
|---|---|---|
| 메모리 위치 | 시스템 RAM | GPU(또는 Apple Silicon의 MPS) 전용 메모리 |
| 연산 처리 | CPU 코어 | GPU 코어(병렬 연산에 특화) |
| numpy 변환 | 바로 가능 (.numpy()) | 불가능 — 먼저 .cpu()로 옮겨야 함 |
| 속도 | 순차 연산에 유리 | 대규모 행렬/병렬 연산에 훨씬 빠름 |
왜 .numpy()가 GPU 텐서에서 바로 안 될까?
numpy는 시스템 RAM에 있는 데이터만 다룰 수 있는 라이브러리예요. GPU(MPS) 메모리는 CPU가 직접 접근할 수 없는 별도의 메모리 공간이라서, numpy가 그 데이터를 읽으려면 먼저 누군가 "GPU 메모리 → 시스템 RAM"으로 복사해줘야 합니다. .cpu()가 바로 그 복사 작업을 하는 거예요.
tensor_gpu = torch.randn(3, 3, device='mps')
tensor_gpu.numpy() # ❌ 에러: MPS 메모리는 numpy가 못 읽음
tensor_gpu.cpu().numpy() # ✅ 먼저 시스템 RAM으로 복사 후 변환
비유하자면, GPU 메모리는 옆 건물 창고, CPU(RAM)는 지금 서 있는 사무실이라고 보면 됩니다. numpy는 사무실 안에 있는 물건만 볼 수 있는 도구라서, 창고에 있는 물건(GPU 텐서)을 쓰려면 먼저 사무실로 옮겨(.cpu()) 와야 하는 거죠.