"통합 메모리는 'PCIe를 건너뛰는' 게 아니야. PCIe가 토큰당 경로 위에 있는 경우 자체를 없애는 거지."
로드 시점: 건넘 한 번
외장 GPU가 있는 기계에서 모델의 삶은 호스트 메모리에서 시작해. CPU가 디스크에서 RAM으로 읽고, 그다음 cudaMemcpy 같은 호출로 호스트 버퍼에서 장치 버퍼로, PCIe 버스를 건너 카드 자체 메모리로, 딱 한 번 옮겨. 프레임워크는 전송이 버스 최고 속도로 돌 수 있게 호스트 페이지를 먼저 고정할 수도 있어. PCIe 5.0 x16이면 63 GB/s쯤이라서 14 GB 모델은 0.25초에, 60 GB 모델은 카드가 담을 수만 있다면 1초에 도착해. 잘 들어간 모델이 하는 복사는 이게 유일해. 그 뒤의 전부는 카드 안에서 일어나.
디코드: 들어가면 건넘 0회
생성되는 토큰마다 모든 가중치를 한 번 읽고(물리 트랙의 토큰당 바이트) 지금까지 쌓인 KV 캐시를 읽고, 새 캐시 몇 킬로바이트를 써. 외장 카드에선 그 트래픽 전부가 VRAM 속도의 VRAM 트래픽이야. RTX 5090이면 1,792 GB/s. 버스는 토큰 id 하나 들어가고 로짓이나 샘플된 토큰 하나 나오는 몇 바이트만 실어. CPU는 몰기만 하고 루프엔 없어. 외장 카드가 맥을 그냥 이기는 경우가 이거고, 이웃 퀘스트가 통합 메모리는 'PCIe를 완전히 건너뛴다'고 쓴 문장의 정직한 판은 이래. 모델이 VRAM에 들어가면 PCIe는 애초에 토큰당 경로에 없었고, 건너뛸 게 없다.
디코드: 안 들어가면 넘친 레이어마다 토큰당 건넘 한 번
모델이 안 들어가면 llama.cpp 같은 런타임은 몇 레이어를 GPU로 보내고 나머지를 CPU에 남길지 정하게 해. 호스트에 남은 레이어는 CPU가 호스트 메모리에서 계산하고, 그 활성값이 토큰마다 양방향으로 버스를 건너. 작은 전송이지만 동기 전송이고, 호스트 쪽 레이어는 행렬 처리량이 훨씬 낮은 프로세서에서 호스트 메모리 대역폭으로 돌아. 아니면 런타임이 가중치를 호스트 메모리에 두고 넘친 레이어의 가중치를 토큰마다 버스로 스트리밍할 수도 있어. 2번 트랙의 토큰당 63 GB/s 경로야. 어느 쪽이든 토큰당 비용에 이제 경계가 포함되고, 카드 자체 대역폭은 더는 중요한 숫자가 아니야. 코드 블록이 토큰 하나를 세 경우 모두 걸어 보내고 바이트마다 어디로 갔는지 찍어.
NVIDIA 자체 '통합 메모리'는 이게 아니야
CUDA엔 10년 전부터 통합 메모리라는 기능이 있어. cudaMallocManaged. CPU와 GPU에 주소 공간 하나를 주고 호스트 메모리와 VRAM 사이에서 요청에 따라 페이지를 옮겨. 같은 두 메모리, 같은 버스 위의 편의 기능이야. GPU의 페이지 폴트는 여전히 PCIe로 페이지를 끌어와. 애플 배치에 대한 NVIDIA의 진짜 답은 API가 아니라 하드웨어야. Grace Hopper와 Grace Blackwell은 CPU 메모리와 GPU 메모리를 900 GB/s NVLink-C2C 링크 뒤에 두고, DGX Spark의 GB10은 GPU한테 128 GB LPDDR5X를 "일관성 있는 통합 시스템 메모리"로 줘. 경쟁자 트랙이 이걸 진지하게 다뤄. 이 레슨의 요점은 더 좁아. 스펙 시트의 '통합 메모리'라는 말은 페이지 이전 API일 수도, 두 메모리 사이의 일관성 링크일 수도, 물리적 풀 하나일 수도 있고, 만들 복사가 없는 건 마지막 것뿐이야.