torch.set_num_threads 제한 후 테스트 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. PyTorch 스레드 제한 효과 검증

a. 실험 목적

  • 배치 64 + GPU 전처리 조합이 가장 효율적인 설정임이 입증된 상황에서,
  • PyTorch 내부 연산에서 생성되는 과도한 OpenMP 스레드로 인한 성능 저하와 불안정을 해결하기 위해,
  • torch.set_num_threads(1)을 적용하여 PyTorch 연산 스레드 수를 1로 고정하고 전체 성능 및 안정성에 미치는 영향을 분석

b. 실험 조건

항목
전처리 위치 GPU
배치 크기 64
요청당 이미지 수 100장
동시 요청 수 30명
스레드 제한 방식 torch.set_num_threads(1) 적용 vs 미적용 비교
측정 항목 로딩, 디코딩, 전처리, 임베딩, 총 처리 시간

2. 실험 결과

단계 제한 전 (기본 스레드 수) 제한 후 (torch.set_num_threads(1)) 변화율
로딩 175.94 158.52 ▼ –9.9%
디코딩 완료 16.78 16.96 ▲ +1.1%
디코딩 대기 79.54 75.43 ▼ –5.2%
로딩 + 디코딩 363.70 329.24 ▼ –9.5%
전처리 132.78 154.49 ▲ +16.3%
임베딩 275.72 264.48 ▼ –4.1%
총시간 847.05 823.24 ▼ –2.8%
  • Request Timeout: 0.16% → 0% (스레드 제한 이후 완전 해소됨)

3. 분석

a. PyTorch 스레드 제한의 주요 효과

가. 전체적인 I/O 및 임베딩 효율 개선

  • PyTorch가 기본적으로 연산마다 코어 수에 비례해 스레드를 생성

    → 특히 다중 요청 시 OpenMP 기반 연산이 스레드 경합

  • torch.set_num_threads(1)을 통해 내부 연산 스레드 수를 단일화함으로써:

    • CPU 자원 경합 방지
    • GIL과 스레드 전환 비용 감소
    • 디코딩 대기 및 로딩 시간 감소
    • GPU로의 데이터 전달 타이밍 개선 → 임베딩 성능 개선

나. 전처리 시간 증가

  • PyTorch 내부 연산의 멀티스레드 활용이 차단되어, 단일 스레드로 실행

    → 전처리 단계에서 연산이 순차적으로 실행되어 속도 저하

    → 하지만 전체 처리 시간 비중이 높지 않음

b. 전체 처리 시간 영향

  • 총 처리 시간은 약 2.8% 감소

    → 이는 디코딩 및 임베딩 효율 향상이 전처리 시간 증가를 상쇄했기 때문

c. 안정성 확보

  • 스레드 수 제한 전: Request Timeout 0.16%

  • 제한 후: Request Timeout 0%

    → PyTorch 내부 스레드가 시스템 전체 병목을 유발하던 문제를 해소


4. 결론 및 시사점

a. 결론

가. torch.set_num_threads(1) 적용은 전체 처리 효율과 안정성에 긍정적

  • CPU 병목 완화 및 경합 제거 → I/O 및 임베딩 단계 개선
  • Request Timeout 해소 → 시스템 안정성 확보
  • 전처리만 소폭 느려졌으나, 전체 성능은 개선됨

나. 시사점 및 향후 계획

항목 조치
PyTorch 설정 torch.set_num_threads(1)기본 옵션으로 적용 권장
자원 활용 제한 여전히 CPU 사용률은 60%, GPU 사용률은 70%에 머무르는 중