퀄컴 뉴럴 프로세싱 SDK (SNPE)
2025-10-09, G25DR
1. 퀄컴 뉴럴 프로세싱 SDK (SNPE) 개요
1.1 On-Device AI의 부상과 엣지 컴퓨팅의 중요성
인공지능(AI) 기술이 발전함에 따라, 연산의 중심이 중앙 집중식 클라우드에서 개별 사용자 기기로 이동하는 패러다임 전환이 가속화되고 있다. 클라우드 기반 AI는 강력한 연산 능력을 제공하지만, 네트워크 지연 시간(latency), 데이터 전송 비용, 사용자 개인정보보호 문제, 그리고 네트워크 연결에 대한 의존성이라는 본질적인 한계를 내포한다.1 이러한 한계는 실시간 반응성이 필수적인 스마트폰, 사물 인터넷(IoT) 기기, 증강 현실(AR) 글래스, 자율주행차와 같은 엣지 디바이스(Edge Device)에서 특히 치명적이다. 이로 인해, 데이터를 생성하는 기기 자체에서 AI 모델을 직접 실행하는 ‘On-Device AI’ 또는 ’엣지 AI’가 핵심 기술로 부상했다. On-Device AI는 지연 시간을 최소화하고, 네트워크 대역폭 소모를 줄이며, 민감한 사용자 데이터를 기기 외부에 전송하지 않아 개인정보보호를 강화하는 등 명확한 이점을 제공한다. 이러한 엣지 컴퓨팅 환경에서 AI 추론을 효율적으로 수행하기 위해서는 하드웨어의 성능을 최대한 활용할 수 있도록 지원하는 전문화된 소프트웨어 프레임워크가 필수적이며, 퀄컴 뉴럴 프로세싱 SDK(Qualcomm Neural Processing SDK, 이하 SNPE)는 바로 이 역할을 수행하기 위해 탄생했다.
1.2 SNPE의 정의: 스냅드래곤 플랫폼을 위한 딥러닝 추론 가속 런타임
SNPE, 즉 스냅드래곤 뉴럴 프로세싱 엔진(Snapdragon Neural Processing Engine)은 퀄컴 스냅드래곤(Snapdragon) 프로세서에 탑재된 딥러닝 신경망의 실행을 가속하기 위해 설계된 소프트웨어 런타임이다.3 이는 AI 모델의 학습(training)이 아닌, 이미 학습된 모델을 사용하여 새로운 데이터에 대한 예측을 수행하는 추론(inference) 단계에 특화되어 있다. SNPE는 개발자들이 PyTorch, TensorFlow, TFLite, ONNX 등 널리 사용되는 딥러닝 프레임워크에서 학습시킨 모델을 스냅드래곤 플랫폼에 최적화된 형태로 변환하고 실행할 수 있도록 포괄적인 도구와 라이브러리를 제공한다.6
SNPE는 단순한 라이브러리를 넘어, 복잡하고 이질적인 하드웨어 아키텍처를 추상화하여 AI 개발자가 하드웨어에 대한 깊은 전문 지식 없이도 고성능 AI 애플리케이션을 개발할 수 있도록 지원하는 핵심적인 ‘미들웨어(middleware)’ 또는 ’추상화 계층(abstraction layer)’으로서의 역할을 수행한다. 스냅드래곤 시스템 온 칩(SoC)은 기능적으로 상이한 여러 프로세서 코어들로 구성되어 있으며, 각 코어를 직접 프로그래밍하는 것은 높은 수준의 전문성을 요구한다.6 SNPE는 간단한 API 호출이나 커맨드 라인 옵션을 통해 이러한 복잡성을 숨기고, 개발자가 모델의 논리 구현에 집중할 수 있도록 함으로써 AI 기술의 대중화와 신속한 애플리케이션 개발을 가능하게 하는 중요한 가치를 제공한다.10
1.3 핵심 목표: 이기종 컴퓨팅 자원을 활용한 성능 및 전력 효율 최적화
SNPE의 가장 근본적인 설계 목표는 스냅드래곤 SoC 내에 존재하는 다양한 종류의 처리 장치, 즉 이기종 컴퓨팅(Heterogeneous Computing) 자원을 지능적으로 활용하여 주어진 AI 워크로드에 대해 최적의 성능과 전력 효율을 달성하는 것이다.6 스냅드래곤 SoC는 범용 연산을 위한 CPU, 대규모 병렬 처리를 위한 GPU, 그리고 저전력 신호 처리에 특화된 DSP를 통합하고 있다. SNPE는 실행하려는 AI 모델의 특성과 애플리케이션의 요구사항(예: 최대 속도, 최소 전력 소모)을 고려하여 이러한 자원들 중 가장 적합한 곳에 연산을 할당한다. 이는 단순히 추론 속도를 높이는 것을 넘어, 배터리 수명이 절대적으로 중요한 모바일 기기 환경에서의 발열 관리 및 전력 소모 최소화라는 현실적인 제약을 해결하기 위한 핵심 전략이다. 따라서 SNPE는 스냅드래곤 플랫폼에서 고성능과 고효율 On-Device AI를 구현하기 위한 필수적인 소프트웨어 솔루션이라 할 수 있다.
2. SNPE 아키텍처: 이기종 컴퓨팅의 원리
2.1 이기종 컴퓨팅(Heterogeneous Computing)의 개념과 필요성
이기종 컴퓨팅은 단일 종류의 프로세서(동종 컴퓨팅, Homogeneous Computing)만을 사용하는 시스템의 한계를 극복하기 위해 등장한 아키텍처이다. 현대의 컴퓨팅 워크로드는 매우 다양하여, 순차적인 제어 흐름이 중요한 작업, 대규모 데이터 병렬 처리가 필요한 작업, 저전력으로 특정 연산을 반복 수행해야 하는 작업 등 각기 다른 특성을 지닌다. 동종 컴퓨팅 시스템에서는 이 모든 작업을 범용 프로세서(주로 CPU)가 처리해야 하므로, 특정 유형의 작업에서는 효율성이 크게 저하된다.
이기종 컴퓨팅은 이러한 문제를 해결하기 위해 각기 다른 작업에 특화된 여러 종류의 프로세서, 예를 들어 중앙 처리 장치(CPU), 그래픽 처리 장치(GPU), 디지털 신호 처리 장치(DSP), 주문형 반도체(ASIC) 등을 하나의 시스템에 통합하는 접근 방식이다.1 각 작업을 가장 적합한 프로세서에 할당함으로써, 시스템 전체의 처리 속도를 높이고 에너지 소비를 줄일 수 있다.14 특히, 방대한 양의 데이터를 빠르고 효율적으로 처리해야 하는 인공지능 및 머신러닝 분야에서 이기종 컴퓨팅은 선택이 아닌 필수가 되었다.
2.2 스냅드래곤 SoC의 주요 연산 유닛: CPU, Adreno GPU, Hexagon DSP
퀄컴 스냅드래곤 SoC는 이기종 컴퓨팅 아키텍처의 대표적인 예시로, AI 추론 워크로드를 처리하기 위해 다음과 같은 핵심 연산 유닛을 포함한다.
2.2.1 CPU (Kryo)
스냅드래곤에 탑재된 Kryo CPU는 ARM 아키텍처 기반의 고성능 코어로, 복잡한 조건 분기나 순차적인 제어 흐름을 처리하는 데 최적화되어 있다. AI 추론 과정에서 CPU는 전체 애플리케이션의 로직을 제어하고, SNPE가 지원하지 않는 특수한 신경망 레이어(Custom Layer)의 연산을 처리하는 폴백(fallback) 역할을 수행한다. 또한, 모델의 일부 연산이 다른 특화된 하드웨어에서 실행되는 동안 데이터 전처리 및 후처리와 같은 보조적인 작업을 담당하기도 한다.3
2.2.2 GPU (Adreno)
Adreno GPU는 본래 그래픽 렌더링을 위해 설계되었지만, 수백에서 수천 개에 이르는 다수의 코어를 바탕으로 대규모 병렬 연산을 수행하는 능력 덕분에 딥러닝 연산 가속에 매우 효과적이다. 특히, 신경망의 핵심을 이루는 컨볼루션(Convolution)이나 행렬 곱(Matrix Multiplication)과 같은 연산은 본질적으로 병렬성이 높기 때문에 GPU에서 실행될 때 CPU 대비 상당한 성능 향상을 보인다. GPU는 주로 32비트 또는 16비트 부동소수점(Floating-point) 연산에 강점을 가지며, 높은 정밀도가 요구되는 모델을 빠르게 실행하는 데 적합하다.1
2.2.3 DSP (Hexagon)
Hexagon DSP는 본래 오디오나 이미지와 같은 신호를 저전력으로 처리하기 위해 개발된 프로세서이다. 특히, Hexagon 벡터 확장(Hexagon Vector eXtensions, HVX)과 같은 SIMD(Single Instruction, Multiple Data) 기능을 통해 벡터 및 텐서 연산을 매우 높은 전력 효율로 처리할 수 있다.16 딥러닝 추론은 대부분 이러한 벡터 연산으로 구성되므로, DSP는 AI 워크로드를 실행하는 데 이상적인 하드웨어이다. DSP는 주로 8비트 또는 16비트 고정소수점(Fixed-point) 연산에 최적화되어 있어, 양자화된(quantized) 모델을 실행할 때 최소한의 전력으로 최대의 성능을 발휘한다. 이 때문에 배터리 수명이 중요한 모바일 기기에서 AI 기능을 상시 구동하는 데 핵심적인 역할을 한다.6
2.3 SNPE 런타임의 역할: 최적의 연산 유닛에 워크로드 동적 할당
SNPE 런타임은 이러한 이기종 컴퓨팅 하드웨어를 효과적으로 활용하기 위한 소프트웨어 계층이다. 개발자는 API를 통해 원하는 성능 프로파일(Performance Profile)을 지정할 수 있다. 예를 들어, 가장 빠른 속도를 원한다면 GPU_FLOAT16이나 DSP_FIXED8_TF와 같은 런타임을 우선적으로 선택하도록 설정할 수 있다.12 그러면 SNPE 런타임은 해당 모델의 연산 그래프를 분석하여 지정된 하드웨어에서 실행될 수 있도록 컴파일하고 작업을 할당한다.
이 과정은 단순히 모델 전체를 하나의 유닛에 할당하는 것을 넘어선다. 신경망의 각 레이어는 서로 다른 연산 특성을 가질 수 있다. 예를 들어, 대부분의 컨볼루션 레이어는 DSP에서 효율적으로 실행될 수 있지만, SNPE가 지원하지 않는 새로운 형태의 활성화 함수(Activation Function) 레이어는 CPU에서 실행되어야 할 수도 있다. SNPE는 이러한 하이브리드 실행 모델을 지원하여, 특정 하드웨어에서 지원되지 않는 연산이 있을 경우 자동으로 CPU를 통해 처리하도록 하는 콜백(callback) 메커니즘을 제공한다.18 이처럼 SNPE 런타임은 모델의 구조와 개발자의 요구사항을 종합적으로 고려하여 워크로드를 지능적으로 분배하고 스케줄링하는 ‘오케스트레이터(Orchestrator)’ 역할을 수행함으로써, 스냅드래곤 플랫폼의 이기종 컴퓨팅 자원 활용을 극대화한다.
3. 엔드-투-엔드 개발 워크플로우
SNPE를 사용하여 딥러닝 모델을 스냅드래곤 기반 기기에 배포하는 과정은 명확하게 정의된 단계들로 구성된다. 이 워크플로우는 크게 개발 환경에서 수행되는 ‘오프라인 최적화’ 단계와 타겟 디바이스에서 이루어지는 ‘온라인 실행’ 단계로 나눌 수 있다. 이러한 분리된 접근 방식은 런타임 시의 부하를 최소화하여 엣지 디바이스의 제한된 자원 하에서 최대 성능을 발휘하기 위한 전략적 설계의 결과물이다. 모델 변환 및 양자화와 같이 계산 비용이 많이 드는 작업들은 개발자의 강력한 PC(Linux 또는 Windows 호스트)에서 미리 처리된다.3 이를 통해 타겟 디바이스에서는 이미 최적화가 완료된 모델을 신속하게 로드하여 추론에만 집중할 수 있으므로, 애플리케이션의 초기 구동 시간을 단축하고 메모리 자원을 효율적으로 사용할 수 있다.
3.1 단계: 모델 학습 (Framework Model Training)
개발 워크플로우의 첫 단계는 딥러닝 모델을 학습시키는 것이다. 이 과정은 SNPE SDK의 범위를 벗어나며, 개발자는 자신이 선호하는 표준 딥러닝 프레임워크를 자유롭게 사용할 수 있다. SNPE는 PyTorch, TensorFlow, TFLite, ONNX(Open Neural Network Exchange) 등 산업계에서 널리 사용되는 대부분의 프레임워크를 지원한다.3 개발자는 이러한 프레임워크를 사용하여 원하는 신경망 아키텍처를 설계하고, 대규모 데이터셋으로 모델을 학습시킨다. 이 단계가 완료되면, 학습된 모델의 가중치(weights)와 구조(architecture)가 포함된 파일(예: TensorFlow의 .pb 파일, PyTorch의 .pt 파일, 또는 표준 교환 포맷인 .onnx 파일)이 생성된다. SNPE는 이렇게 사전에 학습된 모델(pre-trained model)을 입력으로 받아 다음 단계를 진행한다.
3.2 단계: 모델 변환 (Model Conversion to DLC)
학습된 모델은 각 프레임워크 고유의 형식으로 저장되어 있으므로, SNPE 런타임이 이를 직접 실행할 수 없다. 따라서, 모델을 SNPE가 인식하고 실행할 수 있는 고유의 최적화된 포맷인 DLC(Deep Learning Container)로 변환하는 과정이 필요하다. 이 변환 작업은 SNPE SDK에 포함된 일련의 커맨드 라인 도구를 통해 수행된다. 예를 들어, TensorFlow 모델은 snpe-tensorflow-to-dlc 도구를, ONNX 모델은 snpe-onnx-to-dlc 도구를 사용하여 변환할 수 있다.3
이 변환 과정에서 도구는 원본 모델의 연산 그래프를 분석하여 SNPE가 지원하는 레이어들로 구성된 새로운 그래프를 생성한다. 이 때, 모델의 입력 및 출력 노드 이름과 입력 데이터의 차원(dimension)을 명시적으로 지정해야 한다. 변환이 성공적으로 완료되면, 모델의 구조와 부동소수점(FP32) 가중치가 포함된 .dlc 파일이 생성된다. 이 DLC 파일은 SNPE 런타임의 기본 실행 단위가 된다.12
3.3 단계: 모델 양자화 (Model Quantization)
이 단계는 선택 사항이지만, Hexagon DSP에서 모델을 실행하여 최대의 성능과 전력 효율을 얻기 위해서는 사실상 필수적인 과정이다. 양자화는 32비트 부동소수점(FP32)으로 표현된 모델의 가중치와 활성화(activation) 값을 8비트 고정소수점 정수(INT8)와 같이 더 낮은 정밀도의 데이터 타입으로 변환하는 프로세스이다.3 이 과정을 통해 모델의 크기는 약 1/4로 줄어들고, 메모리 대역폭 사용량이 감소하며, 정수 연산에 특화된 DSP에서 추론 속도가 비약적으로 향상된다.
양자화는 snpe-dlc-quantize라는 별도의 도구를 사용하여 수행된다. 이 도구는 2단계에서 생성된 FP32 DLC 파일과 함께 ’보정 데이터셋(calibration dataset)’을 입력으로 받는다.20 보정 데이터셋은 실제 추론 환경에서 사용될 데이터와 유사한 분포를 가진 소규모의 대표 데이터 샘플들이다. snpe-dlc-quantize 도구는 이 보정 데이터를 모델에 통과시켜 각 레이어에서 발생하는 활성화 값의 범위(최소값 및 최대값)를 측정하고, 이 정보를 바탕으로 부동소수점 값을 정수 값으로 매핑하는 최적의 양자화 파라미터(스케일 및 제로 포인트)를 계산한다. 이 과정을 통해 정확도 손실을 최소화하면서 양자화를 수행할 수 있으며, 최종적으로 양자화된 정보가 포함된 새로운 DLC 파일이 생성된다.
3.4 단계: 타겟 디바이스에서의 모델 실행 및 추론 (Execution and Inference)
오프라인 최적화가 완료되면, 최종적으로 생성된 DLC 파일(FP32 또는 양자화된 INT8)을 실제 애플리케이션이 구동될 타겟 디바이스(예: 안드로이드 스마트폰, 임베디드 리눅스 보드)로 전송한다. 이후, 개발자는 SNPE SDK가 제공하는 런타임 라이브러리와 API(C++ 또는 Java)를 사용하여 자신의 애플리케이션 내에서 모델을 통합하고 실행한다.3
애플리케이션 코드는 다음의 절차를 따른다:
-
SNPE 런타임을 초기화하고, 타겟 디바이스에 존재하는 DLC 파일을 로드한다.
-
추론을 실행할 하드웨어(CPU, GPU, DSP)를 선택한다.
-
카메라, 마이크 또는 파일로부터 입력 데이터(예: 이미지, 오디오)를 받아와 모델이 요구하는 형식(크기, 정규화 등)으로 전처리한다.
-
전처리된 데이터를 SNPE 런타임에 전달하여 추론을 실행(
execute)시킨다. -
SNPE 런타임으로부터 추론 결과(예: 객체 경계 상자, 분류 확률)를 받아온다.
-
결과를 후처리하여 사용자에게 의미 있는 정보(예: 화면에 바운딩 박스 그리기)로 변환하여 보여준다.
이러한 일련의 과정을 통해, 학습된 딥러닝 모델은 최종적으로 스냅드래곤 디바이스 위에서 강력한 하드웨어 가속을 받으며 효율적으로 동작하게 된다.11
4. SNPE SDK 핵심 구성 요소 심층 분석
SNPE SDK는 개발자가 엔드-투-엔드 워크플로우를 원활하게 수행할 수 있도록 지원하는 강력하고 다양한 커맨드 라인 도구 모음을 제공한다. 이 도구들은 모델 변환, 준비, 실행, 분석이라는 네 가지 주요 카테고리로 분류할 수 있으며, 각 도구는 워크플로우의 특정 단계에서 핵심적인 역할을 수행한다.
4.1 모델 변환 (Model Conversion)
이 카테고리의 도구들은 다양한 딥러닝 프레임워크에서 생성된 모델을 SNPE 고유의 DLC 포맷으로 변환하는 역할을 담당한다.
-
snpe-tensorflow-to-dlc,snpe-pytorch-to-dlc,snpe-onnx-to-dlc,snpe-tflite-to-dlc: 이들은 각 프레임워크에 특화된 변환기이다. 개발자는 원본 모델 파일 경로, 모델의 입력 및 출력 노드 이름, 그리고 입력 데이터의 형상(shape)과 같은 정보를 인자로 제공해야 한다. 예를 들어,snpe-onnx-to-dlc --input_network model.onnx --output_path model.dlc와 같은 명령을 사용하여 ONNX 모델을 변환할 수 있다.3 -
qairt-converter: 이 도구는 퀄컴의 차세대 통합 AI 런타임인 QAIRT(Qualcomm AI Runtime)의 일부로 제공되는 최신 변환기이다. 기존의 프레임워크별 도구들을 통합하고 YAML 설정 파일을 통해 더 유연하고 상세한 변환 옵션을 제공하는 등, SNPE 생태계의 발전 방향을 보여주는 중요한 구성 요소이다.3
4.2 모델 준비 (Model Preparation)
변환된 DLC 파일을 특정 하드웨어에서 최적의 성능으로 실행하기 위해 추가적인 처리 및 최적화를 수행하는 도구들이다.
-
snpe-dlc-quantize(또는snpe-dlc-quant): 부동소수점(FP32) DLC 모델을 8비트 정수(INT8) 모델로 양자화하는 핵심 도구이다. 이 도구의 가장 중요한 옵션은--input_list로, 보정(calibration)에 사용할 대표 입력 데이터 파일들의 목록을 담은 텍스트 파일을 지정한다. 이 데이터를 기반으로 각 레이어의 활성화 값 범위를 분석하여 정확도 손실을 최소화하는 양자화 파라미터를 결정한다.3 -
snpe-dlc-graph-prepare: Hexagon DSP, 특히 HTP(Hexagon Tensor Processor)에서 모델을 실행할 때 초기화 시간을 단축시키기 위해 사용된다. 이 도구는 모델 그래프를 분석하여 HTP에서 실행하기 위한 준비 작업을 미리 수행하고, 그 결과를 ‘캐시(cache)’ 형태로 DLC 파일 내에 저장한다. 이 캐시 정보 덕분에 애플리케이션이 모델을 로드할 때 매번 수행해야 했던 초기화 과정을 생략할 수 있어, 첫 추론까지의 지연 시간을 크게 줄일 수 있다.3 -
snpe-udo-package-generator: UDO(User-Defined Operation)를 지원하기 위한 도구이다. SNPE가 기본적으로 지원하지 않는 커스텀 레이어나 연산을 모델에 포함해야 할 경우, 개발자는 C++로 해당 연산의 구현체를 작성할 수 있다. 이 도구는 작성된 구현체와 설정 파일을 바탕으로 SNPE 런타임이 동적으로 로드하여 사용할 수 있는 공유 라이브러리 패키지를 생성해준다. 이를 통해 SNPE의 기능적 한계를 극복하고 최신 연구 모델들을 유연하게 통합할 수 있다.3
4.3 실행 (Execution)
최적화된 DLC 모델을 타겟 디바이스나 호스트 PC에서 직접 실행하여 기능성을 검증하고 성능을 측정하는 도구들이다.
-
snpe-net-run: 가장 기본적이고 널리 사용되는 실행 도구이다. C/C++ API를 기반으로 만들어진 독립 실행형 애플리케이션으로, 입력으로 DLC 파일과 입력 데이터 목록 파일을 받아 추론을 수행하고, 그 결과를 출력 파일로 저장한다.--use_gpu,--use_dsp와 같은 옵션을 통해 실행할 런타임을 지정할 수 있어, 각 하드웨어에서의 동작을 빠르고 간단하게 검증하는 데 매우 유용하다.3 -
snpe-throughput-net-run,snpe-parallel-run: 보다 복잡한 실행 시나리오를 테스트하기 위한 도구들이다.snpe-throughput-net-run은 주어진 시간 동안 모델이 얼마나 많은 추론을 처리할 수 있는지(처리량)를 측정하며,snpe-parallel-run은 여러 추론 요청이 동시에 들어오는 상황을 시뮬레이션한다.3 -
snpe_bench.py: Python 스크립트로 제공되는 벤치마킹 유틸리티이다. JSON 설정 파일을 통해 다양한 런타임, 모델, 데이터에 대한 벤치마크 시나리오를 정의하고 실행하여, 각 레이어별 지연 시간 등 상세한 성능 데이터를 수집할 수 있다.23
4.4 분석 (Analysis)
DLC 파일의 내부 구조를 검사하거나, 실행 중 수집된 성능 데이터를 분석하여 최적화의 단서를 찾는 데 사용되는 도구들이다.
-
snpe-dlc-info: DLC 파일에 포함된 다양한 메타데이터를 텍스트 형태로 출력한다. 모델 버전, 입력 및 출력 텐서의 이름, 차원, 데이터 타입 등의 기본 정보뿐만 아니라,snpe-dlc-graph-prepare를 통해 생성된 HTP 캐시 정보의 존재 여부 등도 확인할 수 있다.3 -
snpe-dlc-viewer: DLC 모델의 네트워크 그래프를 시각적으로 탐색할 수 있는 GUI 도구를 실행한다. 각 레이어의 연결 관계와 속성을 확인할 수 있어 모델 구조를 직관적으로 이해하는 데 도움이 된다. -
snpe-diagview: 성능 분석에 가장 중요한 도구 중 하나이다.snpe-net-run이나 API를 통해 프로파일링 모드(DETAILED)로 추론을 실행하면SNPEDiag.log라는 진단 로그 파일이 생성된다.snpe-diagview는 이 로그 파일을 파싱하여, 각 레이어의 이름, 실행된 하드웨어 런타임, 그리고 실행에 소요된 시간을 표 형태로 보여준다. 이를 통해 전체 추론 시간에서 가장 많은 시간을 차지하는 병목(bottleneck) 레이어를 정확히 식별하고 최적화 노력을 집중할 수 있다.3 -
snpe-platform-validator: 타겟 디바이스의 환경이 SNPE를 실행하기에 적합한지 검증한다. 필요한 라이브러리가 모두 존재하는지, 버전이 호환되는지 등을 확인하여 배포 환경에서 발생할 수 있는 문제를 사전에 진단한다.3
이러한 도구들은 서로 유기적으로 연계되어, 개발자가 모델을 성공적으로 변환하고, 최적화하며, 배포하고, 성능을 분석하는 전 과정을 체계적으로 지원한다.
Table 1: SNPE SDK 핵심 도구 요약
이 표는 개발자가 특정 작업을 수행해야 할 때 어떤 도구를 사용해야 하는지 빠르게 참조할 수 있도록 SDK의 방대한 도구들을 기능별로 체계화하여 제공한다.
| 카테고리 | 도구 이름 | 주요 기능 |
|---|---|---|
| 모델 변환 | snpe-onnx-to-dlc | ONNX 모델을 SNPE DLC 포맷으로 변환한다. |
snpe-tensorflow-to-dlc | TensorFlow 모델을 SNPE DLC 포맷으로 변환한다. | |
qairt-converter | 차세대 통합 모델 변환 도구이다. | |
| 모델 준비 | snpe-dlc-quantize | FP32 DLC 모델을 INT8로 양자화한다. 보정 데이터셋이 필요하다. |
snpe-dlc-graph-prepare | HTP 실행을 위해 DLC를 사전 컴파일하고 캐시를 생성한다. | |
| 실행 | snpe-net-run | 주어진 입력에 대해 DLC 모델의 추론을 실행하고 결과를 저장한다. |
snpe_bench.py | 모델의 성능(지연 시간)을 벤치마킹한다. | |
| 분석 | snpe-dlc-info | DLC 파일의 레이어, 입출력 등 상세 정보를 표시한다. |
snpe-diagview | 프로파일링 로그를 분석하여 레이어별 실행 시간 및 런타임을 시각화한다. |
5. 핵심 기술: 양자화 (Quantization)
5.1 양자화의 필요성
현대의 딥러닝 모델은 수백만 개에서 수십억 개에 이르는 파라미터(가중치)를 가지며, 이들은 대부분 32비트 부동소수점(FP32) 형식으로 표현된다. 이는 높은 정밀도를 보장하여 모델의 정확도를 극대화하지만, 몇 가지 심각한 단점을 야기한다. 첫째, 모델의 크기가 매우 커져 모바일 기기와 같이 저장 공간이 제한된 환경에 배포하기 어렵다. 둘째, FP32 연산은 많은 계산 자원을 필요로 하며, 이는 추론 속도를 저하시키고 전력 소모를 증가시킨다. 셋째, 모델을 메모리에 로드하고 가중치를 읽어오는 과정에서 발생하는 메모리 대역폭 병목 현상은 전체 성능에 큰 영향을 미친다.24
양자화는 이러한 문제들을 해결하기 위한 핵심적인 모델 최적화 기술이다. 이는 모델의 가중치와 중간 계산 값(활성화)을 FP32와 같은 고정밀도 형식에서 8비트 정수(INT8)나 16비트 부동소수점(FP16)과 같은 저정밀도 형식으로 변환하는 과정을 의미한다. INT8 양자화의 경우, 모델의 크기를 약 4분의 1로 줄일 수 있으며, 이는 저장 공간과 메모리 대역폭 요구량을 크게 감소시킨다. 더 중요한 것은, 퀄컴 Hexagon DSP와 같은 많은 엣지 AI 가속기들이 정수 연산에 특화되어 있다는 점이다. 이러한 하드웨어에서 양자화된 모델을 실행하면, 부동소수점 연산을 수행할 때보다 훨씬 빠른 속도와 월등히 높은 전력 효율을 달성할 수 있다.5
5.2 SNPE의 비대칭 선형 양자화(Asymmetric Linear Quantization) 원리
SNPE는 각 신경망 레이어별로 적용되는 ‘비대칭 선형 양자화’ 방식을 채택하고 있다. 여기서 ’선형(Linear)’이란 부동소수점 값과 양자화된 정수 값 사이에 일정한 간격(스케일)을 가진 선형적인 관계가 성립함을 의미한다. ’비대칭(Asymmetric)’이란 부동소수점 값 0이 반드시 정수 값 0으로 매핑되지 않을 수 있음을 뜻한다.
이 방식의 핵심 아이디어는 각 레이어의 가중치나 활성화 값들이 가지는 실제 데이터 분포의 최소값(‘cmin‘)과 최대값(‘cmax‘)을 찾고, 이 범위를 목표 정수 범위(예: 8비트 부호 없는 정수의 경우 )에 비례적으로 매핑하는 것이다. 데이터의 분포가 0을 중심으로 대칭적이지 않은 경우(예: ReLU 활성화 함수를 통과한 값들은 항상 0 이상이므로 분포가 양수 쪽으로 치우침), 비대칭 양자화는 매핑 범위를 데이터 분포에 더 가깝게 설정할 수 있어 양자화 오차를 줄이고 모델의 정확도를 더 잘 보존할 수 있다.20
이 양자화 과정에서 ’보정 데이터셋(calibration dataset)’의 역할은 절대적이다. 양자화의 성공은 실제 데이터 분포를 얼마나 정확하게 추정하느냐에 달려있기 때문이다. snpe-dlc-quantize 도구는 보정 데이터셋을 모델에 직접 통과시켜 각 레이어에서 발생하는 활성화 값의 실제 분포를 관찰하고, 이를 바탕으로 최적의 c_{min}과 c_{max} 값을 통계적으로 결정한다.21 만약 보정 데이터셋이 실제 추론 환경에서 마주할 데이터의 분포를 잘 대표하지 못한다면, 추정된 범위가 부정확해져 양자화 후 모델의 정확도가 심각하게 저하될 수 있다. 따라서 양자화는 단순한 수학적 변환이 아니라, 데이터에 기반한 정밀한 최적화 과정으로 이해해야 한다.
5.3 양자화 수학 공식 및 변수 해설
SNPE에서 사용하는 비대칭 선형 양자화는 다음의 수학 공식으로 표현된다.20
q = \text{clamp} \left( \left\lfloor R \times \frac{x - c_{min}}{c_{max} - c_{min}} \right\rceil, lb, ub \right)
이 공식의 각 변수는 다음과 같은 의미를 가진다.
-
q: 양자화의 결과로 얻어지는 **정수 값(quantized integer value)**이다.
-
x: 양자화를 수행하기 전의 **원본 부동소수점 값(original floating-point value)**이다.
-
c_{min}‘, c_{max}‘: 해당 레이어의 가중치 또는 활성화 값들이 가지는 부동소수점 값의 최소 및 최대 범위이다. 이 값들은 보정 데이터셋을 통해 경험적으로 결정된다.
-
R: 양자화 후의 **정수 범위의 크기(range)**이다. 예를 들어, 8비트 부호 없는 정수(unsigned INT8)로 양자화하는 경우, 0부터 255까지 256개의 값을 표현할 수 있으므로 R은 255(2^8 - 1)가 된다.
-
lb, ub: 양자화된 정수 값이 가질 수 있는 **범위의 하한(lower bound) 및 상한(upper bound)**이다. unsigned INT8의 경우, lb=0, ub=255이다.
-
\lfloor \cdot \rceil: 반올림(round-to-nearest) 연산을 의미한다.
-
clamp(v,min,max): 계산된 값 v가 지정된 범위
[min, max]를 벗어날 경우, 값을 각각 min 또는 max로 제한(clipping)하는 함수이다.
이 공식은 먼저 부동소수점 값 x를 [c_{min}, c_{max}] 범위 내에서 정규화((x - c_{min}) / (c_{max} - c_{min}))하여 사이의 값으로 만든다. 그 다음, 이 값을 정수 범위의 크기 R만큼 곱하여 스케일링하고 반올림하여 정수 값으로 변환한다. 마지막으로, 이 값이 목표 정수 범위 [lb, ub]를 벗어나지 않도록 clamp 함수를 적용하여 최종 양자화된 값 q를 얻는다.
5.4 정확도와 성능 간의 트레이드오프
양자화는 본질적으로 정보의 손실을 수반하는 과정이므로, 일반적으로 모델의 정확도가 약간 저하된다. 저정밀도 데이터 타입은 부동소수점보다 표현할 수 있는 값의 범위와 정밀도가 낮기 때문이다. 이러한 정확도 저하의 정도는 모델의 아키텍처, 데이터의 분포, 그리고 양자화 방식에 따라 달라진다.
개발자는 양자화를 통해 얻는 막대한 성능 향상(추론 속도, 전력 효율)과 감수해야 하는 정확도 저하 사이에서 신중한 트레이드오프(trade-off)를 고려해야 한다. 예를 들어, 자율주행차의 보행자 탐지 모델과 같이 안전이 최우선인 애플리케이션에서는 아주 작은 정확도 저하도 허용되지 않을 수 있다. 반면, 스마트폰의 사진 필터 앱과 같이 약간의 시각적 차이가 허용되는 경우에는 성능 향상의 이점이 더 클 수 있다. SNPE는 보정 데이터셋을 활용하여 이러한 정확도 저하를 최소화하도록 설계되었지만, 양자화된 모델의 성능을 실제 태스크에 대해 충분히 검증하는 것은 개발자의 중요한 책임이다.16
6. 애플리케이션 통합: C++ 및 Java API 활용
SNPE SDK는 개발자가 자신의 애플리케이션에 AI 추론 기능을 원활하게 통합할 수 있도록 C++와 Java, 두 가지 주요 프로그래밍 언어에 대한 API를 제공한다. C++ API는 고성능 네이티브 애플리케이션이나 안드로이드 NDK를 사용하는 앱에 적합하며, Java API는 일반적인 안드로이드 애플리케이션 개발에 편리함을 제공한다. 두 API 모두 SNPE의 핵심 기능에 대한 접근을 제공하지만, 사용 방식과 추상화 수준에서 차이가 있다. API 설계의 핵심 철학은 개발자에게 ’유연성’과 ’제어’를 부여하는 데 있다. 개발자는 런타임 선택, 버퍼 관리, 프로파일링 수준 등 다양한 옵션을 통해 자신의 애플리케이션 요구사항에 맞게 추론 파이프라인을 세밀하게 조정할 수 있다.
6.1 C++ API를 이용한 추론 파이프라인 구축
SNPE C++ API는 하드웨어 자원을 세밀하게 제어하고 성능을 극대화하고자 하는 개발자에게 적합하다. 전체 추론 과정은 다음과 같은 논리적인 단계로 구성된다.10
- 모델 로딩 및 빌더 생성: 먼저, 파일 시스템으로부터 DLC 모델을 로드하여 컨테이너 객체를 생성한다.
std::unique_ptr<zdl::DlContainer::IDlContainer> container = zdl::DlContainer::IDlContainer::open("model.dlc");
이 컨테이너를 사용하여 SNPEBuilder 객체를 초기화한다. 이 빌더 객체는 SNPE 추론 인스턴스를 구성하는 모든 설정을 담당한다.
zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
- 런타임 및 프로파일링 설정:
SNPEBuilder를 통해 추론을 실행할 하드웨어와 성능 프로파일링 수준을 설정한다.setRuntimeProcessor()메소드는 이기종 컴퓨팅의 핵심으로, CPU, GPU, DSP 중 어떤 하드웨어를 사용할지 명시적으로 지정한다.
zdl::DlSystem::Runtime_t runtime = zdl::DlSystem::Runtime_t::DSP;
snpeBuilder.setRuntimeProcessor(runtime);
성능 분석을 위해 setProfilingLevel()을 사용하여 DETAILED 수준의 프로파일링을 활성화할 수 있다.
snpeBuilder.setProfilingLevel(zdl::DlSystem::ProfilingLevel_t::DETAILED);
또한, setUseUserSuppliedBuffers(true) 옵션을 사용하면 개발자가 직접 입출력 메모리 버퍼를 관리하여 불필요한 데이터 복사를 제거(zero-copy)하고 지연 시간을 줄일 수 있다. 이는 실시간 비디오 처리와 같이 성능에 매우 민감한 애플리케이션에서 유용한 고급 기능이다.
- SNPE 인스턴스 빌드: 모든 설정이 완료되면
build()메소드를 호출하여 최종적으로 추론을 수행할SNPE인스턴스를 생성한다.
std::unique_ptr<zdl::SNPE::SNPE> snpe = snpeBuilder.build();
- 입력 텐서 준비: 모델의 입력 요구사항(차원, 데이터 타입 등)에 맞는 입력 텐서(
zdl::DlSystem::ITensor)를 생성하고, 전처리된 입력 데이터를 채운다.
// 입력 텐서의 속성을 가져옴
auto inputDims = snpe->getInputDimensions();
// 텐서 팩토리를 사용해 텐서 생성
std::unique_ptr<zdl::DlSystem::ITensor> inputTensor = zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputDims);
// 입력 데이터를 float 배열로부터 복사
std::copy(inputBuffer.begin(), inputBuffer.end(), inputTensor->begin());
- 추론 실행: 준비된 입력 텐서를
execute()메소드에 전달하여 추론을 실행한다. 결과는 출력 텐서 맵(zdl::DlSystem::TensorMap)에 저장된다.
zdl::DlSystem::TensorMap outputTensorMap;
snpe->execute(inputTensor.get(), outputTensorMap);
- 결과 처리: 추론이 완료되면
outputTensorMap에서 출력 레이어의 이름을 키로 사용하여 결과 텐서를 가져온다. 그 후 텐서의 데이터를 읽어와 애플리케이션에 필요한 후처리 작업을 수행한다.
zdl::DlSystem::StringList outputTensorNames = outputTensorMap.getTensorNames();
for (const char* name : outputTensorNames) {
auto outputTensor = outputTensorMap.getTensor(name);
// 결과 데이터 처리...
}
6.2 Java API를 이용한 안드로이드 앱 통합
SNPE Java API는 안드로이드 애플리케이션 개발자가 보다 친숙한 환경에서 SNPE의 기능을 사용할 수 있도록 C++ API를 래핑(wrapping)한 것이다. 핵심 클래스와 사용법은 다음과 같다.29
SNPE.NeuralNetworkBuilder: C++의SNPEBuilder와 동일한 역할을 하는 핵심 클래스이다. 안드로이드Application컨텍스트와 모델 파일(.dlc)을 인자로 받아 네트워크 인스턴스를 생성하는 과정을 담당한다. 이 빌더의 중요한 메소드 중 하나는.setRuntimeOrder()로, 단일 런타임을 지정하는 대신 런타임의 우선순위 목록을 제공할 수 있다. 예를 들어, DSP를 가장 먼저 시도하고, 실패 시 GPU, 그 다음 CPU 순으로 폴백하도록 설정할 수 있다. 이는 디바이스의 상태나 모델 지원 여부에 따라 유연하게 대처할 수 있게 해준다.
final SNPE.NeuralNetworkBuilder builder = new SNPE.NeuralNetworkBuilder(getApplication())
.setModel(modelFile)
.setRuntimeOrder(Runtime.DSP, Runtime.GPU, Runtime.CPU);
NeuralNetwork network = builder.build();
FloatTensor: 부동소수점 데이터를 저장하고 조작하기 위한 텐서 클래스이다. 모델의 입력을 준비하거나 추론 결과를 받을 때 사용된다.write()메소드를 사용하여 Java의float배열로부터 데이터를 텐서로 복사하고,read()메소드를 사용하여 텐서의 데이터를float배열로 읽어올 수 있다.
// 입력 텐서 생성 및 데이터 쓰기
FloatTensor inputTensor = network.createFloatTensor(network.getInputTensorsShapes().get("input_name"));
inputTensor.write(pixelFloats, 0, pixelFloats.length);
TensorMap: 문자열 형태의 텐서 이름을 키로 하고,Tensor객체를 값으로 갖는 맵 자료구조이다.execute()메소드는 이TensorMap을 사용하여 여러 개의 입력을 받고 여러 개의 출력을 반환한다. 이를 통해 다중 입출력을 갖는 복잡한 모델을 효율적으로 처리할 수 있다.
// 입력 텐서 맵 준비
final TensorMap inputs = new TensorMap();
inputs.add("input_name", inputTensor);
// 추론 실행
final TensorMap outputs = network.execute(inputs);
// 출력 텐서 맵에서 결과 가져오기
FloatTensor outputTensor = (FloatTensor) outputs.getTensor("output_name");
final float results = new float;
outputTensor.read(results, 0, results.length);
실제 안드로이드 애플리케이션에서는 카메라 프리뷰로부터 프레임을 지속적으로 받아와 Bitmap으로 변환하고, 이를 float 배열로 변환하여 전처리한 후 FloatTensor에 담아 추론을 실행하는 방식으로 실시간 객체 탐지나 이미지 분할과 같은 기능을 구현할 수 있다.29
7. 성능 최적화 및 벤치마크 분석
SNPE의 핵심 가치는 스냅드래곤 플랫폼의 이기종 컴퓨팅 하드웨어를 활용하여 AI 추론의 성능과 전력 효율을 극대화하는 데 있다. 이 섹션에서는 실제 벤치마크 사례를 통해 각 하드웨어 유닛의 성능 특성을 정량적으로 분석하고, 개발자가 애플리케이션의 성능을 한 단계 더 끌어올리기 위해 사용할 수 있는 주요 최적화 기법들을 살펴본다.
7.1 성능 벤치마크 사례 연구
7.1.1 CPU vs. GPU vs. DSP 성능 및 전력 효율 비교
Lantronix가 Open-Q 820 개발 키트(Snapdragon 820 탑재)에서 객체 탐지 모델인 ’tiny-yolo’를 실행한 벤치마크 결과는 각 하드웨어 유닛의 특성을 명확하게 보여준다.6
-
성능(처리 속도): 애플리케이션 전체를 CPU에서만 실행했을 때의 처리 속도는 약 1.77 FPS(초당 프레임)에 불과했다. 반면, 신경망 추론 부분을 Adreno 530 GPU로 오프로딩했을 때는 5.39 FPS로 204%의 성능 향상을 기록했다. Hexagon 680 DSP를 사용했을 때는 4.33 FPS로 145%의 성능 향상을 보였다. 이는 딥러닝 연산의 높은 병렬성이 GPU와 DSP의 아키텍처와 얼마나 잘 부합하는지를 명확히 보여주는 결과이다.
-
전력 효율: 성능만큼이나 중요한 지표는 전력 소모이다. CPU 단독 실행 시 약 6.53W의 전력을 소모한 반면, GPU를 사용했을 때는 4.33W, DSP를 사용했을 때는 3.15W로 전력 소모가 크게 감소했다. 이를 전력 효율(성능/전력) 관점에서 분석하면, GPU는 CPU 대비 50.5%, DSP는 107.4% 더 효율적이었다. 특히 DSP는 GPU보다 약간 낮은 FPS를 기록했지만, 훨씬 적은 전력을 소모하여 ‘와트당 성능(Performance per Watt)’ 측면에서 압도적인 우위를 보였다. 이는 배터리 수명이 절대적으로 중요한 모바일 환경에서 왜 DSP가 On-Device AI의 핵심 하드웨어로 간주되는지를 입증한다.
7.1.2 Snapdragon 855 벤치마크 분석
NASA 제트추진연구소(JPL)가 Snapdragon 855 칩셋에서 수행한 벤치마크 연구는 더 최신 하드웨어에서의 성능 경향을 보여준다.16 이미지 분류(MSLNet) 및 분할(NavCam Segmentation) 모델을 테스트한 결과, DSP/NPU(신경망 처리 장치)는 GPU보다 2배 이상, CPU보다는 10배 이상 빠른 추론 성능을 기록했다. 이는 DSP가 고정소수점 연산을 위한 긴 벡터 SIMD 명령어와 높은 코어 클럭 속도를 바탕으로 AI 추론에 극도로 최적화되어 있음을 시사한다.
다만, 이 연구에서는 중요한 트레이드오프가 관찰되었다. DSP/NPU는 고정소수점 연산만 지원하므로 모델 양자화가 필수적인데, 이 과정에서 정보 손실로 인한 정확도 저하가 발생할 수 있다. 대부분의 모델에서는 5% 미만의 낮은 오차를 보였지만, Mars NavCam 이미지 분할 모델의 경우 DSP에서 실행했을 때 9.3%의 비교적 높은 오차가 발생했다. 이는 개발자가 DSP의 압도적인 성능을 활용하기 위해서는 양자화 과정과 그로 인한 정확도 변화를 신중하게 검증하고 관리해야 함을 의미한다.
Table 2: 이기종 컴퓨팅 런타임별 성능 및 전력 효율 비교 (Open-Q 820, tiny-yolo)
이 표는 개발자가 각 하드웨어 런타임 선택에 따른 성능과 전력 효율의 구체적인 수치를 직관적으로 비교하여, 자신의 애플리케이션 목표에 맞는 최적의 런타임을 선택하는 데 실질적인 데이터를 제공한다.6
| 런타임 타겟 | 초당 프레임 (FPS) | CPU 대비 성능 향상률 | 전력 소모 (W) | CPU 대비 전력 효율 향상률 |
|---|---|---|---|---|
| CPU | ~1.77 | - | ~6.53 | - |
| GPU (Adreno 530) | 5.39 | 204% | 4.33 | 50.5% |
| DSP (Hexagon 680) | 4.33 | 145% | 3.15 | 107.4% |
7.2 성능 최적화 기법
SNPE는 벤치마크에서 확인된 하드웨어 가속 외에도, 애플리케이션 수준에서 성능을 더욱 향상시킬 수 있는 다양한 최적화 기법을 제공한다.
-
Burst Mode: 이 기능은 DSP 또는 AIP(AI Processor)에서 연속적인 추론 요청이 감지될 때, 하드웨어의 클럭 속도와 전압을 일시적으로 최대 수준으로 고정하여 개별 추론의 지연 시간을 최소화한다. 일반적으로 모바일 기기는 전력 소모를 줄이기 위해 동적으로 클럭 속도를 조절하는데, 이로 인해 추론 시작 시 클럭을 높이는 데 약간의 시간이 소요될 수 있다. Burst Mode는 이러한 지연을 제거하여, 실시간 비디오 스트림 분석과 같이 일관되고 예측 가능한 저지연성이 요구되는 시나리오에서 매우 유용하다.3
-
Init Caching:
snpe-dlc-graph-prepare도구를 사용하여 구현되는 이 기법은 모델 초기화 시간을 단축시키는 데 중점을 둔다. 애플리케이션이 SNPE 모델을 로드할 때, 런타임은 모델 그래프를 분석하고 타겟 하드웨어에서 실행하기 위한 준비 작업을 수행하는데, 이 과정에 수백 밀리초가 소요될 수 있다. Init Caching은 이 초기화 과정에서 생성되는 데이터를 미리 계산하여 DLC 파일 내에 캐시 형태로 저장한다. 이렇게 준비된 DLC 파일을 사용하면, 애플리케이션 시작 시 모델 로딩 및 초기화 시간을 크게 단축시켜 사용자 경험을 향상시킬 수 있다.22 -
기타 애플리케이션 통합 팁:
-
로깅(Logging) 관리: 디버깅 시에는 상세한 로그가 유용하지만, 배포 버전에서는 로깅 레벨을 낮추어 불필요한 I/O 작업을 줄이는 것이 성능에 도움이 된다.3
-
CPU 고정소수점 모드(CPU Fixed Point Mode): DSP를 사용할 수 없는 환경이지만 양자화된 모델을 실행해야 할 경우, CPU에서도 고정소수점 연산을 에뮬레이션하여 실행할 수 있다. 이는 부동소수점 연산보다 빠를 수 있다.3
-
사용자 제공 버퍼(User-Supplied Buffers): API 섹션에서 언급했듯이, 개발자가 직접 입출력 메모리 버퍼를 할당하고 관리함으로써 SNPE 런타임 내부의 불필요한 메모리 복사를 제거할 수 있다. 이는 특히 고해상도 이미지나 비디오 프레임을 처리할 때 지연 시간 감소에 큰 효과를 볼 수 있다.10
이러한 최적화 기법들을 적절히 활용함으로써, 개발자는 스냅드래곤 플랫폼에서 SNPE의 잠재력을 최대한으로 이끌어내고, 사용자에게 더 빠르고 반응성 좋은 AI 경험을 제공할 수 있다.
8. 결론: SNPE의 현재와 미래
8.1 SNPE의 핵심 가치와 기술적 장점 요약
퀄컴 뉴럴 프로세싱 SDK(SNPE)는 스냅드래곤 플랫폼의 강력하고 복잡한 이기종 컴퓨팅 하드웨어를 AI 개발자들이 효과적으로 활용할 수 있도록 지원하는 핵심적인 소프트웨어 스택이다. SNPE는 Kryo CPU, Adreno GPU, Hexagon DSP라는 각기 다른 특성을 지닌 연산 유닛들을 추상화하고, AI 워크로드를 가장 적합한 하드웨어에 지능적으로 할당함으로써 On-Device AI 애플리케이션의 성능과 전력 효율을 극대화한다. 모델 변환, 양자화, 실행, 분석을 아우르는 포괄적인 커맨드 라인 도구 체인과 C++/Java로 제공되는 유연한 API는 개발 과정을 가속화하고, Burst Mode 및 Init Caching과 같은 고급 최적화 기능은 성능을 한계까지 끌어올릴 수 있는 수단을 제공한다. 결론적으로 SNPE는 스냅드래곤 생태계 내에서 고성능 엣지 AI를 구현하기 위한 가장 성숙하고 강력한 솔루션이라 할 수 있다.
8.2 퀄컴 AI 엔진 다이렉트(QNN)와의 관계 및 생태계의 발전 방향
최근 퀄컴의 AI 소프트웨어 문서를 살펴보면, SNPE와 함께 QNN(Qualcomm AI Engine Direct) SDK가 비중 있게 다루어지고 있다.29 QNN은 SNPE보다 더 낮은 수준의 API를 제공하여 개발자가 하드웨어 백엔드(Backend)를 직접 제어하고, 모델 실행 그래프를 더욱 세밀하게 구성할 수 있도록 지원하는 차세대 SDK로 분석된다.36 이는 하드웨어에 대한 최대의 제어권을 원하는 고급 개발자들을 위한 것이다.
이러한 변화는 퀄컴의 AI 소프트웨어 스택이 이원화 전략으로 발전하고 있음을 시사한다. SNPE는 안정적이고 사용하기 쉬운 고수준 SDK로서 폭넓은 개발자층을 지원하는 역할을 계속 수행하고, QNN은 최고의 성능을 추구하는 전문가들을 위해 더 깊이 있는 접근을 가능하게 할 것이다. qairt-converter와 같이 두 SDK에서 공통으로 사용되는 도구의 등장은 두 생태계가 기술적으로 통합되며 진화하고 있음을 보여준다.3
8.3 생태계 내 경쟁 구도 (SNPE vs. TFLite, Core ML, NNAPI)
On-Device AI 추론 프레임워크 시장은 여러 강력한 플레이어들이 경쟁하는 역동적인 분야이다. SNPE는 이 생태계 내에서 다음과 같은 위치를 차지한다.
-
TensorFlow Lite (TFLite): 구글이 주도하는 TFLite는 안드로이드, iOS, 임베디드 리눅스 등 다양한 플랫폼을 지원하는 가장 보편적인 모바일 추론 프레임워크이다. TFLite는 GPU Delegate나 NNAPI Delegate를 통해 하드웨어 가속을 지원하지만, SNPE는 스냅드래곤 하드웨어의 아키텍처에 대한 가장 깊은 이해를 바탕으로 최적화를 수행한다는 점에서 차별화된다. 즉, 범용성에서는 TFLite가 앞서지만, 스냅드래곤 플랫폼에서의 ’최고 성능’은 SNPE가 우위를 점한다. 최근 TFLite가 퀄컴 DSP를 직접 지원하기 시작한 것은 두 생태계가 서로 경쟁하면서도 기술적으로 영향을 주고받고 있음을 보여준다.2
-
Android NNAPI: 안드로이드 운영체제가 제공하는 표준 하드웨어 가속 API였던 NNAPI는 다양한 하드웨어를 단일 인터페이스로 추상화하려는 시도였다. 하지만 현재는 공식적으로 deprecated 되었으며, 구글은 개발자들에게 TFLite로의 마이그레이션을 권장하고 있다.39 이는 범용 표준 API만으로는 각기 다른 특성을 가진 하드웨어의 성능을 최대한 이끌어내는 데 한계가 있음을 인정한 것으로 해석할 수 있다. NNAPI의 퇴조는 오히려 퀄컴의 SNPE와 같이 각 하드웨어 제조사가 직접 제공하는 고도로 최적화된 독자 SDK의 중요성을 더욱 부각시키는 결과를 낳았다.
-
Apple Core ML: Core ML은 애플 생태계의 SNPE에 해당하는 프레임워크로, 아이폰과 아이패드 등의 기기에서 CPU, GPU, 그리고 Neural Engine을 활용한 이기종 컴퓨팅을 지원한다.41 SNPE와 마찬가지로 특정 플랫폼에 종속되어 있지만, 해당 생태계 내에서는 타의 추종을 불허하는 최적화와 통합성을 제공한다. 이는 AI 하드웨어 가속 시장이 범용 솔루션과 플랫폼 특화 솔루션으로 양분되어 있음을 보여주는 대표적인 사례이다.43
8.4 개발자를 위한 최종 권장 사항
스냅드래곤 기반 디바이스에서 최고의 성능과 전력 효율을 갖춘 On-Device AI 애플리케이션을 개발하고자 한다면, SNPE(또는 차세대 QNN)의 학습과 활용은 필수적이다. 특히, 모바일 환경의 제약을 극복하고 AI 기능을 상시 활성화하기 위해서는 Hexagon DSP의 잠재력을 최대한 활용해야 하며, 이를 위해 양자화 기술에 대한 깊은 이해와 적절한 보정 데이터셋을 준비하는 노력이 반드시 수반되어야 한다. 또한, 개발 초기 단계부터 snpe-diagview와 같은 프로파일링 도구를 적극적으로 사용하여 모델의 성능 병목 지점을 식별하고, Burst Mode, Init Caching 등의 최적화 기법을 적용하여 지속적으로 성능을 개선하는 반복적인 개발 프로세스를 구축하는 것이 성공적인 프로젝트의 핵심이 될 것이다. AI 하드웨어 가속 기술이 빠르게 발전함에 따라, 개발자는 이제 하드웨어뿐만 아니라 그 성능을 이끌어내는 소프트웨어 스택의 성숙도와 기능을 함께 고려하여 기술적 의사결정을 내려야 하는 시대에 접어들었다.
9. 참고 자료
- Heterogeneous Computing Architectures — A Deep Dive into the Future of Computing | by RocketMe Up I/O | Medium, https://medium.com/@RocketMeUpIO/heterogeneous-computing-architectures-a-deep-dive-into-the-future-of-computing-9cefb8b7c1a1
- Journey with Qualcomm SNPE on Android, https://vjraj.dev/blog/snpe_android_1/
- Qualcomm Neural Processing SDK, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-2
- Qualcomm Neural Processing SDK | Qualcomm Developer, https://www.qualcomm.com/developer/software/neural-processing-sdk-for-ai
- hisrg/SNPE: Snapdragon Neural Processing Engine (SNPE) SDKThe Snapdragon Neural Processing Engine (SNPE) is a Qualcomm Snapdragon software accelerated runtime for the execution of deep neural networks. With SNPE, users can: Execute an arbitrarily deep neural network Execute the network on the SnapdragonTM CPU, the AdrenoTM GPU or the HexagonTM DSP - GitHub, https://github.com/hisrg/SNPE
- How to use the Snapdragon™ Neural Processing Engine (NPE) SDK with the Open-Q™ 820 - Lantronix, https://www.lantronix.com/blog/example-performance-power-efficiency-gains-using-snapdragon-neural-processing-engine-sdk-open-q-820/
- [AI Model Conversion] Snapdragon Neural Processing Engine SDK Tutorial, https://www.macnica.co.jp/en/business/semiconductor/articles/qualcomm/142393/
- Qualcomm Neural Processing SDK for AI Documentation, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-2?product=1601111740010412
- What is heterogeneous compute? - Arm, https://www.arm.com/glossary/heterogeneous-compute
- Snapdragon NPE Overview - Linaro, https://static.linaro.org/connect/hkg18/presentations/hkg18-306.pdf
- Model deployment - AI Developer Workflow, https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-15B/snpe-run-model.html
- Using the Snapdragon Neural Processing Engine for efficient edge …, https://fritz.ai/using-the-snapdragon-neural-processing-engine/
- Heterogeneous computing - Wikipedia, https://en.wikipedia.org/wiki/Heterogeneous_computing
- Heterogeneous Computing: An architecture and a technique - Qualcomm, https://www.qualcomm.com/news/onq/2017/03/heterogeneous-computing-architecture-and-technique
- What is Heterogeneous Computing? - Supermicro, https://www.supermicro.com/en/glossary/heterogeneous-computing
- Benchmarking Deep Learning Models on Myriad and Snapdragon …, https://ai.jpl.nasa.gov/public/documents/papers/dunkel-jais-benchmarking23.pdf
- [1810.01109] AI Benchmark: Running Deep Neural Networks on Android Smartphones, https://ar5iv.labs.arxiv.org/html/1810.01109
- Qualcomm SNPE and TVM - Questions, https://discuss.tvm.apache.org/t/qualcomm-snpe-and-tvm/11286
- Artificial Intelligence, Machine Learning, Android and the Qualcomm Neural Processing SDK for AI, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-4/artificial-qualcomm-neural-processing-sdk.html?product=1601111740010412
- SNPE — MQBench documentation, https://mqbench.readthedocs.io/en/latest/user_guide/deploy/snpe.html
- AI Developer Workflow | RUBIK Pi Documentation - Thundercomm, https://www.thundercomm.com/rubik-pi-3/en/docs/rubik-pi-3-user-manual/1.1.1/ai-developer-workflow/
- Neural Processing SDK guide - Qualcomm® Linux Documentation, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-2/function_UserBufferList_8h_1a46a8fb1d2a034afc3e3b4ca10ec83417.html?vproduct=1601111740013072&version=1.3&facet=Qualcomm%20Neural%20Processing%20SDK
- Qualcomm SNPE User Application Benchmarking - Area 137, https://michael137.github.io/2020-04-16-snpe-benchmarking/
- Model Optimizations - ML Systems Textbook, https://www.mlsysbook.ai/contents/core/optimizations/optimizations.html
- Sequential representation of model inference using SNPE - ResearchGate, https://www.researchgate.net/figure/Sequential-representation-of-model-inference-using-SNPE_fig19_390214688
- SNPE — Olive documentation - Microsoft Open Source, https://microsoft.github.io/Olive/0.5.0/features/passes/snpe.html
- SNPE — MQBench documentation, https://mqbench.readthedocs.io/en/stable/user_guide/hardware/snpe.html
- SNPE User Manual - device.report, https://device.report/m/42566225d472e967e757764518357ff7f0f4800f9abaa803aedd7b56060c6a43.pdf
- quic/qidk - GitHub, https://github.com/quic/qidk
- Qualcomm Neural Processing SDK, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-2/api_java.html
- Developing an Android App for Snapdragon Mobile Platforms - Learning Resources - Qualcomm Neural Processing SDK for AI Documentation, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-4/developing-an-android-app-for-snapdragon-mobile-platforms.html?product=1601111740010412
- SNPE inference outputs misaligned images - Stack Overflow, https://stackoverflow.com/questions/77222527/snpe-inference-outputs-misaligned-images
- fdchiu/SNPECam: Qualcomm SNPE inference with a Android Camera Feed - GitHub, https://github.com/fdchiu/SNPECam
- quic/ai-engine-direct-helper: QAI AppBuilder is designed to help developers easily execute models on WoS and Linux platforms. It encapsulates the Qualcomm® AI Runtime SDK APIs into a set of simplified interfaces for running models on the NPU/HTP. - GitHub, https://github.com/quic/ai-engine-direct-helper
- Windows Setup - Qualcomm AI Engine Direct SDK, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-50/windows_setup.html
- Overview - Qualcomm AI Engine Direct SDK, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-50/overview.html
- Documentation - Qualcomm AI Engine Direct SDK, https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-50/introduction.html
- AI Developer Workflow - Qualcomm® Linux Documentation, https://docs.qualcomm.com/bundle/publicresource/topics/80-70020-15B/introduction.html?vproduct=1601111740013072&latest=true
- Neural Networks API | Android NDK | Android Developers, https://developer.android.com/ndk/guides/neuralnetworks
- NNAPI Migration Guide | Android NDK, https://developer.android.com/ndk/guides/neuralnetworks/migration-guide
- Core ML | Apple Developer Documentation, https://developer.apple.com/documentation/coreml
- Core ML - Machine Learning - Apple Developer, https://developer.apple.com/machine-learning/core-ml/
- Comparing ML Programs and Neural Networks — Guide to Core ML Tools - Apple, https://apple.github.io/coremltools/docs-guides/source/comparing-ml-programs-and-neural-networks.html