[ultralytics] Ultralytics FLOPs 프로파일링 최적화: deepcopy 제거를 통한 성능 향상
PR 링크: ultralytics/ultralytics#25434 상태: Merged | 변경: +5 / -6
들어가며
딥러닝 모델의 연산량(FLOPs)을 측정하는 것은 모델의 효율성을 평가하는 핵심 과정입니다. 기존 Ultralytics 라이브러리는 thop 라이브러리를 사용하여 모델을 프로파일링할 때, thop이 모델 내부에 잔여 버퍼와 훅(hook)을 남기는 문제를 방지하기 위해 매번 deepcopy(model)을 수행해왔습니다. 하지만 이 deepcopy 과정은 전체 프로파일링 시간의 45~64%를 차지할 정도로 큰 오버헤드를 발생시켰습니다. 본 글에서는 ultralytics-thop 라이브러리의 업데이트를 통해 이 불필요한 모델 복사를 제거하고 성능을 개선한 과정을 분석합니다.
코드 분석
1. 의존성 업데이트 (pyproject.toml)
가장 먼저 ultralytics-thop의 최소 버전을 2.0.18에서 2.0.22로 상향 조정했습니다. 이 버전은 프로파일링 후 잔여 버퍼와 훅을 완벽하게 정리하도록 개선되었습니다.
- "ultralytics-thop>=2.0.18", # FLOPs computation https://github.com/ultralytics/thop
+ "ultralytics-thop>=2.0.22", # FLOPs computation https://github.com/ultralytics/thop
2. 모델 복사 제거 (ultralytics/nn/tasks.py 및 ultralytics/utils/torch_utils.py)
기존에는 thop.profile 호출 시 모델의 복사본을 전달했으나, 이제는 원본 모델을 직접 전달합니다.
Before:
flops = thop.profile(deepcopy(m), inputs=[x.copy() if c else x], verbose=False)[0] / 1e9 * 2 if thop else 0
After:
flops = thop.profile(m, inputs=[x.copy() if c else x], verbose=False)[0] / 1e9 * 2 if thop else 0
이 변경은 get_flops() 함수와 profile_ops() 함수 전반에 걸쳐 적용되었습니다. 이제 모델을 메모리에 중복으로 올릴 필요가 없어 메모리 사용량과 연산 시간이 획기적으로 줄어들었습니다.
왜 이게 좋은가
이번 최적화의 핵심은 '불필요한 리소스 복제 제거'입니다.
- 성능 향상:
yolo11n모델 기준 프로파일링 시간이 18.9ms에서 8.0ms로 약 2.4배 빨라졌으며,yolo11x모델에서는 2.5배의 속도 향상을 보였습니다. - 메모리 효율성: 대규모 모델을 프로파일링할 때 모델을 두 번 메모리에 올리지 않으므로 Peak Memory 사용량이 크게 감소했습니다.
- 안정성: 이전 버전의
thop에서는 프로파일링 실패 시 훅이 제거되지 않아 모델이 파괴되는 문제가 있었으나,2.0.22버전에서는 이러한 사이드 이펙트가 완전히 해결되었습니다.
일반적 교훈
외부 라이브러리가 도입하는 '부작용(Side Effect)'을 해결하기 위해 무조건적인 deepcopy를 사용하는 것은 쉬운 해결책이지만, 성능 측면에서는 큰 비용을 치르게 합니다. 라이브러리 업데이트를 통해 근본적인 원인(버퍼 누수)을 해결하고, 그에 맞춰 코드를 간결하게 유지하는 것이 진정한 최적화의 방향임을 보여줍니다.
참고 자료
참고 자료
- https://pypi.org/project/ultralytics-thop/2.0.22/
- https://docs.python.org/3/library/copy.html#copy.deepcopy
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [sglang] ERNIE-Image의 RoPE와 GELU-mul 융합 및 RoPE cos/sin 호이스팅을 통한 성능 최적화
- [transformers] Hugging Face Transformers: NoRepeatNGramLogitsProcessor 벡터화 및 성능 최적화
- [ultralytics] PyTorch EMA 업데이트 최적화: _foreach_lerp_를 활용한 성능 개선
- [ultralytics] MuSGD 최적화: Batched Newton-Schulz와 Fused Kernel로 8배 성능 향상
- [ultralytics] [Ultralytics] NDJSON 변환 최적화: 보안과 성능을 동시에 잡는 설계 전략
PR Analysis 의 다른글
- 이전글 [vllm] vLLM 멀티모달 처리 성능 개선: MM 전처리를 위한 별도 Executor 도입
- 현재글 : [ultralytics] Ultralytics FLOPs 프로파일링 최적화: deepcopy 제거를 통한 성능 향상
- 다음글 [sglang] [DeepSeek-V4 최적화] SM120(Blackwell)에서 Fused MHC 커널 활성화로 성능 8.9% 향상시키기
댓글