본문으로 건너뛰기

[Triton] Proton CuptiProfiler 다양한 버그 수정 및 개선

들어가며

Triton의 Proton 프로파일러에서 CUPTI(CUDA Profiling Tools Interface) 기반 프로파일링에 여러 버그가 있었다. Stream-captured 커널의 잘못된 correlation 처리, 비활성화된 프로파일러에서의 불필요한 작업, graph 리소스 추적의 불완전성 등이 이 PR에서 수정되었다.

핵심 코드 분석

Correlation 클래스에 clear() 추가

void clear() {
    corrIdToExternId.clear();
    externIdToState.clear();
    maxCompletedCorrelationId.store(0);
    maxSubmittedCorrelationId.store(0);
}

CUPTI가 unsubscribe 후 correlation ID를 리셋하므로, 그 전에 correlation 맵을 정리해야 한다.

Stream capture 커널 스킵

void handleApiEnterLaunchCallbacks(...) {
    auto &dataToEntry = threadState.dataToEntry;
    if (threadState.isStreamCapturing) // Stream captured 커널은 correlate하지 않음
        return;
    if (dataToEntry.empty()) // 프로파일러 비활성화 상태
        return;
}

기존에는 stream capture 확인이 함수 초입에서 이루어져 scope stack에 push조차 되지 않아 exit에서 불일치가 발생했다. 이제 scope push는 항상 수행하되, correlation 제출만 조건부로 처리한다.

Graph 리소스 콜백 개선

// Before: 커널 노드만 필터링하는 위치가 외부
if (graphData->nodeType == CU_GRAPH_NODE_TYPE_KERNEL)
    handleGraphResourceCallbacks(profiler, cbId, graphData);

// After: 내부에서 필터링 + GRAPH_DESTROY 콜백 추가
constexpr std::array<CUpti_CallbackId, 5> kGraphResourceCallbacks = {
    // ...
    CUPTI_CBID_RESOURCE_GRAPH_DESTROY_STARTING,  // 이전: GRAPHEXEC_CREATED
    CUPTI_CBID_RESOURCE_GRAPHEXEC_DESTROY_STARTING,
};

graph가 파괴될 때 관련 리소스를 정리하고, 커널이 아닌 노드(memcpy 등)는 조기에 무시한다.

오타 수정

// Before
"and t may cause memory leak"
// After
"and it may cause memory leak"

왜 이게 좋은가

  • 안정성 향상: 프로파일러 활성화/비활성화 전환 시 메모리 누수와 deadlock이 방지된다.
  • 정확한 프로파일링: stream capture된 커널이 잘못 프로파일링되는 문제가 해결되었다.
  • 리소스 관리: graph 파괴 시 관련 메타데이터가 올바르게 정리된다.

정리

+47/-20의 변경이지만, 프로파일러의 edge case 처리를 크게 개선한 PR이다. CUPTI 콜백의 복잡한 생명주기를 올바르게 관리하는 것이 핵심이다.

참고 자료


이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석 내용은 실제 PR diff를 기반으로 합니다.

댓글