Azure Databricks에서 Ray 클러스터 크기 조정

자동 크기 조정, 헤드 노드 구성, 다른 유형의 클러스터 및 리소스 할당을 포함하여 최적의 성능을 위해 Ray 클러스터의 크기를 조정하는 방법을 알아봅니다.

자동 크기 조정 모드에서 Ray 클러스터 만들기

Ray 2.8.0 이상에서 Azure Databricks에서 시작된 Ray 클러스터는 Azure Databricks 자동 크기 조정과의 통합을 지원합니다. 이 자동 크기 조정 통합은 Azure Databricks 환경 내에서 내부적으로 Azure Databricks 클러스터 자동 크기 조정을 트리거합니다.

자동 크기 조정을 사용하도록 설정하려면 다음 명령을 실행합니다.

2.10 미만의 Ray 버전:

from ray.util.spark import setup_ray_cluster

setup_ray_cluster(
  num_worker_nodes=8,
  autoscale=True,
)

Ray 버전 2.10 이상:

from ray.util.spark import setup_ray_cluster, shutdown_ray_cluster

setup_ray_cluster(
  min_worker_nodes=2,
  max_worker_nodes=4,
  num_cpus_per_node=4,
  collect_log_to_path="/Volumes/<catalog>/<schema>/<volume>/path/to/ray_collected_logs"
)

# Pass any custom Ray configuration with ray.init
ray.init(ignore_reinit_error=True)

API는 ray.util.spark.setup_ray_cluster Apache Spark에 Ray 클러스터를 만듭니다. 내부적으로 백그라운드 Apache Spark 작업을 만듭니다. Apache Spark의 각 작업은 Ray 작업자 노드를 생성하며, Ray 헤드 노드는 드라이버에서 생성됩니다. 인수 min_worker_nodes 이며 max_worker_nodes Ray 워크로드에 대해 만들고 활용할 Ray 작업자 노드의 범위를 나타냅니다. 인수 min_worker_nodes 를 정의하지 않은 상태로 두면, max_worker_nodes 명의 작업자가 있는 고정 크기의 Ray 클러스터가 시작됩니다. 각 Ray 작업자 노드에 할당된 CPU 또는 GPU 코어 수를 지정하려면 인수 num_cpus_worker_node(기본값: 1) 또는 num_gpus_worker_node(기본값: 0)을 설정합니다.

2.10 미만의 Ray 버전의 경우 자동 크기 조정을 사용하는 num_worker_nodes 경우 최대 Ray 작업자 노드 수를 나타냅니다. Ray 작업자 노드의 기본 최소 수는 0입니다. 이 기본 설정은 Ray 클러스터가 유휴 상태일 때 Ray 작업자 노드가 0개까지 축소된다는 것을 의미합니다. 이는 모든 시나리오에서 빠른 응답성에 적합하지 않을 수 있지만 사용하도록 설정하면 비용을 크게 줄일 수 있습니다.

자동 크기 조정 모드에서는 num_worker_nodes를 ray.util.spark.MAX_NUM_WORKER_NODES으로 설정할 수 없습니다.

다음 인수는 업스케일링 및 다운스케일링 속도를 구성합니다.

  • autoscale_upscaling_speed 는 보류 중인 노드 수를 현재 노드 수의 배수로 나타냅니다. 값이 높을수록 업 스케일링이 더 공격적입니다. 예를 들어 1.0으로 설정된 경우 클러스터의 크기는 언제든지 최대 100% 증가할 수 있습니다.
  • autoscale_idle_timeout_minutes 는 자동 크기 조정기가 유휴 작업자 노드를 제거하기 전에 통과해야 하는 시간(분)을 나타냅니다. 값이 작을수록 다운 스케일링이 더 공격적입니다.

Ray 2.9.0 이상을 사용하면, Ray 클러스터가 유휴 상태일 때 작업자가 0으로 축소되어 클러스터가 종료되는 것을 방지하기 위해 autoscale_min_worker_nodes 설정을 구성할 수 있습니다.

Ray 헤드 노드에서 사용하는 리소스 구성

기본적으로 Ray on Spark 구성의 경우 Azure Databricks는 Ray 헤드 노드에 할당된 리소스를 다음으로 제한합니다.

  • CPU 코어 0개
  • GPU 0개
  • 128MB 힙 메모리
  • 128MB 개체 저장소 메모리

Ray 헤드 노드는 일반적으로 Ray 작업을 실행하는 것이 아니라 전역 조정을 위해 사용됩니다. Apache Spark 드라이버 노드 리소스는 여러 사용자와 공유되므로 기본 설정은 Apache Spark 드라이버 쪽에 리소스를 저장합니다. Ray 2.8.0 이상을 사용하면 Ray 헤드 노드에서 사용하는 리소스를 구성할 수 있습니다. setup_ray_cluster API에서 다음 인수를 사용합니다.

  • num_cpus_head_node: Ray 헤드 노드에서 사용하는 CPU 코어 설정
  • num_gpus_head_node: Ray 헤드 노드에서 사용하는 GPU 설정
  • object_store_memory_head_node: Ray 헤드 노드별 개체 저장소 메모리 크기 설정

다른 유형의 클러스터에 대한 지원

더 효율적이고 비용 효율적인 학습 실행을 위해 Spark 클러스터에서 Ray를 만들고 Ray 헤드 노드와 Ray 작업자 노드 간에 서로 다른 구성을 설정할 수 있습니다. 그러나 모든 Ray 작업자 노드에는 동일한 구성이 있어야 합니다. Azure Databricks 클러스터는 다른 유형의 클러스터를 완전히 지원하지는 않지만 클러스터 정책을 설정하여 다른 드라이버 및 작업자 인스턴스 유형으로 Azure Databricks 클러스터를 만들 수 있습니다. 예시:

{
  "node_type_id": {
    "type": "fixed",
    "value": "i3.xlarge"
  },
  "driver_node_type_id": {
    "type": "fixed",
    "value": "g4dn.xlarge"
  },
  "spark_version": {
    "type": "fixed",
    "value": "13.x-snapshot-gpu-ml-scala2.12"
  }
}

Ray 클러스터 구성 튜닝

각 Ray 작업자 노드에 권장되는 구성은 다음과 같습니다. Ray 작업자 노드당 최소 4개의 CPU 코어. 각 Ray 작업자 노드에는 최소 10GB의 힙 메모리가 필요합니다.

따라서 Azure Databricks는 ray.util.spark.setup_ray_cluster을(를) 호출할 때 num_cpus_per_node을(를) 4 이상으로 설정할 것을 권장합니다.

각 Ray 작업자 노드에 대한 힙 메모리 튜닝에 대한 자세한 내용은 다음 섹션을 참조하세요.

Ray 작업자 노드에 대한 메모리 할당

각 Ray 작업자 노드는 힙 메모리와 개체 저장소 메모리라는 두 가지 유형의 메모리를 사용합니다.

각 형식에 할당된 메모리 크기는 아래에 설명된 대로 결정됩니다.

각 Ray 작업자 노드에 할당된 총 메모리는 다음과 같습니다. RAY_WORKER_NODE_TOTAL_MEMORY = (SPARK_WORKER_NODE_PHYSICAL_MEMORY / MAX_NUMBER_OF_LOCAL_RAY_WORKER_NODES * 0.8)

MAX_NUMBER_OF_LOCAL_RAY_WORKER_NODES 는 Apache Spark 작업자 노드에서 시작할 수 있는 최대 Ray 작업자 노드 수입니다. 인수 num_cpus_per_node 또는 num_gpus_per_node에 의해 결정됩니다.

인수 object_store_memory_per_node설정하지 않으면 각 Ray 작업자 노드에 할당된 힙 메모리 크기와 개체 저장소 메모리 크기는 다음과 RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY * 0.7OBJECT_STORE_MEMORY_PER_NODE = RAY_WORKER_NODE_TOTAL_MEMORY * 0.3

인수 object_store_memory_per_node설정하면 RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY - argument_object_store_memory_per_node

또한 레이 작업자 노드당 개체 저장소 메모리 크기는 운영 체제의 공유 메모리에 의해 제한됩니다. 최대값은 다음과 같습니다. OBJECT_STORE_MEMORY_PER_NODE_CAP = (SPARK_WORKER_NODE_OS_SHARED_MEMORY / MAX_NUMBER_OF_LOCAL_RAY_WORKER_NODES * 0.8)

SPARK_WORKER_NODE_OS_SHARED_MEMORY/dev/shm Apache Spark 작업자 노드에 대해 구성된 디스크 크기입니다.

크기 조정 모범 사례

각 Ray 작업자 노드에 대한 CPU 및 GPU 번호 설정

인수 num_cpus_worker_node 를 Apache Spark 작업자 노드당 CPU 코어 수로 설정하는 것이 좋습니다. 마찬가지로 Apache Spark 작업자 노드당 GPU 수로 설정하는 num_gpus_worker_node 것이 최적입니다. 이 구성을 통해 각 Apache Spark 작업자 노드는 각 Apache Spark 작업자 노드의 리소스를 완전히 활용하는 하나의 Ray 작업자 노드를 시작합니다.

Apache Spark 클러스터를 시작할 때 Azure Databricks 클러스터 구성 내에서 환경 변수를 RAY_memory_monitor_refresh_ms에서 0으로 설정합니다.

Apache Spark 및 Ray 하이브리드 워크로드에 대한 메모리 리소스 구성

Azure Databricks 클러스터에서 하이브리드 Spark 및 Ray 워크로드를 실행하는 경우 Azure Databricks는 Spark 실행기 메모리를 작은 값으로 줄이는 것이 좋습니다. 예를 들어 Azure Databricks 클러스터 구성에서 spark.executor.memory 4g 설정합니다.

Apache Spark 실행기는 GC를 지연적으로 트리거하는 Java 프로세스이며 Apache Spark 데이터 세트 캐시는 많은 Apache Spark 실행기 메모리를 사용합니다. 이렇게 하면 Ray가 사용할 수 있는 사용 가능한 메모리가 줄어듭니다. 메모리 부족 오류를 방지하려면 spark.executor.memory 설정을 줄이십시오.

Apache Spark 및 Ray 하이브리드 워크로드에 대한 계산 리소스 구성

Azure Databricks 클러스터에서 하이브리드 Spark 및 Ray 워크로드를 실행하는 경우 클러스터 노드 또는 Ray 작업자 노드를 자동으로 확장 가능하게 만드는 것이 좋습니다. 예시:

Azure Databricks 클러스터를 시작하는 데 사용할 수 있는 고정된 수의 작업자 노드가 있는 경우 Ray-on-Spark 자동 크기 조정을 사용하도록 설정하는 것이 좋습니다. 실행 중인 Ray 워크로드가 없으면 Ray 클러스터가 축소되어 Apache Spark 작업에서 사용할 수 있도록 리소스를 해제할 수 있습니다. Apache Spark 작업이 완료되고 Ray가 다시 사용되면 Ray-on-Spark 클러스터가 수요에 맞게 다시 강화됩니다.

또한 Azure Databricks 및 Ray-on-spark 클러스터를 자동으로 확장 가능하게 만들 수 있습니다. 예를 들어 Azure Databricks 클러스터의 자동 확장 가능한 노드를 최대 10개 노드로 구성하고, Ray-on-Spark 작업자 노드를 최대 4개의 노드로 구성하고, 각 Apache Spark 작업자의 리소스를 완전히 활용하도록 각 Ray 작업자 노드를 구성하는 경우 Ray 워크로드는 이러한 클러스터 구성에서 최대 4개의 노드 리소스를 사용할 수 있습니다. 이에 비해 Apache Spark 작업은 최대 6개 노드의 리소스를 할당할 수 있습니다.