지난 8년간 CPU 코어 수와 I/O·스토리지 대역폭은 두 배 주기로 늘었지만 지연시간은 거의 줄지 않았다. GPU/HBM 중심의 가속기 아키텍처가 부상하며 대규모 병렬성과 배치가 필수화되었고, 생성형 AI가 이 추세를 앞당겼다. 이제 소프트웨어가 현대 하드웨어 현실에 맞게 진화해야 한다.
2025년 8월 5일
지금은 벌겅혹벌의 계절이다. 이 특이한 말벌들은 식물에 화학 물질을 주입해, 코드에서 가젯 익스플로잇을 하듯 식물의 생장 패턴을 재목적화한다. 사진은 이끼장미혹으로, 왼쪽에 더 작은 혹이 자라기 시작하는 것도 볼 수 있다.
이 주제에 대해 한동안 메모를 해왔는데, 어제 Bsky에서 David Aronchick과 대화를 나누며 좀 더 자세히 글로 남겨야겠다 싶었다.
AMD Zen EPYC는 2017년에 최대 32코어로 출하되었고, 2019년 Zen 2에서 64코어, 2022년 Zen 4에서 96코어 또는 Zen 4c의 128개 소형 코어, 그리고 2024년 Zen 5에서 128코어, Zen 5c에서 192코어가 되었다. 즉 8년 동안 코어 수가 네 배로 늘었고, 모어의 법칙 같은 주기로 2년마다 두 배씩 증가한 셈이다.
데스크톱 CPU의 스레드 대비 CPU 성능, 출처: CPU Benchmark.
코어 내부를 보면, 클럭은 빨라지지 않았지만 연산 유닛을 겹겹이 늘려 왔다. 32비트 레지스터에서 64비트(amd64는 2003년), 128비트 SSE(1999년), 256비트 AVX(2011년), 512비트 AVX(2017년)로, 그리고 최신 Zen 5 하드웨어는 사이클마다 512비트 연산을 네 번 실행할 수 있다. 이는 메모리 대역폭 한계를 훨씬 웃돌기 때문에, 캐시에 올라온 데이터에 대해 대량 연산을 할 때만 실효성이 있다.
그 사이 AMD EPYC는 최대 DDR4 8채널에서 DDR5 12채널로 늘어 최대 메모리 대역폭이 대략 두 배가 되었지만, 최대 코어 구성에서는 코어당 대역폭이 절반으로 줄었다.
I/O도 늘려 왔다. 이더넷은 과거에는 가끔 10배 점프(100Mb는 1995년, 1Gb는 1999년, 10Gb는 2002년, 100Gb는 2010년)를 했지만, 최근에는 단순히 링크를 배가(倍加)해 올리는 두 배 주기로 바뀌었다(25Gb와 50Gb는 2015년, 200Gb와 400Gb는 2017년, 800Gb는 2024년). 현재 표준은 100Gb 링크와 스위치 기반이지만 200Gb로 두 배가 되는 중이며, 이런 배가 추세는 계속될 것이다. 이는 대략 PCIe 대역폭과 보조를 맞추는데, PCIe 5 x16 링크는 400Gb 이더넷을 지원하고, PCIe 6도 이제 막 보급되기 시작했다.
스토리지도 같은 추세다. 근접(nearline) 스토리지를 제외하면 하드 드라이브는 사실상 구식이 되었다. 단일 PCIe 5 x4 장치는 일반적으로 초당 14GB 읽기를 지원해 100Gb 이더넷 채널을 포화시키기에 충분하며, 200단 플래시가 등장하고 120TB와 240TB 드라이브도 나오기 시작했다.
이 모든 와중에 지연시간(latency)은 거의 줄지 않았고, 많은 클라우드 아키텍처처럼 리소스가 네트워크 너머 더 먼 곳에 위치하면서 오히려 늘어난 경우도 많다. 따라서 가용 성능을 활용하려면 큐 깊이를 대폭 늘려야 하는데, 대부분의 소프트웨어는 아직 여기에 도달하지 못했다. 대신 소프트웨어 복제본을 잔뜩 띄우거나, 대량의 비동기 I/O로 이를 보완하려 시도할 때가 있다.
그렇다면 CPU에서는 이런 변화가 있었다면, GPU와 기타 "AI 하드웨어"는 어떨까? GPU는 다양한 형태의 메모리를 더 비싸고 더 넓고 더 빠르며 더 높은 지연의 구성으로 배치해 이런 문제를 우회하는 한편, 더 많은 FLOPS와 더 큰 병렬성, 더 약한 분기 지원을 가진 하드웨어와 결합해 왔다.
조금 더 풀어보자. GDDR과 HBM은 메모리 칩을 연산 장치 가까이에 두고 매우 넓은 버스로 높은 대역폭을 내기 위한, 점점 더 비싼 방식이다. DDR5 채널이 64비트 폭인 반면, HBM 3E는 64비트 폭의 다이를 최대 16개까지 적층하며, GPU에는 이러한 스택이 여러 개일 수 있다. 예를 들어 Nvidia GB100은 8다이 스택을 8개 탑재한다. 원칙적으로 CPU에 HBM을 붙일 수도 있다(AMD가 틈새 제품으로 제공하긴 한다). 하지만 추가 지연 때문에 훨씬 더 긴 큐가 필요하고, 그에 따라 더 많은 분기 예측과 추측 실행 등이 요구된다. GPU는 사실상 코드의 분기를 제대로 지원하지 않으며, 막대한 병렬성을 갖춘 대규모 메모리 읽기/쓰기 스트림에서 가장 효율적으로 작동한다. 예를 들어 32개 스레드(워프)는 동일한 명령을 실행해(이에 따라 명령 처리 하드웨어 요구사항이 줄어든다), 각 텐서 코어는 클럭마다 1024비트 벡터에 대한 연산을 수행할 수 있다. CPU에서 분기 많은 코드를 돌리기 위한 하드웨어는 대부분 사라졌고, 조건이 필요하다면 보통 조건문의 양쪽을 모두 실행한 뒤 불리언을 곱해 사용할 값을 선택한다. AI 워크로드가 주로 행렬 곱셈으로 수렴하면서, 그래픽 처리를 위한 GPU의 레거시 부분은 점점 퇴화하고 있다. 또한 우리는 더 낮은 정밀도로 계산하는 법을 익혔다. 과학자들은 한때 IEEE 부동소수점의 수렴 특성과 64비트 부동소수점에 집착했지만, Nvidia Blackwell의 최신 트렌드는 4비트 부동소수점이며, 이들은 대략 16배 빠르게 돌릴 수 있다.
AI를 위해 구축되는 아키텍처는 전통적 HPC와 슈퍼컴퓨터를 매우 닮았다. 기본 연산 단위는 보통 CPU 2개와 GPU 8개, 그리고 네트워크 카드 800Gb급 10장(그중 8장은 GPU 간 직접 통신용)을 탑재한 서버다. 심지어 추론 워크로드도, 특히 더 큰 모델에서는, 여러 대의 머신에서 규모 있게 돌릴 때 가장 효율적이며, 가용 연산을 더 활용하기 위해 배치 처리(예: LLM과 동시에 100개의 대화)를 한다. 작업의 상당 부분에서 병목은 메모리 대역폭이다.
이제 우리가 얼마나 많은 새로운 연산 자원을 만들고 있는지 보자. TSMC의 신규 공정 생산을 보면, 약 3분의 1은 휴대폰 칩이고, 이는 대략 가속기와 전통적 CPU 연산이 반반 정도로 섞여 있다. 나머지는 대략 CPU와 GPU가 비슷한 비중으로 나뉜다. 가치 기준으로 보면 서버 지출의 절반이 어떤 형태로든 가속 연산에 투입된다. 이는 우리가 이 새로운 아키텍처에서 효과적으로 스케일 아웃할 수 있는 특정 애플리케이션을 찾아냈기 때문이기도 하다. 하지만 이 아키텍처는 어차피 오고 있었고, 2017년 무렵에는 슈퍼컴퓨터 규모로 자리 잡기 시작했다. 최근의 지출 붐이 투자를 앞당기고 배가를 더 빠르게 만들고 있지만, 애초에 우리가 가던 궤도였다.
TSMC 생산 구성 비중 추정치, 출처: The Next Platform
IDC의 서버 지출 추정치(Estimated server spend) IDC
무슨 일이 일어나든, 단일 스레드 성능은 어차피 정체되어 있었고, 메모리 벽은 1990년대 무렵부터 현실이었으며, Nvidia는 수십 년간 일관된 비전으로 제품을 만들어 왔다. CPU에서 GPU로 전환할 때 지연시간 격차가 크게 존재하며, 최근 Apple, Nvidia, AMD에서 보듯 CPU와 GPU를 동일 실리콘에 통합하는 시도도 시작되었지만, 이런 부품은 대체로 메모리 대역폭이 훨씬 낮다. 소프트웨어는 하드웨어 현실을 따라잡기 위해 해야 할 일이 많다. 생성형 AI가 이 하드웨어 변화를 가속했고, 이제 우리는 현대 하드웨어에 맞춘 소프트웨어 변혁에 힘써야 한다.