20. Model Optimizations 단계별 학습 문서
원문 경로
/Users/keumky/Documents/New project 3/sources/mlsysbook/20-optimizations/source.md
짧은 소개
이 장은 연구실에서 높은 정확도를 내는 모델을 실제 제품 환경에서 쓸 수 있게 만드는 방법을 다뤄요. 큰 모델은 정확할 수 있지만, 모바일 기기, 엣지 장치, 마이크로컨트롤러, 대규모 클라우드 서비스에서는 메모리, 전력, 지연시간, 비용이라는 벽에 부딪혀요.
그래서 이 장의 핵심은 단순히 “모델을 작게 만들자”가 아니에요. 정확도와 기능은 최대한 유지하면서, 목표 하드웨어에서 실제로 빠르고 싸고 안정적으로 돌아가게 만드는 시스템 설계가 핵심입니다.
읽는 방법
이 장은 기법 이름이 많아서 처음부터 세부 수식에 들어가면 길을 잃기 쉬워요. 다음 순서로 세 번 읽는 방식이 좋아요.
| 읽기 순서 | 무엇을 보나요? | 목표 |
|---|---|---|
| 1회차 | 서론, 요약, 큰 분류 | 왜 최적화가 필요한지 잡아요 |
| 2회차 | 세 차원과 데이터 흐름 | 어떤 병목에 어떤 기법을 쓰는지 연결해요 |
| 3회차 | pruning, quantization, distillation, NAS, sparsity의 세부 원리 | 실제 배포 전략을 설계할 수 있게 해요 |
읽을 때는 기법을 외우기보다 아래 질문으로 분류해보세요.
무엇을 계산할 것인가? -> 모델 표현 최적화
숫자를 얼마나 정밀하게 쓸 것인가? -> 수치 정밀도 최적화
하드웨어에서 어떻게 실행할 것인가? -> 아키텍처 효율 최적화
이 장의 한 줄 요약
모델 최적화는 정확도를 크게 잃지 않으면서 모델 구조, 숫자 표현, 실행 방식을 함께 조정해 목표 배포 환경의 메모리, 전력, 지연시간, 비용 제약을 만족시키는 일입니다.
1단계: 중학교 수준
모델 최적화는 “여행 가방을 다시 싸는 일”이에요
아주 긴 여행을 간다고 생각해볼게요. 큰 가방에 모든 물건을 다 넣으면 편할 것 같지만, 실제로는 무겁고 이동하기 힘들어요. 비행기에 실을 수 있는 무게 제한도 있고, 버스를 탈 때도 불편하죠.
AI 모델도 비슷해요. 연구실에서는 큰 모델이 좋은 성적을 낼 수 있어요. 하지만 스마트폰, 작은 센서, 자동차 안의 장치, 클라우드 서버에서는 무작정 큰 모델을 쓰기 어려워요. 너무 큰 모델은 저장하기 어렵고, 실행이 느리고, 배터리를 빨리 쓰고, 서버 비용도 많이 들어요.
모델 최적화는 필요한 물건은 남기고, 덜 중요한 짐은 줄이고, 가방 안을 더 효율적으로 정리하는 일이에요.
왜 이런 일이 필요할까요?
좋은 AI가 있어도 실제 장소에서 못 쓰면 의미가 줄어들어요.
예를 들어 볼게요.
| 장소 | 문제 |
|---|---|
| 스마트폰 | 배터리와 저장 공간이 제한돼요 |
| 작은 센서 | 메모리와 전력이 아주 작아요 |
| 자동차나 로봇 | 판단이 늦으면 위험할 수 있어요 |
| 클라우드 서비스 | 요청이 많으면 비용이 크게 늘어요 |
모델 최적화는 AI를 더 많은 곳에서 쓸 수 있게 해주는 다리 역할을 해요.
큰 그림은 세 가지 질문이에요
이 장은 모델 최적화를 세 방향으로 나눠요.
| 질문 | 쉬운 비유 | 대표 아이디어 |
|---|---|---|
| 꼭 필요한 부품만 남겼나요? | 가방에서 안 쓰는 물건 빼기 | pruning, distillation |
| 숫자를 너무 자세히 적고 있지는 않나요? | 가격을 소수점 끝까지 쓰지 않고 반올림하기 | quantization |
| 실제 길에서 잘 움직이나요? | 길이 좁으면 작은 차를 쓰기 | hardware-aware design, sparsity |
Pruning은 가지치기예요
나무가 너무 빽빽하면 햇빛이 잘 안 들어요. 그래서 덜 필요한 가지를 잘라내면 나무가 더 건강해질 수 있어요.
Pruning도 비슷해요. 모델 안에는 결과에 거의 영향을 주지 않는 연결이나 부분이 있을 수 있어요. 그런 부분을 줄이면 모델이 작아지고, 운이 좋으면 더 빨라져요.
다만 아무 가지나 자르면 나무가 상하듯이, 모델도 중요한 부분을 잘못 자르면 정확도가 떨어져요. 그래서 잘라낸 뒤에는 다시 적응시키는 과정이 필요해요.
Knowledge Distillation은 큰 선생님이 작은 학생을 가르치는 일이에요
큰 모델은 똑똑하지만 무거워요. 작은 모델은 가볍지만 혼자 배우면 성능이 부족할 수 있어요.
Knowledge distillation은 큰 모델을 선생님으로 두고, 작은 모델을 학생처럼 훈련시키는 방법이에요. 선생님은 단순히 정답만 알려주는 것이 아니라, “이 답이 가장 그럴듯하지만 다른 답도 조금은 비슷해” 같은 판단의 뉘앙스를 알려줘요.
학생 모델은 이 힌트를 받아서 작은 크기에서도 꽤 좋은 성능을 낼 수 있어요.
Quantization은 숫자를 짧게 적는 일이에요
어떤 물건의 길이가 12.003948cm라고 해도, 일상에서는 12cm라고 말해도 충분할 때가 많아요. 숫자를 조금 덜 자세히 적으면 기록할 공간이 줄어요.
Quantization도 비슷해요. 모델 안의 숫자를 아주 정밀하게 저장하지 않고, 조금 거칠지만 더 작은 숫자 형식으로 바꿔요. 그러면 모델 크기가 줄고 계산도 빨라질 수 있어요.
하지만 너무 거칠게 줄이면 중요한 차이를 잃을 수 있어요. 그래서 어느 정도까지 줄여도 괜찮은지 조심스럽게 확인해야 해요.
NAS는 좋은 설계도를 자동으로 찾아보는 일이에요
집을 지을 때 사람이 설계도를 직접 만들 수도 있지만, 여러 설계 후보를 자동으로 비교해서 좋은 구조를 찾을 수도 있어요.
Neural Architecture Search, 즉 NAS는 모델의 구조를 자동으로 탐색하는 방법이에요. 어떤 층을 쓸지, 얼마나 깊게 만들지, 모바일 기기에서 빠른 구조는 무엇인지 등을 자동으로 찾아요.
다만 후보를 많이 시험해야 하므로 비용이 큽니다. 그래서 정말 특별한 하드웨어나 엄청난 규모의 서비스처럼 투자할 이유가 있을 때 특히 유용해요.
Sparsity는 “빈칸이 많은 상태”예요
교실 좌석 100개 중 90개가 비어 있다면, 실제로 신경 써야 할 좌석은 10개뿐이에요. 모델에서도 값이 0이거나 거의 0인 부분이 많으면 그 부분은 계산하지 않아도 될 수 있어요.
이 상태를 sparsity라고 해요. 다만 실제로 빨라지려면 컴퓨터가 “빈칸은 건너뛰자”를 잘 지원해야 해요. 빈칸이 많아도 컴퓨터가 모든 칸을 하나씩 확인하면 기대만큼 빨라지지 않아요.
Dynamic computation은 쉬운 문제는 빨리 끝내는 방식이에요
시험 문제 중 쉬운 문제는 바로 풀고, 어려운 문제에 시간을 더 쓰는 게 효율적이에요.
AI 모델도 어떤 입력은 쉽게 판단할 수 있고, 어떤 입력은 더 깊이 살펴봐야 해요. Dynamic computation은 쉬운 입력에는 적은 계산만 쓰고, 어려운 입력에는 더 많은 계산을 쓰는 방법이에요.
이 방법은 빠를 수 있지만, 입력마다 걸리는 시간이 달라져서 실시간 시스템에서는 조심해야 해요.
1단계 중간 정리
모델 최적화는 모델을 무조건 작게 만드는 일이 아니에요. 필요한 능력은 남기고, 불필요한 짐을 줄이며, 실제 장치에서 잘 달리게 만드는 일이에요.
핵심 기법을 한 문장으로 정리하면 이렇게 볼 수 있어요.
| 기법 | 쉬운 설명 |
|---|---|
| Pruning | 덜 중요한 연결이나 부품을 잘라요 |
| Distillation | 큰 선생님 모델의 판단 방식을 작은 모델이 배워요 |
| Quantization | 숫자를 더 짧고 가볍게 표현해요 |
| NAS | 좋은 모델 구조를 자동으로 찾아요 |
| Sparsity | 0이 많은 구조를 이용해 계산을 줄여요 |
| Hardware-aware design | 하드웨어가 잘하는 방식에 맞춰 모델을 설계해요 |
2단계: 고등학교 수준
문제를 논리 흐름으로 다시 보기
이제 비유에서 한 단계 들어가 볼게요. 배포할 모델이 있을 때 실제 질문은 다음 순서로 흘러가요.
학습된 모델이 있음
↓
목표 배포 환경을 확인함
↓
병목을 측정함
↓
병목에 맞는 최적화 기법을 고름
↓
정확도, 지연시간, 메모리, 전력을 다시 측정함
↓
필요하면 여러 기법을 순서대로 조합함
여기서 중요한 점은 “기법부터 고르지 않는다”는 거예요. 먼저 병목이 무엇인지 봐야 해요.
세 가지 최적화 차원
원문은 모델 최적화를 세 차원으로 나눠요.
| 차원 | 핵심 질문 | 대표 기법 | 주로 줄이는 것 |
|---|---|---|---|
| 모델 표현 최적화 | 어떤 계산을 없앨까요? | pruning, distillation, low-rank, NAS | 파라미터 수, 구조 복잡도 |
| 수치 정밀도 최적화 | 숫자를 몇 비트로 표현할까요? | PTQ, QAT, mixed precision, INT8 | 메모리, 대역폭, 연산 에너지 |
| 아키텍처 효율 최적화 | 하드웨어에서 어떻게 실행할까요? | sparsity kernels, operator fusion, dynamic computation | 실제 지연시간, 전력, 하드웨어 유휴 시간 |
이 세 가지는 독립된 상자가 아니에요. 예를 들어 pruning은 파라미터 수를 줄이지만, sparsity를 만들기 때문에 실행 방식에도 영향을 줘요. Quantization은 숫자 표현을 줄이지만, 메모리 대역폭과 에너지에도 영향을 줘요.
배포 제약을 차원에 연결하기
병목을 보면 어떤 방향부터 봐야 할지 정할 수 있어요.
| 문제가 되는 제약 | 먼저 볼 차원 | 이유 |
|---|---|---|
| 모델 파일이 너무 큼 | 모델 표현, 수치 정밀도 | 파라미터 개수와 비트 수를 줄여야 해요 |
| 메모리 대역폭이 부족함 | 수치 정밀도, 아키텍처 효율 | 적은 바이트를 읽고, 메모리 이동을 줄여야 해요 |
| 추론 지연시간이 큼 | 모델 표현, 아키텍처 효율 | 계산량과 실행 스케줄을 함께 봐야 해요 |
| 배터리 소모가 큼 | 수치 정밀도, 아키텍처 효율 | 낮은 정밀도와 적은 메모리 이동이 중요해요 |
| 정확도 손실이 허용되지 않음 | 학습-aware 기법 | PTQ보다 QAT, distillation, 점진적 pruning이 유리할 수 있어요 |
모델 크기를 간단한 수식으로 보기
모델 크기는 대략 이렇게 볼 수 있어요.
[ \text{model size} \approx \text{number of parameters} \times \text{bits per parameter} ]
예를 들어 파라미터 수를 줄이는 pruning은 앞부분을 줄여요. FP32를 INT8로 바꾸는 quantization은 뒷부분을 줄여요.
그래서 두 기법을 함께 쓰면 효과가 곱처럼 커질 수 있어요.
파라미터 수 줄이기
↓
남은 파라미터를 더 짧은 숫자로 표현하기
↓
작고 빠른 모델 만들기
Pruning의 논리
Pruning은 “중요도가 낮은 값을 0으로 만들거나 구조째 제거하자”는 아이디어예요.
가장 단순한 기준은 크기예요. 값이 아주 작으면 출력에 미치는 영향이 작다고 가정할 수 있어요. 그래서 작은 값을 먼저 없애요.
| pruning 방식 | 무엇을 없애나요? | 장점 | 주의점 |
|---|---|---|---|
| Unstructured pruning | 개별 weight | 저장 공간을 크게 줄일 수 있어요 | 하드웨어가 sparse 계산을 못 하면 빨라지지 않을 수 있어요 |
| Structured pruning | channel, filter, neuron, layer | 실제 속도 향상에 유리해요 | 구조 변경으로 정확도 손실이 커질 수 있어요 |
| Dynamic pruning | 입력에 따라 일부 계산을 건너뜀 | 쉬운 입력을 빠르게 처리할 수 있어요 | 런타임 판단 비용과 구현 복잡도가 있어요 |
Distillation의 논리
일반 학습에서는 정답이 “고양이”면 나머지는 모두 틀린 답으로 다뤄요. 하지만 선생님 모델은 “고양이가 가장 맞지만, 강아지와도 조금 비슷하고, 여우와는 덜 비슷하다”는 식의 확률 분포를 줄 수 있어요.
이 확률 분포가 작은 모델에게 더 풍부한 학습 신호가 돼요.
큰 teacher model
↓ soft probability
작은 student model
↓ hard label도 함께 학습
배포하기 쉬운 compact model
핵심은 학생 모델이 정답만 맞히는 것이 아니라 선생님 모델의 판단 구조를 따라 배우는 거예요.
Low-rank factorization의 논리
큰 행렬 하나를 더 작은 행렬 두 개의 곱으로 근사할 수 있다면 저장량을 줄일 수 있어요.
[ A \approx UV ]
원래 (A)가 (m \times n) 크기라면 파라미터 수는 (mn)개예요. 그런데 (U)가 (m \times k), (V)가 (k \times n)이고 (k)가 작다면 저장량은 (mk + kn)이 돼요.
단, 너무 작은 (k)를 고르면 중요한 정보가 사라져요. 너무 큰 (k)를 고르면 줄어드는 효과가 작아요.
Quantization의 논리
Quantization은 연속적인 실수를 정해진 작은 숫자 칸으로 옮기는 일이에요.
[ q = \text{round}\left(\frac{x}{s}\right) ]
여기서 (x)는 원래 실수 값, (s)는 실수를 정수 범위로 옮기기 위한 스케일, (q)는 양자화된 정수예요.
이 수식은 “숫자를 일정한 간격의 칸에 넣는다”는 뜻이에요. 칸이 넓으면 저장은 쉬워지지만 오차가 커져요. 칸이 촘촘하면 정확하지만 저장과 계산 비용이 커져요.
PTQ와 QAT
| 방식 | 언제 양자화하나요? | 장점 | 단점 |
|---|---|---|---|
| PTQ | 학습이 끝난 뒤 | 빠르고 간단해요 | 민감한 모델은 정확도가 떨어질 수 있어요 |
| QAT | 학습 중에 양자화 효과를 흉내 냄 | 정확도 보존에 유리해요 | 추가 학습 비용과 튜닝이 필요해요 |
| Dynamic quantization | 실행 중 입력에 따라 범위를 계산 | 입력 변화에 적응할 수 있어요 | 런타임 오버헤드가 있어요 |
PTQ는 빠른 배포에 좋아요. QAT는 정확도 손실이 작아야 하는 제품 환경에 더 적합할 수 있어요.
Architectural efficiency의 논리
FLOPs가 줄었다고 실제 지연시간이 반드시 줄지는 않아요. 실제 하드웨어에서는 메모리를 읽고 쓰는 시간, 커널 실행 방식, 병렬 처리 효율이 중요해요.
예를 들어 모델 안에 0이 많아도 일반적인 dense 행렬곱으로 실행하면 컴퓨터는 0까지 모두 계산할 수 있어요. 그러면 이론적으로는 줄었지만 실제로는 별로 빨라지지 않아요.
그래서 다음 같은 실행 최적화가 필요해요.
| 기법 | 아이디어 |
|---|---|
| Operator fusion | 여러 연산을 하나로 합쳐 메모리 이동을 줄여요 |
| Sparse kernel | 0인 값을 건너뛰도록 실행해요 |
| Hardware-aware scheduling | 하드웨어의 병렬 구조에 맞게 계산을 배치해요 |
| Early exit | 쉬운 입력은 중간에서 답을 내고 멈춰요 |
전체 최적화 순서 예시
원문은 BERT-Base 예시를 통해 순서가 중요하다고 설명해요.
큰 모델
↓ structured pruning
중요한 구조만 남김
↓ knowledge distillation
정확도 일부 회복
↓ INT8 quantization 또는 QAT
메모리와 연산 비용 감소
↓ operator fusion, sparsity-aware 실행
실제 하드웨어 지연시간 감소
순서를 잘못 잡으면 손실이 커질 수 있어요. 예를 들어 먼저 지나치게 양자화하면, 이후 pruning에서 어떤 weight가 중요한지 판단하기 더 어려워질 수 있어요.
2단계 중간 정리
이 장의 논리는 아래처럼 압축할 수 있어요.
제약을 측정한다
↓
제약을 세 최적화 차원에 연결한다
↓
기법을 고른다
↓
정확도와 시스템 성능을 함께 측정한다
↓
필요하면 여러 기법을 순서 있게 조합한다
최적화는 “정확도 조금 내리고 속도 올리기”처럼 단순한 문제가 아니에요. 실제 하드웨어, 메모리 대역폭, 에너지, 런타임 지원, 시스템 전체 병목을 함께 보는 문제입니다.
3단계: 대학교 수준
3.1 Model Optimization Fundamentals
원문은 먼저 연구 모델과 배포 모델 사이의 불일치를 문제로 제기해요. 연구에서는 정확도가 가장 중요한 지표가 되기 쉽지만, 실제 배포에서는 정확도 하나만으로는 부족해요. 모바일 장치에는 몇 GB 수준의 메모리만 있을 수 있고, 마이크로컨트롤러는 KB 단위의 SRAM만 가질 수 있어요. 클라우드에서는 모델이 돌아가더라도 요청량이 커지면 전력과 비용이 운영 부담으로 바뀌어요.
따라서 모델 최적화의 목표는 다음과 같이 정리할 수 있어요.
| 목표 | 설명 |
|---|---|
| 정확도 유지 | 모델의 핵심 기능을 망가뜨리지 않아야 해요 |
| 메모리 감소 | 파라미터, activation, 버퍼 사용량을 줄여야 해요 |
| 지연시간 감소 | 사용자 요청이나 실시간 제어 요구를 만족해야 해요 |
| 에너지 감소 | 모바일, 엣지, 대규모 클라우드에서 전력 비용을 낮춰야 해요 |
| 하드웨어 적합성 | 목표 장치가 실제로 빠르게 실행할 수 있는 형태여야 해요 |
중요한 점은 이것이 다목적 최적화 문제라는 점이에요. 하나를 좋게 만들면 다른 하나가 나빠질 수 있어요. 더 작은 모델은 빠를 수 있지만 정확도가 떨어질 수 있고, 낮은 정밀도는 메모리를 줄이지만 numerical error를 늘릴 수 있어요.
원문은 이 문제를 세 차원으로 구성해요.
- 모델 표현을 효율화해 어떤 계산을 할지 줄여요.
- 숫자 표현을 줄여 같은 계산을 더 가볍게 해요.
- 하드웨어 실행 방식을 맞춰 이론적 절감이 실제 성능 향상으로 이어지게 해요.
3.2 Optimization Framework
최적화 프레임워크는 소프트웨어 알고리즘과 하드웨어 실행 사이를 잇는 구조예요. 원문은 세 레이어의 상호작용을 강조해요.
| 차원 | 대표 질문 | 대표 기법 |
|---|---|---|
| Efficient model representation | 모델에 중복이 있나요? | pruning, distillation, structured approximation, NAS |
| Efficient numerics representation | 숫자를 너무 큰 형식으로 쓰나요? | quantization, mixed precision, FP16, BF16, INT8 |
| Efficient hardware implementation | 하드웨어가 좋아하는 패턴으로 실행되나요? | sparsity exploitation, operator fusion, scheduling, dynamic computation |
이 프레임워크의 핵심은 “한 기법이 한 차원에만 머물지 않는다”는 점이에요. Pruning은 모델 표현 기법이지만, 0이 많은 구조를 만들기 때문에 hardware execution에도 영향을 줘요. Quantization은 수치 정밀도 기법이지만, 모델 크기와 메모리 대역폭도 줄여요.
그래서 최적화는 개별 기술 목록이 아니라 조합과 순서의 문제예요.
3.3 Deployment Context
Practical deployment
원문은 실제 배포 환경이 얼마나 다른지 강조해요.
| 환경 | 대표 제약 |
|---|---|
| Cloud ML | 처리량, 비용, 전력, GPU 활용률 |
| Edge ML | 낮은 지연시간, 제한된 메모리, 제한된 compute |
| Mobile ML | 배터리, 발열, 앱 크기, 실시간 반응성 |
| Tiny ML | 아주 작은 RAM과 flash, 매우 낮은 전력 |
마이크로컨트롤러 예시는 극단적인 차이를 보여줘요. Arduino Uno는 SRAM이 2KB 수준이고 flash도 32KB 수준이에요. 반면 현대 GPU는 수십 GB 메모리와 훨씬 높은 클럭, 많은 코어를 가져요. 이런 차이 때문에 같은 모델을 모든 환경에 그대로 배포할 수 없어요.
Edge ML은 클라우드 왕복 없이 로컬 장치에서 추론해 지연시간을 크게 줄일 수 있지만, 모델 크기와 연산량이 엄격히 제한돼요. Tiny ML은 1mW 이하 전력과 1MB 미만 메모리 같은 극단적인 조건을 다뤄요.
Balancing trade-offs
모델 capacity를 늘리면 대체로 표현력과 정확도가 좋아질 가능성이 있지만, 메모리 footprint, latency, power consumption, training cost도 커져요.
특히 memory bandwidth가 병목이 되는 경우가 많아요. 큰 모델은 weight를 연산 장치로 계속 옮겨야 하고, 모바일 SoC의 메모리 대역폭은 고성능 GPU보다 훨씬 낮아요. 그래서 연산 장치가 충분히 빨라도 데이터를 가져오느라 기다리는 “memory wall”이 생겨요.
이 장에서 반복되는 핵심은 이것입니다.
최적화할 대상은 모델 파일만이 아니라
모델이 실제 시스템 안에서 움직이는 전체 경로입니다.
3.4 Framework Application and Navigation
Mapping constraints
제약 조건은 최적화 차원을 고르는 지도 역할을 해요.
| 제약 | 우선 고려할 차원 | 가능한 접근 |
|---|---|---|
| 저장 공간 부족 | 모델 표현, 수치 정밀도 | pruning, distillation, quantization |
| 메모리 대역폭 부족 | 수치 정밀도, 아키텍처 효율 | INT8, BF16, operator fusion, tiling |
| 추론 지연시간 | 모델 표현, 아키텍처 효율 | structured pruning, early exit, sparse kernel |
| 학습 또는 추론 비용 | 수치 정밀도, 아키텍처 효율 | mixed precision, efficient kernels |
| 정확도 손실 불가 | 학습-aware 최적화 | QAT, gradual pruning, distillation |
이 표는 절대적인 규칙이 아니라 출발점이에요. 하나의 기법은 여러 제약에 동시에 영향을 주기 때문이에요.
Navigation strategies
원문은 실무적 접근을 세 가지 속도로 나눠 설명해요.
| 접근 | 특징 | 기대 효과와 비용 |
|---|---|---|
| 빠른 배포 | 학습 후 수정 중심 | 몇 시간 안에 4-8배 압축, 1-2% 정확도 손실 가능 |
| production-grade 최적화 | pruning, fine-tuning, quantization 조합 | 몇 주가 걸릴 수 있지만 8-15배 압축과 1% 미만 손실을 목표로 함 |
| 극한 제약 | sub-1MB, sub-10mW 같은 조건 | NAS, 초저정밀도, 구조 변경까지 포함하며 수개월의 엔지니어링이 필요할 수 있음 |
또 하나 중요한 지적은 동일한 quantization도 하드웨어에 따라 효과가 크게 다르다는 점이에요. 특화 accelerator에서는 큰 speedup이 나와도 일반 CPU에서는 제한적일 수 있어요. 그래서 최적화 전에는 시스템 전체 profiling이 필수입니다.
3.5 Optimization Dimensions
Model representation
모델 표현 최적화는 구조적 중복을 줄이는 차원이에요. 현대 신경망은 필요한 것보다 훨씬 많은 파라미터를 갖는 경우가 많아요. 이런 overparameterization은 학습 중에는 도움이 될 수 있지만, 배포 시점에는 압축 여지가 돼요.
대표 기법은 다음과 같아요.
| 기법 | 설명 |
|---|---|
| Pruning | 덜 중요한 weight, neuron, channel, layer를 제거해요 |
| Knowledge distillation | 큰 teacher의 지식을 작은 student로 옮겨요 |
| Low-rank, tensor decomposition | 큰 행렬이나 텐서를 작은 구성요소로 근사해요 |
| NAS | 효율적인 모델 구조를 자동으로 탐색해요 |
Numerical precision
수치 정밀도 최적화는 weight, activation, 연산을 어떤 숫자 형식으로 표현할지 다뤄요. FP32는 안정적이지만 비용이 커요. FP16, BF16, INT8, INT4 같은 낮은 정밀도는 메모리와 연산 비용을 줄이지만 오차를 늘릴 수 있어요.
Mixed-precision training은 forward pass에는 FP16 같은 낮은 정밀도를 쓰고, gradient 관련 계산에는 더 높은 정밀도를 유지해 안정성과 효율을 동시에 노려요.
Architectural efficiency
아키텍처 효율은 “좋은 구조와 좋은 숫자 형식이 실제로 빠르게 실행되는가”를 다뤄요. 이 차원에서는 sparsity, matrix factorization, dynamic computation, operator fusion, hardware-aware scheduling이 중요해요.
예를 들어 90% sparse model은 이론적으로 10%만 계산하면 될 것처럼 보이지만, 실제 speedup은 specialized sparse kernel과 하드웨어 지원이 있어야 나와요.
Three-dimensional framework
세 차원은 서로 얽혀 있어요.
Pruning -> 파라미터 감소 -> sparsity 생성 -> sparse hardware 필요
Quantization -> bit-width 감소 -> 메모리 대역폭 감소 -> low-precision accelerator 필요
Distillation -> 작은 dense model 생성 -> 일반 하드웨어에서 실행하기 쉬움
NAS -> 구조 자체를 목표 하드웨어에 맞춤 -> 후속 quantization과 pruning 효과 증가
3.6 Structural Model Optimization Methods
원문은 구조 최적화의 목표를 두 가지로 설명해요.
- overparameterization에서 생긴 중복을 제거해요.
- 하드웨어에서 효율적으로 실행될 수 있는 구조로 바꿔요.
여기에는 pruning, distillation, structured approximation, NAS가 포함돼요.
Pruning의 기본 아이디어
Pruning은 모델 안에서 중요도가 낮은 파라미터나 구조를 제거하는 방법이에요. 모델이 커질수록 memory bandwidth가 병목이 될 수 있기 때문에, 파라미터를 줄이면 저장 공간과 데이터 이동량을 줄일 수 있어요.
원문의 작은 예시는 3x3 weight matrix에서 크기가 작은 값들을 제거하고, 큰 절댓값을 가진 4개만 남기는 방식이에요. 여기서 핵심은 “nonzero parameter 수를 줄인다”는 점이에요.
수학적으로는 다음과 같이 쓸 수 있어요.
[ \min_{\hat{W}} \mathcal{L}(\hat{W}) \quad \text{subject to} \quad |\hat{W}|_0 \leq k ]
각 항의 의미는 다음과 같아요.
| 기호 | 의미 |
|---|---|
| (\hat{W}) | pruning 이후 남은 파라미터 |
| (\mathcal{L}(\hat{W})) | pruning 이후 모델 손실 |
| (\lVert \hat{W} \rVert_0) | 0이 아닌 파라미터 개수 |
| (k) | 허용하는 최대 파라미터 수 |
(\ell_0)-norm을 직접 최소화하는 문제는 어렵기 때문에 실제로는 magnitude-based selection, gradient-based importance, second-order sensitivity 같은 근사 기준을 써요.
때로는 다음과 같은 soft regularization을 써서 작은 weight가 많아지도록 유도해요.
[ \min_W \mathcal{L}(W) + \lambda |W|_1 ]
(\lambda)는 sparsity를 얼마나 강하게 유도할지 조절해요. 하지만 (\ell_1)은 weight를 작게 만들 뿐 정확히 0으로 만드는 것은 아니므로, 실제 메모리와 연산을 줄이려면 thresholding이 필요해요.
Pruning target structures
Pruning은 무엇을 제거하느냐에 따라 달라져요.
| 대상 | 설명 | 주의점 |
|---|---|---|
| Weight | 개별 연결을 제거해요 | sparse kernel 없이는 속도 향상이 작을 수 있어요 |
| Neuron | 뉴런 전체와 연결을 제거해요 | layer width가 줄어요 |
| Channel 또는 filter | CNN의 feature channel이나 filter를 제거해요 | 이후 layer의 입력 channel도 맞춰야 해요 |
| Layer | layer 전체를 제거해요 | 연결을 우회하도록 구조를 다시 잡아야 해요 |
Channel pruning과 layer pruning은 구조를 바꾸므로 fine-tuning이 중요해요. 남은 네트워크가 새 구조에 적응해야 하기 때문이에요.
Unstructured pruning
Unstructured pruning은 개별 weight를 제거해요. 수학적으로는 binary mask (M)을 weight matrix (W)에 element-wise로 곱해요.
[ \hat{W} = M \odot W ]
보통 magnitude 기준이면 threshold (\tau)를 두고 다음처럼 마스크를 만들어요.
[ M_{i,j} = \begin{cases} 1, & |W_{i,j}| > \tau \ 0, & \text{otherwise} \end{cases} ]
장점은 모델 저장 공간을 크게 줄일 수 있다는 점이에요. 하지만 GPU와 TPU는 dense matrix multiplication에 최적화된 경우가 많기 때문에, sparse 계산 커널이 없으면 실제 추론 속도는 거의 좋아지지 않을 수 있어요.
즉 unstructured pruning은 “parameter-level compression”에는 강하지만, “wall-clock latency” 향상은 하드웨어와 런타임 지원에 달려 있어요.
Structured pruning
Structured pruning은 neuron, filter, channel, layer 같은 전체 계산 단위를 제거해요. 이렇게 하면 남은 모델이 더 작은 dense model이 되기 쉬워서 일반 하드웨어에서도 속도 향상이 잘 나타날 수 있어요.
구조 단위의 중요도는 여러 방식으로 평가해요.
| 기준 | 설명 | 특징 |
|---|---|---|
| Magnitude-based | 해당 구조의 weight norm이 작은지 봐요 | 빠르고 구현이 쉬워요 |
| Activation-based | 실제 데이터에서 activation이 낮은지 봐요 | 데이터 분포를 반영해요 |
| Gradient-based | loss를 줄이는 데 기여하는 gradient가 작은지 봐요 | 학습 동역학을 반영하지만 계산이 복잡해요 |
Structured pruning은 실제 FLOPs를 줄이는 데 유리하지만, 모델 capacity를 구조적으로 없애므로 정확도 손실 가능성이 더 커요. 그래서 fine-tuning이나 distillation과 함께 쓰는 경우가 많아요.
Dynamic pruning
Static pruning은 한 번 제거한 파라미터를 계속 제거된 상태로 둬요. Dynamic pruning은 입력이나 학습 과정에 따라 어떤 부분을 쓸지 조정해요.
예를 들어 간단한 이미지에서는 많은 convolution filter가 거의 반응하지 않을 수 있어요. 이때 activation-conditioned pruning은 낮은 activation을 보이는 filter나 channel을 이번 입력에 대해 건너뛰어요.
학습 중 dynamic pruning도 있어요. Gradual magnitude pruning은 dense network로 시작해 pruning 비율을 점점 늘려요. 어떤 방식은 중요해진 연결을 다시 살리는 regrowth까지 허용해요.
장점은 입력 난이도에 맞춰 계산량을 조절할 수 있다는 점이에요. 단점은 런타임에서 pruning decision을 내려야 하므로 오버헤드와 구현 복잡도가 생긴다는 점이에요.
Pruning trade-offs
| 방식 | 메모리 절감 | 실제 속도 향상 | 정확도 보존 | 구현 난이도 |
|---|---|---|---|---|
| Unstructured | 높음 | 낮거나 하드웨어 의존 | 비교적 좋을 수 있음 | 중간 |
| Structured | 중간-높음 | 높음 | 더 민감할 수 있음 | 중간-높음 |
| Dynamic | 입력에 따라 다름 | 입력에 따라 큼 | 유연함 | 높음 |
Pruning은 “얼마나 자를지”와 “어떤 기준으로 자를지”가 모두 중요해요.
Iterative pruning과 one-shot pruning
원문은 두 전략을 비교해요.
| 전략 | 방식 | 장점 | 단점 |
|---|---|---|---|
| Iterative pruning | 조금 자르고 fine-tuning을 반복해요 | 정확도 보존에 유리해요 | 시간이 오래 걸려요 |
| One-shot pruning | 한 번에 많이 자르고 fine-tuning해요 | 빠르게 압축해요 | 정확도 손실이 클 수 있어요 |
원문의 예시에서 iterative pruning은 6개 channel을 세 번에 나누어 제거하고 각 단계마다 fine-tuning해 최종 정확도를 거의 유지해요. 반면 one-shot pruning은 같은 channel을 한 번에 제거하면서 정확도가 크게 떨어지고, fine-tuning 후에도 회복이 제한적이에요.
이 예시는 pruning에서 “최종 구조가 같아도 도달 경로가 중요하다”는 점을 보여줘요.
Lottery Ticket Hypothesis
Lottery Ticket Hypothesis는 큰 네트워크 안에 처음부터 잘 학습될 수 있는 작은 subnetwork, 즉 winning ticket이 존재할 수 있다는 가설이에요.
절차는 다음과 같아요.
큰 네트워크를 학습함
↓
작은 magnitude weight를 pruning함
↓
남은 weight를 원래 초기값으로 되돌림
↓
다시 학습하고 pruning을 반복함
↓
작지만 잘 학습되는 winning ticket을 찾음
이 가설은 pruning을 단순 압축이 아니라 효율적인 subnetwork를 발견하는 과정으로 보게 해요. 하지만 실제로 winning ticket을 찾으려면 여러 번 학습과 pruning을 반복해야 하므로 계산 비용이 큽니다.
Pruning practice
실무 프레임워크는 pruning을 직접 구현하지 않아도 되도록 API를 제공해요.
| 도구 | 역할 |
|---|---|
| PyTorch pruning utilities | unstructured, structured, custom pruning을 적용할 수 있어요 |
| TensorFlow Model Optimization Toolkit | training 중 sparsity를 유도하고 TFLite export를 지원해요 |
| ONNX | pruning 자체보다는 pruned model의 교환과 inference engine 연계를 지원해요 |
| TensorRT, OpenVINO, EdgeTPU | structured pruning이나 graph optimization을 실제 실행 성능으로 연결해요 |
중요한 실무 판단은 하드웨어 호환성이에요. Unstructured pruning은 파일 크기를 줄여도 CPU/GPU에서 바로 빨라지지 않을 수 있고, structured pruning은 모바일과 엣지에서 더 실용적일 가능성이 커요.
원문은 MobileNet, BERT, EfficientNet 같은 모델에서 pruning이 활용된 사례를 언급해요. BERT에서는 attention head와 intermediate layer pruning이 중요하고, EfficientNet에서는 filter pruning이 모바일 배포에 도움이 될 수 있어요.
3.7 Knowledge Distillation
Knowledge distillation은 큰 teacher model의 출력 분포를 작은 student model이 학습하게 하는 방법이에요. Pruning이 기존 모델에서 부분을 제거하는 방식이라면, distillation은 작은 새 모델을 teacher의 안내로 학습하는 방식이에요.
Distillation theory
일반 supervised learning은 hard label을 써요. 예를 들어 정답이 “dog”이면 dog만 1이고 나머지는 0이에요. 하지만 teacher model의 soft probability는 클래스 간 유사성을 담아요.
예를 들어 teacher가 다음처럼 판단할 수 있어요.
| 클래스 | teacher 확률의 의미 |
|---|---|
| dog | 가장 가능성이 높음 |
| wolf | dog와 특징이 일부 비슷함 |
| fox | 조금 비슷하지만 wolf보다는 덜 비슷함 |
이 정보는 hard label보다 풍부해요. Student는 단순히 정답만 외우는 것이 아니라 teacher가 만든 decision boundary의 모양을 배우게 돼요.
Distillation mathematics
모델의 softmax는 logit (z_i)를 확률로 바꿔요.
[ p_i = \frac{\exp(z_i)}{\sum_j \exp(z_j)} ]
Distillation에서는 temperature (T)를 넣어 분포를 부드럽게 만들어요.
[ p_i(T) = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} ]
(T)가 커지면 확률 분포가 덜 뾰족해져요. 즉 teacher가 “정답 말고 다른 후보를 얼마나 비슷하게 보는지”가 더 잘 드러나요.
Student의 손실은 보통 두 항을 섞어요.
[ \mathcal{L}{\text{distill}} = (1-\alpha)\mathcal{L}{\text{CE}}(y_s, y)
- \alpha T^2 \cdot \mathrm{KL}(p^T_{\text{teacher}} | p^T_{\text{student}}) ]
| 항 | 의미 |
|---|---|
| (\mathcal{L}_{\text{CE}}) | student가 실제 hard label을 맞히도록 해요 |
| KL divergence | teacher와 student의 soft distribution 차이를 줄여요 |
| (T^2) | temperature가 커질 때 gradient scale을 보정해요 |
| (\alpha) | hard label 학습과 teacher 모방 사이의 비중을 조절해요 |
Distillation intuition and gains
Distillation의 장점은 세 가지로 볼 수 있어요.
| 장점 | 설명 |
|---|---|
| 메모리 효율 | student가 작으므로 저장 공간과 로딩 시간이 줄어요 |
| 계산 효율 | dense하고 작은 모델이라 일반 accelerator에서 실행하기 쉬워요 |
| 일반화 | teacher의 soft target이 regularization처럼 작동할 수 있어요 |
원문은 DistilBERT 같은 모델이 큰 teacher 성능의 상당 부분을 유지하면서 파라미터와 지연시간을 줄이는 사례를 언급해요. 또한 multilingual NLP나 computer vision에서 하나의 teacher가 여러 task-specific student를 가르칠 수 있다고 설명해요.
한계도 있어요.
| 한계 | 설명 |
|---|---|
| teacher 품질 의존 | teacher가 틀린 bias를 가지면 student도 배울 수 있어요 |
| 추가 학습 비용 | teacher와 student를 함께 사용하는 훈련 단계가 필요해요 |
| student capacity | student가 너무 작으면 teacher 지식을 충분히 흡수하지 못해요 |
Pruning과 비교하면 distillation은 정확도 보존에 유리한 경우가 많지만, 새 모델 훈련이 필요해요. 실제로는 pruning, distillation, quantization을 조합하는 편이 효과적이에요.
3.8 Structured Approximations
Structured approximation은 파라미터를 그냥 삭제하는 대신, 큰 행렬이나 텐서를 더 작은 구성요소로 근사하는 방법이에요.
Low-rank matrix factorization
큰 weight matrix (A \in \mathbb{R}^{m \times n})를 두 작은 행렬의 곱으로 근사해요.
[ A \approx UV ]
여기서 (U \in \mathbb{R}^{m \times k}), (V \in \mathbb{R}^{k \times n})이고 (k)는 (m,n)보다 작아요. SVD를 쓰면 다음처럼 분해할 수 있어요.
[ A = U\Sigma V^T ]
상위 (k)개의 singular value만 남기면 low-rank approximation이 돼요.
파라미터 수는 다음처럼 바뀌어요.
| 표현 | 파라미터 수 |
|---|---|
| 원래 행렬 | (mn) |
| low-rank 근사 | (mk + kn) |
(k)가 충분히 작으면 저장량이 줄어요. 하지만 inference 중에는 두 번의 행렬곱이 필요할 수 있으므로 latency가 항상 줄지는 않아요.
활용처는 fully connected layer, convolution filter factorization, recommendation system의 user-item matrix factorization 등이에요.
주요 trade-off는 rank 선택이에요. (k)가 너무 작으면 정보 손실이 크고, 너무 크면 압축 효과가 작아요. 데이터에 noise나 missing value가 있으면 regularization이 필요할 수도 있어요.
Tensor decomposition
현대 모델에는 2차원 행렬뿐 아니라 convolution kernel, attention tensor, embedding tensor처럼 다차원 텐서가 많이 등장해요. Tensor decomposition은 low-rank factorization을 고차원으로 확장해요.
대표 방법은 세 가지예요.
| 방법 | 핵심 아이디어 |
|---|---|
| CP decomposition | 텐서를 rank-one component들의 합으로 표현해요 |
| Tucker decomposition | core tensor와 mode별 factor matrix로 나눠요 |
| Tensor-Train decomposition | 고차원 텐서를 연속된 작은 core들의 곱으로 표현해요 |
CP decomposition은 다음처럼 쓸 수 있어요.
[ \mathcal{A} \approx \sum_{r=1}^{k} u_r \otimes v_r \otimes w_r ]
Tucker decomposition은 다음처럼 표현돼요.
[ \mathcal{A} \approx \mathcal{G} \times_1 U \times_2 V \times_3 W ]
Tensor-Train은 고차원 텐서를 여러 core로 이어 붙여 표현해요.
[ \mathcal{A} \approx \mathcal{G}^{(1)} \times \mathcal{G}^{(2)} \times \dots \times \mathcal{G}^{(d)} ]
Tensor decomposition은 CNN filter compression, NLP embedding compression, attention 연산 최적화, accelerator-friendly tensor operation에 활용돼요.
하지만 rank 선택, factorization 자체의 계산 비용, tensor contraction overhead, numerical stability 문제가 있어요. 특히 factorized representation이 ill-conditioned해지면 학습과 추론의 안정성이 떨어질 수 있어요.
LRMF와 tensor decomposition 비교
| 항목 | LRMF | Tensor decomposition |
|---|---|---|
| 대상 | 2차원 행렬 | 고차원 텐서 |
| 주요 적용 | fully connected, embedding | convolution, attention, multi-way interaction |
| 장점 | 이해와 구현이 비교적 쉬움 | 고차원 구조를 더 잘 활용 |
| 위험 | rank 선택과 추가 행렬곱 | rank 정의가 복잡하고 tensor contraction overhead가 큼 |
두 방법은 경쟁 관계가 아니라 서로 보완적이에요. 한 모델 안에서 dense layer는 LRMF로, convolution kernel이나 attention tensor는 tensor decomposition으로 다룰 수 있어요.
3.9 Neural Architecture Search
NAS는 사람이 직접 구조를 설계하는 대신, 가능한 architecture 공간을 자동으로 탐색해 정확도와 효율의 균형이 좋은 모델을 찾는 방법이에요.
NAS의 세 단계
| 단계 | 질문 |
|---|---|
| Search space definition | 어떤 layer, block, activation, width, depth를 고를 수 있나요? |
| Search strategy | 후보 구조를 어떤 순서와 방식으로 탐색하나요? |
| Candidate evaluation | 정확도, FLOPs, latency, memory, energy를 어떻게 평가하나요? |
Search space는 너무 좁으면 좋은 구조를 놓치고, 너무 넓으면 비용이 폭발해요.
Search strategies
| 전략 | 설명 | 장점 | 단점 |
|---|---|---|---|
| Reinforcement learning NAS | controller가 architecture를 순차적으로 생성하고 reward를 받아요 | 좋은 구조를 찾을 수 있어요 | 매우 비쌀 수 있어요 |
| Evolutionary NAS | architecture population을 mutation과 selection으로 진화시켜요 | 병렬화가 쉬워요 | 많은 평가가 필요해요 |
| Gradient-based NAS | architecture 선택을 연속 변수로 완화해 gradient descent로 최적화해요 | search cost를 크게 줄여요 | discrete 구조의 특성을 놓칠 수 있어요 |
NAS optimization problem
NAS는 bi-level optimization으로 볼 수 있어요. 바깥 루프는 architecture (\alpha)를 찾고, 안쪽 루프는 그 architecture의 weight (w)를 학습해요.
[ \alpha^* = \arg\min_{\alpha \in \mathcal{A}} \mathcal{L}{\text{val}}(w^*(\alpha), \alpha) \quad \text{subject to} \quad C(\alpha) \leq C{\text{max}} ]
[ w^*(\alpha) = \arg\min_w \mathcal{L}_{\text{train}}(w, \alpha) ]
여기서 (C(\alpha))는 latency, memory, energy 같은 배포 제약이에요. 이 공식이 보여주는 어려움은 후보 architecture마다 학습을 해야 평가할 수 있다는 점이에요. Search space가 조금만 커져도 exhaustive search는 불가능해져요.
Search space design
Cell-based search는 전체 네트워크가 아니라 반복 가능한 작은 block, 즉 cell을 찾고 이를 쌓아 전체 모델을 만들어요. 이렇게 하면 탐색 공간이 줄고, 발견한 cell을 여러 모델 크기에 재사용할 수 있어요.
Hardware-aware search는 FLOPs만 보지 않고 실제 장치의 latency를 최적화 대상으로 넣어요. 예를 들어 모바일 CPU, GPU, edge accelerator에서 실제로 빠른 구조를 찾기 위해 latency predictor나 hardware-in-the-loop 평가를 사용해요.
NAS in practice
원문은 MnasNet식 latency-aware reward를 소개해요.
[ \text{Reward}(\alpha) = \text{Accuracy}(\alpha) \times \left(\frac{L(\alpha)}{L_{\text{target}}}\right)^\beta ]
여기서 (L(\alpha))는 측정된 latency, (L_{\text{target}})은 목표 latency, (\beta)는 accuracy-latency trade-off를 조절하는 값이에요.
이런 방식은 FLOPs가 낮은 구조가 아니라 실제 장치에서 빠른 구조를 찾는 데 중요해요.
When to use NAS
NAS는 강력하지만 비싸요. 그래서 언제 쓸지 판단해야 해요.
| NAS가 적합한 경우 | NAS를 피하는 편이 나은 경우 |
|---|---|
| 새로운 하드웨어 제약이 있음 | 이미 잘 최적화된 표준 모델이 있음 |
| billions of inference 규모라 1-2% 효율 개선도 큰 비용 절감이 됨 | compute budget이 작음 |
| cloud, edge, mobile용 architecture family가 필요함 | 요구사항이 빨리 바뀜 |
대부분의 실무자는 NAS를 직접 돌리기보다 EfficientNet, MobileNetV3, MnasNet처럼 이미 NAS로 발견된 architecture에서 시작하는 것이 투자 대비 효과가 좋아요.
Architecture examples
원문은 EfficientNet, MobileNetV3, FBNet, NAS-BERT, efficient ViT 계열을 예시로 들어요.
| 모델 | NAS가 찾은 효율 포인트 |
|---|---|
| EfficientNet | depth, width, resolution의 compound scaling |
| MobileNetV3 | mobile hardware에 맞춘 inverted residual, squeeze-and-excitation, activation 선택 |
| FBNet | 모바일 CPU latency를 search objective에 반영 |
| NAS-BERT | transformer 구조를 더 효율적으로 탐색 |
이후 원문은 BERT-Base 예시로 구조 최적화만으로는 부족하다는 점을 보여줘요. 440MB 모델을 pruning과 distillation으로 110MB까지 줄여도, FP32 matrix multiplication 때문에 모바일 latency 목표를 못 맞출 수 있어요. 이것이 다음 차원인 numerical precision optimization으로 이어져요.
3.10 Quantization and Precision Optimization
수치 정밀도는 weight와 activation을 어떤 형식으로 표현할지 정해요. FP32는 안정적이지만 4바이트를 쓰고, memory bandwidth와 energy cost가 커요. 낮은 정밀도는 연산과 메모리 이동을 줄이지만, quantization error를 만들어요.
원문은 precision reduction이 단순히 칩 스펙의 TOPS 향상만큼 end-to-end speedup을 보장하지 않는다고 경고해요. Format conversion, mixed-precision orchestration, accuracy recovery, convergence delay 같은 시스템 비용이 있기 때문이에요.
Precision and energy
연산 에너지 예시는 precision reduction의 의미를 잘 보여줘요.
| 연산 | 대략적인 에너지 |
|---|---|
| 32-bit floating add | 약 0.9 pJ |
| 16-bit floating add | 약 0.4 pJ |
| 32-bit integer add | 약 0.1 pJ |
| 8-bit integer add | 약 0.03 pJ |
하지만 더 큰 비용은 데이터 이동일 수 있어요. DRAM access는 cache access나 산술 연산보다 훨씬 비쌀 수 있어요. 따라서 quantization은 연산을 가볍게 하는 동시에 메모리에서 옮기는 byte 수도 줄여요.
FP32에서 INT8로 가면 각 weight가 4바이트에서 1바이트로 줄어, 이론적으로 저장량은 4배 줄어들 수 있어요. 최적화된 하드웨어에서는 inference도 4-8배 빨라질 수 있지만, 이는 hardware support에 의존해요.
Numeric encoding and storage
수치 형식은 sign, exponent, mantissa 또는 integer range로 구성돼요.
| 형식 | 특징 | 주 용도 |
|---|---|---|
| FP32 | 넓은 범위와 높은 정밀도 | 안정적인 학습, baseline |
| FP16 | 저장과 연산이 가벼움, exponent 범위가 좁음 | accelerator training/inference |
| BF16 | FP32와 같은 exponent 폭, mantissa는 줄임 | 안정적인 training에 유리 |
| TF32 | NVIDIA Ampere에서 FP32 호환성과 속도 균형 | GPU training |
| FP8 | 더 낮은 floating precision | 최신 AI accelerator |
| INT8 | 8-bit integer, inference 효율 우수 | mobile, edge, cloud inference |
| INT4 | 더 강한 압축 | 극한 제약, LLM compression 등 |
| Binary/Ternary | 1-bit 또는 2-bit 수준 | 특수 하드웨어, 초저전력 |
BF16은 FP16보다 mantissa 정밀도는 낮지만 exponent가 넓어서 gradient의 underflow/overflow에 더 강할 수 있어요. 그래서 학습 안정성이 중요한 경우 자주 고려돼요.
Precision reduction trade-offs
Precision reduction의 효과는 모델과 layer마다 달라요. CNN은 INT8에 강한 경우가 많지만, NLP transformer나 speech model은 attention이나 normalization에서 작은 수치 차이에 민감할 수 있어요.
| 요인 | 영향 |
|---|---|
| 모델 구조 | CNN, transformer, speech model의 민감도가 달라요 |
| layer 종류 | normalization, attention은 더 높은 정밀도가 필요할 수 있어요 |
| hardware support | low-precision unit이 없으면 speedup이 작아요 |
| calibration 품질 | clipping range가 나쁘면 accuracy가 크게 떨어져요 |
| task 요구 | fine-grained classification은 quantization noise에 민감할 수 있어요 |
Post-training quantization
PTQ는 학습된 FP32 모델을 retraining 없이 INT8 또는 FP16 같은 낮은 정밀도로 바꾸는 방법이에요. 빠르고 구현이 쉬워서 production deadline이 짧을 때 유용해요.
Uniform quantization은 다음 수식으로 표현돼요.
[ q = \text{round}\left(\frac{x}{s}\right) ]
여기서 (x)는 원래 floating-point 값, (s)는 scale factor, (q)는 integer representation이에요. INT8에서는 보통 floating range를 ([-128, 127]) 또는 유사한 정수 범위에 매핑해요.
Non-uniform quantization은 값이 많이 몰린 구간에 더 촘촘한 표현을 주는 방식이에요. 정확도에는 유리할 수 있지만 calibration과 실행이 더 복잡해 production에서는 uniform quantization이 더 흔해요.
Calibration
PTQ에서 calibration은 매우 중요해요. Calibration dataset을 모델에 통과시켜 activation과 weight의 분포를 보고 clipping range ([\alpha, \beta])를 정해요.
대표 calibration 방법은 다음과 같아요.
| 방법 | 설명 | 장점 | 단점 |
|---|---|---|---|
| Max | 관측된 최대 절댓값을 범위로 써요 | 단순해요 | outlier에 취약해요 |
| Entropy | 원래 분포와 quantized 분포의 정보 손실을 줄여요 | 분포 보존에 유리해요 | 계산이 더 복잡해요 |
| Percentile | 상위 일부 outlier를 잘라내요 | outlier 영향을 줄여요 | percentile 선택이 필요해요 |
Calibration range는 symmetric 또는 asymmetric일 수 있어요.
| 방식 | 설명 | 적합한 경우 |
|---|---|---|
| Symmetric | 0을 중심으로 같은 scale을 써요 | weight 분포가 0 중심일 때 |
| Asymmetric | zero point와 scale을 조정해 치우친 분포를 표현해요 | activation 분포가 skewed일 때 |
Quantization granularity
같은 layer 안에서도 filter마다 값의 범위가 다를 수 있어요. 그래서 clipping range를 어느 단위로 잡을지가 중요해요.
| granularity | 설명 | trade-off |
|---|---|---|
| Layerwise | layer 전체에 하나의 scale을 써요 | 단순하지만 정확도 손실이 클 수 있어요 |
| Groupwise | filter를 group으로 나눠 scale을 써요 | 정확도와 비용의 중간 |
| Channelwise | channel 또는 filter별 scale을 써요 | CNN에서 실용적 표준에 가까워요 |
| Sub-channelwise | channel 내부를 더 나눠 scale을 써요 | 정확하지만 overhead가 커요 |
원문은 channelwise quantization이 convolution filter quantization에서 정확도와 효율의 균형이 좋아 널리 쓰인다고 설명해요.
Weight, activation, AWQ, static and dynamic quantization
Weight quantization은 weight를 FP32에서 INT8 같은 낮은 형식으로 바꿔 모델 크기와 메모리 읽기 비용을 줄여요.
Activation quantization은 inference 중 layer 출력값을 낮은 정밀도로 표현해 연산 비용을 줄여요. 하지만 중간 activation 오차가 다음 layer로 전파되므로 정확도 관리가 중요해요.
Activation-aware Weight Quantization, 즉 AWQ는 특히 LLM 압축에서 activation을 관찰해 중요한 소수의 weight를 보호하는 방식이에요. 원문은 약 1%의 salient weight를 보호하는 접근을 언급해요.
Activation quantization은 clipping range 계산 시점에 따라 두 방식으로 나뉘어요.
| 방식 | range 계산 시점 | 장점 | 단점 |
|---|---|---|---|
| Static quantization | calibration 때 미리 계산 | runtime overhead가 작아요 | 입력 변화에 둔감할 수 있어요 |
| Dynamic quantization | runtime에 계산 | 입력별 적응이 가능해요 | 매번 range 계산 비용이 있어요 |
Quantization-aware training
QAT는 학습 중에 quantization 효과를 흉내 내요. Forward pass에서는 quantize-dequantize를 적용해 낮은 정밀도처럼 동작하게 하고, backward pass에서는 gradient 계산을 full precision으로 유지해요.
Fake quantization은 다음처럼 표현할 수 있어요.
[ q = \text{round}\left(\frac{x}{s}\right) \times s ]
문제는 round 연산이 미분 불가능하다는 점이에요. 그래서 Straight-Through Estimator, 즉 STE를 써요. STE는 backward pass에서 round의 gradient를 대략 1처럼 취급해 gradient가 흐르게 해요.
QAT의 장점은 모델이 quantization error에 적응한다는 점이에요. INT8 inference에서 정확도를 잘 보존할 수 있어요. 단점은 학습 시간이 늘고, scale, quantization scheme, training schedule 같은 추가 hyperparameter가 생긴다는 점이에요.
실무에서는 PTQ를 먼저 적용해 보고, 정확도 손실이 크면 QAT를 적용하는 hybrid 접근이 많이 쓰여요.
Extreme quantization
Extreme quantization은 INT4를 넘어 binary 또는 ternary 표현까지 내려가요.
| 방식 | 가능한 값 | 장점 | 단점 |
|---|---|---|---|
| Binarization | 보통 -1/+1 또는 0/1 | 메모리와 연산을 극단적으로 줄여요 | 표현력이 크게 줄어요 |
| Ternarization | -1/0/+1 | binary보다 유연하고 sparsity도 가능해요 | 여전히 정확도 손실이 큼 |
이 방식은 초저전력 환경에는 매력적이지만, 일반 processor는 이런 연산에 최적화되어 있지 않을 수 있어요. 그래서 specialized hardware와 QAT 같은 보정 기법이 중요해요.
Multi-technique optimization strategies
원문은 quantization, pruning, distillation, NAS를 따로 쓰기보다 조합하라고 강조해요.
| 조합 | 왜 유용한가요? |
|---|---|
| Pruning + quantization | 파라미터 수와 bit-width를 함께 줄여 multiplicative compression을 얻어요 |
| Distillation + quantization | aggressive quantization으로 생긴 정확도 손실을 teacher guidance로 줄여요 |
| NAS + quantization | 낮은 정밀도에서도 잘 견디는 architecture를 처음부터 찾을 수 있어요 |
| Pruning + distillation | 구조를 줄인 뒤 teacher guidance로 성능을 회복해요 |
원문의 BERT 여정은 이 조합의 의미를 잘 보여줘요.
BERT-Base 440MB
↓ structural pruning + distillation
110MB
↓ INT8 quantization
28MB
↓ architectural efficiency
모바일 latency 목표에 접근
구조 최적화와 수치 정밀도 최적화만으로도 부족할 수 있어요. 모델이 여전히 0을 dense format으로 계산하거나, layer normalization이 memory-bound로 남거나, GPU가 메모리 전송을 기다린다면 architecture execution을 최적화해야 해요.
3.11 Architectural Efficiency Techniques
아키텍처 효율 최적화는 연산이 목표 하드웨어에서 실제로 잘 실행되도록 만드는 차원이에요. 이 차원은 operation scheduling, memory access, workload adaptation을 다룹니다.
Hardware-aware design
Hardware-aware design은 학습이 끝난 뒤 억지로 맞추는 것이 아니라, 모델 설계 단계부터 목표 하드웨어의 특성을 반영해요.
| 원리 | 설명 |
|---|---|
| Scaling optimization | depth, width, resolution을 하드웨어 제약에 맞춰 조절해요 |
| Computation reduction | depthwise separable convolution, bottleneck 등으로 연산을 줄여요 |
| Memory optimization | activation과 parameter 저장, memory access를 줄여요 |
| Hardware-aware operations | accelerator가 잘 처리하는 연산 패턴을 선택해요 |
Scaling optimization
Convolutional model의 FLOPs는 대략 다음에 비례해요.
[ \text{FLOPs} \propto d \cdot w^2 \cdot r^2 ]
여기서 (d)는 depth, (w)는 width, (r)은 input resolution이에요. Resolution을 키우면 (r^2)로 비용이 커져요. Width도 (w^2)로 비용이 커져요.
EfficientNet의 compound scaling은 세 요소를 따로 키우지 않고 함께 균형 있게 키워요.
[ d = \alpha^\phi d_0,\quad w = \beta^\phi w_0,\quad r = \gamma^\phi r_0 ]
(\phi)는 전체 scaling 정도이고, (\alpha,\beta,\gamma)는 각 축의 scaling 비율이에요. 이 방식은 정확도와 비용의 균형을 더 안정적으로 맞추려는 접근이에요.
Transformer에서도 layer 수, attention head 수, embedding dimension이 비슷한 역할을 해요.
Computation reduction
Depthwise separable convolution은 standard convolution을 두 단계로 쪼개요.
- Depthwise convolution: 각 입력 channel에 독립적으로 filter를 적용해요.
- Pointwise convolution: 1x1 convolution으로 channel을 섞어요.
Standard convolution 비용은 다음과 같아요.
[ \mathcal{O}(h w C_{\text{in}} C_{\text{out}} k^2) ]
Depthwise separable convolution은 다음처럼 나뉘어요.
[ \mathcal{O}(h w C_{\text{in}} k^2) + \mathcal{O}(h w C_{\text{in}} C_{\text{out}}) ]
즉 channel mixing에서 (k^2) 비용을 제거해 모바일과 엣지 장치에서 큰 절감 효과를 줄 수 있어요.
Grouped convolution은 channel을 group으로 나눠 처리하고, bottleneck layer는 1x1 convolution으로 차원을 줄인 뒤 비싼 연산을 수행해요. 이런 구조는 하드웨어 병렬성과 메모리 사용량을 함께 고려한 설계예요.
Memory optimization
메모리 최적화는 activation, feature map, parameter 저장량을 줄이는 문제예요.
DenseNet의 feature reuse는 이전 layer의 feature를 재사용해 불필요한 새 feature 생성을 줄여요. Activation checkpointing은 training 중 모든 activation을 저장하지 않고 일부만 저장한 뒤 backward pass에서 다시 계산해요.
표준 backpropagation은 activation 저장량이 다음에 비례할 수 있어요.
[ \mathcal{O}(A_{\text{total}}) ]
Activation checkpointing은 이상적으로 다음 수준까지 줄일 수 있어요.
[ \mathcal{O}(\sqrt{A_{\text{total}}}) ]
대신 일부 activation을 다시 계산해야 하므로 training time overhead가 생겨요.
SqueezeNet은 1x1 convolution을 활용해 channel 수를 먼저 줄이고, 그 다음 비싼 convolution을 수행해 parameter 수를 크게 줄이는 방식이에요.
Adaptive computation methods
Adaptive computation은 모든 입력에 같은 계산량을 쓰지 않아요. 쉬운 입력은 빨리 처리하고, 어려운 입력은 더 깊게 처리해요.
| 방식 | 설명 |
|---|---|
| Early exit | 중간 layer에서 confidence가 충분하면 바로 출력해요 |
| Conditional computation | 입력에 따라 layer, path, unit을 선택해요 |
| Gate-based computation | router나 gating network가 어떤 expert를 쓸지 정해요 |
| Adaptive inference | confidence와 complexity에 따라 계산 깊이를 조절해요 |
BranchyNet은 여러 exit point를 넣어 쉬운 입력은 중간에 빠져나오게 해요. Multi-exit vision transformer도 transformer layer마다 가벼운 classifier를 붙여 비슷한 전략을 사용해요.
SkipNet은 gating mechanism으로 특정 CNN layer를 건너뛰고, Capsule Network의 dynamic routing은 activation이 이동할 경로를 입력에 따라 정해요.
Mixture of Experts는 여러 expert 중 일부만 활성화해 큰 parameter capacity를 갖되, 입력당 계산량은 제한해요. Switch Transformer는 token마다 router가 하나의 expert를 고르게 해 feedforward layer를 expert pool로 대체해요.
Dynamic computation의 구현 문제
Dynamic computation은 매력적이지만 어렵습니다.
| 문제 | 설명 |
|---|---|
| Discrete decision | skip, exit, expert 선택은 미분하기 어려워요 |
| Training instability | 입력마다 다른 경로를 지나 gradient가 불안정할 수 있어요 |
| Runtime overhead | 경로 선택 자체도 계산 비용이에요 |
| Variable latency | 입력마다 실행 시간이 달라 실시간 시스템에 부담이 돼요 |
| Hardware divergence | GPU/TPU는 같은 연산을 대량 병렬로 할 때 효율적인데 조건 분기가 이를 방해해요 |
| Irregular memory access | 경로가 달라지면 메모리 접근 패턴도 불규칙해져요 |
| Bias risk | 특정 입력군에 계산을 덜 배정하면 성능 편향이 생길 수 있어요 |
| Evaluation difficulty | FLOPs 같은 고정 예산 지표로 adaptive model을 평가하기 어려워요 |
그래서 dynamic computation은 정확도와 평균 latency뿐 아니라 worst-case latency, fairness, robustness, reproducibility까지 측정해야 해요.
3.12 Sparsity Exploitation
Sparsity는 tensor 안의 많은 원소가 0이거나 거의 0인 상태예요.
[ S = \frac{\Vert \mathbf{1}{{T{ij}=0}} \Vert_0}{m \times n} ]
Floating-point에서는 정확히 0이 아니어도 충분히 작은 값을 0처럼 볼 수 있어요.
[ S_\epsilon = \frac{\Vert \mathbf{1}{{|T{ij}| < \epsilon}} \Vert_0}{m \times n} ]
Sparsity는 regularization 때문에 자연스럽게 생길 수도 있고, pruning으로 의도적으로 만들 수도 있어요.
Sparsity types
| 유형 | 설명 | 실행 특성 |
|---|---|---|
| Unstructured sparsity | 개별 weight가 불규칙하게 0이 돼요 | 압축률은 높지만 hardware 활용이 어려워요 |
| Structured sparsity | channel, block, N:M pattern처럼 규칙적으로 0이 돼요 | accelerator가 활용하기 쉬워요 |
Unstructured sparsity는 유연하지만 irregular memory access가 생겨요. Structured sparsity는 압축 자유도는 낮을 수 있지만 실제 speedup에 유리해요.
Sparsity utilization
Sparse matrix operation은 0을 건너뛰어 연산량을 줄여요. 예를 들어 4x4 dense matrix-vector multiplication은 16개의 곱셈이 필요하지만, nonzero가 6개뿐이면 sparse-aware implementation은 6개만 계산할 수 있어요.
하지만 이론적 절감이 실제 속도로 이어지려면 sparse format 저장, index 관리, memory access, kernel implementation이 모두 잘 맞아야 해요.
Low-rank approximation도 넓은 의미에서 중복 구조를 이용해 계산량과 저장량을 줄이는 방법으로 연결돼요. Sparsity-aware training은 학습 중부터 sparse representation을 유지하도록 돕습니다.
Hardware support
원문은 sparse operation이 하드웨어 지원 없이는 기대만큼 빨라지지 않는다고 강조해요.
| 하드웨어 | sparse 지원 특징 |
|---|---|
| GPU | NVIDIA Ampere의 Sparse Tensor Core처럼 structured sparsity를 가속할 수 있어요 |
| TPU | sparse matrix optimization과 높은 tensor throughput을 활용해요 |
| FPGA | data path를 custom하게 설계해 특수 sparse pattern에 맞출 수 있어요 |
| CPU | 일반적으로 sparse acceleration 이점이 제한적일 수 있어요 |
MegaBlocks처럼 sparse Mixture of Experts를 block-sparse operation으로 재구성하고 GPU-specific kernel을 개발하는 접근도 있어요. 핵심은 sparse pattern을 하드웨어가 좋아하는 block 단위나 규칙적 패턴으로 바꾸는 거예요.
Structured patterns
Block sparse matrix는 큰 sparse matrix를 작은 dense block들의 조합으로 표현해요. 이렇게 하면 전체적으로는 sparse하지만 block 내부는 dense operation으로 처리할 수 있어 accelerator 활용이 좋아져요.
(N:M) sparsity는 연속된 (M)개 원소 중 (N)개만 nonzero가 되도록 강제하는 방식이에요. 대표적으로 2:4 sparsity는 4개 중 2개만 nonzero로 두는 패턴이에요. 이런 규칙성은 메모리 접근과 연산 스케줄을 예측 가능하게 만들어요.
Challenges and limitations
Sparsity의 한계는 다음과 같아요.
| 한계 | 설명 |
|---|---|
| 불규칙 sparsity 활용 어려움 | index 관리와 irregular access 때문에 speedup이 제한돼요 |
| pruning 알고리즘 비용 | 어떤 값을 제거할지 결정하는 과정 자체가 비쌀 수 있어요 |
| hardware alignment 필요 | sparse format과 accelerator 지원이 맞아야 해요 |
| accuracy trade-off | 너무 aggressive하면 underfitting이나 성능 저하가 생겨요 |
| energy saving 불확실 | sparse metadata 처리 overhead가 이득을 상쇄할 수 있어요 |
| task별 효과 차이 | 모든 모델과 task가 sparsity에서 같은 이득을 얻지 않아요 |
Combined optimizations
Sparsity는 pruning, quantization, efficient model design과 함께 쓸 때 효과가 커질 수 있어요.
| 조합 | 주의점 |
|---|---|
| Sparsity + pruning | pruning pattern이 hardware-friendly해야 해요 |
| Sparsity + quantization | 낮은 정밀도와 sparse metadata 관리가 충돌할 수 있어요 |
| Sparsity + efficient design | depthwise convolution, low-rank, dynamic computation과 같이 쓰면 이득이 커져요 |
특히 unstructured sparsity와 quantization을 함께 쓰면 하드웨어가 irregular sparse low-precision operation을 잘 처리해야 해요. GPU/TPU는 structured pattern에서 유리하고, CPU는 overhead 때문에 이득이 제한될 수 있어요.
3.13 Implementation Strategy and Evaluation
원문은 최적화가 기법 적용으로 끝나지 않고, 측정과 통합 전략으로 완성된다고 설명해요.
Profiling and opportunity analysis
최적화의 첫 단계는 profiling이에요. 모델 연산이 전체 시스템 병목인지부터 확인해야 해요. 데이터 전처리, I/O, 네트워크 통신이 지연시간을 지배한다면 모델만 줄여도 효과가 작을 수 있어요.
Profiling은 여러 차원을 봐야 해요.
| profiling 대상 | 무엇을 보나요? |
|---|---|
| Memory profiling | parameter, buffer, activation, dynamic allocation |
| Computational profiling | FLOPs, 실제 wall-clock time, bottleneck op |
| Energy profiling | 배터리 또는 edge power budget |
| Latency profiling | end-to-end delay와 op별 지연시간 |
| Sensitivity analysis | 어떤 layer가 pruning/quantization에 민감한지 |
원문의 ViT 예시는 좋은 접근을 보여줘요. Attention layer가 FLOPs의 65%를 차지하면 structured pruning 후보가 되고, layer normalization이 FLOPs는 작지만 latency를 크게 차지하면 memory-bound operation으로 operator fusion 후보가 돼요. Classification head가 계산은 작지만 parameter memory를 많이 차지하면 INT8 quantization 후보가 될 수 있어요.
Measuring optimization effectiveness
최적화 효과는 accuracy만 보지 않아요.
| 측정 항목 | 왜 필요한가요? |
|---|---|
| Top-line accuracy | 기본 성능 유지 여부 |
| Calibration | 확률 예측이 잘 보정되어 있는지 |
| Fairness | 특정 그룹 성능 저하가 생기지 않는지 |
| Robustness | 입력 변화와 noise에 견디는지 |
| Latency | 실제 장치에서 얼마나 빠른지 |
| Memory | peak memory와 모델 크기 |
| Energy | inference당 에너지 비용 |
| Hardware-specific gain | GPU, CPU, mobile에서 효과가 다른지 |
원문의 ResNet-50 INT8 예시는 Top-1 정확도가 76.1%에서 75.8%로 0.3%만 떨어지고, V100 latency가 4.2ms에서 1.3ms로 줄며, 모델 크기가 98MB에서 25MB로 줄어드는 식의 다면적 평가를 보여줘요. 하지만 CPU speedup은 GPU보다 작을 수 있어 하드웨어별 측정이 필요해요.
Multi-technique integration
가장 큰 효과는 세 차원을 조합할 때 나와요.
원문의 BERT-Base 모바일 배포 예시는 다음 순서를 제시해요.
1. Structured pruning
attention head 30%, FFN intermediate dimension 40% 제거
↓
2. Knowledge distillation
정확도 일부 회복
↓
3. QAT 기반 INT8 quantization
추가 메모리 절감과 latency 개선
이 순서는 중요해요. Pruning을 먼저 하면 중요한 weight가 더 작은 구조에 집중되고, 이후 quantization이 더 안정적일 수 있어요. 반대로 먼저 quantization하면 pruning importance를 판단할 numerical precision이 줄어 최종 정확도가 나빠질 수 있어요.
3.14 AutoML and Automated Optimization Strategies
AutoML은 architecture, hyperparameter, compression strategy, deployment constraint를 자동으로 탐색해요. 사람이 할 일을 완전히 대체한다기보다, 사람이 정한 목표와 제약 안에서 큰 탐색 공간을 체계적으로 훑는 도구에 가까워요.
AutoML optimizations
AutoML이 다루는 주요 대상은 다음과 같아요.
| 대상 | 설명 |
|---|---|
| NAS | layer, block, connectivity, scaling을 탐색해요 |
| Hyperparameter optimization | learning rate, batch size, weight decay 등을 조정해요 |
| Model compression | pruning threshold, sparsity pattern, quantization level을 선택해요 |
| Deployment-aware optimization | latency, memory, power, bandwidth 제약을 반영해요 |
Bayesian optimization은 적은 평가로 좋은 hyperparameter를 찾는 데 유리하고, evolutionary algorithms와 adaptive heuristic도 AutoML에서 쓰여요.
Optimization strategies
AutoML은 여러 전략을 결합할 수 있어요.
| 전략 | 역할 |
|---|---|
| NAS | 구조를 자동 설계해요 |
| HPO | 학습 안정성과 성능을 조정해요 |
| Compression optimization | pruning과 quantization 설정을 자동 탐색해요 |
| Data processing optimization | feature selection, augmentation, balancing을 자동화해요 |
| Meta-learning | 이전 task 경험을 새 search에 활용해 비용을 줄여요 |
| End-to-end automation | architecture, hyperparameter, compression을 하나의 pipeline으로 묶어요 |
Google AutoML, Amazon SageMaker Autopilot, Azure AutoML 같은 플랫폼은 이런 흐름을 제품화한 예시로 볼 수 있어요.
AutoML challenges
AutoML에도 한계가 있어요.
| 문제 | 설명 |
|---|---|
| Computational cost | 많은 후보를 학습하고 평가해야 해요 |
| Search bias | search space와 objective가 결과를 편향시킬 수 있어요 |
| Data bias propagation | 데이터 편향이 자동 탐색 결과에도 반영될 수 있어요 |
| Generalization | 특정 데이터와 장치에 최적화된 모델이 다른 환경에서 약할 수 있어요 |
| Interpretability | 왜 그 구조가 좋은지 설명하기 어려울 수 있어요 |
| Control trade-off | 자동화가 domain expert의 세밀한 판단을 가릴 수 있어요 |
AutoML은 효율적인 탐색 도구지만, 목표 설정, 제약 정의, 평가 기준 설계에는 여전히 사람의 전문성이 필요해요.
3.15 Implementation Tools and Software Frameworks
최적화 이론이 실무에서 쓰이려면 framework와 compiler, inference engine이 필요해요. 직접 weight tensor를 조작하고 quantization operation을 삽입하는 일은 모델이 커질수록 관리하기 어려워요.
Model optimization APIs and tools
| 도구 | 제공 기능 |
|---|---|
| TensorFlow Model Optimization Toolkit | quantization, pruning, clustering |
| PyTorch quantization/pruning utilities | PTQ, QAT, structured/unstructured pruning |
| MXNet 등 framework API | 일반적인 최적화 workflow 지원 |
| ONNX | optimized model 교환과 inference runtime 연결 |
Framework API의 장점은 검증된 구현, 일관된 인터페이스, 빠른 실험, 최신 연구 기법의 통합이에요. 하지만 API를 쓴다고 자동으로 좋은 결과가 나오는 것은 아니고, target hardware와 평가 지표를 함께 확인해야 해요.
Hardware-specific optimization libraries
| 라이브러리 | 역할 |
|---|---|
| TensorRT | NVIDIA GPU에서 INT8, fusion, structured sparsity 등을 최적화해요 |
| XLA | TensorFlow/TPU 계열에서 graph fusion과 memory optimization을 수행해요 |
| OpenVINO | Intel 하드웨어 배포 최적화를 지원해요 |
| TVM | 다양한 backend에 대해 scheduling과 auto-tuning을 수행해요 |
| SNPE | 모바일 SoC 최적화에 쓰일 수 있어요 |
| CMSIS-NN | ARM Cortex-M 같은 microcontroller에서 low-precision inference를 돕습니다 |
| Vitis AI | FPGA에서 custom sparse computation을 최적화할 수 있어요 |
이 도구들은 세 최적화 차원을 실제 실행으로 연결해요. Pruning으로 생긴 structured sparsity를 accelerator가 활용하게 하고, quantized model을 INT8 kernel로 실행하며, operator fusion으로 memory traffic을 줄여요.
Optimization process visualization
최적화는 모델 내부를 바꾸기 때문에 시각화가 중요해요.
Quantization visualization은 weight와 activation의 quantization error histogram을 보여줘요. Outlier가 특정 layer에 몰려 있다면 calibration range나 granularity를 바꿀 수 있어요. Activation color map은 saturation이나 truncation 문제를 드러낼 수 있어요. QAT 중에는 MSQE를 추적해 어느 시점부터 학습이 불안정해지는지 볼 수 있어요.
Sparsity visualization은 pruning된 weight 분포를 layer별 heat map으로 보여줘요. 어떤 layer가 과도하게 sparse해졌는지, pruning iteration에 따라 global sparsity가 어떻게 증가하는지 확인할 수 있어요. TensorBoard, Netron, SparseML, DeepSparse, PyTorch utilities 같은 도구가 이런 분석에 쓰일 수 있어요.
3.16 Technique Comparison
세 기법은 목적과 비용이 달라요.
| 기법 | 가장 적합한 상황 | 강점 | 약점 |
|---|---|---|---|
| Pruning | sparse hardware가 있고 FLOPs를 줄여야 할 때 | 구조와 parameter를 줄임 | unstructured는 speedup이 제한될 수 있음 |
| Quantization | 다양한 하드웨어에 폭넓게 배포할 때 | 가장 범용적이고 실용적 | 민감한 모델은 정확도 손실 |
| Distillation | 정확도 보존이 특히 중요할 때 | 작은 dense model을 고품질로 만들 수 있음 | 추가 학습 비용 |
| NAS | 새로운 제약이나 대규모 배포가 있을 때 | 사람보다 좋은 efficiency trade-off 발견 가능 | search cost가 큼 |
| Sparsity/execution optimization | 이론 절감을 실제 latency 개선으로 바꿔야 할 때 | hardware utilization 개선 | kernel과 runtime 의존 |
Production에서는 보통 순차 조합을 사용해요.
Pruning으로 parameter count 감소
↓
Distillation 또는 fine-tuning으로 정확도 회복
↓
Quantization으로 bit-width 감소
↓
Fusion, sparse kernel, scheduling으로 실제 실행 최적화
원문은 이런 조합이 10-50배 압축으로 이어질 수 있지만, 항상 측정과 검증이 필요하다고 봐요.
3.17 Fallacies and Pitfalls
원문은 자주 발생하는 오해를 분명히 짚어요.
오해 1: 최적화 기법은 독립적으로 적용해도 된다
Pruning과 aggressive quantization을 동시에 무리하게 적용하면 정확도 손실이 겹칠 수 있어요. Pruned teacher에서 distillation하면 teacher의 손상된 행동을 student가 배울 수도 있어요. 기법 간 상호작용을 보고 순서를 설계해야 해요.
오해 2: parameter count나 FLOPs만 줄이면 실제 성능도 좋아진다
FLOPs가 줄어도 cache locality, memory access pattern, kernel launch overhead, format conversion 때문에 latency가 줄지 않을 수 있어요. 최적화의 성공 기준은 실제 배포 장치에서 측정한 지표여야 해요.
오해 3: aggressive quantization은 항상 정확도를 거의 유지한다
INT8은 많은 모델에서 잘 작동하지만, INT4, binary, ternary로 갈수록 표현력이 줄고 numerical instability가 커져요. Attention, normalization, speech/NLP model은 특히 민감할 수 있어요.
오해 4: 학습 후 최적화만으로 충분하다
PTQ나 post-training pruning은 편하지만, accuracy-efficiency trade-off가 QAT, gradual pruning, distillation-integrated training보다 나쁠 수 있어요. 제품 요구가 엄격하면 training-aware optimization을 고려해야 해요.
오해 5: 모델만 최적화하면 시스템이 빨라진다
전처리, I/O, network communication, batching, request pipeline이 병목이면 모델 최적화 효과가 작아요. 전체 시스템 profiling이 먼저예요.
3.18 Summary
이 장의 결론은 명확해요. 모델 최적화는 연구 모델을 실제 배포 가능한 시스템으로 바꾸는 핵심 엔지니어링이에요.
핵심은 다음 다섯 가지예요.
| 핵심 | 설명 |
|---|---|
| 세 차원 조합 | 모델 표현, 수치 정밀도, 아키텍처 실행을 함께 봐야 해요 |
| 하드웨어 인식 | target hardware의 memory, compute, low-precision support를 반영해야 해요 |
| 자동화의 활용 | AutoML과 NAS는 넓은 탐색 공간에서 좋은 조합을 찾을 수 있어요 |
| 정확도와 제약의 균형 | 작고 빠르지만 기능을 잃지 않는 균형이 중요해요 |
| 보편 해법은 없음 | 최적 전략은 task, model, hardware, 운영 요구에 따라 달라요 |
원문의 BERT 예시는 전체 흐름을 잘 요약해요. 440MB 모델을 structural pruning, knowledge distillation, INT8 quantization, architectural efficiency 기법으로 줄이면 28MB 수준의 배포 가능한 모델로 만들 수 있어요. 하지만 이 과정은 하나의 마법 기법이 아니라, 측정과 조합, 순서 설계의 결과입니다.
복습 질문
- 모델 최적화의 목표가 단순히 모델 크기를 줄이는 것이 아닌 이유는 무엇인가요?
- 연구 환경에서 좋은 모델이 모바일이나 엣지 장치에서 바로 쓰이기 어려운 이유를 설명해보세요.
- 모델 표현 최적화, 수치 정밀도 최적화, 아키텍처 효율 최적화는 각각 무엇을 줄이거나 바꾸나요?
- Unstructured pruning과 structured pruning의 차이는 무엇이며, 실제 속도 향상 관점에서는 어떤 차이가 있나요?
- (\ell_0)-norm 기반 pruning 목표가 왜 직접 풀기 어려운지 설명해보세요.
- Iterative pruning이 one-shot pruning보다 정확도 보존에 유리할 수 있는 이유는 무엇인가요?
- Lottery Ticket Hypothesis가 pruning을 바라보는 관점을 어떻게 바꾸나요?
- Knowledge distillation에서 hard label보다 soft target이 더 많은 정보를 줄 수 있는 이유는 무엇인가요?
- Temperature (T)가 distillation에서 하는 역할을 설명해보세요.
- Low-rank factorization에서 rank (k)를 너무 작게 또는 너무 크게 잡으면 각각 어떤 문제가 생기나요?
- Tensor decomposition이 matrix factorization보다 필요한 상황은 어떤 경우인가요?
- NAS를 직접 수행하는 것이 적합한 상황과 피해야 할 상황을 각각 말해보세요.
- FP16과 BF16은 어떤 점에서 다르고, BF16이 학습 안정성에 유리할 수 있는 이유는 무엇인가요?
- PTQ에서 calibration이 중요한 이유는 무엇인가요?
- Symmetric calibration과 asymmetric calibration은 어떤 데이터 분포에서 각각 유리한가요?
- QAT가 PTQ보다 정확도 보존에 유리할 수 있는 이유를 STE와 함께 설명해보세요.
- Binary 또는 ternary quantization이 극단적 제약 환경에서 매력적이지만 어려운 이유는 무엇인가요?
- FLOPs가 줄어도 실제 latency가 줄지 않을 수 있는 이유를 하드웨어 관점에서 설명해보세요.
- Early exit와 conditional computation은 어떤 점에서 비슷하고 어떤 점에서 다른가요?
- Dynamic computation이 실시간 시스템에서 위험할 수 있는 이유는 무엇인가요?
- Sparsity가 실제 speedup으로 이어지기 위해 필요한 조건은 무엇인가요?
- Block sparsity와 (N:M) sparsity가 하드웨어 친화적인 이유는 무엇인가요?
- 최적화 전 profiling에서 memory, computation, latency, energy를 각각 측정해야 하는 이유는 무엇인가요?
- Pruning, distillation, quantization을 조합할 때 순서가 중요한 이유는 무엇인가요?
- AutoML이 사람의 전문성을 완전히 대체하지 못하는 이유는 무엇인가요?
- Framework API와 hardware-specific library가 모델 최적화를 실무에서 가능하게 만드는 방식은 무엇인가요?
- Quantization error histogram과 sparsity heat map은 각각 어떤 문제를 발견하는 데 도움이 되나요?
- “parameter 수가 줄었으니 배포 성능도 반드시 좋아진다”는 말이 왜 위험한가요?
- 원문의 BERT 최적화 흐름을 세 최적화 차원에 맞춰 다시 정리해보세요.
- 자신이 스마트폰용 모델을 배포해야 한다면, 어떤 순서로 병목을 측정하고 최적화 기법을 선택할지 설명해보세요.