
핵심요약
온디바이스 AI 얼굴 식별 파이프라인의 성능 최적화를 위해, 모델 변경 없이 연산 흐름 재설계, 알고리즘 최적화, 데이터 접근 방식 개선, 병렬 처리 조정 등을 통해 응답 시간을 37%, 처리량을 530% 향상시켰습니다.
온디바이스 AI 얼굴 식별 파이프라인 최적화
1. Motivation 및 문제 정의
- Tinder 사용자들은 프로필 사진 선택에 어려움을 겪으며, AI 추천 기술로 사용자 경험 혁신 목표.
- 민감한 개인 정보 보호를 위해 모든 데이터 처리는 기기 내(on-device)에서 수행되어야 함.
- 얼굴 식별 파이프라인은 전체 사진 분석 속도가 중요하며, 모델 외적인 병목 요소 개선 필요.
- 최적화 목표: 모델 변경 없이 응답 시간 37% 단축, 처리량 530% 개선.
2. 얼굴 식별 파이프라인 구성
- 얼굴 탐지(Face Detection): 사진에서 얼굴 영역 및 랜드마크 식별, 후처리(NMS, Similarity transform)를 통해 얼굴 이미지 정렬.
- 얼굴 인식(Face Recognition): 얼굴 이미지에서 임베딩 벡터 생성, 기준 임베딩과 비교하여 유사도 판정.
- 전체 파이프라인: 위 두 단계의 결합으로 사용자 얼굴 포함 여부 식별.
3. 최적화 전략 및 결과
- 실험 환경: Galaxy S24 (Android 14), Tensorflow Lite CPU 가속, 500회 반복 측정.
- 병목 지점 분석: Inline Timing Snippet 및 Profiler 도구 활용, Load Image, Face Detection, 3rd-party Face Recognition이 주요 병목으로 파악됨.
3.1. 필터링 우선 적용 및 연산 융합 (Predicate Pushdown)
- 문제점: Face Detection 모델의 후처리에서 불필요한 디코딩 작업이 많음 (모든 후보 영역 디코딩 후 필터링).
- 개선: 디코딩 전에 confidence 기반 필터링을 먼저 적용하여 필요한 후보만 디코딩 (PPD 기법 유사).
- 결과: 디코딩 시간 79% 감소, 단일 사진 처리 시간(latency) 76ms → 70ms 개선.
3.2. Top-K 선택 알고리즘 최적화
- 문제점: threshold 통과 후보 전체 정렬(O(n log n)) 및 중간 컬렉션 생성 오버헤드.
- 개선: Min Heap 자료구조 활용으로 상위 K개만 유지하는 알고리즘으로 변경.
- 결과: Pre NMS Filter & TopK 단계 응답 시간 78% 개선.
3.3. TensorBuffer 데이터 접근 최적화
- 문제점:
getFloatValue메소드 반복 호출 시 JNI 호출 오버헤드 발생. - 개선:
floatArray프로퍼티 사용으로 JNI 호출 최소화 및 JVM 최적화 활용. - 결과: 관련 함수 응답 시간 10-20% 개선, 단일 사진 처리 시간 70.2ms → 69ms 개선.
3.4. TensorFlow Lite 스레드 풀 크기 최적화
- 목표: 단일 연산의 병렬 처리로 응답 시간 개선 시도.
- 결과: 스레드 풀 크기 1일 때 가장 빠른 응답 시간 확인. 특정 연산(rescale)이 병렬화에 부적합하여 역효과 발생.
- 최적화: 스레드 풀 크기 1로 고정하여 응답 시간 12.5% 개선 (69ms → 60ms).
3.5. 모델 인스턴스 병렬화를 통한 처리량 최적화
- 목표: 여러 모델 인스턴스로 동시 처리하여 처리량(throughput) 증대.
- 결과: 얼굴 탐지 모델 인터프리터 수 증가 시 처리량 2.28배 향상. 단, 얼굴 인식 모델이 병목 발생.
- 최종 개선: 얼굴 탐지 및 인식 모델 모두 병렬화 적용 (인터프리터 수=4, 스레드 풀 크기=1). 처리량 7.2장/초 → 45.9장/초 (약 530%) 향상.
4. 결론
- 성능 최적화의 핵심은 정량적 분석(프로파일러, 벤치마크)과 체계적인 개선.
- 연산 흐름 재설계, 불필요한 연산 제거, JNI 오버헤드 최소화, 병렬 처리 최적화 등을 통해 성능 극대화.
- 멀티 스레딩은 만능이 아니며, 연산 특성과 환경에 따른 세심한 조율 및 검증 필요.