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%에 머무르는 중 |