Barrier
마지막 수정:
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
무슨 일이 일어나나
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를 너무 자주 넣으면 왜 병렬성이 줄어드는가?