[멀티 프로세스] CPU‐GPU 서버 모두 워커 프로세스 2 테스트 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 개요

  • gpu 서버의 워커 프로세스를 3 → 2개로 줄인 결과, 17s → 12s로 P95가 감소
  • 그러나 여전히 gpu 사용량이 높아 gpu 리소스 경합 상태
  • 이에 cpu 서버의 워커 프로세스도 2개로 맞춰서 너무 많은 요청 처리로 인해 경합 상태가 발생하는 현상을 완화시키고자 함

2. 테스트: cpu - gpu 서버 모두 워커 프로세스 2개

10:18-10:27: cpu-gpu server worker process 2

a. k6 report

cpugpu2

cpu worker: 2, gpu worker: 2

cpugpu4

cpu worker: 3, gpu worker: 2

b. 지연 시간

worker 수 cpu:3, gpu:2 cpu:2, gpu:2 비교
P95(s) 12 10 16.67% 단축
avg 2 3 1.5% 증가
  • cpu 워커 수도 2개로 제한하여 요청량을 제한하여 리소스 경합 상태가 완화됨
    • 이로 인해 경합 심화로 인한 outlier는 감소
  • 그러나 avg 증가함
    • 들어오는 요청 자체는 그대로인데 워커를 줄여서 처리 병렬성 감소
    • gpu 서버 측면에서는 경합 완화이더라도 categories 요청 처리는 cpu 서버에서만 진행됨.
    • 그런데 cpu 워커 감소로 categories 요청 처리까지 병렬성 제한함
    • gpu 서버 embedding 경합 완화의 효과(긍정)와 cpu 서버 categories 처리 속도 제한(부정)을 동시에 가짐
gpu 싱글 프로세스 gpu 워커 프로세스 2개 (cpu 워커 3개) cpu gpu 모두 워커 프로세스 2개 비교
디코딩 단일: 15.78 ms / 최소: 7.27 ms / 평균: 24.80 ms / 최대: 278.22 ms 최소값: 7.07 ms / 평균값: 24.82 ms / 최대값: 378.64 ms 최소값: 6.99 ms / 평균값: 22.82 ms / 최대값: 318.49 ms cpu2<cpu3<single
로딩 단일: 232.66 ms / 최소: 10.08 ms / 평균: 204.48 ms / 최대: 541.40 ms 최소값: 9.61 ms / 평균값: 89.08 ms / 최대값: 981.62 ms 최소값: 9.89 ms / 평균값: 70.68 ms / 최대값: 887.73 ms cpu2<cpu3<single
로딩+디코딩 단일: 232.66 ms / 최소: 76.89 ms / 평균: 300.36 ms / 최대: 647.85 ms 최소값: 1.00 ms / 평균값: 421.73 ms / 최대값: 956.48 ms 최소값: 84.90 ms / 평균값: 216.89 ms / 최대값: 961.73 ms cpu2<cpu3<single
전처리 단일: 63.96 ms / 최소: 36.01 ms / 평균: 105.93 ms / 최대: 641.05 ms 최소값: 38.84 ms / 평균값: 227.55 ms / 최대값: 807.82 ms 최소값: 35.77 ms / 평균값: 208.62 ms / 최대값: 765.75 ms single<cpu2<cpu3
임베딩 단일: 183.38 ms / 최소: 66.22 ms / 평균: 218.94 ms / 최대: 562.11 ms 최소값: 1.00 ms / 평균값: 455.31 ms / 최대값: 999.15 ms 최소값: 1.01 ms / 평균값: 448.39 ms / 최대값: 998.20 ms single<cpu2<cpu3
  • cpu - gpu 워커 수를 맞추지 않았을 때는 디코딩, 로딩 각각의 시간은 줄었으나 경합 상태로 인해 outlier 증가해 로딩+디코딩 시간 증가했음
  • cpu 워커 수 2개로 제한한 후, 리소스 경합이 완화되어 로딩+디코딩 처리 시간이 싱글 프로세스(경합 매우 적은)보다 작아짐
  • 전처리, 임베딩 역시 지연시간이 완화되었으나, 추가적인 최적화 가능성 확인해볼만 함

c. 리소스 사용량

cpugpu1

  • 위에서 지연 시간이 보인 양상을 리소스 사용량을 기반으로 설명할 수 있음:
    • 로딩 & 디코딩 시간 완화: cpu 리소스에 여유가 생겨서 경합 해결
    • 전처리, 임베딩 시간 완화되지 않은 이유: gpu 기반 테스크는 gpu 사용률이 현재 max이기 때문에 경합이 발생하고 있어 최적화가 어렵다

3. 결론: 최종 결정 - cpu, gpu worker process 2개씩

  • 최종 멀티 프로세스 구조를 아래와 같이 선정했다:
    • cpu 서버: gunicorn 기반 워커 프로세스 2개
    • gpu 서버: uvicorn 기반 워커 프로세스 2개
  • 전처리 작업을 gpu에서 하는 버전으로 테스트했는데, 사이먼으로부터 cpu에서 전처리하는 버전을 받아서 재테스트해볼만 함
    • cpu 리소스 여유가 있어서 속도 향상이 기대됨
    • 전처리 작업이 cpu로 이동하면 gpu 경합이 완화되어 임베딩 작업 역시 속도 향상될 것 기대됨