[sglang] Multi-GPU VLM 서빙에서 ShmPointerMMData broadcast race condition 수정
PR 링크: sgl-project/sglang#21655 상태: Merged | 변경: +39 / -1
들어가며
SGLang의 multi-GPU VLM(Vision-Language Model) 서빙에서 멀티모달 데이터를 POSIX shared memory를 통해 rank 간 전달한다. ShmPointerMMData는 shared memory 세그먼트의 이름과 메타데이터를 담는 경량 포인터 객체로, broadcast_pyobj를 통해 모든 rank에 전파된다. 그러나 source rank가 broadcast 직후 바로 shm_unlink를 호출하면, 다른 rank들이 아직 shm_open을 완료하지 못한 상태에서 세그먼트가 삭제되는 race condition이 발생할 수 있었다.
핵심 코드 분석
1. Race condition 감지 함수 추가
def has_shm_features(recv_reqs):
"""Return True if any request in the list contains ShmPointerMMData."""
for req in recv_reqs:
if hasattr(req, "batch"):
if has_shm_features(req.batch):
return True
elif hasattr(req, "mm_inputs") and req.mm_inputs:
for item in req.mm_inputs.get("mm_items", []):
if isinstance(item.feature, ShmPointerMMData):
return True
return False
재귀적으로 요청 목록을 탐색하여 ShmPointerMMData가 포함된 요청이 있는지 확인한다.
2. Barrier 삽입
Before:
if recv_reqs:
for req in recv_reqs:
unwrap_shm_features(req) # shm_open -> 텐서로 복원 -> shm_unlink
After:
if recv_reqs:
# Non-DP-attention: broadcast 후 모든 rank가 shm_open 완료할 때까지 대기
if (
not self.server_args.enable_dp_attention
and self.tp_size > 1
and self.model_config.is_multimodal
and has_shm_features(recv_reqs)
):
barrier(group=self.tp_cpu_group)
for req in recv_reqs:
unwrap_shm_features(req)
4가지 조건이 모두 충족될 때만 barrier를 삽입한다:
- DP attention 비활성화 (DP attention에서는 다른 collective가 이미 동기화 역할)
- TP(Tensor Parallelism) size > 1
- 멀티모달 모델
- 실제로 ShmPointerMMData가 포함된 요청
왜 이게 좋은가
- Race condition 해결: source rank의
shm_unlink가 다른 rank의shm_open보다 먼저 실행되는 문제 방지 - 최소 오버헤드: 4가지 조건으로 barrier가 필요한 경우에만 동기화하여 불필요한 지연 방지
- DP attention 예외: DP attention 환경에서는 이미 존재하는 collective 연산이 동기화를 보장하므로 추가 barrier 불필요
- POSIX 시맨틱 활용:
shm_unlink는 이름만 제거하고 이미 열린 핸들은 유효하므로, barrier 이후에는 안전
정리
Multi-GPU VLM 서빙의 POSIX shared memory broadcast에서 발생하는 미묘한 race condition을 정확한 위치에 barrier를 삽입하여 해결했다. 주석에 DP attention에서 barrier가 불필요한 이유까지 상세히 설명되어 있어 향후 유지보수에도 도움이 된다.
참고 자료
- sgl-project/sglang#21655 — 원본 PR
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [sglang] TRT-LLM Sparse MLA 커널의 prefill 배치 지원
- 현재글 : [sglang] Multi-GPU VLM 서빙에서 ShmPointerMMData broadcast race condition 수정
- 다음글 [Open WebUI] 채팅 제목 업데이트 시 DB 컨텍스트를 단일 세션으로 통합하여 역직렬화 2회 제거
댓글