Pytorch 추론 가속 기법 테스트 계획 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 기본 전제
- 현재 환경: GPU A100(vRAM 40GB), bf16 (torch.bfloat16) 로딩 상태
- 모델: FLUX 1 Kontext dev
- 목표: 추론 속도 및 효율 최적화
2. 5가지 최적화 기법: 상호 관계 분석
항목 번호 | 기술명 | 적용 계층 | 상호 의존성 |
---|---|---|---|
1 | torch.compile |
모델 전체 (Graph 수준) | 다른 최적화와 병행 가능 (독립) |
2 | SDPA (scaled_dot_product_attention ) |
Attention 연산 단위 (커널 수준) | torch.compile과 병행 가능 (독립) |
3 | channels_last | 데이터 포맷 (메모리 수준) | cudnn.benchmark과 시너지 |
4 | cudnn.benchmark |
Conv2D 알고리즘 선택 (런타임 수준) | channels_last와 함께 쓰면 효과 증가 |
5 | CUDA Graph | 실행 계획 최적화 (런타임 수준) | 반드시 고정된 입력 형태 확보 후 적용 가능 |
3. 순서 결정의 핵심 기준
- 서로 간섭이 없는 독립적인 최적화인지? (병행 가능)
- 선행 조건(예: 고정 입력, 데이터 포맷)이 필요한지?
- 측정 가능성과 롤백 용이성
4. 테스트 순서
순서 | 항목 | 이유 |
---|---|---|
① | channels_last | ✅ Conv2D 성능 향상의 기본 전제 (cudnn.benchmark에 영향) |
② | cudnn.benchmark = True | ✅ Conv2D 알고리즘 최적화 → channels_last가 먼저 적용되어야 효과적 |
③ | torch.compile | ✅ 모델 전체 그래프 최적화 → 기존 설정과 병행 가능, 독립적으로 평가 |
④ | SDPA | ✅ 특정 Attention 블록만 최적화 → 전체와 독립적 (torch.compile과 병행 가능) |
⑤ | CUDA Graph | ✅ 입력/메모리 포맷/알고리즘 등 모든 설정이 안정화된 뒤 마지막에 적용 → 반드시 입력 고정 상태 필요 |
5. 병행/독립성 체크
항목 | 병행 가능 여부 | 주의사항 |
---|---|---|
channels_last ↔ cudnn.benchmark | ✅ 병행 가능 (시너지) | channels_last 먼저 |
torch.compile ↔ 나머지 모두 | ✅ 병행 가능 | 항상 안전 |
SDPA ↔ 나머지 모두 | ✅ 병행 가능 | transformer 내부에만 영향 |
CUDA Graph ↔ 나머지 모두 | ✅ 병행 가능 | 단, 고정된 입력 필수 |
6. 최종 요약: 단계별 가이드
단계 | 작업 내용 | 목적 | 독립 여부 |
---|---|---|---|
1️⃣ | channels_last 적용 | Conv2D 가속의 기본 | 필요 |
2️⃣ | cudnn.benchmark = True | 알고리즘 선택 최적화 | 필요 |
3️⃣ | torch.compile(model) | 전체 그래프 최적화 | 독립 |
4️⃣ | SDPA 적용 여부 확인 | 어텐션 속도 최적화 | 독립 |
5️⃣ | CUDA Graph 적용 | 호출 오버헤드 제거 | 필요 (입력 고정) |
- 3, 4번은 순서 무관,
- 1 → 2 → 5번은 반드시 순서 유지 필요