Condividi tramite


Ridimensionare i cluster Ray in Azure Databricks

Informazioni su come ottimizzare le dimensioni del cluster Ray per ottenere prestazioni ottimali, tra cui scalabilità automatica, configurazione del nodo head, cluster eterogenei e allocazione delle risorse.

Creare un cluster Ray in modalità di scalabilità automatica

In Ray 2.8.0 e versioni successive, i cluster Ray sono stati avviati in Azure Databricks supportano l'integrazione con la scalabilità automatica di Azure Databricks. Questa integrazione della scalabilità automatica attiva la scalabilità automatica del cluster Azure Databricks internamente all'interno dell'ambiente Azure Databricks.

Per abilitare la scalabilità automatica, eseguire il comando seguente:

Per Ray versione seguente 2.10:

from ray.util.spark import setup_ray_cluster

setup_ray_cluster(
  num_worker_nodes=8,
  autoscale=True,
)

Per Ray versione 2.10 e successive:

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)

L'API ray.util.spark.setup_ray_cluster crea un cluster Ray in Apache Spark. Internamente, crea un processo Apache Spark in background. Ogni attività Apache Spark nel processo crea un nodo di lavoro Ray e il nodo head Ray viene creato nel driver. Gli argomenti min_worker_nodes e max_worker_nodes rappresentano l'intervallo di nodi di lavoro Ray da creare e usare per i carichi di lavoro Ray. Se l'argomento min_worker_nodes viene lasciato indefinito, verrà avviato un cluster Ray a dimensione fissa con max_worker_nodes il numero di ruoli di lavoro disponibili. Per specificare il numero di core CPU o GPU assegnati a ogni nodo del ruolo di lavoro Ray, impostare l'argomento num_cpus_worker_node (valore predefinito: 1) o num_gpus_worker_node (valore predefinito: 0).

Per Ray versione precedente alla 2.10, se la scalabilità automatica è abilitata, num_worker_nodes indica il numero massimo di nodi di lavoro Ray. Il numero minimo predefinito di nodi del ruolo di lavoro Ray è zero. Questa impostazione predefinita indica che quando il cluster Ray è inattivo, si riduce a zero nodi del ruolo di lavoro Ray. Questo potrebbe non essere ideale per la velocità di risposta rapida in tutti gli scenari, ma può ridurre in modo significativo i costi quando è abilitato.

In modalità di scalabilità automatica non è possibile impostare num_worker_nodes su ray.util.spark.MAX_NUM_WORKER_NODES.

Gli argomenti seguenti configurano la velocità di ridimensionamento e riduzione delle prestazioni:

  • autoscale_upscaling_speed rappresenta il numero di nodi consentiti in sospeso come multiplo del numero corrente di nodi. Maggiore è il valore, più aggressivo è il ridimensionamento. Ad esempio, se questo valore è impostato su 1,0, il cluster può aumentare di dimensioni al massimo del 100% in qualsiasi momento.
  • autoscale_idle_timeout_minutes rappresenta il numero di minuti che è necessario passare prima che il ridimensionamento automatico rimuova un nodo di lavoro inattiva. Minore è il valore, più aggressivo è il ridimensionamento.

Con Ray 2.9.0 e versioni successive, è anche possibile impostare autoscale_min_worker_nodes per impedire al cluster Ray di ridurre i ruoli di lavoro a zero quando il cluster Ray è inattivo, causando la chiusura del cluster.

Configurare le risorse usate dal nodo Head Ray

Per impostazione predefinita, per la configurazione di Ray on Spark, Azure Databricks limita le risorse allocate al nodo head Ray per:

  • 0 core CPU
  • 0 GPU
  • Memoria heap da 128 MB
  • Memoria dell'archivio oggetti da 128 MB

Questo perché il nodo head Ray viene in genere usato solo per il coordinamento globale, non per l'esecuzione di attività Ray. Le risorse del nodo del driver Apache Spark vengono condivise con più utenti, quindi l'impostazione predefinita salva le risorse sul lato driver Apache Spark. Con Ray 2.8.0 e versioni successive, è possibile configurare le risorse usate dal nodo head Ray. Usare gli argomenti seguenti nell'API setup_ray_cluster:

  • num_cpus_head_node: impostazione dei core CPU usati dal nodo head Ray
  • num_gpus_head_node: impostazione della GPU usata dal nodo head Ray
  • object_store_memory_head_node: impostazione delle dimensioni della memoria dell'archivio oggetti in base al nodo head Ray

Supporto per cluster eterogenei

È possibile creare un cluster Ray on Spark per esecuzioni di training più efficienti e convenienti e impostare configurazioni diverse tra il nodo head Ray e i nodi di lavoro Ray. Tuttavia, tutti i nodi di lavoro Ray devono avere la stessa configurazione. I cluster di Azure Databricks non supportano completamente cluster eterogenei, ma è possibile creare un cluster di Azure Databricks con tipi di driver e istanze di lavoro diversi impostando criteri del cluster. Ad esempio:

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

Ottimizzare la configurazione del cluster Ray

La configurazione consigliata per ogni nodo del ruolo di lavoro Ray è la seguente: Minimo 4 core CPU per nodo del ruolo di lavoro Ray. Memoria heap minima di 10 GB per ogni nodo del ruolo di lavoro Ray.

Pertanto, quando si chiama ray.util.spark.setup_ray_cluster, Azure Databricks consiglia di impostare num_cpus_per_node un valore maggiore o uguale a 4.

Vedere la sezione successiva per informazioni dettagliate sull'ottimizzazione della memoria dell'heap per ogni nodo del ruolo di lavoro Ray.

Allocazione di memoria per i nodi del ruolo di lavoro Ray

Ogni nodo del ruolo di lavoro Ray usa due tipi di memoria: memoria heap e memoria dell'archivio oggetti.

Le dimensioni di memoria allocate per ogni tipo vengono determinate come descritto di seguito.

La memoria totale allocata a ogni nodo del ruolo di lavoro 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 è il numero massimo di nodi di lavoro Ray che possono essere avviati nel nodo del ruolo di lavoro Apache Spark. Questo valore è determinato dall'argomento num_cpus_per_node o num_gpus_per_nodeda .

Se non si imposta l'argomento object_store_memory_per_node, le dimensioni della memoria dell'heap e le dimensioni dell'archivio oggetti allocate a ogni nodo del ruolo di lavoro Ray sono: RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY * 0.7OBJECT_STORE_MEMORY_PER_NODE = RAY_WORKER_NODE_TOTAL_MEMORY * 0.3

Se si imposta l'argomento object_store_memory_per_node: RAY_WORKER_NODE_HEAP_MEMORY = RAY_WORKER_NODE_TOTAL_MEMORY - argument_object_store_memory_per_node

Inoltre, le dimensioni della memoria dell'archivio oggetti per ogni nodo del ruolo di lavoro Ray sono limitate dalla memoria condivisa del sistema operativo. Il valore massimo è: 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 è la dimensione del /dev/shm disco configurata per il nodo del ruolo di lavoro Apache Spark.

Procedura consigliata per il ridimensionamento

Impostare il numero di CPU e GPU per ogni nodo del ruolo di lavoro Ray

È consigliabile impostare l'argomento num_cpus_worker_node sul numero di core CPU per ogni nodo del ruolo di lavoro Apache Spark. Analogamente, l'impostazione num_gpus_worker_node del numero di GPU per ogni nodo del ruolo di lavoro Apache Spark è ottimale. Con questa configurazione, ogni nodo del ruolo di lavoro Apache Spark avvia un nodo di lavoro Ray che utilizzerà completamente le risorse di ogni nodo del ruolo di lavoro Apache Spark.

Impostare la variabile RAY_memory_monitor_refresh_ms di ambiente su 0 all'interno della configurazione del cluster Azure Databricks all'avvio del cluster Apache Spark.

Configurazione delle risorse di memoria per carichi di lavoro ibridi Apache Spark e Ray

Se si eseguono carichi di lavoro Spark e Ray ibridi in un cluster Azure Databricks, Azure Databricks consiglia di ridurre la memoria dell'executor Spark a un valore ridotto. Ad esempio, impostare spark.executor.memory 4g nella configurazione del cluster Azure Databricks.

L'executor di Apache Spark è un processo Java che attiva GC in modo differinte e la cache del set di dati apache Spark usa una grande quantità di memoria dell'executor apache Spark. In questo modo si riduce la memoria disponibile che Ray può usare. Per evitare potenziali errori di memoria insufficiente, ridurre la spark.executor.memory configurazione.

Configurazione delle risorse di calcolo per carichi di lavoro ibridi Apache Spark e Ray

Se si eseguono carichi di lavoro Spark e Ray ibridi in un cluster Azure Databricks, è consigliabile rendere scalabili automaticamente i nodi del cluster o i nodi di lavoro Ray. Ad esempio:

Se è disponibile un numero fisso di nodi di lavoro per avviare un cluster Azure Databricks, è consigliabile abilitare la scalabilità automatica Ray-on-Spark. Quando non sono in esecuzione carichi di lavoro Ray, il cluster Ray si riduce, consentendo di liberare le risorse per l'uso da parte delle attività di Apache Spark. Al termine delle attività di Apache Spark e Ray viene usato di nuovo, il cluster Ray-on-Spark verrà nuovamente ridimensionato per soddisfare la domanda.

È anche possibile rendere scalabili automaticamente i cluster Azure Databricks e Ray-on-Spark. Ad esempio, se si configurano i nodi scalabili automatici del cluster Azure Databricks su un massimo di 10 nodi, configurare i nodi del ruolo di lavoro Ray on Spark su un massimo di quattro nodi e impostare un nodo di lavoro Ray per funzionare per ogni ruolo di lavoro Apache Spark, i carichi di lavoro Ray possono usare al massimo quattro nodi in una configurazione di tale cluster. In confronto, i processi Apache Spark possono allocare al massimo sei nodi di risorse.