Container Runtime on multi-node clusters¶
In this preview, Container Runtime allows you to run
ML workloads on multi-node clusters in Snowflake Notebooks. The snowflake-ml-python library includes APIs to set the
number of nodes in the compute pool available for ML workloads, allowing the resources available to a workload to be
scaled without resizing the compute pool. Another API retrieves a list of active nodes.
Um cluster com vários nós atribui um nó para ser o nó principal. Os nós adicionais são chamados de nós de trabalho. O nó principal orquestra operações paralelas no cluster e também contribui com seus recursos de computação para executar a carga de trabalho. Um cluster de vários nós com um nó ativo tem apenas um nó principal. Um cluster de vários nós com três nós ativos tem um nó principal e dois nós de trabalho, e todos os três nós participam da execução da sua carga de trabalho.
Pré-requisitos¶
Para usar clusters de vários nós para executar as cargas de trabalho de ML, é necessário:
Uma conta ativa do Snowflake com acesso a notebooks. Consulte Snowflake Notebooks.
Privileges to create and manage notebooks that use the container runtime. See Notebooks on Container Runtime.
Configurar um pool de computação¶
Para usar uma configuração de vários nós, você precisa de um pool de computação com pelo menos dois nós. Você pode criar um novo pool de computação ou alterar um pool existente. Em qualquer um dos comandos, passe um argumento MAX_NODES para definir a capacidade máxima do pool. É uma boa prática provisionar um ou mais nós extras para que você possa aumentar ou diminuir facilmente para cargas de trabalho maiores ou menores.
Para ver a capacidade de um pool de computação, use o comando DESCRIBE COMPUTE POOL. A capacidade está na coluna MAX_NODES da tabela retornada.
Para definir a capacidade de um pool de computação, use o comando ALTER COMPUTE POOL.
Executar uma carga de trabalho em um cluster de vários nós¶
A escolha de um pool de computação de vários nós para o notebook é a única ação necessária para usar vários nós no pool de computação para executar uma carga de trabalho de ML.
No notebook, defina o número de nós ativos usando a snowflake.ml.runtime_cluster.scale_cluster Python API. O número de nós ativos em um pool de computação é o número de nós disponíveis para executar uma carga de trabalho, até MAX_NODES do pool. O método usa o número total de nós ativos necessários, incluindo o nó principal e todos os nós de trabalho, como seu parâmetro principal.
Nota
Essa função é bloqueadora por padrão (ou seja, aguarda até que a operação de dimensionamento termine) e tem um tempo limite de 12 minutos. Se a operação atingir o tempo limite, ela voltará automaticamente ao estado anterior.
As operações de dimensionamento não persistem entre as sessões. Ou seja, se um notebook terminar com um número diferente de zero nós de trabalho, ele não será automaticamente ampliado na próxima vez que for iniciado. Você deve chamar a API de dimensionamento novamente para definir o número de nós de trabalho.
Sintaxe¶
Argumentos¶
expected_cluster_size(int): o número de nós ativos no pool de computação, até MAX_NODES do pool. Isso inclui o nó principal e todos os nós de trabalho.notebook_name(Opcional [str]): o nome do notebook em que a carga de trabalho é executada. O pool de computação a ser dimensionado é o pool no qual o notebook especificado está sendo executado. Se não for fornecido, ele será determinado automaticamente a partir do contexto atual. Uma exceção será aberta se o nome do notebook errado for usado.is_async(bool): controla se a função bloqueia a espera por dimensionamento:Se False (falso) (padrão): a função bloqueia até que o cluster esteja totalmente pronto ou o tempo da operação expire.
Se True (verdadeiro): a função retorna imediatamente após confirmar que a solicitação de dimensionamento foi aceita.
options(Opcional [Dict[str, Any]]): opções avançadas de configuração:rollback_after_seconds(int): tempo máximo antes da reversão automática se o dimensionamento não for concluído. O padrão é 720 segundos.block_until_min_cluster_size(int): número mínimo de nós que devem estar prontos antes do retorno da função.
Retornos¶
True se o pool de computação for dimensionado com sucesso para o número especificado de nós ativos. Caso contrário, é gerada uma exceção.
Exemplo¶
Obter o número disponível de nós¶
Use a get_nodes API para obter informações sobre os nós ativos no cluster. A função não recebe argumentos.
Sintaxe¶
Retornos¶
Uma lista contendo detalhes dos nós ativos no cluster. Cada elemento da lista é um dicionário com as seguintes chaves:
name(str): o nome do nó.cpus(int): o número de CPUs no nó.gpus(int): o número de GPUs no nó.
Exemplo¶
A saída do código de exemplo é a seguinte:
Treinamento distribuído em clusters de vários nós¶
The Container Runtime supports distributed training of LightGBM, XGBoost, and PyTorch models. The distributed training APIs for LightGBMEstimator, XGBEstimator, and PyTorch are documented in detail in the API Reference.
Configuração de dimensionamento¶
Todos os modelos oferecem um parâmetro opcional de configuração de dimensionamento que permite que você especifique o recurso para o trabalho de treinamento. A configuração de dimensionamento é uma instância de uma classe específica do modelo: LightGBMScalingConfig, XGBScalingConfig ou PyTorchScalingConfig, dependendo do tipo de modelo.
Objetos de configuração de dimensionamento do LightGBM e XGBoost têm os seguintes atributos:
num_workers: o número de processos de trabalho a serem usados para treinamento. O padrão é -1, que define automaticamente o número de processos de trabalho.num_cpu_per_worker: número de CPUs alocadas por processo de trabalho. O padrão é -1, que define automaticamente o número de CPUs por processo de trabalho.use_gpu: se você deve usar a GPU para treinamento. O padrão é None (Nenhum), permitindo que o estimador escolha com base no ambiente. Ao usar a GPU, certifique-se de configurar também os parâmetros do modelo para usar a GPU.
Nota
Generally, leave num_workers and num_cpu_per_worker at their default values, so Container Services
determines the best way to distribute these resources. The runtime assigns a worker for each node in the compute pool,
and the necessary CPUs or GPUs for each worker to complete the task.
Os objetos de configuração de dimensionamento do PyTorch têm os seguintes atributos:
num_cpus: o número de núcleos de CPU a serem reservados para cada trabalhador.num_gpus: o número de GPUs a serem reservadas para cada trabalhador. O padrão é 0, indicando que nenhuma GPUs está reservada.
Treinamento distribuído dos modelos LightGBM/XGBoost¶
- Uso da memória
Normalmente, um nó com n GB de RAM pode treinar um modelo com n/4 a n/3 de dados sem ficar sem memória. O tamanho máximo do conjunto de dados depende do número de processos de trabalho e do algoritmo de treinamento usado.
- Desempenho de computação
O desempenho do treinamento com vários nós depende dos parâmetros do modelo, como a profundidade da árvore, o número de árvores e o número máximo de compartimentos. Aumentar os valores desses parâmetros pode aumentar o tempo total de treinamento em um conjunto de dados.
Exemplo¶
O exemplo a seguir mostra como treinar um modelo do XGBoost em um cluster de vários nós. O treinamento dos modelos do LightGBM é semelhante.
Treinamento distribuído de modelos do PyTorch¶
Os modelos do PyTorch são treinados usando uma função de treinamento (train_func) que é chamada em cada processo de trabalho.
Uso de APIs de contexto¶
Durante a execução da função de treinamento, você pode usar APIs de contexto para acessar metadados essenciais sobre o ambiente de treinamento e para o encaminhamento de parâmetros do chamador para as funções de treinamento. Consulte Classes relacionadas para obter a documentação da classe de contexto do PyTorch.
O objeto de contexto expõe metadados de tempo de execução que você pode usar para personalizar o comportamento da função de treinamento. Você pode recuperá-los usando os métodos fornecidos get_node_rank, get_local_rank, get_world_size, entre outros.
O código a seguir é um exemplo de recuperação dos valores test e train do objeto de contexto; eles são passados em uma chave chamada dataset_map (que você pode ver no exemplo da função de treinamento mais adiante neste tópico). Esses valores são usados para criar objetos de conjunto de dados do PyTorch que, em seguida, são passados para o modelo.
Relatórios de métricas¶
Use o método
metrics_reporterdo objeto de contexto para enviar métricas da função de treinamento para o código de controle. Isso permite o monitoramento e a depuração em tempo real do processo de treinamento, conforme mostrado no exemplo a seguir.
Exemplo¶
O exemplo a seguir é uma função de treinamento para um modelo do PyTorch.
O código a seguir ilustra como iniciar o treinamento distribuído com a função de treinamento anterior. O exemplo cria um objeto distribuidor do PyTorch para executar o treinamento em vários nós, conecta os dados de treinamento e teste à função de treinamento por meio de um objeto de contexto e estabelece a configuração de dimensionamento antes de executar o treinador.
Limitações conhecidas e problemas comuns¶
These limitations and issues are likely to be addressed before multi-node training on Container Runtime is generally available.
Tempo limite da operação de dimensionamento expirado¶
A operação de dimensionamento pode falhar porque os novos nós não estão prontos dentro do tempo limite de 12 minutos. As possíveis causas incluem:
Capacidade insuficiente do pool. Você solicitou mais nós do que o MAX_NODES do pool. Aumente o MAX_NODES do pool.
Contenção de recursos. 12 minutos pode não ser tempo suficiente para aquecer os nós adicionados. Defina o MIN_NODES do pool como um número maior para manter alguns dos nós aquecidos ou aumente o número de nós ativos usando mais de uma chamada para
scale_clustercom um incremento menor. Outra opção é usar o modo assíncrono para não esperar que todos os nós estejam prontos:Use o modo assíncrono para operações sem bloqueio:
Aumentar o limite de tempo:
Erros no nome do notebook¶
Se for exibida uma mensagem de erro como «Notebook <name> does not exist or not authorized» (Notebook <nome> não existe ou não autorizado), isso significa que o nome do notebook detectado automaticamente não corresponde ao notebook atual. Isso pode ocorrer quando:
O nome do notebook contém caracteres especiais, como pontos e espaços
A detecção automática do nome do notebook não está funcionando corretamente
Solução: forneça explicitamente o parâmetro de nome do notebook. Observe que o nome do notebook precisa de aspas duplas para ser tratado como um identificador:
Os serviços SPCS não são limpos após uma operação de dimensionamento com falha¶
Quando as operações de dimensionamento falham, o sistema deve limpar todos os recursos criados na operação. No entanto, se isso falhar, um ou mais serviços SPCS poderão ser deixados no estado PENDING ou FAILED. Os serviços no estado PENDING podem se tornar ACTIVE posteriomente ou, se não houver capacidade no pool de computação, permanecer PENDING para sempre.
Para remover serviços nos estados PENDING ou FAILED, dimensione o cluster para ter um nó (zero nós de trabalho). Para limpar todos os serviços iniciados, encerre a sessão atual do notebook clicando em «End Session» (Encerrar sessão) na interface do notebook.