Skip to main content
공개 노트

torch.profiler를 성능 최적화의 출발점으로 쓰는 법

Views 10약 6분생성형 AI 활용
Summary

torch.profiler 입문: 느린 모델을 '감'이 아니라 기록으로 보기

딥러닝 성능 문제는 대개 코드 한 줄의 문제가 아니라 실행 경로 전체의 문제입니다. 모델 연산, CPU 스케줄링, CUDA 커널 실행, 데이터 이동, 반복되는 작은 호출이 서로 맞물리기 때문입니다. 이때 필요한 것은 더 빠른 하드웨어에 대한 추측이 아니라, 실제 실행이 어디에서 시간을 쓰는지 확인할 수 있는 관찰 체계입니다.

torch.profiler는 그 역할을 하는 PyTorch의 오픈소스 성능 분석 도구입니다. 대규모 딥러닝 모델의 성능 분석과 문제 해결을 위해 CPU와 CUDA 활동을 함께 들여다볼 수 있고, 결과를 표와 타임라인 형태로 해석할 수 있습니다.12

성능 분석에서 먼저 바뀌어야 할 관점

모델이 느릴 때 가장 흔한 오해는 “가장 큰 연산이 곧 병목”이라고 단정하는 것입니다. 물론 행렬곱처럼 계산량이 큰 연산은 중요한 후보입니다. 하지만 실제 학습이나 추론에서는 GPU가 계속 바쁘게 일하지 못하는 구간, CPU가 다음 작업을 준비하는 구간, 작은 연산이 반복 호출되는 패턴도 전체 시간을 크게 좌우할 수 있습니다.

따라서 프로파일링의 목적은 단순히 느린 연산 이름을 찾는 데 그치지 않습니다. 더 중요한 질문은 다음과 같습니다.

  • CPU와 GPU가 어떤 순서로 일하고 있는가?

  • 특정 연산이 오래 걸리는가, 아니면 호출 횟수가 많아 누적 비용이 커지는가?

  • GPU가 비어 있는 시간이 있는가?

  • 측정 자체가 너무 많은 오버헤드를 만들고 있지는 않은가?

torch.profiler는 이 질문들에 답하기 위한 출발점입니다.

torch.profiler가 수집하는 실행의 단서

기본적인 사용 방식은 관심 있는 코드 구간을 torch.profiler.profile 컨텍스트 매니저로 감싸는 것입니다. 이때 프로파일링 대상으로 CPU 활동과 CUDA 활동을 지정할 수 있습니다.2

간단한 예로, fn(x, w, b)라는 함수가 torch.matmul(x, w)를 수행한 뒤 그 결과에 torch.add로 b를 더한다고 하겠습니다. 이런 작은 함수에서도 프로파일러는 단순히 “함수가 실행됐다”가 아니라, 내부의 PyTorch 연산과 CUDA 활동을 분리해 관찰할 수 있는 기반을 제공합니다. 관련 예제 실행 환경에는 NVIDIA A100-SXM4-80GB GPU가 사용되었습니다.

다만 이 같은 예제는 도구의 동작 방식을 이해하기 위한 최소 단위일 뿐입니다. 실제 가치는 학습 루프, 모델 블록, 데이터 처리와 연산이 섞인 구간처럼 병목 원인을 눈으로 추정하기 어려운 코드에서 더 크게 나타납니다.

표와 trace는 같은 데이터를 다른 방식으로 읽는 창이다

torch.profiler의 산출물은 크게 두 갈래로 볼 수 있습니다. 하나는 profiler table이고, 다른 하나는 profiler trace입니다.

Profiler table은 연산별 요약을 확인하는 데 적합합니다. 어떤 연산이 많은 시간을 차지했는지, 얼마나 자주 호출됐는지 같은 정보를 빠르게 훑어볼 수 있습니다. 성능 조사의 첫 단계에서는 이 표를 통해 후보를 좁히는 것이 효율적입니다.

반면 trace는 시간축 위에서 실행 흐름을 보는 데 유용합니다. PyTorch Profiler 결과는 .json trace 파일로 출력할 수 있으며, 이 파일은 Google Perfetto trace viewer에서 열어볼 수 있습니다.3 표가 “무엇이 많이 보였는가”를 보여준다면, trace는 “언제 무엇이 실행됐고, 그 사이에 빈틈이 있었는가”를 판단하게 해줍니다.

이 둘은 대체 관계가 아닙니다. 표만 보면 실행 순서를 놓치기 쉽고, trace만 보면 전체적인 비용 순위를 파악하기 번거롭습니다. 실무적으로는 표로 의심 지점을 좁힌 뒤 trace로 CPU와 GPU의 흐름을 확인하는 접근이 더 안정적입니다.

학습 루프에서는 측정 범위를 통제해야 한다

학습 전체를 처음부터 끝까지 전부 기록하는 방식은 항상 좋은 선택이 아닙니다. 프로파일링은 관찰 도구이지만, 관찰 자체에도 비용이 있습니다. CUDA 활동, shape, stack trace 등 더 많은 정보를 수집할수록 기록량과 오버헤드가 커질 수 있습니다.5

그래서 학습 루프를 분석할 때는 전체 코드를 무작정 기록하기보다, profiler context manager로 필요한 구간을 감싸고 대표적인 step을 중심으로 보는 방식이 중요합니다. PyTorch Profiler는 학습 프로세스가 0부터 번호가 매겨지는 step들로 구성된다고 가정합니다.6 이 전제 때문에 학습 루프 안에서 step 진행을 프로파일러에 알려주는 흐름이 필요합니다.

대규모 모델에서는 이 점이 특히 중요합니다. 너무 적게 기록하면 병목이 보이지 않고, 너무 많이 기록하면 분석 파일이 커지고 실행에도 영향을 줍니다. 좋은 프로파일링은 많은 데이터를 모으는 일이 아니라, 판단 가능한 만큼의 데이터를 적절한 시점에 모으는 일에 가깝습니다.

도구 통합이 중요한 이유

프로파일링 결과는 읽을 수 있어야 가치가 있습니다. PyTorch Profiler 결과를 .json trace로 저장해 Perfetto에서 열 수 있다는 점은 실행 타임라인을 독립적인 뷰어에서 분석할 수 있게 해줍니다.3 또한 VS Code의 Python 확장은 TensorBoard 통합 기능을 제공하며 PyTorch Profiler를 지원합니다. 개발 환경 안에서 결과를 확인할 수 있으면, 측정과 코드 수정 사이의 반복 시간이 줄어듭니다.

성능 최적화는 한 번의 측정으로 끝나지 않습니다. 병목 후보를 찾고, 코드를 바꾸고, 다시 측정하는 과정을 반복해야 합니다. 따라서 어떤 뷰어를 사용할지, trace를 어떻게 보관할지, 어떤 구간을 반복 측정할지 같은 작업 흐름도 성능 분석의 일부입니다.

해석할 때 조심해야 할 점

프로파일러 결과는 답안지가 아니라 단서입니다. 예를 들어 어떤 연산의 시간이 길게 보인다고 해서 반드시 그 연산만 바꾸면 된다는 뜻은 아닙니다. 하위 연산 시간이 포함된 값인지, 자체 실행 시간이 큰 것인지, 호출 구조상 상위 구간에 시간이 누적되어 보이는 것인지 구분해야 합니다.4

또 호출 횟수가 많은 연산도 주의해야 합니다. 개별 실행 시간은 작아도 반복이 많으면 전체 비용이 커질 수 있습니다. 이 경우 문제는 특정 연산 하나의 속도보다, 연산이 너무 잘게 나뉘어 실행되는 구조일 수 있습니다.

Trace를 볼 때도 마찬가지입니다. GPU 타임라인에 빈 구간이 보인다면 그 원인이 데이터 준비인지, CPU 측 준비 비용인지, 동기화인지 추가 확인이 필요합니다. torch.profiler는 원인을 좁혀주는 도구이지, 모든 최적화 전략을 자동으로 결정해주는 도구는 아닙니다.

앞으로 확인해야 할 것들

torch.profiler를 제대로 활용하려면 다음 항목을 중심으로 결과를 읽는 습관이 필요합니다.

  1. CPU와 CUDA 활동을 함께 기록했는가?

  2. profiler table에서 시간과 호출 횟수의 상위 항목은 무엇인가?

  3. .json trace를 열어 CPU와 GPU 실행 흐름을 확인했는가?

  4. 학습 루프에서는 step 단위로 측정 범위를 통제했는가?

  5. 측정 후 코드 변경을 다시 같은 조건에서 비교했는가?

이 글은 ‘Profiling in PyTorch’ 시리즈의 첫 번째 글에서 다루는 torch.profiler의 기본 관찰 방식을 사실적 출발점으로 삼았지만, 핵심은 특정 예제를 따라 하는 데 있지 않습니다. 중요한 것은 성능 문제를 감으로 판단하지 않고, 표와 trace를 통해 검증 가능한 질문으로 바꾸는 것입니다.

torch.profiler는 최적화 버튼이 아니라 성능 분석의 계기판입니다. 다음에 볼 것은 계기판에 나타난 신호를 바탕으로 어떤 코드 구조를 바꿀지, 그리고 그 변경이 실제로 학습 또는 추론 시간을 줄였는지입니다.

참고

1Using PyTorch Profiler with DeepSpeed for performance debugging

2PyTorch 프로파일러(Profiler)

3Using PyTorch Profiler with DeepSpeed for performance debugging

4Profiling in PyTorch (Part 1): A Beginner's Guide to torch.profiler

5torch.profiler -- PyTorch 1.11.0 documentation

6Using PyTorch Profiler with DeepSpeed for performance debugging

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기