gpumode · 강의 아카이브
《GPU Mode》 L070 2025 · resilience High priority transcript · failed

PCCL — Pluralis Collective Communication Library

10,000 GPU 클러스터에서 한 GPU 가 죽는 사건은 매시간 일어난다. NCCL 의 약속은 “모두가 살아있다” — 그 약속이 깨지면 collective 가 hang 또는 abort. 그러면 다시 시작. 한 번의 100B token 학습이 수십 번 재시작되는 게 일상. PCCL 은 그 전제를 버린다 — 일부가 죽거나 들어와도 collective 가 그대로 흘러가는 fault-tolerant collective.

fault tolerance collective elastic re-shape checkpoint-free recovery straggler 10k GPU PCCL
M
Speaker
mike64t
PCCL 저자 · 분산 학습 인프라 · 확인 필요
강의 번호
L070
스피커
mike64t
학습 우선순위
High · 정독
자료
slides 있음
§ 01강의가 풀려는 문제· Why fault tolerance

“1만 GPU 학습 = 매시간 한 GPU 가 죽는다” — 그 가정이 일상이 됐다

대규모 학습 클러스터의 hardware MTBF (mean time between failures) 는 GPU 당 보통 수개월 ~ 수년. 1 만 GPU 면 몇 시간마다 한 번 누군가가 실패한다. NCCL 은 “모두가 살아있다” 를 가정 — 한 GPU 라도 timeout/error 가 나면 collective 가 abort, communicator 재구성이 필요. 큰 학습 한 번에 재시작 수십 번.

강의의 출발 질문 셋.

  1. 왜 NCCL 은 fault tolerant 하지 않은가 — design choice 였음. 작은 클러스터에서는 의미 없음.
  2. 실패는 어떻게 분류되는가 — fail-stop, fail-slow (straggler), Byzantine. 각자 다른 치료.
  3. collective semantics 를 유지하면서 일부 실패를 견딜 수 있는가 — PCCL 의 답은 yes — 단, 결과의 의미가 살짝 바뀐다.
강의의 인지적 frame

"fault tolerance 는 layer 의 문제다" — 어느 layer 가 책임지는지가 모든 결정의 핵심. 기존 답: application layer (PyTorch checkpoint + restart). PCCL 의 제안: collective library 자체에서 부분적으로. application 은 의미적 변화만 받아들이면 됨.

“fault tolerance 는 보너스 기능이 아니다 — 1만 GPU 시대에는 communication library 의 default 가 되어야 한다.”강의 §1 재구성
§ 02collective 가 노드 실패에 대처하는 법· Existing patterns

현재 production 의 4 가지 패턴 — PCCL 이전

PCCL 이전에 분산 학습 인프라가 노드 실패에 대처해온 방법 네 가지. 각자 다른 layer 에서 다른 의미로 푼다.

패턴 1 · checkpoint + restart
application layer
정기적으로 모든 weight + optimizer state 를 디스크에. 실패 시 마지막 체크포인트부터 모두 재시작. 가장 단순, 가장 흔함. 단점: 재시작 비용이 큼 (수분 ~ 1시간), 중간 작업 손실.
패턴 2 · elastic torchrun
launcher layer
PyTorch 의 torchrun --max-restarts. 실패 감지 → 새 rank set 으로 자동 restart. 여전히 application 은 처음부터 다시 (또는 ckpt 부터). orchestration 자동화일 뿐 communication 자체는 처음부터.
패턴 3 · in-memory replication
framework layer
DeepSpeed/FSDP 의 일부 mode 에서 weight 를 여러 GPU 에 redundant 하게 보관. 한 GPU 실패 → 이웃이 채움. memory cost 큼, 작은 클러스터에서만 실용적.
패턴 4 · fault-tolerant collective (PCCL)
communication library layer
NCCL 자리에 들어가는 라이브러리 자체가 일부 rank 의 dropout 을 견딘다. application 은 의미만 받아들임 — “이 allreduce 는 7개 rank 의 평균이다” 같이. 가장 깊은 layer 의 해법.
FIG · 4 패턴의 실패 처리 timeline같은 1 GPU 실패
ckpt + restart
학습 step (~30 min)
FAIL
restart wait
ckpt load
재시작 학습
elastic launcher
학습
FAIL
re-rendezvous
ckpt load
학습
replication
학습 (메모리 ↑)
FAIL
heal
학습 계속
PCCL
학습
F
N-1 rank 으로 학습 계속
PCCL 의 이상 — 실패 후 재시작 없이 그대로 진행. 단, allreduce 의 결과가 N-1 rank 의 평균이 됨. learning dynamics 적으로는 batch 크기가 살짝 줄어든 효과.
§ 03fault model· What fails, how often

실패의 분류 — 같은 “장애” 라도 의미와 치료가 다르다

분산 시스템 이론의 표준 분류 — fault model 의 3 단계. PCCL 은 어디까지 다루나?

FIG · fault model 분류3 단계
fault type의미발생 빈도PCCL 의 입장
fail-stop (crash)완전히 멈춤, 통보 가능시간당 1회primary target
fail-slow (straggler)살아있지만 매우 느림매 step 일부primary target
network partition통신만 끊김드뭄timeout 처리
silent corruption잘못된 값 전달매우 드뭄미처리
Byzantine (악의)고의로 거짓N/A미처리 (학습 환경)
PCCL 은 fail-stop + fail-slow 를 처리. silent corruption 과 Byzantine 은 학습 환경에서 매우 드물고, 별도 검증 (checksum, redundancy) 으로 처리. 합리적인 scope.

실 데이터 — Meta · OPT-175B 학습

OPT-175B 의 학습 보고서 (Zhang et al., 2022) 가 인용되는 흔한 reference. ~1000 GPU 학습에서 — 3 개월 학습 동안 100+ 번의 실패, 중간 ~25% 의 시간이 재시작 / 디버깅. 같은 비율을 10× scale 에 적용하면 1만 GPU 학습은 실패 시간만 한 달 단위.

“NCCL 은 1초 안에 모든 rank 가 멈출 가능성을 받아들인다 — 그게 1만 GPU 학습의 한 시간을 정의한다.”학습 노트 · §3

straggler 의 특수성

fail-stop 은 timeout 으로 잡힌다. straggler 는 더 까다롭다 — 살아있지만 5× 느림. NCCL 의 ring 은 모든 rank 의 속도가 비슷할 때만 작동. 한 rank 가 5× 느리면 전체가 5× 느려짐. PCCL 의 입장 — “느린 rank 는 일정 시간 후 skip 하고 다음 step”. 의미적으로 “느린 rank 의 gradient 는 늦게 들어옴” 이 됨 (asynchronous learning 에 가까워짐).

§ 04PCCL 추상· Elastic group

“참여자 수” 가 변할 수 있는 collective — 추상의 차이

PCCL 의 핵심 추상 — elastic group. NCCL 의 communicator 가 “고정 멤버십” 이라면, PCCL 의 group 은 “현재 시점의 멤버십”. 매 collective 호출 마다 group 이 변할 수 있다.

API 의 형태 (개념적, 정확한 시그너처는 repo 확인 필요).

# 개념적 API
group = pccl.Group(initial_ranks=128,
                   min_ranks=96,
                   max_ranks=160)

for step in training_loop:
    # N 은 매 호출마다 다를 수 있음
    n_alive = group.allreduce(grad,
                              op='mean',
                              policy='skip_dead')
    if n_alive < group.min_ranks:
        wait_for_recovery()
    # 학습 step 진행

핵심 — min_ranksmax_ranks 의 명시. 학습이 의미를 가지려면 최소 N 이상이 살아있어야 한다는 application semantic 을 명시. PCCL 은 그 invariant 만 지킨다.

정책 옵션

  • skip_dead — 죽은 rank 의 contribution 무시. allreduce 결과가 살아있는 rank 의 평균.
  • wait — 정해진 timeout 까지 대기. 그 후 skip. straggler 처리.
  • retry — 죽었다고 본 rank 가 살아남. 한 번 더 시도.
  • strict — NCCL 호환 모드. 한 rank 만 죽어도 abort.
의미적 변화

NCCL 의 allreduce: “모든 rank 의 정확한 합”. PCCL 의 allreduce(skip_dead): "현재 살아있는 rank 의 합. count 를 함께 돌려줌". application 은 count 로 평균 다시 계산하거나, learning rate 조정.

이 추상이 PCCL 의 power. 합 자체가 약속이 아니라, 합 + count + alive set 이 결과. application 은 이 셋으로 자기 의미 (mean, weighted mean, robust mean 등) 를 다시 만든다.

§ 05NCCL 과의 차이· Design contrast

같은 hardware, 다른 약속 — 그래서 무엇을 포기하는가

PCCL 은 NCCL 의 대체가 아니다 — 다른 trade-off 의 다른 라이브러리. 무엇이 같고 무엇이 다른지.

FIG · NCCL vs PCCL 차원 비교10개 axis
차원NCCLPCCL의미
membership고정elastic합류/이탈 가능
결과 의미정확한 합살아있는 합 + countapplication 책임 ↑
실패 모드전체 abort부분 skip학습 흐름 유지
throughput (정상)최고~95% NCCLoverhead 있음
latency (small)~10 µs~30 µscontrol plane 비용
topology 최적화자동제한적elastic 이라 어려움
programming modelcollectivecollective + status결과 + count
interopPyTorch 기본PyTorch shimdrop-in 가능
backendNVLink/IB동일transport 같음
scopesingle 학습multi-day, 1만 GPUtimescale 다름
PCCL 은 정상 상황에서 NCCL 보다 살짝 느리다 — 5% 정도. 그러나 실패 발생 시 재시작 비용 (수십 분) 을 절약한다. 큰 학습에서는 net positive.
Elastic 의 비용

elastic 은 공짜가 아니다 — 매 collective 마다 “누가 살아있는가” 를 알아야 함. 이걸 위한 control plane 이 필요 (heartbeat, view synchronization). 이게 latency overhead 의 출처. 큰 메시지에서는 거의 무시할 수 있지만 작은 메시지에서는 차이가 보임.

“NCCL 의 allreduce 는 ‘N rank 의 합’이다. PCCL 의 allreduce 는 ‘이번에 살아있던 K rank 의 합과 K’이다 — 의미의 형태 자체가 다르다.”학습 노트 · §5
§ 06합류 · 이탈 (re-shape)· Membership change

학습 중에 새 GPU 가 들어오는 일이 일상이 된다면

PCCL 의 또 다른 power — 죽음만이 아니라 합류도 처리. cluster 가 새 노드를 띄워줄 때, 이 노드를 학습에 합류시키는 비용이 “재시작” 이면 거의 못 쓰는 자원. PCCL 은 in-place 합류.

FIG · re-shape protocol4 step
1. 합류 요청 R0 R1 R2 R3? 새 노드가 join 요청 2. barrier R0 R1 R2 기존 rank 안전점 도달 3. state sync R0 R3 weights → weight 복사 4. resume R0 R1 R2 R3 N+1 rank 으로 학습 membership change protocol — barrier 후 state sync 후 resume. checkpoint 을 디스크에 거치지 않음.
PCCL 의 합류는 in-memory state copy. 디스크 checkpoint 거치지 않음. 한 노드의 weight 를 새 노드로 broadcast — 보통 몇 초 - 분 단위.

data parallel 만 단순

data parallel (DDP, FSDP) 에서 합류는 단순 — 모든 rank 가 같은 weight 를 보유. 한 rank 의 weight 를 새 rank 로 broadcast 하면 끝. tensor parallel / pipeline parallel 은 더 복잡 — 각 rank 가 다른 부분의 weight 를 가짐. 합류 시 sharding 자체를 다시 계산해야 함. PCCL 의 처음 target 은 DP, TP/PP 는 후속.

§ 07구현 패턴· Control plane · data plane

"누가 살아있는가" 를 알기 위한 별도 layer 의 존재

PCCL 의 내부 구조는 control plane + data plane 의 분리. NCCL 은 사실상 data plane 만 — 통신 자체. PCCL 은 그 위에 control plane (멤버십 관리, 실패 감지, view 동기화) 을 추가.

control plane
"누가 살아있는가"
분산 합의 (Raft / etcd 같은 가족) 또는 lightweight gossip. 매 collective 마다 view 를 가져옴. 실패 감지 (heartbeat timeout) 가 여기. failure detector 의 정확도가 학습의 throughput 에 직접 영향.
data plane
"실제 데이터 이동"
NCCL / NVSHMEM / RDMA 를 그대로 쓸 수 있음. PCCL 의 기여는 “실패 감지 후 ring 을 어떻게 reroute 하는가” 의 알고리즘. 본질은 NCCL 의 ring 의 dynamic version.
membership service
"누구를 받아들이는가"
새 노드의 join 요청을 처리. policy 에 따라 admit/reject. cluster scheduler (Slurm, k8s) 와 통합 가능.
application shim
"PyTorch 에 어떻게 연결"
PyTorch 의 ProcessGroup 인터페이스에 매핑. backend='pccl' 로 init. 기존 학습 코드의 변경 최소.

view synchronization

분산 합의의 핵심 — "이번 collective 에서 누가 참여하는지" 에 모든 rank 가 같은 답을 가져야 함. 한 rank 는 “R3 살았다” 라고 보고, 다른 rank 는 “R3 죽었다” 로 보면 — allreduce 의 결과 자체가 분기됨. PCCL 의 핵심 protocol 은 view 를 collective epoch 별로 동기화.

trade-off — 정확도 vs 응답성

failure detector 가 빠르면 (timeout 짧음) 정상 rank 를 잘못 죽이는 false positive ↑. 늦으면 진짜 죽은 rank 를 오래 기다려서 throughput ↓. adaptive timeout (RTT 기반) 가 일반적 답.

“NCCL 은 ‘모두 같이’ 의 단일 layer. PCCL 은 ‘누가 살아있는가’ + ‘그들끼리 통신’ 의 두 layer — 그 분리가 elastic 의 출발점.”학습 노트 · §7
§ 08production 사례· Deployment

실 사용 — frontier lab 의 케이스

PCCL 의 production 적용은 2024-2025 시점에서 frontier lab 들에서 시작. 정확한 사례는 강의 영상 확인 필요하지만, 일반적 패턴을 정리한다.

현실적 진단

PCCL 은 아직 frontier 의 도구. NCCL 이 default 인 production 학습 인프라에서 PCCL 로 전환하는 데에는 — (a) 운영팀의 mental model 변화, (b) failure 시 의미가 바뀌는 점을 application team 이 받아들이는 것, (c) NCCL 만큼 well-tested 인 단계 도달 — 모두 필요. 보통 1-2년의 maturity 시간.

간단한 ROI 계산

1만 GPU 학습, 시간당 1회 실패, NCCL 재시작 비용 30분, 학습 1달. 손실 시간 = 24×30 day×1×30min = ~360 hours = ~15 days. 학습의 50% 가 재시작 비용. PCCL 로 이 비용을 ~5% 로 줄이면 학습 wall clock 이 ~2× 빠름. 큰 학습에서는 매우 큰 saving.

§ 09다음 방향· Where it goes

fault tolerance 의 frontier

"fault tolerance 는 communication library 의 ‘보너스’ 에서 ‘core competency’로 옮겨가고 있다 — 1만 GPU 가 임계점."학습 노트 · §9
§ 10기억할 메모와 코드· Key takeaways

다시 열었을 때 5분 안에 잡혀야 할 것

왜 PCCL
1만 GPU 학습 = 시간당 1회 실패 = NCCL 재시작 50% 시간. PCCL 은 그 50% 를 회수.
elastic group
고정 멤버십 → "현재 시점 멤버십". min/max ranks invariant.
결과의 의미 변화
N rank 의 합 → 살아있는 K rank 의 합 + count. application 이 의미 다시 만듦.
fault model
PCCL primary target = fail-stop + fail-slow. silent / Byzantine 은 별도.
control / data plane
분리. control 이 view 합의, data 가 NCCL 같은 transport.
re-shape protocol
barrier → state sync (in-memory) → resume. ckpt 디스크 안 거침.
DP 만 단순
TP/PP 는 sharding 재계산이 필요해 더 어려움. PCCL 의 처음 scope 는 DP.
NCCL 수렴
NCCL 3.x 가 partial recovery 도입. PCCL idea 가 mainstream 화 진행.
Code repo URL 미공개 / 영상에서 추적 필요
관련 Meta OPT-175B logbook, PyTorch Elastic, NCCL 3.x design

손에 새기기 — 실습 시퀀스

  1. NCCL 의 실패 모드 직접 보기 — 작은 multi-GPU 학습을 돌리다가 한 process 를 강제 kill. NCCL 이 timeout / abort 어떻게 행동하는지 확인.
  2. elastic torchrun 베이스라인torchrun --max-restarts=3 으로 같은 시나리오. checkpoint 부터 다시 시작하는 비용 측정.
  3. failure injection — 학습 코드에 chaos monkey. step 마다 1% 확률로 한 rank 가 sleep 5초. straggler 시뮬.
  4. view synchronization 직접 구현 — etcd 를 control plane 으로, alive set 을 매 step 동기화. NCCL 위에 simple PCCL prototype.
  5. ROI 계산 — 자기 클러스터의 실 실패 빈도, 재시작 비용 측정. PCCL 도입의 break-even 시간 계산.
  6. FSDP + PCCL shim — PyTorch FSDP 에 PCCL backend 적용 (가능하면). DP allreduce 만 elastic.
§ 11다른 강의로 이어지는 길· Connections

communication / scaling / production 의 가족

PCCL 은 통신 라이브러리 가족의 “fault tolerance 축” 위 노드.

§ 12열린 질문· Open questions

이 노트가 의도적으로 비워둔 자리들

검증 메모

본문의 디자인 패턴 (control plane + data plane 분리, view synchronization, elastic group) 은 분산 시스템 일반론에서 PCCL 의 위치를 추정한 것. 강의 영상에서 mike64t 가 발화한 정확한 구조는 영상 transcript 가 복원되면 확인 권장.

← Lecture 069 Quartet 4-bit training Lecture 071 → FlexOlmo — open LMs for flexible data use