Ray 구조

손호준·2023년 1월 17일
0

ray의 메모리 구조

Ray 시스템 메모리

  • GCS
  • Raylet

어플리케이션 메모리

  • 워커 힙
    어플리케이션이 사용하고있는 메모리(예: 파이썬코드). best measured as the resident set size (RSS) of your application minus its shared memory usage (SHR) in commands such as top. The reason you need to subtract SHR is that object store shared memory is reported by the OS as shared with each worker. Not subtracting SHR will result in double counting memory usage.

  • 객체 저장소 메모리
    어플리케이션이 ray.put으로 객체를 만들고 원격함수에서 값을 반환할때 사용되는 메모리. 객체는 참조 카운트되고(ObjectRef) 범위를 벗어나면 제거됨. 각 노드에서 실행 중인 개체 저장소 서버가 존재하고, Ray1.3이상부터는 개체 저장소가 가득차면 개체가 디스크로 spill됨.

  • 객체 저장소 공유메모리
    어플리케이션이 ray.get으로 객체를 읽을때 사용되는 메모리. 개체가 이미 노드에 있는 경우 추가 할당이 발생하지 않기 때문에 많은 액터와 작업 간에 큰 개체를 효율적으로 공유할 수 있음.

메모리 인식 스케줄링

기본적으로 ray는 필요한 메모리 양을 미리 예측할 수 없기 때문에, 스케줄링을 할때 작업이나 액터의 잠재적인 메모리 사용량을 고려하지 않음. 작업 이나 액터에 필요한 메모리 양을 알고 있는 경우 ray.remote 데코레이터 의 리소스 요구 사항을 지정하여 메모리 인식 스케줄링을 활성화할 수 있음.
단, 메모리 요구사항을 지정해도 메모리 사용량에 제한이 생기진 않는데, 이는 스케줄링 중에만 허용 제어에 사용되기 때문. 요청된 메모리보다 더 많이 쓰지 않는 것은 태스크 자체에게 달려있다.

## 예시
# reserve 500MiB of available memory to place this task
@ray.remote(memory=500 * 1024 * 1024)
def some_function(x):
    pass

# reserve 2.5GiB of available memory to place this actor
@ray.remote(memory=2500 * 1024 * 1024)
class SomeActor(object):
    def __init__(self, a, b):
        pass

메모리 부족 방지(OOM)

어플리케이션 작업이나 액터가 많은 양의 힙 공간을 사용하는 경우 노드의 메모리 부족이 발생할 수 있다. 운영체제는 작업자나 raylet 프로세스를 종료하여 어플리케이션을 중단시킨다.

메모리 모니터

메모리 모니터는 각 노드의 raylet프로세스 내에서 실행되는 구성요소이다.
워커 힙, 객체 저장소 및 raylet을 포함하는 메모리 사용량을 주기적으로 확인한다. 결합된 사용량이 임계값을 초과하면 raylet은 작업이나 액터 프로세스를 종료시켜 메모리를 확보하고 ray가 실패하지 않도록 한다.

메모리 모니터는 다음 환경 변수에 의해 제어됨

  • RAY_memory_monitor_refresh_ms (int, defaults to 250)
    메모리 사용량을 확인하고 필요한 경우 작업이나 액터를 종료하는 간격. 값이 0이면 비활성화됨
  • RAY_memory_usage_threshold (float, defaults to 0.95)
    노드가 메모리 용량을 초과할 때의 임계값. 메모리 사용량이 이 값보다 크고 여유 공간이 min_memory_free_bytes 미만이면 공간을 확보하기 위해 프로세스를 종료하기 시작함. 범위는 [0, 1]
  • RAY_task_oom_retries (int, defaults to 15)
    메모리 모니터에 의해 종료되는 프로세스로 인해 실패한 경우 작업이나 액터에 대한 재시도 횟수. 작업이나 행위자가 재시도할 수 없는 경우 이 값은 사용되지 않음. 이 값은 메모리 모니터에 의해 프로세스가 종료된 경우에만 사용됨. 다른 방식으로 실패한 경우에는 RAY_task_oom_retries가 아닌 max_retries나 max_restart 같은 재시도 카운터가 사용됨(예: 운영체제에 의해 종료된 경우).
profile
Rustacean🦀/Data engineer💻

0개의 댓글