Dela via


Skala Ray-kluster på Azure Databricks

Lär dig hur du justerar storleken på ditt Ray-kluster för optimala prestanda, inklusive autoskalning, huvudnodkonfiguration, heterogena kluster och resursallokering.

Skapa ett Ray-kluster i autoskalningsläge

I Ray 2.8.0 och senare har Ray-kluster som startats i Azure Databricks stöd för integrering med automatisk skalning i Azure Databricks. Den här integreringen av automatisk skalning utlöser automatisk skalning av Azure Databricks-kluster internt i Azure Databricks-miljön.

Om du vill aktivera automatisk skalning kör du följande kommando:

För Ray-versionen under 2.10:

from ray.util.spark import setup_ray_cluster

setup_ray_cluster(
  num_worker_nodes=8,
  autoscale=True,
)

För Ray version 2.10 och senare:

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="/dbfs/path/to/ray_collected_logs"
)

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

API:et ray.util.spark.setup_ray_cluster skapar ett Ray-kluster på Apache Spark. Internt skapar det ett Apache Spark-bakgrundsjobb. Varje Apache Spark-uppgift i jobbet skapar en Ray-arbetsnod och Ray-huvudnoden skapas på drivrutinen. Argumenten min_worker_nodes och max_worker_nodes representerar intervallet för Ray-arbetsnoder som ska skapas och används för Ray-arbetsbelastningar. Om argumentet min_worker_nodes lämnas odefinierat startas ett Ray-kluster med fast storlek med max_worker_nodes antalet tillgängliga arbetare. Om du vill ange antalet PROCESSOR- eller GPU-kärnor som tilldelats varje Ray-arbetsnod anger du argumentet num_cpus_worker_node (standardvärde: 1) eller num_gpus_worker_node (standardvärde: 0).

Om automatisk skalning är aktiverat num_worker_nodes för Ray-versionen under 2.10 anger det maximala antalet Ray-arbetsnoder. Det minsta standardantalet ray worker-noder är noll. Den här standardinställningen innebär att när Ray-klustret är inaktivt skalar det ned till noll Ray Worker-noder. Detta kanske inte är idealiskt för snabb svarstid i alla scenarier, men det kan avsevärt minska kostnaderna när det är aktiverat.

I autoskalningsläge kan num_worker_nodes inte anges till ray.util.spark.MAX_NUM_WORKER_NODES.

Följande argument konfigurerar uppskalnings- och nedskalningshastigheten:

  • autoscale_upscaling_speed representerar antalet noder som tillåts vara väntande som en multipel av det aktuella antalet noder. Ju högre värde, desto mer aggressiv är uppskalningen. Om detta till exempel är inställt på 1,0 kan klustret växa i storlek med högst 100 % när som helst.
  • autoscale_idle_timeout_minutes representerar det antal minuter som måste passera innan autoskalning tar bort en inaktiv arbetsnod. Ju mindre värde, desto mer aggressiv är nedskalningen.

Med Ray 2.9.0 och senare kan du också ställa in autoscale_min_worker_nodes för att förhindra att Ray-klustret skalar ned till noll arbetare när Ray-klustret är inaktivt, vilket skulle göra att klustret avslutas.

Konfigurera resurser som används av Ray-huvudnoden

För Ray on Spark-konfigurationen begränsar Azure Databricks som standard resurser som allokerats till Ray-huvudnoden till:

  • 0 CPU-kärnor
  • 0 GPU:er
  • 128 MB heapminne
  • Lagringsminne för 128 MB-objekt

Det beror på att Ray-huvudnoden vanligtvis endast används för global samordning, inte för att köra Ray-uppgifter. Apache Spark-drivrutinsnodresurser delas med flera användare, så standardinställningen sparar resurser på Apache Spark-drivrutinssidan. Med Ray 2.8.0 och senare kan du konfigurera resurser som används av Ray-huvudnoden. Använd följande argument i api:et setup_ray_cluster:

  • num_cpus_head_node: ange processorkärnor som används av Ray-huvudnoden
  • num_gpus_head_node: ställa in GPU som används av Ray-huvudnod
  • object_store_memory_head_node: ange minnesstorlek för objektlagring efter Ray-huvudnod

Stöd för heterogena kluster

Du kan skapa ett Ray on Spark-kluster för effektivare och kostnadseffektivare träningskörningar och ange olika konfigurationer mellan Ray-huvudnoden och Ray-arbetsnoderna. Alla Ray-arbetsnoder måste dock ha samma konfiguration. Azure Databricks-kluster stöder inte helt heterogena kluster, men du kan skapa ett Azure Databricks-kluster med olika typer av drivrutin och arbetsinstanser genom att ange en klusterprincip. Till exempel:

{
  "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"
  }
}

Justera Konfigurationen av Ray-klustret

Den rekommenderade konfigurationen för varje Ray-arbetsnod är följande: Minst 4 CPU-kärnor per Ray-arbetsnod. Minst 10 GB heapminne för varje Ray Worker-nod.

När du anropar ray.util.spark.setup_ray_clusterrekommenderar Azure Databricks därför att du anger num_cpus_per_node ett värde som är större än eller lika med 4.

Mer information om hur du justerar heapminnet för varje Ray-arbetsnod finns i nästa avsnitt.

Minnesallokering för Ray-arbetsnoder

Varje Ray-arbetsnod använder två typer av minne: heapminne och objektlagringsminne.

Den allokerade minnesstorleken för varje typ bestäms enligt beskrivningen nedan.

Det totala minne som allokeras till varje Ray-arbetsnod är: 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 är det maximala antalet Ray Worker-noder som kan startas på Apache Spark-arbetsnoden. Detta bestäms av argumentet num_cpus_per_node eller num_gpus_per_node.

Om du inte anger argumentet object_store_memory_per_nodeär minnesstorleken för heapminnet och objektarkivets minnesstorlek som allokerats till varje Ray-arbetsnod: RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY * 0.7OBJECT_STORE_MEMORY_PER_NODE = RAY_WORKER_NODE_TOTAL_MEMORY * 0.3

Om du anger argumentet object_store_memory_per_node: RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY - argument_object_store_memory_per_node

Dessutom begränsas minnesstorleken för objektarkivet per Ray-arbetsnod av det delade minnet i operativsystemet. Det maximala värdet är: 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 är diskstorleken /dev/shm som konfigurerats för Apache Spark-arbetsnoden.

Metodtips för skalning

Ange cpu- och GPU-numret för varje Ray-arbetsnod

Vi rekommenderar att du anger argumentet num_cpus_worker_node till antalet CPU-kärnor per Apache Spark-arbetsnod. På samma sätt är det optimalt att ange num_gpus_worker_node antalet GPU:er per Apache Spark-arbetsnod. Med den här konfigurationen startar varje Apache Spark-arbetsnod en Ray Worker-nod som fullt ut använder resurserna för varje Apache Spark-arbetsnod.

Ange miljövariabeln RAY_memory_monitor_refresh_ms till 0 i Azure Databricks-klusterkonfigurationen när du startar Apache Spark-klustret.

Minnesresurskonfiguration för Apache Spark- och Ray-hybridarbetsbelastningar

Om du kör Spark- och Ray-hybridarbetsbelastningar i ett Azure Databricks-kluster rekommenderar Azure Databricks att du minskar Spark-körminnet till ett litet värde. Ange till exempel spark.executor.memory 4g i Azure Databricks-klusterkonfigurationen.

Apache Spark-kören är en Java-process som utlöser GC lazily, och Apache Spark-datauppsättningscache använder mycket Apache Spark-körminne. Detta minskar det tillgängliga minne som Ray kan använda. Minska konfigurationen spark.executor.memory för att undvika eventuella minnesfel.

Beräkningsresurskonfiguration för Apache Spark- och Ray-hybridarbetsbelastningar

Om du kör Hybrid Spark- och Ray-arbetsbelastningar i ett Azure Databricks-kluster rekommenderar vi att du gör antingen klusternoder eller Ray Worker-noder automatiskt skalbara. Till exempel:

Om du har ett fast antal tillgängliga arbetsnoder för att starta ett Azure Databricks-kluster rekommenderar vi att du aktiverar automatisk skalning av Ray-on-Spark. När inga Ray-arbetsbelastningar körs skalas Ray-klustret ned, vilket gör att resurser kan frigöras för användning av Apache Spark-uppgifter. När Apache Spark-uppgifter har slutförts och Ray används igen skalas Ray-on-Spark-klustret upp igen för att möta efterfrågan.

Dessutom kan du göra Azure Databricks- och Ray-on-spark-kluster automatiskt skalbara. Om du till exempel konfigurerar Azure Databricks-klustrets automatiskt skalbara noder till högst 10 noder, konfigurerar Ray-on-Spark-arbetsnoderna till högst fyra noder och ställer in en Ray-arbetsnod som ska användas per Apache Spark-arbetare, kan Ray-arbetsbelastningar använda högst fyra nodresurser i en sådan klusterkonfiguration. Som jämförelse kan Apache Spark-jobb allokera högst sex noder med resurser.