본문으로 건너뛰기

[Ray Data] AutoscalingCoordinator에서 여러 데이터셋 실행 시 리소스 이중 할당 방지

PR 링크: ray-project/ray#59740 상태: Merged | 변경: +78 / -14

들어가며

Ray Data의 AutoscalingCoordinator는 여러 데이터셋이 동시에 실행될 때 클러스터 리소스를 배분하는 역할을 한다. 각 데이터셋은 명시적으로 요청한 리소스 외에 request_remaining=True로 잔여 리소스도 요청할 수 있다. 기존 구현에서는 잔여 리소스를 모든 request_remaining=True 요청자에게 중복 할당하여, 실제 가용 리소스보다 더 많은 리소스가 할당된 것처럼 보이는 문제가 있었다.

핵심 코드 분석

Before: 잔여 리소스 중복 할당

# NOTE, to handle the case where multiple datasets are running concurrently,
# now we double-allocate remaining resources to all requesters with
# `request_remaining=True`.
for ongoing_req in ongoing_reqs:
    if ongoing_req.request_remaining:
        ongoing_req.allocated_resources.extend(cluster_node_resources)

After: 균등 분배

remaining_resource_requesters = [
    req for req in ongoing_reqs if req.request_remaining
]
num_remaining_requesters = len(remaining_resource_requesters)
if num_remaining_requesters > 0:
    for node_resource in cluster_node_resources:
        divided_resource = {
            k: v // num_remaining_requesters for k, v in node_resource.items()
        }
        for ongoing_req in remaining_resource_requesters:
            if any(v > 0 for v in divided_resource.values()):
                ongoing_req.allocated_resources.append(divided_resource)

왜 이게 좋은가

  1. 리소스 과다 할당 방지: CPU 10, GPU 5인 노드에서 2개의 데이터셋이 각각 CPU 2, GPU 1을 사용 중이라면, 잔여 CPU 5, GPU 3을 각각 CPU 2, GPU 1씩 공평하게 나눈다. 이전에는 두 데이터셋 모두 잔여 전체를 할당받아 CPU 5+5=10이 할당된 것처럼 계산되었다.
  2. 정수 나눗셈으로 안전성 확보: // 연산자로 나누므로 할당량의 합이 실제 가용량을 초과하지 않는다. 나머지로 인해 일부 리소스가 미할당될 수 있지만, 과다 할당보다 안전하다.
  3. 0값 필터링: if any(v > 0 for v in divided_resource.values())로 모든 값이 0인 리소스 할당을 건너뛴다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글