지난 글에서는 학습(Training)과 추론(Inference)의 차이를 통해, 추론 전용 NPU가 어떻게 하드웨어 구조를 경량화하는지 살펴보았습니다. 그 경량화의 핵심 키워드 중 하나는 바로 정밀도(Precision)의 축소였습니다. 소프트웨어 엔지니어에게 데이터는 float (32-bit) 혹은 int (32-bit)라는 추상적인 변수 타입일 뿐입니다. 하지만 실리콘 칩을 설계하는 하드웨어 엔지니어에게 데이터는 물리적인 무게(Weight)를 가집니다.
비트(Bit) 수가 늘어난다는 것은 데이터를 실어 나르는 와이어(Wire)의 가닥수가 늘어나는 것이고, 이를 저장할 플립플롭(Flip-Flop)의 개수가 증가하며, 무엇보다 이들을 계산할 로직 회로의 면적(Area)이 기하급수적으로 커짐을 의미합니다.
이번 글에서는 딥러닝의 표준인 FP32(Floating Point 32-bit)가 하드웨어 관점에서 왜 그토록 무겁고 비싼 포맷인지, 그리고 INT8(Fixed Point)로의 전환이 시스템 성능에 어떤 효과를 불러오는지 분석해 보겠습니다.
1. IEEE 754의 구조적 복잡성: 실수 표현
우리가 흔히 쓰는 실수형 데이터(FP32)는 IEEE 754 표준을 따릅니다. 이 포맷은 매우 넓은 Dynamic Range를 표현하기 위해 숫자를 세 부분으로 쪼갭니다.
- Sign (1-bit): 부호 (+/-)
- Exponent (8-bit): 지수 (데이터의 크기/범위 결정)
- Mantissa (23-bit): 가수 (데이터의 정밀도/유효숫자 결정)
이 구조는 수학적으로는 훌륭하지만, 하드웨어 구현 관점에서는 악몽에 가깝습니다. 단순한 덧셈 하나를 하려 해도 다음과 같은 복잡한 과정을 거쳐야 하기 때문입니다.
- Denormalization: 두 수의 지수(Exponent)를 비교하여 자릿수를 맞춥니다.
- Mantissa Add: 정렬된 가수끼리 덧셈을 수행합니다.
- Normalization: 결과값을 다시 표준 포맷(1.xxx)으로 만들기 위해 비트 시프트(Shift)를 수행합니다.
- Rounding: 정밀도를 맞추기 위해 반올림 처리를 합니다.
이 모든 과정에는 비교기(Comparator), 배럴 시프터(Barrel Shifter), 선행 0 탐지기(Leading Zero Detector) 같은 복잡한 로직 블록들이 필요합니다. 이것이 FP32 연산기가 비싼 이유입니다.
2. 하드웨어 면적(Area)의 기하급수적 증가
하드웨어 설계 비용의 핵심 지표 중 하나는 실리콘 면적(Die Area)입니다. 면적이 클수록 웨이퍼 한 장에서 나오는 칩의 개수(Net Die)가 줄어들고, 수율(Yield)이 떨어지며, 칩 단가가 상승합니다. 연산기(Multiplier)의 면적은 입력 데이터 비트 수(N)에 대해 대략 N2의 복잡도를 가집니다.
- FP32 Multiplier: 가수가 23비트이므로 24 * 24 (hidden bit 포함) 수준의 곱셈 로직에 지수 덧셈 로직, 정규화 로직이 추가됩니다.
- INT8 Multiplier: 단순한 8 * 8 정수 곱셈기입니다. 복잡한 정규화나 시프터가 필요 없습니다.
Quantitative Analysis:
45nm 공정 기준으로 FP32 곱셈기 1개의 면적은 INT8 곱셈기 약 18.5개의 면적과 맞먹습니다. 즉, FP32를 포기하고 INT8을 선택하면, 동일한 칩 면적에 약 18배 더 많은 연산 코어(Core)를 집적할 수 있다는 뜻입니다. 이것이 바로 NPU가 폭발적인 처리량(Throughput)을 낼 수 있는 비결입니다.
3. 전력 소모(Power Consumption)와 열(Heat)
더 심각한 문제는 전력(Power)입니다. 앞서 언급한 FP32의 복잡한 로직들은 매 클럭마다 스위칭(Switching)을 일으키며 전력을 소모합니다.
- FP32 덧셈: 약 0.9 pJ (Pico Joules)
- INT8 덧셈: 약 0.03 pJ
- 에너지 효율 차이: 약 30배
수억 개의 파라미터를 가진 거대 모델을 돌릴 때, 이 30배의 차이는 스마트폰 배터리가 1시간 만에 방전되느냐, 하루 종일 가느냐를 결정짓습니다. 또한, 전력 소모는 곧 발열(Heat)로 이어지며, 발열은 칩의 동작 클럭을 강제로 낮추는 스로틀링(Throttling)의 원인이 됩니다.
4. 메모리 대역폭(Bandwidth)의 병목 해소
데이터의 무게는 연산기 내부뿐만 아니라, 데이터가 이동하는 통로인 메모리 버스(Memory Bus)에서도 느껴집니다.
- FP32: 파라미터 하나당 4 Byte
- INT8: 파라미터 하나당 1 Byte
동일한 DRAM 대역폭(예: 100GB/s)을 가진 시스템이라면, FP32 데이터를 로딩할 때보다 INT8 데이터를 로딩할 때 4배 더 많은 데이터를 공급할 수 있습니다.
대부분의 AI 추론 작업이 연산 속도보다 데이터 로딩 속도에 의해 제한받는 Memory-Bound 특성을 가진다는 점을 고려하면, 데이터 사이즈를 1/4로 줄이는 것은 전체 시스템 성능을 최대 4배까지 끌어올릴 수 있는 가장 확실한 최적화입니다.
5. 고정 소수점(Fixed Point)과 양자화(Quantization)
그렇다면 어떻게 FP32를 INT8로 바꿀까요? 단순히 소수점 아래를 자르는 것이 아닙니다. 우리는 고정 소수점(Fixed Point) 개념을 사용합니다.
하드웨어적으로는 소수점의 위치를 고정해두고(프로그래머와 하드웨어 간의 약속), 실제로는 정수 연산기(ALU)만 돌리는 방식입니다. 이 과정을 양자화(Quantization)라고 부릅니다.
물론, 32비트의 넓은 표현 범위를 8비트라는 좁은 그릇에 담으려다 보니 정보의 손실(Accuracy Drop)이 발생합니다. 하지만 딥러닝 모델은 파라미터가 매우 많아(Redundancy), 개별 파라미터의 약간의 오차는 전체 결과에 큰 영향을 주지 않는 특성이 있습니다. 이를 이용해 우리는 정확도를 유지하면서도 하드웨어 비용을 극단적으로 낮출 수 있습니다.
6. 결론: 적절한 그릇에 데이터를 담는 지혜
하드웨어 엔지니의 역할은 무조건 가장 정밀한 계산기를 만드는 것이 아닙니다. 요구되는 정확도를 만족하는 선에서, 가장 작고(Area), 가장 저전력인(Power) 데이터 포맷을 선택하는 것입니다.
최근에는 FP32와 INT8 사이의 절충안으로 BF16(Bfloat16)이나 FP8 같은 새로운 포맷들이 등장하여 NVIDIA H100 같은 최신 칩에 탑재되고 있습니다. 이는 학습의 안정성과 추론의 효율성 사이에서 끊임없이 줄타기를 하는 하드웨어 설계의 진화를 보여줍니다.