AI Architecture 7. MLP와 메모리 장벽(Memory Wall)

지난 시간까지 우리는 하드웨어 비용을 줄이기 위해 데이터를 깎아내는 양자화(Quantization) 기술을 배웠습니다. 그렇다면 우리는 왜 이렇게까지 처절하게 데이터 크기를 줄이려고 노력하는 걸까요?

그 이유는 딥러닝 모델 속에 메모리 대역폭을 잡아먹는 괴물이 있기 때문입니다. 그 괴물의 이름은 바로 MLP (Multi-Layer Perceptron), 혹은 Fully Connected Layer (FC Layer)입니다.

소프트웨어 튜토리얼에서 가장 먼저 배우는 “Hello World” 수준의 간단한 구조지만, 하드웨어 아키텍트 입장에서 MLP는 가장 비효율적이고 골치 아픈 레이어 중 하나입니다. 이번 글에서는 “연산은 공짜, 데이터 이동은 빚이다”라는 반도체 업계의 격언을 증명하는 메모리 장벽(Memory Wall) 현상과, MLP가 어떻게 시스템 성능을 갉아먹는지 분석해 보겠습니다.

1. MLP의 구조적 문제

Fully Connected Layer의 정의는 앞 레이어의 모든 뉴런이 뒤 레이어의 모든 뉴런과 연결된다는 것입니다. 수식으로는 Y = WX + B로, 행렬과 벡터의 곱셈(Matrix-Vector Multiplication, MVM)입니다.

이 모든 연결이 문제입니다. 입력 뉴런이 1,000개, 출력 뉴런이 1,000개라고 가정해 봅시다.

  • 필요한 연산 횟수: 1,000 * 1,000 = 1,000,000 (1M) MACs
  • 필요한 가중치(파라미터) 수: 1,000 * 1,000 = 1,000,000 (1M) 개

파라미터 100만 개를 메모리에서 가져와서, 딱 한 번씩 곱하고 끝납니다, 재사용(Reuse)이 없습니다. 가중치(Wij) 하나는 오직 입력(Xi) 하나와 곱해지고는, 다음 연산에서 쓰이지 않고 버려집니다.

2. 폰 노이만 병목과 메모리 장벽 (The Memory Wall)

현대의 대부분 컴퓨터는 폰 노이만 구조(Von Neumann Architecture)를 따릅니다. 이는 연산 장치(Processor)와 저장 장치(Memory)가 분리되어 있고, 그 사이를 버스(Bus)가 연결하는 구조입니다. 문제는 기술의 발전 속도 차이에서 옵니다.

Von Neumann architecture
  • 프로세서 속도: 지난 20년간 수천 배 빨라졌습니다. (무어의 법칙)
  • 메모리 속도(DRAM): 용량은 늘었지만, 데이터를 퍼 나르는 속도(대역폭)와 반응 속도(Latency)는 그만큼 빨라지지 못했습니다.

이 격차로 인해 프로세서는 데이터를 달라고 아우성치는데, 메모리가 데이터를 제때 공급하지 못해 프로세서가 노는 현상이 발생합니다. 이것이 바로 메모리 장벽(Memory Wall)입니다.

The Memory Wall
The Memory Wall

MLP는 이 메모리 장벽에 정면으로 충돌하는 구조입니다. 연산기(ALU)가 “나 계산 끝났어! 다음 숫자 줘!”라고 외쳐도, 메모리 버스가 가중치를 실어 나르느라 꽉 막혀 있어서 칩의 성능이 10%도 안 나오는 상황이 벌어집니다.

3. 연산 강도 (Arithmetic Intensity): 효율성의 지표

이 현상을 공학적으로 설명하기 위해 연산 강도(Arithmetic Intensity)라는 개념을 사용합니다.

Arithmetic Intensity=Total Floating Point Operations (FLOPs)Total Data Access in Bytes (Bytes)Arithmetic \ Intensity = \frac{\text{Total Floating Point Operations (FLOPs)}}{\text{Total Data Access in Bytes (Bytes)}}

즉, 데이터 1바이트를 메모리에서 가져왔을 때, 몇 번이나 연산을 할 수 있는가?를 나타내는 수치입니다.

  • Convolution Layer (CNN): 필터 하나를 이미지 전체에 쓱 훑으며 재사용합니다. 가중치 하나를 가져와서 수천 번 재사용합니다. -> 연산 강도가 높음 (Compute-Bound)
  • FC Layer (MLP): 가중치 하나 가져와서 딱 한 번 곱하고 끝납니다. -> 연산 강도가 극도로 낮음 (Memory-Bound)

NPU가 아무리 초당 100조 번 연산(100 TOPS)을 할 수 있어도, MLP를 돌릴 때는 메모리 대역폭 한계 때문에 실제 성능은 1~2 TOPS밖에 안 나오는 참사가 벌어집니다.

4. 해결책 1: 배치 처리 (Batch Processing)

이 문제를 해결하기 위한 가장 쉬운 방법은 배치(Batch)를 키우는 것입니다.

입력 데이터(X) 하나만 처리하지 말고, X를 100개 모아서 한 번에 처리하는 것입니다.

  • Batch Size = 1: 가중치 W 로딩 -> 연산 1회 -> 끝
  • Batch Size = 100: 가중치 W 로딩 -> 연산 100회 (입력 1~100에 대해 재사용) -> 끝

이렇게 하면 행렬-벡터 곱셈(MVM)이 행렬-행렬 곱셈(Matrix-Matrix Multiplication, MMM)으로 바뀝니다. 가중치 W를 한 번 캐시(SRAM)에 올려두고 100번 재사용할 수 있으므로 연산 강도가 높아집니다.

(하지만 지난 글에서 다뤘듯, 실시간 추론에서는 Latency 문제로 배치를 키우기 어렵다는 딜레마가 있습니다.)

5. 해결책 2: 온칩 메모리(On-chip SRAM)의 거대화

배치를 키울 수 없다면? 칩 안에 데이터를 다 넣어버리면 됩니다. DRAM은 느리고 에너지를 많이 쓰지만, 칩 내부의 SRAM은 매우 빠릅니다.

최근 AI 반도체 스타트업(Groq, Graphcore 등)이나 테슬라의 FSD 칩은 수백 MB에 달하는 거대한 SRAM을 칩에 때려 박습니다. MLP의 가중치를 칩 안에 상주(Resident)시켜서, 메모리 장벽을 아예 없애버리려는 시도입니다. 물론, 칩 면적이 커져서 가격이 비싸진다는 단점이 있습니다.

6. 결론: CNN이 사랑받았던 이유

과거 이미지 처리 분야에서 FC Layer만으로 된 모델 대신 CNN(Convolutional Neural Network)이 주류가 된 것은 정확도 때문이기도 하지만, 하드웨어 효율성 때문이기도 합니다.

지역성(Locality)과 재사용성(Reuse)이 없는 MLP는 하드웨어 입장에서 ‘돈 먹는 하마’입니다. 그러나 최근 등장한 Transformer(GPT) 모델들은 다시금 거대한 행렬 연산(FC Layer 기반의 Attention)을 사용하고 있어, 하드웨어 아키텍트들은 또다시 이 메모리 장벽을 넘기 위해 HBM(고대역폭 메모리)을 적층하는 등 전쟁을 벌이고 있습니다.

다음 글에서는 MLP와 정반대의 성격을 가진, 하드웨어 엔지니어가 가장 사랑하는 구조인 “CNN과 지역성(Locality): 하드웨어 온칩 버퍼 효율의 극대화”에 대해 알아보겠습니다.

참고: The Memory Wall

Similar Posts