AllReduce 지연은 네트워크 지연이다. 대부분의 도구는 이를 감지하지 못한다.

발행: (2026년 5월 27일 PM 10:30 GMT+9)
5 분 소요
원문: Dev.to

출처: Dev.to

개요

랭크 5에서 발생한 느린 AllReduce가 해당 랭크의 NIC에서 발생한 TCP 재전송과 일치하며, 집합 연산이 완료되기 4 ms 전에 발생한다.
멀티‑노드 학습 작업이 AllReduce에서 느려질 때, 증거는 GPU‑카운터 대시보드 아래에 있다: libnccl 호출 표면(어떤 랭크가 언제 어떤 인자로 시작했는지)과 커널 TCP 경로(어떤 연결이 얼마나 재전송됐는지, 어느 NIC에서)이다. 에이전트는 NCCL 공개 API에 uprobes를, TCP와 스케줄러에 tracepoint를 삽입한다. 두 레이어는 쿼리 시 (host, pid, timestamp) 로 조인된다.

GPU 측면에서 진행 중인 AllReduce는 GPU가 바쁜 것처럼 보인다. Compute 커널이 집합 연산 뒤에 대기하고, 활용도 카운터는 높게 보고되며, 집합 연산은 피어 랭크를 기다린다; SM은 유용한 연산을 수행하지 않는다. NVML과 DCGM 모두 바쁜 디바이스를 감지하고, 학습 단계 시간이 증가하지만 대시보드는 변하지 않는다.

NCCL 공개 API는 작고 이름이 명확하다. 에이전트는 다음 함수에 uprobes를 붙인다:

  • ncclAllReduce
  • ncclAllGather
  • ncclReduceScatter
  • ncclBcast
  • ncclSend
  • ncclRecv

그리고 라이프사이클 훅(ncclCommInitRank, ncclCommInitAll, ncclCommDestroy)에도 붙인다.
진입 시 각 프로브는 랭크, 커뮤니케이터 포인터, 데이터 타입, reduce‑op, 카운트, 스트림을 기록한다. 반환 시 캡처된 타임스탬프를 지속 시간으로 접어 랭크, 랭크 수, 커뮤니케이터‑ID 해시를 포함한 하나의 이벤트를 방출한다.

커뮤니케이터‑ID 해시는 전체 128‑바이트 ncclUniqueIdsplitmix64 로 해시한 것이며, 처음 8 바이트만 사용하는 것이 아니다. NCCL 매직‑및‑버전 헤더를 공유하는(매우 흔한) 서로 다른 커뮤니케이터도 트레이스에서 구별된 ID를 갖는다.

같은 호스트에서 에이전트는 tcp:tcp_retransmit_skb와 스케줄러 tracepoint에도 연결한다. 노드 간 연결에서의 재전송은 GPU와 무관한 느린 AllReduce의 가장 흔한 원인이다. 트레이스는 재전송 타임스탬프, 출발지/목적지 주소, 시퀀스 번호를 기록한다. 이를 libnccl AllReduce‑in‑flight 이벤트와 (cgroup_id, time‑window) 로 조인하면 느린 집합 연산의 TCP 측 원인을 알 수 있다.


예시 쿼리

-- Find slow ncclAllReduce calls and any TCP retransmits inside their window
WITH slow_collectives AS (
  SELECT timestamp_ns,
         duration_ns,
         rank,
         nranks,
         comm_id_hash,
         pid
    FROM nccl_events
   WHERE op = 'ALL_REDUCE'
     AND duration_ns > 50000000   -- > 50 ms
)
SELECT s.rank,
       s.duration_ns/1e6 AS ms,
       COUNT(t.timestamp_ns) AS retransmits_in_window
  FROM slow_collectives s
  LEFT JOIN tcp_events t
    ON t.timestamp_ns BETWEEN s.timestamp_ns
                         AND s.timestamp_ns + s.duration_ns
   AND t.event = 'tcp_retransmit_skb'
 GROUP BY s.rank, s.duration_ns, s.timestamp_ns
 ORDER BY ms DESC
 LIMIT 20;

이 쿼리는 예를 들어 “랭크 5의 AllReduce가 187 ms 걸렸고, 그 기간 동안 3개의 TCP 재전송이 발생했다”는 결과를 반환한다. 두 레이어, 하나의 조인, 하나의 답변.


설치 및 사용법

# 1. Install the agent
curl -fsSL https://github.com/ingero-io/ingero/releases/latest/download/install.sh | sh

# 2. Start a workload using NCCL on this host (PyTorch DDP, vLLM TP, etc.)

# 3. Capture for the duration of one training epoch (or one inference window)
ingero trace --duration 2m --out /tmp/nccl.db

# 4. Inspect collectives
ing
0 조회
Back to Blog

관련 글

더 보기 »