온디바이스 AI, 얼굴 식별 파이프라인 최적화로 성능 530% 향상!

by DD
4개월 전
조회수 16

하이퍼커넥트(Hyperconnect)는 온디바이스(On-device) AI 사진 추천 기술의 핵심인 얼굴 식별 파이프라인(Face Verification Pipeline) 최적화 과정을 공개

얼굴 탐지(Face Detection) 모델의 디코딩(Decoding) 과정에서 불필요한 연산을 제거하고, top-K 선택 알고리즘을 힙 기반으로 변경하여 성능 개선

TensorFlow Lite 스레드 풀(Thread Pool) 크기를 디바이스 환경에 맞춰 조절하고, 모델 인스턴스 병렬화(Model Instance Parallelization)를 통해 처리량 극대화

모델 구조 변경 없이, 연산 흐름 개선 및 병렬 처리 기법을 통해 응답 시간 37% 단축, 처리량 530% 향상이라는 괄목할 만한 성과 달성

성능 최적화는 정량적 분석을 기반으로, 병목 지점(Bottleneck) 파악 및 디바이스 환경에 맞는 튜닝(Tuning)이 중요함을 강조

얼굴 식별 파이프라인(Face Verification Pipeline) 구조 분석

본문은 AI 사진 추천을 위한 얼굴 식별 파이프라인(Face Verification Pipeline)을 얼굴 탐지(Face Detection)와 얼굴 인식(Face Recognition) 두 단계로 구분하여 설명한다.

얼굴 탐지(Face Detection): 얼굴 탐지 모델(Face Detection Model)을 활용, 사진에서 얼굴 영역(Bounding Box)과 특징점(Landmark)을 추출

얼굴 인식(Face Recognition): 써드파티 라이브러리를 사용하여 임베딩(Embedding) 벡터 생성 및 유사도 계산

파이프라인(Pipeline) 구조: 각 단계는 개별 ML 모델을 사용하며, 온디바이스(On-device) 환경에서 실행되므로, 성능 최적화가 중요

얼굴 식별 파이프라인은 개인 정보 보호를 위해 데이터 격리 아키텍처(Data Isolation Architecture)를 채택하여, 모든 데이터 처리가 기기 내에서 이루어진다.

디코딩(Decoding) 최적화: PPD(Predicate Pushdown) 기법 활용

얼굴 탐지(Face Detection) 모델의 디코딩(Decoding) 과정에서, 모델이 출력하는 모든 후보 영역에 대해 디코딩을 수행하는 비효율성을 발견하고, PPD(Predicate Pushdown) 기법을 적용하여 성능을 개선했다.

PPD(Predicate Pushdown) 적용: 디코딩 전에 confidence 값을 기준으로 필터링하여, 디코딩 대상 데이터(Decoding Target Data)를 99% 감소

연산 융합(Fused Operation): 필터링, 정렬(Sorting), Top-K 선택(Top-K)을 하나의 연산으로 묶어 불필요한 중간 단계 제거

결과: 디코딩 시간 79% 감소, 단일 사진 처리 시간(Latency) 6ms 개선, 처리량(Throughput) 1장/초 향상

이러한 최적화는 모델 구조 변경 없이, 연산 흐름을 재설계하여 성능을 향상시킨 대표적인 사례이다.

Top-K 선택 알고리즘 최적화: 힙(Heap) 기반 자료구조 활용

기존의 Top-K 선택 알고리즘은 전체 후보를 정렬하는 O(n log n)의 시간 복잡도를 가지는 비효율적인 구조였다. 이를 개선하기 위해, 힙(Heap) 기반 자료구조를 활용하여 상위 K개만 유지하는 알고리즘을 구현했다.

Min Heap(최소 힙) 사용: confidence가 낮은 후보를 우선순위로 하여, 상위 K개 후보를 효율적으로 관리

불필요한 정렬 제거: threshold를 통과한 모든 후보를 정렬하는 대신, 상위 K개만 유지하여 정렬 연산 최소화

결과: Pre NMS Filter & TopK 단계에서 78% 응답 시간 개선

이러한 최적화는 알고리즘 선택의 중요성을 보여주며, 자료구조(Data Structure) 선택이 성능에 미치는 영향을 강조한다.

TensorFlow Lite 스레드 풀(Thread Pool) 및 모델 인스턴스 최적화

모델 추론 성능 향상을 위해, TensorFlow Lite의 스레드 풀(Thread Pool) 크기를 디바이스 환경에 맞게 조절하고, 모델 인스턴스 병렬화(Model Instance Parallelization)를 적용했다.

스레드 풀 크기 조절: 스레드 풀 크기 1로 고정하여 응답 시간 12.5% 개선

모델 인스턴스 병렬화: 얼굴 탐지(Detection) 모델 인터프리터 수를 4개로 늘려 처리량 2.28배 향상

병목 현상 해결: 써드파티 라이브러리 얼굴 인식(Recognition) 모델의 병목을 해결하기 위해, 인식 모델 스레드 풀(Recognition Model Thread Pool) 추가

결과적으로, 전체 파이프라인 처리량 6.4배 향상, 응답 시간 37% 감소, 처리량 530% 개선이라는 놀라운 성과를 달성했다.

성능 최적화의 핵심: 정량적 분석과 데이터 기반 의사 결정

본문은 성능 최적화 과정에서 정량적 분석(Quantitative Analysis)의 중요성을 강조하며, 데이터 기반 의사 결정의 중요성을 강조한다.

프로파일러(Profiler) 활용: Android Studio Profiler, Perfetto 등을 활용하여 병목 지점(Bottleneck)을 정확하게 파악

벤치마크(Benchmark) 기반: 다양한 디바이스 환경에서 성능 측정 및 검증을 수행

멀티 스레딩(Multi-threading) 주의: 스레드 풀 크기 증가가 항상 성능 향상으로 이어지는 것은 아니며, 암달의 법칙(Amdahl’s Law)을 고려해야 함

결론적으로, 시스템 최적화는 전반적인 구조에 대한 이해실제 측정을 바탕으로 이루어져야 하며, 성능 병목은 직관이 아닌 데이터를 통해 확인하고, 변경의 영향도 구체적인 수치를 통해 검증해야 한다.

온디바이스 AI 얼굴 식별 파이프라인 최적화