상태: 초안 (2026-10-16), 일부 실측. 직접 해 본 것은 노트북 CPU 예제(
code/04_small_models.py, 1초 안팎)와 실험용 GPU 의 EfficientTAM 측정입니다(6절, 집 랩의 8GB급 노트북용 GPU 한 장, 1회용 파드). 논문 수치는 원문을 열어 조건과 함께 옮겼고, 하드웨어는 등급으로 적었습니다. 시리즈 「비전 모델 읽기 3」 4편. 증류의 학습 원리는 비전 모델 읽기 2 의 4편, EfficientTAM 의 구조는 비전 모델 읽기 1 의 10편에 있습니다.
목차
- 1. 무엇을 줄이나: 계산·파라미터·메모리 접근
- 2. 구조를 바꾸기: 깊이별 분리 합성곱(MobileNet)
- 3. 고르게 키우기: EfficientNet
- 4. 덜어 내기: 가지치기
- 5. 배운 것을 옮기기: 증류
- 6. 예: SAM 2 를 줄인 EfficientTAM
- 7. 한계
- 8. 우리 프로젝트와의 연결
- 참고 문헌
1. 무엇을 줄이나: 계산·파라미터·메모리 접근
모델을 「작게」 만든다는 말에는 세 가지가 섞여 있습니다.
- 곱셈-덧셈 수(MACs, FLOPs 의 절반쯤): 한 번 추론에 하는 계산의 양.
- 파라미터 수: 내려받을 크기, 메모리에 올릴 크기.
- 메모리 접근량: 계산하려고 읽고 쓰는 바이트. 1편의 「한 프레임의 일생」 에서 실제 시간을 정하는 것은 이것인 경우가 많습니다.
셋은 같이 움직이지 않습니다. 이 글의 실측 대부분이 그 어긋남을 보여 줍니다.
2. 구조를 바꾸기: 깊이별 분리 합성곱(MobileNet)
보통 3×3 합성곱은 출력 채널 하나를 만들 때마다 입력 채널 전부의 3×3 이웃을 봅니다. 「공간을 보는 일」 과 「채널을 섞는 일」 을 한꺼번에 하는 셈입니다. Howard 외의 MobileNet(2017)은 이 둘을 나눕니다.
- 깊이별(depthwise) 3×3: 채널마다 따로 3×3 필터 하나. 공간만 봅니다.
- 점별(pointwise) 1×1: 같은 자리의 채널들을 섞습니다.
입력 채널 M, 출력 채널 N, 필터 한 변 K, 특징 지도 크기 H×W 이면
보통 합성곱 H·W·M·N·K²
깊이별 분리 H·W·M·K² + H·W·M·N
비율(분리 ÷ 보통) 1/N + 1/K²
입니다. K=3 이고 N 이 크면 대략 9분의 1 입니다. 논문은 3×3 에서 8–9배 적은 계산이라고 적었습니다(3.1절).
| 모델(ImageNet, 224 입력) | top-1 | 곱셈-덧셈 | 파라미터 |
|---|---|---|---|
| 같은 구조, 보통 합성곱 | 71.7% | 4,866M | 29.3M |
| MobileNet(깊이별 분리) | 70.6% | 569M | 4.2M |
(MobileNet 논문 표 4.) 정확도 1%p 를 내주고 계산을 약 8.6배 줄였습니다. 계산의 95% 가 1×1 에 몰린다는 점(표 2)도 설계 의도입니다. 1×1 합성곱은 그냥 행렬곱이라 어느 기계에서나 빠르게 돌기 때문입니다.
MobileNet 은 크기를 고르는 손잡이 둘을 줍니다. 폭 배수 α(채널 수에 곱함)는 계산과 파라미터를 대략 α² 로, 해상도 배수 ρ 는 계산만 대략 ρ² 로 줄입니다(파라미터는 그대로). 논문 표 6·7 에서 α=0.5 는 70.6% → 63.7%(곱셈-덧셈 149M), 입력 128 은 64.4%(186M)였습니다. 5편에서 보겠지만 해상도를 줄이는 쪽은 「작은 물체가 사라진다」 는 다른 대가를 냅니다.
MobileNetV2(Sandler 외 2018)는 좁은 병목을 1×1 로 6배 넓힌 뒤 깊이별 3×3 을 하고 다시 좁히는 역 잔차를 씁니다. 다시 좁히는 마지막 1×1 에는 ReLU 를 걸지 않습니다(좁은 차원에서 ReLU 를 걸면 정보가 뭉개진다는 관찰). 휴대폰 CPU 큰 코어 하나에서 V1 113ms → V2 75ms, top-1 70.6% → 72.0% 였습니다(표 4).
직접 재 보기: 계산이 8.4배 줄면 시간도 8.4배 줄까
채널 128, 특징 지도 72×128(512×288 입력의 4분의 1 크기)에서 보통 3×3 과 깊이별 분리를 노트북 CPU 스레드 하나로 쟀습니다(9회 중앙값, code/04_small_models.out.txt).
| 파라미터 | 곱셈-덧셈 | CPU 시간 | 초당 곱셈-덧셈 | |
|---|---|---|---|---|
| 보통 3×3 | 147,456 | 1,359.0M | 4.23ms | 321G/s |
| 깊이별 3×3 + 1×1 | 17,536 | 161.6M | 2.62ms(깊이별 2.06 + 1×1 0.28) | — |
| 그중 깊이별 3×3 만 | 1,152 | 10.6M | 2.06ms | 5.2G/s |
| 그중 1×1 만 | 16,384 | 151.0M | 0.28ms | 548G/s |
계산은 8.4배 줄었는데 시간은 1.6배만 줄었습니다. 범인은 깊이별 3×3 입니다. 계산은 전체의 7% 인데 시간의 79% 를 썼습니다. 깊이별 합성곱은 채널을 섞지 않으니 읽어 온 값 하나로 하는 계산이 아주 적습니다(산술 강도가 낮다). 행렬곱 전용 장치는 「한 번 읽은 값으로 많이 계산하는」 일에서만 빠르기 때문에, 깊이별 합성곱은 그 장치를 거의 놀립니다. 이 노트북 CPU 는 행렬 가속기가 있어 밀집 합성곱이 유난히 빠르므로 격차가 더 크게 보였을 수 있습니다(다른 CPU·GPU 는 미실측).
이 현상을 정면으로 다룬 논문이 Ma 외의 ShuffleNet V2(2018)입니다. 계산량이 비슷한 구조들이 GPU 와 휴대폰 CPU 에서 서로 다른 순서로 빨랐고, 그래서 「계산량은 속도의 대리 지표일 뿐, 목표 기기에서 직접 재라」 고 정리했습니다. 거기서 나온 네 가지 지침 가운데 둘이 위 결과와 닿습니다. 그룹 합성곱을 지나치게 쓰지 말 것(계산량을 고정하고 그룹 수를 1 → 8 로 늘리면 데스크톱급 GPU 처리량이 2,451 → 634), 원소별 연산(ReLU·덧셈)을 무시하지 말 것(ResNet 블록에서 둘을 빼면 GPU·휴대폰 CPU 모두 약 20% 빨라짐)입니다(표 2·4).
3. 고르게 키우기: EfficientNet
Tan·Le 의 EfficientNet(2019)은 반대 방향의 질문을 합니다. 작은 기준망이 있을 때 깊이·폭·해상도 중 무엇을 키울까. 하나만 키우면 금방 포화되니, 셋을 정해진 비율로 함께 키웁니다.
깊이 d = α^φ, 폭 w = β^φ, 해상도 r = γ^φ, 조건 α·β²·γ² ≈ 2 (α, β, γ ≥ 1)
합성곱의 계산량은 깊이에 비례하고 폭과 해상도에는 제곱으로 비례하므로, φ 를 1 올릴 때마다 계산이 약 2배가 됩니다. 기준망 B0 는 신경망 구조 탐색으로 찾았고 α=1.2, β=1.1, γ=1.15 입니다.
| 모델 | top-1 | 파라미터 | 계산(FLOPs) |
|---|---|---|---|
| EfficientNet-B0(224 입력) | 77.1% | 5.3M | 0.39B |
| EfficientNet-B7 | 84.3% | 66M | 37B |
(논문 표 2.) 초록의 「당시 최고 모델보다 8.4배 작고 6.1배 빠르다」 에서 「빠르다」 는 서버 CPU 코어 하나·배치 1 의 지연입니다(19.0초 대 3.1초, 표 4). GPU 처리량 이야기가 아니라는 조건이 요약에서는 잘 빠집니다.
4. 덜어 내기: 가지치기
학습이 끝난 망에서 작은 가중치를 0 으로 만들고, 다시 조금 학습해 정확도를 되찾는 방법입니다. Han 외의 Deep Compression(2016)은 가지치기 → 가중치 군집화(합성곱 8비트, 완전연결 5비트) → 허프만 부호화로 AlexNet 을 240MB → 6.9MB(35배), VGG-16 을 552MB → 11.3MB(49배)로 줄이면서 정확도를 지켰습니다(표 1). 가지치기만으로 연결 수가 AlexNet 9배, VGG-16 13배 줄었습니다.
여기서 「작아졌다」 와 「빨라졌다」 를 나눠야 합니다. 이 논문이 보고한 3–4배 속도 이득은 완전연결 층만, 배치 1 에서 잰 것이고, 큰 배치에서는 이점이 사라진다고 논문 스스로 적었습니다(6.3절, 부록 A).
직접 재 보기: 0 이 90% 면 10배 빠를까
2048×2048 완전연결 층에 입력 64개를 곱하는 시간을 쟀습니다(노트북 CPU, 스레드 하나, 9회 중앙값).
| 가중치 | 시간 |
|---|---|
| 밀집(가지치기 전) | 0.59ms |
| 90% 를 아무 칸이나 0(비구조적), 밀집 곱 | 0.59ms |
| 같은 행렬을 희소 형식(CSR)으로 바꿔 곱 | 6.83ms |
| 출력 행을 90% 통째로 지움(구조적), 밀집 곱 | 0.06ms |
비구조적 가지치기는 모양이 그대로라 밀집 곱이 0 도 곱합니다. 희소 형식으로 바꾸면 0 을 건너뛰지만, 이 크기와 이 희소도에서는 불규칙한 접근 비용 때문에 11.6배 느렸습니다. 행을 통째로 지운 구조적 가지치기만 그대로 작은 밀집 곱이 되어 약 10배 빨라졌습니다. Li 외(2017)가 합성곱의 필터를 통째로 지우는 방법을 낸 이유가 이것입니다. CIFAR-10 의 VGG-16 에서 계산량 34% 를 줄였고, 데스크톱급 GPU(배치 128)에서 시험 시간이 1.23초 → 0.73초로 줄었습니다(표 1·3). 비구조적 희소성도 전용 커널이나 하드웨어가 있으면 빨라질 수 있지만, 그 측정은 하지 않았습니다(미실측).
5. 배운 것을 옮기기: 증류
작은 구조로 처음부터 학습하면 큰 모델만큼 배우지 못하는 경우가 많습니다. 지식 증류는 큰 모델(교사)의 부드러운 출력을 작은 모델(학생)의 정답으로 함께 씁니다. 원리와 수치는 비전 모델 읽기 2 의 4편에 자세히 있습니다. 실시간 관점에서 기억할 점은 하나입니다. 증류는 구조를 바꾸지 않습니다. 학생의 속도는 학생의 구조(2–4절)가 정하고, 증류는 그 구조가 낼 수 있는 정확도에 더 가까이 가게 해 줄 뿐입니다.
6. 예: SAM 2 를 줄인 EfficientTAM
Xiong 외의 EfficientTAM(2024)은 위 방법들을 영상 분할 모델에 함께 적용한 예입니다. 비전 모델 읽기 1 의 10편에 구조가 있으니 줄인 자리만 다시 적습니다.
- 인코더를 작은 평평한 ViT 로: 계층형 Hiera 대신 ViT-Tiny·Small. 구조를 바꾸는 쪽입니다(2절).
- 사전학습은 큰 모델의 특징을 따라 배우기로: EfficientSAM 의 SAMI 사전학습(가려진 조각에서 SAM 인코더의 특징을 복원) — 넓은 뜻의 증류입니다(5절).
- 기억을 2×2 로 평균: 메모리 교차 어텐션의 키·값을 4분의 1 로. 계산을 덜어 내는 쪽입니다(4절과 같은 정신).
| 모델(논문 표 1) | 파라미터 | 데이터센터 GPU FPS | 휴대폰 지연 | SA-V 시험 J&F |
|---|---|---|---|---|
| SAM 2(비교 대상) | 81M | 43.8 | — | 74.7 |
| EfficientTAM-S | 34M | 85.0 | 1,010.8ms | 74.5 |
| EfficientTAM-Ti/2 | 18M | 109.4 | 261.4ms | 70.8 |
(1024×1024 입력, GPU 는 배치 1. 휴대폰은 2023년 상위 기종이고 측정 정밀도·입력 크기는 논문에 적혀 있지 않습니다.) 입력을 512×512 로 줄인 표 5 에서는 휴대폰 80.6ms·SA-V 71.5 였습니다. 초록의 「휴대폰 약 10 FPS」 에 가까운 숫자는 이 512 입력 쪽뿐이라는 점은 비전 모델 읽기 1 의 10편에서 짚은 그대로입니다.
우리 실측: EfficientTAM-S 를 실험용 GPU 에서
TT Lab 의 탁구대 찾기는 EfficientTAM-S 를 씁니다. 같은 가중치(sha256 대조)를 집 랩의 8GB급 노트북용 GPU 한 장에서 쟀습니다. 1회용 파드, 다른 GPU 작업 없음, 예열 5회 뒤 10회 × 3묶음의 중앙값입니다.
| 무엇을 | FP32 | FP16 | BF16 |
|---|---|---|---|
| 이미지 인코더, 1024×1024, 배치 1 | 58.8ms | 18.7ms | 18.7ms |
| 같은 것, 배치 4(그림당) | 60.9ms | 20.4ms | 20.5ms |
| 찾기 한 번(512×288 화면 → 인코딩 + 점 하나로 마스크) | 69.4ms | — | 29.9ms |
| 그중 마스크 디코더만(인코딩 뒤 점 하나) | 3.9ms | — | — |
| 인코더 입력을 512×512 로 바꿔 만든 판, 배치 1 | 12.8ms | — | 5.9ms |
- 파라미터는 모두 3,406만 개, 그중 이미지 인코더가 2,235만 개로 논문의 34M 과 맞습니다.
- 입력이 512×288 이어도 모델은 그림을 1024×1024 로 늘려서 인코딩합니다. 그래서 찾기 한 번의 시간 대부분(69.4ms 중 67.0ms)이 인코더입니다. 폰 화면을 작게 보내도 이 모델의 계산은 줄지 않습니다.
- FP32 → 16비트에서 인코더가 3.1배 빨라졌습니다. 같은 GPU 에서 공 모델(합성곱)은 1.5배였습니다(2편). 트랜스포머의 큰 행렬곱이 16비트 전용 계산 장치(텐서 코어)를 잘 쓰기 때문입니다.
- 배치 4 는 그림당 시간이 거의 같았습니다. 이 GPU 는 그림 한 장으로 이미 차 있습니다(6편).
- 512×512 판은 위치 임베딩을 늘리고 줄여 맞춘 것이라 정확도는 재지 않았습니다(미실측). 논문 표 5 처럼 따로 학습하지 않으면 정확도가 떨어질 수 있습니다. 시간만 보면 1024 의 4분의 1 화소에서 4.6배(FP32)–3.1배(BF16) 빨랐습니다.
7. 한계
- 계산량은 시간이 아닙니다. 2절과 4절의 실측이 그 예입니다. 표의 계산량·파라미터만 보고 고르면 안 되고, 목표 기기에서 재야 합니다.
- 줄인 만큼 무엇을 잃는지는 과제마다 다릅니다. MobileNet 의 1%p 는 ImageNet 분류의 숫자입니다. 화면에서 몇 화소짜리 공을 찾는 일에서 같은 비율로 잃는다는 보장은 없습니다(미실측).
- 가지치기 비율은 저장 크기를 말할 뿐입니다. 속도 이득은 구조적으로 지웠거나, 전용 커널·하드웨어가 있을 때만 생깁니다.
8. 우리 프로젝트와의 연결
- TT Score 의 공 모델(BlurBall)은 HRNet 계열이지만 이미 작습니다. 채널이 16–128 이고 파라미터는 1.49M 입니다. 그런데도 512×288 에서 창 하나에 수 ms–십여 ms 가 걸리는 까닭은 계산량보다 해상도를 끝까지 유지하는 구조(공이 몇 화소라 줄일 수 없음)에 있습니다. 그래서 이 모델을 더 작게 만드는 쪽보다 정밀도(2편)와 입력 크기(5편)를 먼저 봤습니다.
- 탁구대 찾기는 경기 시작 때 한 번이면 되니 EfficientTAM 의 크기가 문제 되지 않습니다. 6절의 실측처럼 찾기 한 번이 30–70ms 라면, 다음 단계는 「폰에서 찾기」 입니다(7편).
- 「녹화본 교사 → 실시간 학생」 증류는 TT Score 의 진행 중 연구입니다. 학생의 구조를 무엇으로 할지는 이 글의 측정 방식(목표 기기에서 직접 재기)으로 고를 생각입니다.
다음 글은 모델을 그대로 두고 덜 자주, 덜 넓게 돌리는 방법입니다.
티티 한마디. 곱셈을 8배 줄였는데 시간은 1.6배만 줄었어요. 계산보다 읽어 오는 게 더 느릴 때가 있거든요. 저울(계산량)보다 시계(실측)를 믿어요!
참고 문헌
- Howard, A. G. et al. (2017). MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. arXiv. https://arxiv.org/abs/1704.04861
- Sandler, M. et al. (2018). MobileNetV2: Inverted Residuals and Linear Bottlenecks. CVPR 2018. https://arxiv.org/abs/1801.04381
- Tan, M., Le, Q. V. (2019). EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. ICML 2019. https://arxiv.org/abs/1905.11946
- Ma, N. et al. (2018). ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design. ECCV 2018. https://arxiv.org/abs/1807.11164
- Han, S., Mao, H., Dally, W. J. (2016). Deep Compression. ICLR 2016. https://arxiv.org/abs/1510.00149
- Li, H. et al. (2017). Pruning Filters for Efficient ConvNets. ICLR 2017. https://arxiv.org/abs/1608.08710
- Xiong, Y. et al. (2024). Efficient Track Anything. arXiv. https://arxiv.org/abs/2411.18933
- 예제 코드와 출력: 이 폴더의
code/04_small_models.py,code/04_small_models.out.txt