복제의 단위는 그룹이다
한 줄 요약
모델 하나가 GPU 한 노드에 다 들어가지 않으면 여러 노드가 「한 엔진」이 되어야 합니다(텐서·파이프라인 병렬). 그 엔진 하나가 서비스의 복제 단위입니다. LeaderWorkerSet(LWS)은 리더 파드 하나와 워커 파드 몇 개를 「그룹」으로 묶고, 그 그룹을 Deployment 처럼 늘리고 줄이고 굴려 바꿉니다.
왜 이게 필요했나
추론 서비스는 보통 Deployment 로 띄웁니다. 파드 하나가 모델 하나를 들고, 파드를 늘리면 처리량이 늡니다. 그런데 70B 를 넘는 모델을 노드 두 대에 나눠 올리면 「파드 하나 = 모델 하나」 가 깨집니다. 두 파드가 짝을 이뤄야 모델 하나가 되고, 짝 중 하나가 죽으면 다른 하나도 쓸모가 없습니다.
StatefulSet 으로 흉내 내 보면 문제가 드러납니다. 파드에 번호는 붙지만 「0번과 1번이 한 짝, 2번과 3번이 한 짝」 이라는 개념이 없습니다. 짝 하나가 죽어도 그 파드만 다시 뜨고, 남은 짝은 끊긴 통신을 붙잡고 멈춰 있습니다. 판을 올릴 때도 파드 단위로 굴러가서, 옛 판 리더와 새 판 워커가 한 짝이 되는 순간이 생깁니다. vLLM·SGLang 의 멀티 노드 배포와 llm-d, Dynamo 의 대안 경로가 모두 LWS 를 쓰는 이유가 이것입니다.
어떻게 동작하나
replicas 그룹 수(서비스의 복제 수)
leaderWorkerTemplate.size 그룹 하나의 파드 수(리더 1 + 워커 size-1)
leaderTemplate / workerTemplate 리더와 워커의 파드 틀(다를 수 있다)
restartPolicy RecreateGroupOnPodRestart 면 그룹 안 파드 하나가 재시작할 때 그룹 전체를 다시 만든다
rolloutStrategy 그룹 단위로 굴려 바꾼다(maxUnavailable·maxSurge 도 그룹 수)
exclusive-topology 주석 그룹 하나가 토폴로지(노드 등) 하나를 독차지하게 한다
실험 VM(LWS v1.0.0)에서 본 이름과 환경 변수입니다. 그룹 번호가 파드 이름에, 워커 번호가 뒤에 붙습니다.
llm-0 llm-0-1 ← 그룹 0 의 리더와 워커
llm-1 llm-1-1 ← 그룹 1
LWS_LEADER_ADDRESS=llm-0.llm.infer LWS_GROUP_SIZE=2 LWS_WORKER_INDEX=1
안쪽은 StatefulSet 입니다. 리더들을 담는 StatefulSet 하나(llm)와 그룹마다 워커 StatefulSet 하나(llm-0, llm-1)가 생기고, 헤드리스 서비스 llm 이 이름을 풀어 줍니다.
현장에서 만나는 모습
- 「그룹은 묶어 만들지만 묶어 배치하지는 않습니다.」 실측에서 앞 작업의 파드들이 아직 GPU 를 놓지 않은(종료 중인) 사이에 GPU 4장 노드에 그룹 둘짜리 LWS 를 띄우자, 그룹 1 은 리더만 뜨고 워커는 Pending 인 「반쪽 그룹」 이 되었습니다. 그 리더는 아무 일도 못 하면서 자리를 차지합니다. LWS 는 이 문제를 갱 스케줄러에 맡깁니다. 차트 값
gangSchedulingManagement.schedulerProvider로 Volcano 를 붙이거나, Kueue 를 쓰면 그룹마다 Workload 하나가 됩니다(실측:leaderworkerset-llm-0-…처럼 그룹마다 하나, podSets 는 leader·worker). - 「Kueue 의 입장도 노드 자리를 보장하지는 않습니다.」 같은 실험에서 Kueue 가 입장시킨 그룹 하나가 리더 Pending·워커 Running 으로 갈라져 있었습니다. 앞 그룹의 파드가 아직 GPU 를 놓지 않은 사이였습니다. 입장(쿼터)과 배치(노드)는 다른 층이라는 것을 다시 확인하는 장면입니다.
- 「설치 크기를 보세요.」 LWS v1.0.0 매니페스트는 컨트롤러 2개가 CPU 1·메모리 1Gi 씩을 요청합니다. 4 vCPU VM 에 KAI 와 함께 올렸더니 KAI 파드가 Pending 이 되었습니다. 이 실습의 VM 은 컨트롤러를 1개로 줄였습니다.
- 「busybox nslookup 은 검색 도메인을 쓰지 않습니다.」
LWS_LEADER_ADDRESS(llm-0.llm.infer)를 그대로 넣으면 NXDOMAIN 이 납니다. 끝에.svc.cluster.local을 붙이거나, 검색 도메인을 따르는 ping 같은 도구를 쓰면 풀립니다. 실제 서버(vLLM 등)는 일반 해석기를 써서 짧은 이름이 됩니다.
English corner
The unit of replication is the group, not the pod.
leader, worker, group, exclusive placement 네 단어로 LWS 문서를 읽을 수 있습니다.
다음 실습에서 할 것
그룹 둘짜리 LWS 를 띄워 이름과 환경 변수를 읽고, 워커 하나를 실패시켜 그 그룹만 다시 만들어지는 것을 봅니다. 그룹 단위 롤링 업데이트를 하고, KWOK 노드 두 대에 그룹마다 노드 하나씩 독차지하게 배치한 뒤, 마지막으로 반쪽 그룹을 일부러 만들어 봅니다.