병목지점 식별 테스트(Embedding 생략) - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 테스트 개요

a. 목표

  • 이미지 임베딩 파이프라인에서 병목이 GPU 추론인지, 이미지 로딩 및 전처리인지를 구분하기 위한 실험을 수행

b. 왜 이 테스트가 필요한가?

목적 설명
병목 위치 명확화 추론을 제거했을 때도 latency가 유지되면, 병목은 전처리 또는 로딩 단계에 있다는 증거가 된다
멀티 스트림 전략의 유효성 검증 스트림 수를 늘리는 것이 병렬 처리에 도움이 되는지 실측을 통해 확인
추후 최적화 방향 결정 CPU 기반 병목이면 전처리 최적화나 Gunicorn 병렬 구조가 필요하고, GPU 병목이면 배치 최적화나 모델 경량화가 우선됨

2. 테스트를 위해 변경한 코드 요약

  • 추론을 제거하고 dummy 텐서 반환

    with torch.no_grad():
        # batch_features = model.encode_image(image_input)
        batch_features = torch.zeros((len(batch_filenames), 512))
    

3. 테스트 시나리오

  • 부하 도구: k6
  • 사용자 시뮬레이션: 동시 사용자(VU) 최대 30명
  • 실행 시간: 3분간 유지
  • 요청 주기: 각 사용자는 응답 수신 후 3~5초 랜덤 휴식
  • 요청 데이터: 30~50장의 이미지 리스트 포함된 embedding 요청

4. 테스트 결과

항목 스트림 1 (세마포어 4) 스트림 4 (세마포어 8)
embedding_duration (avg) 2048 ms 3284 ms
http_req_duration (avg) 2.04 s 3.28 s
http_req_duration (max) 7.74 s 39.65 s
iteration_duration (avg) 6.05 s 7.25 s
GPU 사용률 거의 0% (추론 제거됨) 거의 0%
CPU 사용률 90% 이상 (전처리 포화) 90% 이상 (전처리 포화)

a. 해석

  • 추론 제거 후에도 평균 latency는 여전히 2~3초 수준병목은 GPU가 아님

  • 스트림 수 증가로 latency가 오히려 악화됨

    → CPU 병목 상태에서 동시에 많은 요청을 처리하면서 전처리 경합 발생

  • 최대 응답 시간이 39초까지 발생한 점은 동시성 증가로 인한 tail latency 폭증을 의미

b. 결론

  • GPU 추론은 병목이 아니며, 현재 구조의 병목은 이미지 로딩과 전처리 (CPU-bound)
  • 현재 상태로 멀티 스트림 전략은 CPU 병목 환경에서 효과 없으며, 오히려 latency를 악화시킬 수 있음