Barrier

마지막 수정:

distributedcollectivesynchronizationbarrier

Barrier는 tensor 값을 모으거나 더하는 연산이 아니다. 모든 rank를 같은 지점에서 기다리게 하는 동기화 연산이다.

dist.barrier()
rank 0 work 0s wait next step
rank 1 work 1s wait next step
rank 2 work 2s next step
barrier opens only after every rank arrives
빠른 rank도 barrier 앞에서는 가장 느린 rank가 도착할 때까지 기다린다.

무슨 일이 일어나나

rank 0, 1, 2가 있다고 하자.

rank 0: 작업을 빨리 끝냄
rank 1: 조금 늦게 끝냄
rank 2: 가장 늦게 끝냄

barrier가 없으면 rank 0은 다음 작업으로 먼저 넘어갈 수 있다. 하지만 barrier가 있으면 rank 0도 멈춰서 기다린다.

모든 rank가 barrier에 도착한다
-> barrier가 열린다
-> 모든 rank가 다음 단계로 넘어간다

왜 조심해야 하나

Barrier는 디버깅이나 정확한 동기화가 필요할 때 유용하다. 하지만 너무 자주 쓰면 병렬 처리의 이점을 깎아먹는다.

빠른 rank가 기다린다
전체 속도는 가장 느린 rank에 맞춰진다

분산 학습에서는 꼭 필요한 collective 자체가 암묵적인 동기화 지점이 되는 경우도 많다. 그래서 별도의 barrier를 습관적으로 넣기보다는, 정말 모든 rank를 여기서 맞춰야 하는지 확인해야 한다.

확인

  • Barrier는 tensor 값을 바꾸는가?
  • 빠른 rank가 barrier에 먼저 도착하면 바로 다음 단계로 넘어가는가?
  • Barrier를 너무 자주 넣으면 왜 병렬성이 줄어드는가?