하이퍼커넥트(Hyperconnect)는 온디바이스(On-device) AI 사진 추천 기술의 핵심인 얼굴 식별 파이프라인(Face Verification Pipeline) 최적화 과정을 공개
얼굴 탐지(Face Detection) 모델의 디코딩(Decoding) 과정에서 불필요한 연산을 제거하고, top-K 선택 알고리즘을 힙 기반으로 변경하여 성능 개선
TensorFlow Lite 스레드 풀(Thread Pool) 크기를 디바이스 환경에 맞춰 조절하고, 모델 인스턴스 병렬화(Model Instance Parallelization)를 통해 처리량 극대화
모델 구조 변경 없이, 연산 흐름 개선 및 병렬 처리 기법을 통해 응답 시간 37% 단축, 처리량 530% 향상이라는 괄목할 만한 성과 달성
성능 최적화는 정량적 분석을 기반으로, 병목 지점(Bottleneck) 파악 및 디바이스 환경에 맞는 튜닝(Tuning)이 중요함을 강조
본문은 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)를 채택하여, 모든 데이터 처리가 기기 내에서 이루어진다.
얼굴 탐지(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 선택 알고리즘은 전체 후보를 정렬하는 O(n log n)의 시간 복잡도를 가지는 비효율적인 구조였다. 이를 개선하기 위해, 힙(Heap) 기반 자료구조를 활용하여 상위 K개만 유지하는 알고리즘을 구현했다.
Min Heap(최소 힙) 사용: confidence가 낮은 후보를 우선순위로 하여, 상위 K개 후보를 효율적으로 관리
불필요한 정렬 제거: threshold를 통과한 모든 후보를 정렬하는 대신, 상위 K개만 유지하여 정렬 연산 최소화
결과: Pre NMS Filter & TopK 단계에서 78% 응답 시간 개선
이러한 최적화는 알고리즘 선택의 중요성을 보여주며, 자료구조(Data Structure) 선택이 성능에 미치는 영향을 강조한다.
모델 추론 성능 향상을 위해, 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)을 고려해야 함
결론적으로, 시스템 최적화는 전반적인 구조에 대한 이해와 실제 측정을 바탕으로 이루어져야 하며, 성능 병목은 직관이 아닌 데이터를 통해 확인하고, 변경의 영향도 구체적인 수치를 통해 검증해야 한다.