Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Ray programma compiti Python indipendenti e ne tiene traccia i progressi per te. In questo notebook, si avvia Ray su un calcolo 1xA10 collegato, si inviano otto compiti GPU senza aspettare che ognuno finisca, e si usa il dashboard di Ray per osservarli eseguire uno alla volta sulla GPU disponibile.
Note
Questo esempio richiede l'ambiente di IA Databricks versione 5 o superiore.
Requisiti
Questo notebook richiede un runtime AI con l'ambiente AI v5 . La guida utilizza un calcolo GPU collegato a 1xA10 così puoi osservare il funzionamento della coda Ray.
Per collegare il quaderno:
- Seleziona Collega in cima al quaderno.
- Selezionare GPU serverless.
- Nel pannello laterale Environment, imposta Acceleratore su 1xA10.
- Seleziona AI v5 come ambiente base.
- Seleziona Applica, poi seleziona Conferma.
AI v5 include Ray e PyTorch abilitato a CUDA, quindi questo esempio non installa pacchetti aggiuntivi. Per vedere tutte e otto le attività eseguite contemporaneamente, puoi invece collegare il notebook a 8xH100 compute e riavviarlo.
Inizializza Ray
Avvia Ray per la sessione notebook con ray_init(). La funzione visualizza informazioni sul contesto Ray e stampa un link alla dashboard che funziona tramite il proxy del driver di Databricks.
import ray
from serverless_gpu import ray_init
ray_init()
Ispezionare le risorse Ray
Prima di inviare il lavoro, controlla le risorse che Ray ha scoperto. Con 1xA10 come risorsa di calcolo, il cluster dovrebbe riportare una GPU.
from pprint import pprint
cluster_resources = ray.cluster_resources()
available_resources = ray.available_resources()
pprint(
{
"cluster_resources": cluster_resources,
"available_resources": available_resources,
},
sort_dicts=False,
)
if cluster_resources.get("GPU", 0) < 1:
raise RuntimeError(
"Ray did not detect a GPU. Attach the notebook to 1xA10 or 8xH100 compute, then rerun it."
)
Definisci un compito GPU
Decorare una funzione con @ray.remote(num_gpus=1) crea un task Ray che riserva una GPU ogni volta che viene eseguito. Questo compito esegue un piccolo calcolo CUDA e restituisce dettagli sulla GPU utilizzata.
La sleep chiamata mantiene attiva ogni compito abbastanza a lungo da poterla ispezionare nella dashboard. Questa pausa serve solo per l'esplorazione della dashboard e non è pensata per essere usata come benchmark.
@ray.remote(num_gpus=1)
def run_gpu_task(task_id: int, inspection_seconds: int) -> dict:
import os
import time
import ray
import torch
values = torch.arange(1, 5, dtype=torch.float32, device="cuda") + task_id
computation_result = torch.square(values).sum().item()
torch.cuda.synchronize()
time.sleep(inspection_seconds)
return {
"task_id": task_id,
"ray_gpu_ids": ray.get_gpu_ids(),
"cuda_visible_devices": os.environ.get("CUDA_VISIBLE_DEVICES"),
"gpu_model": torch.cuda.get_device_name(0),
"computation_result": computation_result,
}
Invia attività asincronamente
Prima di eseguire la prossima cella, apri il link della dashboard stampato da ray_init(). Dalla pagina Jobs , apri il job in esecuzione e guarda la lista delle attività dopo l'invio. Con 1xA10 di calcolo, dovresti vedere un compito in esecuzione mentre gli altri sette aspettano la capacità della GPU. Con il calcolo 8xH100, tutti e otto i compiti possono essere eseguiti contemporaneamente.
Ogni .remote() chiamata invia un'attività senza aspettare che venga conclusa e restituisce un riferimento all'oggetto.
task_refs = [run_gpu_task.remote(task_id, inspection_seconds=10) for task_id in range(8)]
print(f"Submitted {len(task_refs)} tasks.")
print(f"Each submission returned a {type(task_refs[0]).__name__}.")
Recupero dei risultati
Dopo aver ispezionato il pannello, passa i riferimenti agli oggetti a ray.get(). Ray aspetta che le prove finiscano e restituisce i risultati in ordine di consegna.
results = ray.get(task_refs)
pprint(results, sort_dicts=False)
Con il calcolo 1xA10, i risultati mostrano che tutte e otto le attività hanno usato la stessa GPU una dopo l'altra. Se riesegui il notebook con calcolo 8xH100, Ray può programmare tutte e otto le attività contemporaneamente senza alcun cambiamento di codice.