10,000 GPU 클러스터에서 한 GPU 가 죽는 사건은 매시간 일어난다. NCCL 의 약속은 “모두가 살아있다” — 그 약속이 깨지면 collective 가 hang 또는 abort. 그러면 다시 시작. 한 번의 100B token 학습이 수십 번 재시작되는 게 일상. PCCL 은 그 전제를 버린다 — 일부가 죽거나 들어와도 collective 가 그대로 흘러가는 fault-tolerant collective.
대규모 학습 클러스터의 hardware MTBF (mean time between failures) 는 GPU 당 보통 수개월 ~ 수년. 1 만 GPU 면 몇 시간마다 한 번 누군가가 실패한다. NCCL 은 “모두가 살아있다” 를 가정 — 한 GPU 라도 timeout/error 가 나면 collective 가 abort, communicator 재구성이 필요. 큰 학습 한 번에 재시작 수십 번.
강의의 출발 질문 셋.
왜 NCCL 은 fault tolerant 하지 않은가 — design choice 였음. 작은 클러스터에서는 의미 없음.
실패는 어떻게 분류되는가 — fail-stop, fail-slow (straggler), Byzantine. 각자 다른 치료.
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 은 어디까지 다루나?
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_ranks 와 max_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 의 다른 라이브러리. 무엇이 같고 무엇이 다른지.
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
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 들에서 시작. 정확한 사례는 강의 영상 확인 필요하지만, 일반적 패턴을 정리한다.
data parallel 학습의 elastic 부분 — DDP / FSDP 의 일부 group 에 PCCL 적용. TP 그룹은 NCCL, DP 그룹만 PCCL 같은 hybrid.
fine-tuning 클러스터 — pre-training 만큼 critical 하지 않은 학습. 합류/이탈이 잦은 환경에 자연스러운 fit.
RLHF rollout 클러스터 — actor 들이 동시에 sample 생성. PCCL 의 elastic 이 적합. L054 와 연결.
shared cluster — multi-tenant 환경에서 priority preemption. 우선순위 높은 작업이 들어올 때 일부 rank 잠시 빠짐.
현실적 진단
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
NCCL 3.x 와의 수렴 — NCCL 자체가 partial recovery 를 도입. PCCL 의 idea 가 mainstream 으로. 향후 5년 내 “elastic NCCL” 이 default 될 가능성.
TP/PP 의 elastic — 가장 어려운 부분. sharding 자체가 변해야 함. 미해결 frontier.
predictive failure detection — GPU의 ECC error 패턴 등으로 실패 1-2분 전 예측. graceful drain. 운영팀의 일이지만 collective 가 hint 받을 수 있음.
silent corruption 검증 — checksum, redundancy. PCCL 다음의 자연스러운 확장.
cross-cluster federation — 여러 데이터센터 사이의 collective. WAN 위 collective 는 fault tolerance 가 사실상 default.
"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 이 의미 다시 만듦.
PCCL 의 정확한 API — 본문은 개념적 형태. repo / 문서가 공개되면 정확한 시그너처로 교체.
throughput 95% NCCL 의 정확한 수치 — 일반적 추정. 강의의 정확한 measurement 확인 필요.
mike64t 의 affiliation 과 background — username 만 있어 강의 영상에서 확인 필요.
TP / PP 에서의 elastic 디자인 — 본문에서 “미해결” 로 적었지만 강의 영상에서 토론됐을 가능성. 확인 필요.
실제 production 채택 사례 — DeepSeek, Meta, Google 중 누가 PCCL 류 사용? 본문은 일반적 사례만.
NCCL 3.x 의 fault tolerance 와의 정확한 차이 — 두 라이브러리가 같은 시점에 같은 problem 을 풀고 있어 비교 question 가 활발.
검증 메모
본문의 디자인 패턴 (control plane + data plane 분리, view synchronization, elastic group) 은 분산 시스템 일반론에서 PCCL 의 위치를 추정한 것. 강의 영상에서 mike64t 가 발화한 정확한 구조는 영상 transcript 가 복원되면 확인 권장.