본문 바로가기
Model Lightening/NPU

모델 별 NPU에서의 병목: CNN vs Transformer

by Sangwoo Seo 2025. 11. 18.

NPU(Neural Processing Unit)는 AI 추론 작업을 위해 특화된 프로세서입니다. 스마트폰, 태블릿, 임베디드 장치 등에 탑재되면서 빠르게 대중화되고 있죠. 하지만 모든 딥러닝 모델이 NPU에서 같은 효율성을 보여주지는 않습니다. 특히 CNN(Convolutional Neural Networks)과 Transformer/LLM은 메모리 특성이 근본적으로 다르기 때문에, NPU 환경에서 전혀 다른 병목을 겪습니다.

이 글에서는 CNN과 Transformer가 NPU의 메모리 계층에서 어떻게 상호작용하는지, 그리고 각 모델의 성능 한계가 어디에서 비롯되는지 살펴보겠습니다.

병목(bottleneck)이란?

딥러닝이나 컴퓨터 시스템에서 병목 현상(Bottleneck)은 시스템 전체의 처리 속도나 성능이 특정 한 부분(구성 요소) 때문에 가장 크게 제한되는 현상을 말합니다. 마치 병의 목부분이 내용물이 빠져나가는 속도를 결정하듯, 모델 내부의 특정 계층(레이어)이나 하드웨어 자원이 가장 느리면 그 부분이 전체 시스템의 속도를 결정짓게 됩니다.​

 

병목은 대표적으로 두 가지 유형이 있습니다:

  • 연산(Compute) 병목: CPU, GPU, NPU 등의 연산 자원이 부족할 때 발생합니다.
  • 메모리(Memory) 병목: 필요한 데이터나 파라미터를 옮기는 속도나 용량이 부족할 때 발생합니다.

실제 딥러닝 모델에서는 이 두 가지가 번갈아 전체 성능을 제한하게 되며, 어디에서 병목이 생기는지 정확히 파악하는 것이 성능 최적화의 첫걸음입니다.

CNN의 메모리 접근 패턴: 지역성의 힘

ResNet 같은 CNN 모델을 NPU에서 실행할 때 핵심은 공간적 지역성(spatial locality)입니다. CNN의 컨볼루션 연산은 입력 이미지의 좁은 영역에서 반복적으로 데이터에 접근합니다. 예를 들어 3×3 필터로 컨볼루션을 수행할 때, 같은 메모리 주변 영역에서 계속 데이터를 읽고 쓰게 됩니다.

이런 특성은 NPU의 로컬 SRAM 버퍼에 매우 유리합니다. ResNet-50 같은 모델에서 전체 연산의 95% 이상이 컨볼루션 레이어에서 일어나는데, 이 연산들은 대부분 인근 메모리 위치에 접근합니다. 결과적으로 NPU의 로컬 캐시나 스크래치패드 메모리에 데이터가 한 번 로드되면, 여러 번 재사용될 수 있습니다.

CNN에서 또 다른 중요한 특징은 예측 가능한 메모리 접근 패턴입니다. 같은 입력에 대해 CNN은 항상 동일한 경로를 따라 계산을 수행합니다. 이는 NPU가 미리 메모리 접근을 예측하고 최적화할 수 있다는 의미입니다. 예를 들어 AlexNet 같은 모델에서 전체 메모리 쓰기의 93%가 전체 메모리 공간의 1.4%에만 집중됩니다. 이러한 "메모리 핫스팟"은 NPU의 설계자들이 사전에 파악하고 최적화할 수 있는 지점입니다.

NPU 아키텍처는 정확히 이 특성을 활용하도록 설계되었습니다. CNN의 데이터 재사용 패턴에 맞춰, NPU는 로컬 메모리의 대역폭을 극대화하고 오프칩(off-chip) 메모리 접근을 최소화합니다. 결과적으로 CNN은 NPU에서 에너지 효율이 매우 높고, 추론 속도도 빠릅니다. 특히 MobileNet이나 TinyYolo 같은 경량 CNN은 NPU에서 125배 이상의 지연 시간 감소를 달성하기도 합니다.

Transformer/LLM의 메모리 병목: 대역폭의 벽

Transformer와 LLM은 완전히 다른 메모리 특성을 보입니다. CNN의 공간적 지역성과 달리, Transformer의 어텐션(Attention) 메커니즘은 모든 토큰 쌍 간의 상호작용을 계산해야 합니다. 이는 메모리 접근이 산재되어 있고, 대량의 데이터를 움직여야 한다는 의미입니다.

더 근본적인 문제는 산술 강도(Arithmetic Intensity, AI)의 차이입니다.

 

$$ AI = \frac{총 연산수(FLOP)}{총 메모리 접근(Byte)} $$

 

CNN에서는 작은 필터 크기로 많은 계산을 수행하므로 산술 강도가 높습니다. 반면 Transformer의 토큰 생성 단계(디코딩, decoding)에서는 모델의 모든 가중치를 읽으면서 단 하나의 토큰만 출력합니다. Llama2-7B의 경우 산술 강도가 약 62 operations per byte에 불과합니다.
** operations per byte: byte 당 연산 수

이 수치는 NVIDIA A100 GPU의 operations per byte 비율인 208.3보다 훨씬 낮습니다. 이는 무엇을 의미할까요? 메모리 대역폭이 성능의 주요 제약이 된다는 의미입니다. 아무리 NPU의 컴퓨팅 유닛이 강력해도, 메모리에서 데이터를 가져오는 속도가 따라가지 못하면 프로세서는 유휴 상태로 대기하게 됩니다.

Transformer의 또 다른 문제는 KV 캐시(Key-Value Cache)입니다. 대화형 추론에서 이전에 생성한 토큰들의 Key와 Value를 저장해두어야 하는데, 이 캐시는 시간에 따라 선형적으로 증가합니다. 배치 크기가 클수록, 이 캐시는 급속도로 메모리를 점유합니다.

 

결과적으로 더 이상 NPU의 로컬 SRAM에 담을 수 없게 되고, 더 느린 DRAM에서 반복적으로 데이터를 읽어야 합니다.

병목 진단: 어디서 문제가 생기는가?

CNN과 Transformer의 성능 문제가 어디에서 발생하는지 파악하는 것이 최적화의 첫 번째 단계입니다.

CNN의 병목 분석

CNN은 일반적으로 연산량이 많고 데이터 재사용성이 높기 때문에, NPU나 GPU 등에서 메모리 병목이 심각하게 드러나는 경우가 많지 않습니다. Convolutional layer는 동일한 데이터(특징맵, 파라미터)를 여러 번 참조하여, 한 번 메모리에서 데이터를 불러오면 여러 연산에 재활용할 수 있기 때문입니다. 이러한 특성 덕분에 대부분의 CNN 연산은 compute 자원을 효율적으로 활용하며, peak 성능(이론상 최대 성능)에 근접한 효율을 내는 경우가 많습니다.​

하지만, CNN 구조 내에서도 예외적으로 메모리 트래픽이 증가해 병목이 발생할 수 있는 구간이 존재합니다. 대표적으로 배치 정규화(Batch Normalization)나 풀링(Pooling) 계층이 그러한데, 이들은 컨볼루션과 달리 데이터 재사용도가 낮아, 메모리로부터 같은 데이터를 반복적으로 읽어오는 비율이 줄어듭니다. 그 결과, 특정 계층에서 메모리 대역폭을 많이 소모하며 병목 현상을 일으킬 수 있습니다. 또한, ResNet과 같이 skip connection이 도입된 구조에서는 중간 활성화 맵을 레이어 간에 반복적으로 로드해야 하므로, 이 역시 on-chip 메모리(SRAM) 사용량이 늘어나고, 메모리 트래픽 부담을 증가시킵니다.​

NPU에서 CNN 모델의 실제 성능을 분석할 때는, 전체 연산량만이 아니라 각 계층이 요구하는 활성화 버퍼(activation buffer) 크기와 로컬(on-chip) 메모리 대역폭에 주목해야 합니다. 예를 들어, MobileNetV2 등은 경량화를 위해 설계됐지만, 구조상 큰 활성화 버퍼가 필요한 계층이 포함되어 NPU의 한정된 SRAM 용량을 초과할 수 있습니다. 이 경우, 데이터가 off-chip 메모리(DDR 등)로 spill-over되어 추가적인 대역폭 사용과 성능 저하로 이어집니다. 실제 최적화나 디버깅에서는 프로파일링 도구를 통해 layer 별 메모리 읽기/쓰기 횟수와 트래픽 패턴을 분석하여, 병목이 나타나는 계층을 정확히 식별해야 합니다.​

더불어, CNN이 언제나 compute 자원을 가득 채워 사용한다고 단정할 수는 없습니다. 배치 크기가 매우 작거나, 커널/채널 수가 작은 얕은 네트워크, 혹은 특정 하드웨어 아키텍처의 한계 등에서는 오히려 compute 자원(연산 유닛)이 병목이 되어 전체 자원을 모두 쓰지 못하는 문제가 생길 수 있습니다. 즉, CNN의 성능 분석과 최적화에서는 layer별로 연산 복잡도와 메모리 트래픽을 함께 살피는 것이 필수적입니다. 각 레이어의 특성이 NPU 또는 GPU 자원 사용을 어떻게 결정짓는지 꼼꼼히 분석하는 것이, 전체적인 모델 성능을 높이는 핵심입니다.

Transformer의 병목 분석

딥러닝 모델을 NPU에 올려 추론할 때, CNN과 Transformer 계열은 각기 다른 방식으로 하드웨어 자원을 활용합니다. CNN은 데이터 재사용성이 높아 연산 장치를 효율적으로 사용할 수 있지만, Transformer와 LLM은 추론 과정에서 병목 현상을 자주 마주합니다. 특히 디코딩 단계에서 성능이 눈에 띄게 떨어지는 경우가 많은데, 이는 많은 개발자들이 실제로 경험하는 문제입니다.

이러한 성능 저하는 바로 메모리 대역폭의 한계와 관련이 깊습니다. Transformer 구조에서는 토큰 하나를 생성할 때마다 수십억 개에 이르는 모델 파라미터를 DRAM에서 반복적으로 읽어와야 하며, 이때 데이터 이동 속도가 전체 모델 처리 속도의 한계를 결정하게 됩니다. 이로 인해 하드웨어의 연산 성능이 충분하더라도, 실제로는 이론치를 충분히 활용하지 못하는 상황이 자주 발생합니다.

병목이 얼마나 중요한지 정량적으로 분석하기 위해서는 산술 강도(Arithmetic Intensity)와 ridge point라는 기준을 활용합니다. CNN처럼 데이터 재사용성이 높은 모델은 비교적 적은 메모리 접근만으로도 많은 연산을 수행할 수 있어 산술 강도가 높습니다. 반면, Transformer의 디코딩 단계에선 토큰 하나를 출력하기 위해 전체 파라미터를 매번 DRAM에서 읽어야 하므로, 상대적으로 연산량은 적고, 산술 강도 역시 매우 낮아집니다. 예를 들어 Llama2-7B의 디코딩 단계 산술 강도 약 62 operations per byte 수준에 머뭅니다.

산술 강도가 어느 지점에서 문제를 일으키는지 판단하려면, ridge point를 보면 됩니다. Ridge point란 메모리 대역폭이 병목이 되기 시작하는 산술 강도 임계값으로, NPU나 GPU 등 AI 프로세서에서 peak 연산 성능과 메모리 대역폭의 비로 정의됩니다.

 

$$ Ridge point = \frac{Peak Compute(FLOPS)}{Peak Memory Bandwidth(Byte/sec)} $$

 

예를 들어 NVIDIA A100의 ridge point는 약 208.3인데, 모델의 실제 산술 강도가 이보다 낮을 경우, 메모리 대역폭이 전체 성능을 좌우하게 됩니다. 즉, 연산 유닛이 아무리 많아도 데이터가 제때 공급되지 않는다면, 많은 하드웨어 자원은 유휴 상태에 머물 수밖에 없습니다.

현업에서는 이러한 병목을 진단하기 위해 활성화 버퍼 사용률과 메모리 사용률을 자주 모니터링합니다. 예를 들어 GPU 연산 유닛의 활성화율이 80% 이상이라면 연산 병목이 의심되고, Transformer 디코딩 단계처럼 활성화율이 낮으면서 메모리 사용률만 높게 나타나면 명백히 메모리 대역폭이 병목이라는 신호입니다. 프로파일링 툴을 통해 layer 별 메모리 이동량을 측정하거나, 실시간 로딩 대기 구간을 추적하면 성능 한계의 원인을 파악할 수 있습니다.

Transformer에서 추가로 고려해야 할 점은 KV 캐시(Key-Value Cache)입니다. 대화형 추론에선 이전 토큰 정보를 저장하는 KV 캐시가 시퀀스 길이에 따라 선형적으로 커지기 때문에, 온칩 메모리(SRAM)로 모두 감당할 수 없고, 결국 느린 DRAM 접근에 의존하게 됩니다. 이는 또 한 번 대역폭 병목과 성능 저하를 유발합니다.

이처럼 병목 구조는 자연스럽게 최적화 전략에도 영향을 끼칩니다. 메모리 병목이 지배적인 모델에선 양자화, 파라미터 압축, KV 캐시 효율화 등으로 메모리 전송량 자체를 줄이는 접근이 효과적입니다. 최근의 FlashAttention, Multi-Query Attention 등도 이런 메모리 병목을 해결하고자 등장한 대표적인 기술입니다.

NPU 환경에서의 최적화 전략

딥러닝 모델을 NPU에 올릴 때, CNN과 Transformer는 메모리 접근 패턴과 연산 요구가 다르기 때문에 최적화 방식도 달라집니다. 하드웨어의 효율성을 극대화하려면 각각의 병목 구조를 이해하고, 그에 맞는 튜닝이 필수적입니다.

CNN 최적화

CNN은 이미 NPU 친화적인 구조를 갖고 있지만, 하드웨어 자원을 극대화하기 위해 추가적인 최적화가 여전히 중요합니다.


우선, 데이터 레이아웃과 배치(batch) 최적화가 핵심입니다. CNN 연산의 효율을 높이려면 입력, 필터, 출력 텐서의 메모리 배치가 하드웨어 구조에 맞게 일관성 있게 정렬되어야 합니다. 예를 들어, N, H, W, C 혹은 N, C, H, W와 같이 NPU가 최적화된 레이아웃을 선택하면 SRAM(Global Buffer)의 캐시 효율이 대폭 향상됩니다.


배치 크기도 전략적으로 조정해야 하는데, 활성화맵이 온칩 메모리(SRAM)에 완전히 적재될 수 있을 만큼만 설정하는 것이 이상적입니다. 온칩 메모리에 다 담지 못하고 off-chip(DDR 등) 메모리에 의존하게 되면, 불필요한 메모리 트래픽이 증가하며 대역폭 병목이 일어날 수 있습니다.


또한, 메모리 국부성(locality) 활용을 극대화하는 것도 중요합니다. CNN의 합성곱 계층은 슬라이딩 윈도우 방식으로 데이터를 반복적으로 재사용하므로, 연산에 필요한 데이터만 미리 프리페칭(pre-fetching)하여 로드하는 방법이 효과적입니다. 반면, Pooling이나 BatchNorm과 같은 데이터 재사용성이 낮은 연산 구간에서는, 여러 레이어의 연산을 하나로 합치거나 중간 결과 버퍼를 공유함으로써 불필요한 메모리 접근을 줄일 수 있습니다.

레이어 합성(layer fusion)과 연산·입출력(I/O) 동시 최적화 기법도 유용합니다. 예를 들어, Convolution, Activation, BatchNorm 같은 인접한 연산을 연산 차원에서 한번에 처리하면 메모리 입출력이 반복적으로 발생하는 것을 줄이고, 파이프라이닝 효과 역시 기대할 수 있습니다.

마지막으로, 정밀도 조정과 양자화(quantization) 전략이 있습니다. 연산 및 데이터 전송의 bit-width를 줄여(Single→Half, Float→INT8 등) 실제로 동일한 하드웨어 대역폭에서도 더 많은 연산량을 소화할 수 있습니다. 최신 NPU 전용 프레임워크에서는 이러한 레이아웃 최적화, operator fusion, 양자화 최적화 등의 다양한 기능이 지원되고, 이들 옵션을 적극적으로 활용하는 것이 실전 성능을 높이는 데 매우 중요합니다.

Transformer 최적화

Transformer 구조는 NPU에서 메모리 대역폭 문제가 먼저 한계에 부딪히는 경우가 많으므로, 병목 완화를 위한 목적 지향적인 최적화가 무엇보다 중요합니다.

우선, 모델 파라미터와 활성화의 양자화(quantization)를 통해 데이터 bit 수를 16비트, 8비트, 혹은 4비트로 낮추면, 동일 대역폭 환경에서 훨씬 더 많은 연산을 수행할 수 있습니다. 이는 실제 인퍼런스나 추론 속도를 가속하는 데 실질적인 효과가 있습니다.

KV 캐시(Key-Value Cache) 관리 역시 Transformer 최적화에서 핵심적인 포인트입니다. 디코딩 시 시퀀스 길이에 비례해 캐시가 선형적으로 커지게 되므로, 캐시 압축이나 배치 크기 조정, 불필요한 토큰의 메모리 정리를 통해 점유율을 줄여야 합니다. 온칩에 가능한 많은 KV 캐시를 배치하고, 불가피하게 남는 부분만 오프칩 DRAM으로 넘기는 계층적 메모리 관리 전략도 효과적입니다.

또한, 연산·메모리 병렬화와 스케줄링이 중요한 역할을 합니다. 연산과 데이터 이동을 동시에 파이프라이닝하거나, prefetching 기법을 활용하면, 연산 유닛이 데이터 대기 시간(메모리 stall) 동안 놀지 않도록 할 수 있습니다. 필요하다면 메모리 I/O의 동시성을 높이는 queue, double buffer 등의 구조를 검토하는 것도 좋은 방법입니다.

Transformer의 어텐션 연산처럼 접근 패턴이 흩어져 있을 때는, tile-wise 행렬 곱, FlashAttention, Multi-Query Attention, Sparsity Pruning 등 고효율 알고리즘을 사용해 병렬성을 높이고, 불필요한 데이터 이동을 줄이는 구조로 설계하는 것이 중요합니다.

모델 구조 경량화도 최근 연구 동향 중 하나입니다. 파라미터 프루닝(pruning), Low-Rank Approximation, Layer fusion, Token/Head/Layer Pruning 등으로 모델 자체를 하드웨어 친화적으로 경량화하면, 전체 연산·메모리 요구량 자체를 줄일 수 있습니다.

마지막으로, 메모리 대역폭에 맞는 배치·시퀀스 튜닝이 실전에서 성능을 좌우할 수 있습니다. NPU마다 DRAM/DDR/HBM의 대역폭 한계가 다르기 때문에, 실제로 배치 크기나 시퀀스 길이를 실험적으로 조정하며, 모델별·하드웨어별 최적 throughput을 찾아 적용해야 합니다.

이처럼,

CNN과 Transformer는 구조와 병목, 최적화 전략에서 모두 확연히 다릅니다. CNN은 데이터 재사용성·국부성·연산-입출력 융합 등으로 연산 자원 활용 극대화에, Transformer는 메모리 대역폭 극복·캐시 관리·모델 경량화 등으로 병목 완화에 집중하는 것이 NPU 실전 최적화의 핵심입니다. 모델별로 레이아웃, 연산 정밀도, 파라미터 전달 방식, 캐시와 시퀀스 관리까지 꼼꼼하게 점검한다면, 다양한 NPU 환경에서 딥러닝 모델의 최대 성능을 이끌어낼 수 있습니다.