AllReduce 지연은 네트워크 지연이다. 대부분의 도구는 이를 감지하지 못한다.
출처: 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를 붙인다:
ncclAllReducencclAllGatherncclReduceScatterncclBcastncclSendncclRecv
그리고 라이프사이클 훅(ncclCommInitRank, ncclCommInitAll, ncclCommDestroy)에도 붙인다.
진입 시 각 프로브는 랭크, 커뮤니케이터 포인터, 데이터 타입, reduce‑op, 카운트, 스트림을 기록한다. 반환 시 캡처된 타임스탬프를 지속 시간으로 접어 랭크, 랭크 수, 커뮤니케이터‑ID 해시를 포함한 하나의 이벤트를 방출한다.
커뮤니케이터‑ID 해시는 전체 128‑바이트 ncclUniqueId를 splitmix64 로 해시한 것이며, 처음 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