AI Architecture 1. 인공 뉴런의 해부: silicon에서 Y=WX+B 구현

AI 딥러닝을 처음 공부할 때, 우리는 가장 먼저 퍼셉트론(Perceptron), 즉 인공 뉴런의 개념을 접합니다. 파이토치(PyTorch)나 텐서플로우(TensorFlow)를 다루는 소프트웨어 엔지니어에게 인공 뉴런은 그저 행렬 연산 라이브러리가 처리해 주는 한 줄의 수식에 불과합니다.

Y=(W×X)+BY = \sum (W \times X) + B

하지만 우리 같은 RTL 엔지니어에게 이 수식은 전혀 다른 의미로 다가옵니다. 위 수식이 실리콘 웨이퍼(Silicon Wafer) 위의 물리적인 트랜지스터와 회로로 변환되는 순간, 그것은 곧 ‘비용(Cost)’이자 ‘발열(Heat)’, 그리고 ‘면적(Area)’이라는 현실적인 문제로 직결되기 때문입니다.

이번 글에서는 NPU(Neural Processing Unit) 설계의 가장 기초 단위인 인공 뉴런의 물리적 실체에 대해 알아보겠습니다.

1. 논리 게이트가 아닌, 거대한 산술 연산기 (Arithmetic Unit)

학부 시절 디지털 논리회로 수업에서 우리는 AND, OR, NOT 같은 기본 게이트를 배웁니다. 하지만 딥러닝 가속기를 설계할 때 우리가 마주하는 기본 블록은 훨씬 거대합니다.

퍼셉트론의 핵심 동작은 벡터의 내적(Dot Product)입니다. 수백, 수천 개의 입력 신호와 가중치를 각각 곱한 뒤, 그 결과들을 모두 더해야 합니다. 하드웨어 세계에서는 이를 MAC (Multiply-Accumulate) 연산이라고 부릅니다.

MAC Operation: AccumulatorAccumulator+(A×B)\text{MAC Operation: } \quad \text{Accumulator} \leftarrow \text{Accumulator} + (A \times B)

소프트웨어적으로는 out += a * b라는 단순한 문장이지만, 하드웨어적으로 이 연산은 칩의 운명을 결정짓습니다. NPU의 성능 지표인 TOPS(Tera Operations Per Second)는 결국 “이 MAC 연산을 1초에 몇 번 돌릴 수 있는가?”와 동의어입니다.

2. 곱셈기(Multiplier): 면적을 잡아먹는 괴물

하드웨어 아키텍처 관점에서 덧셈(Adder)과 곱셈(Multiplier)은 체급 자체가 다릅니다. 이 차이를 이해하는 것이 NPU 설계의 첫걸음입니다.

  • 덧셈기(Adder): N비트 덧셈은 비교적 간단합니다. 전가산기(Full Adder)를 직렬로 연결하거나(Ripple Carry), 속도를 위해 Carry Look-ahead 방식을 써도 논리 게이트의 깊이(Depth)가 깊지 않습니다. 면적(Area)도 작고 전력 소모도 착합니다.
  • 곱셈기(Multiplier): 곱셈은 차원이 다릅니다. 이진수 곱셈은 수많은 부분곱(Partial Products)을 생성하고, 이를 다시 계층적으로 더하는 과정(Wallace Tree 등)을 거칩니다.

입력 비트 수가 N일 때, 덧셈기의 복잡도가 O(N)에 가깝다면, 곱셈기의 복잡도는 O(N2)에 가깝게 증가합니다. 예를 들어, 32-bit Floating Point(FP32) 곱셈기 하나를 칩에 구현하려면, 32-bit 덧셈기보다 수십 배 이상의 면적(Gate Count)이 필요합니다.

Architect’s Insight:

많은 분들이 “왜 NPU는 FP32 대신 INT8이나 FP16을 쓰려고 안달일까?”라고 묻습니다. 답은 간단합니다. 곱셈기의 크기 때문입니다. 데이터 비트 수를 절반으로 줄이면 곱셈기의 면적은 1/4 수준으로 줄어듭니다. 같은 면적의 칩에 4배 더 많은 연산기를 집어넣어 성능을 4배 높일 수 있다는 뜻입니다. 이것이 하드웨어 경량화의 핵심입니다.

3. 부동소수점(Floating Point)의 하드웨어적 악몽

인공 뉴런 수식은 보통 실수(Real Number)를 다루기 때문에 부동소수점 연산이 기본입니다. 하지만 하드웨어 엔지니어에게 Floating Point는 피하고 싶은 존재입니다.

단순한 정수(Integer) 곱셈과 달리, 부동소수점 연산(A * B)은 다음과 같은 복잡한 과정을 거칩니다:

  1. 지수(Exponent) 더하기: 두 수의 지수 부분을 더합니다.
  2. 가수(Mantissa) 곱하기: 유효숫자 부분을 정수 곱셈합니다.
  3. 정규화(Normalization): 결과값을 표준 포맷(1.xxx 형태)으로 맞추기 위해 비트 시프트(Shift)를 수행합니다.
  4. 반올림(Rounding): 정밀도에 맞춰 끝자리를 처리합니다.

이 모든 과정 하나하나가 배럴 시프터(Barrel Shifter)와 복잡한 제어 로직을 필요로 합니다. 딥러닝 모델이 커질수록 우리는 이 비싼 FP32 연산을 INT8 같은 저렴한 정수 연산으로 대체하는 양자화(Quantization) 기술에 의존할 수밖에 없습니다.

4. Y=WX+B의 에너지: Power Consumption

반도체 설계의 3대 요소인 PPA (Power, Performance, Area) 중 최근 가장 중요한 것은 Power(전력)입니다. CMOS 회로의 동적 전력 소모(Dynamic Power)는 다음 공식으로 설명됩니다.

P=αCV2fP = \alpha \cdot C \cdot V^2 \cdot f
  • α: 스위칭 활동 계수 (얼마나 자주 0과 1이 바뀌는가)
  • C: 정전 용량 (회로의 크기와 비례)
  • V: 동작 전압
  • f: 동작 주파수

거대한 곱셈기 회로(C가 큼)가 고속(f가 높음)으로 동작하면 P는 기하급수적으로 증가합니다. 스마트폰 뒷면이 뜨거워지거나 데이터센터의 냉방 비용이 치솟는 이유는 바로 수만 개의 인공 뉴런(MAC 유닛)이 동시에 스위칭하며 에너지를 태우고 있기 때문입니다.

5. 데이터 이동

마지막으로, RTL 엔지니어가 고려해야 할 가장 중요한 부분입니다. Y=WX+B를 계산할 때, 가장 많은 에너지를 쓰는 범인은 ‘연산(Compute)’이 아닙니다. 범인은 바로 ‘데이터 이동(Data Movement)’입니다.

스탠퍼드 대학의 Mark Horowitz 교수가 발표한 유명한 자료에 따르면, 7nm 공정 기준으로 32비트 덧셈을 한 번 하는 데 드는 에너지가 약 0.1 pJ(피코줄)이라면, DRAM에서 데이터를 가져오는 데 드는 에너지는 약 640 pJ입니다. 무려 6,400배의 차이인거죠.

Mark Horowitz energy table

하드웨어 관점에서 W(가중치)를 메모리에서 꺼내와서 MAC 연산기까지 나르는 과정은 엄청난 낭비입니다. 이를 메모리 장벽(Memory Wall) 문제라고 하며, 현대 AI 반도체 아키텍처의 모든 혁신(HBM, Cache, Dataflow 등)은 오직 이 데이터 이동으로 인한 에너지 소모를 줄이기 위해 존재한다고 해도 과언이 아닙니다.

6. 결론: 하드웨어에는 ‘공짜’가 없다

개발자가 파이썬으로 model.forward(x)를 호출하는 그 짧은 순간, NPU 내부에서는 수천 개의 곱셈기가 면적 싸움을 하고, 엄청난 전력이 소모되며, 메모리 버스에서는 데이터가 병목을 일으키며 아우성칩니다.

그래서 AI 하드웨어 엔지니어로서 우리의 목표는 명확합니다.

“어떻게 하면 불필요한 부동소수점 연산을 줄이고(Quantization), 어떻게 하면 메모리에서 데이터를 덜 가져오게(Data Reuse) 만들 것인가?”

이 질문에 대한 답을 찾기 위해, 다음 글에서는 “활성화 함수(Activation Function)의 비용”을 분석해 보겠습니다. 왜 하드웨어 엔지니어들은 Sigmoid를 혐오하고 ReLU를 선호할까요? 그 비밀을 파헤쳐 봅니다.

참고: Computing’s Energy Problem

Similar Posts