Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Ray agenda tarefas independentes em Python e acompanha o progresso delas para você. Neste notebook, você inicia o Ray no ambiente de computação 1xA10 anexado, envia oito tarefas de GPU sem esperar que cada uma termine e usa o painel do Ray para observá-las em execução, uma de cada vez, na GPU disponível.
Note
Este exemplo requer o ambiente de IA Databricks versão 5 ou superior.
Requirements
Este notebook requer tempo de execução de IA com o ambiente AI v5 . O passo a passo usa computação de GPU anexada 1xA10 para que você possa observar o Ray enfileirando tarefas.
Para conectar o notebook:
- Selecione Conectar no topo do caderno.
- Selecione GPU sem servidor.
- No painel lateral Ambiente, defina Acelerador para 1xA10.
- Selecione AI v5 como ambiente base.
- Selecione Aplicar, depois selecione Confirmar.
A AI v5 inclui Ray e PyTorch habilitado para CUDA, então este exemplo não instala pacotes adicionais. Para ver as oito tarefas rodando ao mesmo tempo, você pode conectar o notebook ao cálculo 8xH100 e rodá-lo novamente.
Inicializar Ray
Inicie o Ray para a sessão do notebook com ray_init(). A função exibe informações sobre o contexto Ray e imprime um link de painel que funciona através do proxy do driver Databricks.
import ray
from serverless_gpu import ray_init
ray_init()
Inspecionar os recursos do Ray
Antes de enviar trabalhos, confira os recursos que Ray encontrou. Com capacidade computacional 1xA10, o cluster deve informar uma 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."
)
Defina uma tarefa de GPU
Aplicar o decorador @ray.remote(num_gpus=1) a uma função cria uma tarefa do Ray que reserva uma GPU cada vez que é executada. Essa tarefa realiza um pequeno cálculo CUDA e retorna detalhes sobre a GPU que utilizou.
A chamada sleep mantém cada tarefa ativa por tempo suficiente para ser examinada no painel. Essa pausa é apenas para exploração de dashboards e não é para ser usada como 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,
}
Submeter tarefas de forma assíncrona
Antes de executar a próxima célula, abra o link do painel impresso por ray_init(). Na página Jobs, abra o job em execução e acompanhe a lista de tarefas após o envio. Com capacidade de processamento 1xA10, você deve ver uma tarefa em execução enquanto as outras sete aguardam disponibilidade de capacidade da GPU. Com o cálculo 8xH100, todas as oito tarefas podem ser executadas ao mesmo tempo.
Cada .remote() chamada envia uma tarefa sem esperar que ela termine e retorna uma referência ao objeto.
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__}.")
Recuperar resultados
Depois de inspecionar o painel, passe as referências aos objetos para ray.get(). Ray espera as tarefas terminarem e devolve os resultados em ordem de submissão.
results = ray.get(task_refs)
pprint(results, sort_dicts=False)
Com o cálculo 1xA10, os resultados mostram que todas as oito tarefas usaram a mesma GPU uma após a outra. Se você reexecutar o notebook com capacidade computacional 8xH100, o Ray poderá agendar todas as oito tarefas ao mesmo tempo sem precisar alterar o código.