CPU 스레드, 호스트 메모리, GPU가 PCIe 경로 가까이에 머무르지 않고 서로 다른 비로컬 도메인을 가로질러 통신하면 NUMA 로컬리티가 추론 성능에 영향을 줍니다.
듀얼 소켓 홈 AI 서버는 두 개의 대용량 RAM 풀과 여러 GPU를 하나의 시스템으로 제공할 수 있지만, 모든 메모리 및 장치 접근 비용이 동일한 것은 아닙니다. 한 소켓에 스케줄된 워커가 다른 소켓에 연결된 메모리에서 텐서를 준비한 뒤, 또 다른 PCIe 루트 아래에 있는 GPU로 전송할 수 있습니다. 영향은 모델 배치, 호스트 스테이징, 텐서 병렬 통신, 인터커넥트 토폴로지, 배칭 방식, 그리고 워크로드가 연산 중심인지 전송 중심인지에 따라 달라집니다.
NUMA는 하나의 메모리 풀을 거리에 따른 접근 구조로 바꿉니다
NUMA 시스템에서는 각 CPU 소켓 또는 컴퓨팅 도메인에 특정 코어와 더 가까운 메모리가 있습니다. 소프트웨어는 통합된 전체 용량에 접근할 수 있지만, 원격 접근은 인터커넥트를 거쳐야 합니다. 이 경로는 일반적으로 로컬 메모리와 지연 시간 및 가용 대역폭이 다릅니다.
NUMA 토폴로지는 GPU DMA에도 영향을 줍니다. 호스트 페이지가 GPU의 PCIe 루트 컴플렉스에서 멀리 떨어져 있을 수 있기 때문입니다. CPU 스케줄링과 메모리 배치는 별개의 결정이며, 가상 머신이 이 둘을 정렬하는 데 필요한 호스트 토폴로지를 자동으로 인식하지 못할 수도 있습니다.
호스트 메모리 트래픽이 GPU 연산량에 비해 적을 때는 영향이 작습니다. 하지만 모델 로딩, CPU 오프로딩, 토큰화, 고정 버퍼 복사, 잦은 동기화 또는 VRAM을 초과해 데이터가 외부 메모리로 넘어가는 워크로드에서는 영향이 커집니다. NUMA 용량이 충분하다고 해서 NUMA 로컬리티가 보장되는 것은 아닙니다.
GPU 배치는 모델 경로에 두 번째 토폴로지를 추가합니다
여러 GPU가 서로 다른 CPU 소켓, PCIe 스위치 또는 패키지 내 파티션에 연결될 수 있습니다. 두 가속기 사이를 이동하는 텐서는 직접 피어 경로, 전용 GPU 링크, PCIe 스위치 또는 호스트 메모리와 소켓 간 홉을 거치는 경로를 사용할 수 있습니다. 이러한 경로의 성능은 서로 같지 않습니다.
다중 파티션 GPU에 관한 연구에서는 비균일 접근과 파티션 간 통신이 경합과 커널 지연 시간을 증폭시킬 수 있음을 보여줍니다. 배치 전략은 데이터가 전역적으로 공유되는지, 일부만 공유되는지, 또는 하나의 워크그룹이나 파티션 내에서만 사용되는지에 따라 달라집니다.
모델 파티셔닝은 반복적인 트래픽이 가장 많이 흐르는 토폴로지를 따라야 합니다. 인접한 레이어나 어텐션 상태를 느린 경계 너머에 배치하면 매 토큰마다 통신이 발생할 수 있지만, 통신량이 적은 분할은 거리를 감당할 수 있습니다. GPU 개수만 세고 GPU 간 링크를 매핑하지 않으면 중요한 관계를 파악할 수 없습니다.
텐서 병렬화에서는 로컬리티가 토큰마다 발생하는 비용이 될 수 있습니다
텐서 병렬 추론은 한 레이어 내 연산을 여러 GPU로 나누고 집단 통신을 통해 부분 결과를 결합합니다. 이를 통해 더 큰 모델을 처리하고 더 많은 연산 자원을 활용할 수 있지만, 통신은 여러 레이어와 토큰에 걸쳐 반복됩니다. 따라서 원격 경로는 일회성 모델 로딩 비용이 아니라 지속적으로 발생하는 비용이 됩니다.
텐서 병렬화는 가속기 링크와 샤드 배치가 필요한 동기화를 지원할 때 가장 효과적입니다. 더 느린 NUMA 또는 PCIe 경계를 넘어 GPU를 추가하면 용량은 늘어날 수 있지만, 장치 수만 보고 예상한 것보다 처리량 향상 폭은 작을 수 있습니다.
모델을 각 GPU에 독립적으로 배치할 수 있고 요청을 로컬하게 유지할 수 있다면 데이터 병렬화 또는 요청 단위 배치가 더 나은 선택일 수 있습니다. 하나의 모델이 단일 장치에 들어가지 않을 때는 텐서 병렬화가 필요하지만, 추가된 용량이 속도 향상으로 이어지는지는 배치 크기, 집단 통신 빈도, 인터커넥트에 따라 결정됩니다.
퍼스트 터치와 스레드 마이그레이션은 의도한 배치를 무너뜨릴 수 있습니다
운영체제는 각 페이지를 처음 접근한 스레드와 가까운 곳에 메모리를 배치하는 경우가 많습니다. 한 소켓에서 초기화가 실행되고 이후 추론 워커가 다른 소켓에서 실행되면 페이지가 원격 상태로 남을 수 있습니다. 스케줄러의 마이그레이션으로 인해 CPU 준비 스레드가 자신이 처리하도록 의도된 메모리와 GPU에서 멀어질 수도 있습니다.
NUMA 인식은 로컬 메모리 뱅크와 해당 메모리에 가장 효율적으로 접근하는 CPU 소켓을 연결합니다. 메모리 할당을 제어하지 않고 CPU 스레드만 고정하거나, GPU를 정렬하지 않고 메모리만 고정하면 전체 경로의 일부만 해결할 수 있습니다.
안정적인 배치를 위해서는 CPU 어피니티, 메모리 정책, 장치 할당, 토폴로지 인식 프로세스 실행이 필요할 수 있습니다. 컨테이너와 가상 머신은 또 다른 매핑 계층을 추가합니다. 목표는 모든 것을 무조건 고정하는 것이 아니라, 대량의 데이터가 흐르는 생산자, 버퍼, 소비자 경로를 현실적으로 가장 가까운 도메인 안에 유지하는 것입니다.
로컬리티는 특정 추론 단계에서 가장 중요합니다
모델 로딩에서는 스토리지에서 호스트로, 호스트에서 GPU로 이동하는 과정이 중요합니다. 프리필은 많은 프롬프트 토큰을 처리하며 더 큰 행렬 연산을 활용할 수 있는 반면, 디코드는 한 번에 한두 토큰씩 반복적으로 진행되므로 메모리 대역폭, 동기화, 커널 실행 오버헤드에 민감해질 수 있습니다. 따라서 하나의 요청 안에서도 NUMA의 영향은 달라질 수 있습니다.
GPU NUMA 효과에 관한 연구는 작업을 메모리 도메인 및 캐시 재사용에 맞춰 배치하면 어텐션 성능을 향상시킬 수 있음을 보여줍니다. 다만 이는 모든 상황에서 속도 향상이 발생한다는 의미가 아닙니다. 커널의 공유 패턴이 토폴로지를 고려한 매핑과 일치하는 경우에만 성능 향상이 나타납니다.
평균 초당 토큰 수만 보고하는 벤치마크는 첫 토큰 지연 시간이나 특정 배치에서의 낮은 확장성을 숨길 수 있습니다. 로딩 시간, 프리필 처리량, 토큰 간 지연 시간, GPU 링크 트래픽, 원격 NUMA 접근, CPU 메모리 대역폭을 각각 기록하세요.
기술 및 AI 허브
더 읽어보기

서비스를 추가할수록 Jellyfin 홈 서버 아키텍처가 달라지는 이유
Jellyfin 박스에 앱이 추가될수록 서비스 스택으로 확장되므로, CPU, 스토리지, 네트워크, 시크릿, 백업 및 복구 경계의 담당 주체를 명확히 정해야 합니다.

캐시를 용량으로 착각하지 않고 Jellyfin 성능을 측정하는 방법
신뢰할 수 있는 Jellyfin 벤치마크는 콜드 상태와 웜 상태를 별도로 표시하여 캐시된 메타데이터나 파일 시스템 페이지를 영구적인 하드웨어 성능으로 잘못 간주하지 않도록 합니다.

다중 사용자 Jellyfin에 필요한 iGPU 여유 성능은 어느 정도일까요?
Jellyfin iGPU의 여유 용량은 작업 부하에 따라 달라집니다. 임의의 사용률을 기준으로 삼지 말고, 반복적으로 재현 가능한 가장 높은 동시 트랜스코딩 조합을 처리한 뒤에도 여유를...

