온디바이스 AI 얼굴 검증 파이프라인 최적화
안드로이드 온디바이스 얼굴 검증 최적화로 latency 37%, throughput 530% 개선.
하이퍼커넥트 Match Group AI 팀은 갤러리 속 수천 장의 사진에서 프로필에 적합한 이미지를 찾기 위해 온디바이스 사진 추천 기술을 개발했다. 개인정보 보호를 위해 모든 처리는 기기 안에서 끝나야 했고, 그중 첫 단계인 Face Verification 파이프라인의 속도가 핵심 과제가 됐다.
측정은 Galaxy S24(Android 14), TensorFlow Lite CPU 가속 환경에서 진행했다. 500회 반복 측정과 기기 쿨링을 통해 노이즈를 줄였고, 초기 결과에서는 Load Image 46.4ms, Face Detection 30.5ms, 3rd-party Face Recognition 61.3ms로 총 138.2ms, 처리량은 7.2 photos/s였다.
가장 먼저 손본 부분은 Face Detection 전후처리였다. 기존에는 모든 후보 bounding box를 먼저 디코딩한 뒤 confidence가 낮은 후보를 버렸지만, 이를 필터링 우선 적용으로 바꿔 디코딩 대상을 크게 줄였다. 여기에 sorting, Top-K 선택을 묶는 fused operation까지 적용해 디코딩 시간이 8.9ms -> 1.9ms로 줄었고, 전체 지연시간도 76ms -> 70ms, 처리량도 13장/초 -> 14장/초로 개선됐다.
다음 병목은 takePromisingTopKIndices였다. 기존의 filter -> sortedByDescending -> take 방식은 전체 정렬과 중간 컬렉션 생성을 유발했다. 이를 Min Heap 기반 알고리즘으로 바꿔 상위 K개만 유지하도록 하자 Pre NMS Filter & TopK 단계의 응답 시간이 78% 개선됐다.
또 다른 병목은 TensorBuffer.getFloatValue 호출이었다. ByteBuffer.getFloat가 JNI를 거치며 반복 호출 비용이 컸기 때문에, 이를 TensorBuffer.floatArray 사용으로 전환했다. 그 결과 Pre NMS Filter & TopK, Decode Bboxes, Decode Landmarks, Apply NMS가 각각 10~20% 정도 빨라졌고, 전체 파이프라인 지연도 70.2ms -> 69ms로 줄었다.
모델 외부 최적화 이후에는 TensorFlow Lite thread pool 크기를 조정했다. 기본값인 4개 스레드보다 1개 스레드가 더 빨랐고, 실제로 inference P50은 13.8ms -> 6.2ms로 개선됐다. 프로파일링 결과 일부 연산은 스레드를 늘릴수록 오히려 7.7~7.8배 느려졌고, 병렬화가 항상 이득이 아니라는 점을 확인했다.
마지막으로는 모델 인스턴스 병렬화로 throughput을 끌어올렸다. 얼굴 탐지 모델은 interpreter 수를 늘리며 병렬 처리했고, 얼굴 인식 모델도 별도 스레드 풀로 병렬화했다. 그 결과 전체 파이프라인 throughput은 16.6장/초 -> 37.9장/초 -> 45.9장/초까지 올라갔고, 최종적으로 이미지당 latency는 138ms -> 87ms로 약 37% 감소, throughput은 7.2장/초 -> 45.9장/초로 약 530% 개선됐다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.