Treinar modelo de PyTorch

Este artigo descreverá de que modo usar o componente Treinar modelo de PyTorch no designer do Azure Machine Learning para treinar modelos de PyTorch, como o DenseNet. O treinamento ocorre depois que você define um modelo, escolhe seus parâmetros e requer dados rotulados.

No momento, o componente Treinar modelo de PyTorch é compatível com um nó único e o treinamento distribuído.

Como usar o módulo Treinar modelo de PyTorch

  1. Adicione o componente DenseNet ou ResNet ao seu rascunho de pipeline no designer.

  2. Adicione o componente Treinar modelo de PyTorch ao pipeline. Você pode encontrar esse componente na categoria Treinamento do Modelo. Expanda a opção Treinar e arraste o componente Treinar modelo de PyTorch para seu pipeline.

    Observação

    O componente Treinar modelo de PyTorch será executado de modo mais adequado em uma computação do tipo GPU de um grande conjunto de dados. Caso contrário, haverá falha no pipeline. Você pode selecionar computação para um componente específico no painel direito do componente configurando Usar outro destino de computação.

  3. Na entrada à esquerda, anexe um modelo não treinado. Anexe o conjunto de dados de treinamento e o conjunto de dados de validação à entrada do meio e do lado direito do módulo Treinar modelo de PyTorch.

    Em um modelo não treinado, ele deverá ser um modelo de PyTorch, como o DenseNet. Caso contrário, um 'InvalidModelDirectoryError' será gerado.

    Já o conjunto de dados de treinamento deve ser um diretório de imagem rotulado. Confira Converter em Diretório de Imagem para saber como obter um diretório de imagem rotulado. Na ausência do rótulo, um 'NotLabeledDatasetError' será recebido.

    O conjunto de dados de treinamento e de validação devem ter as mesmas categorias de rótulo. Caso contrário, um InvalidDatasetError será recebido.

  4. Em Épocas, especifique quantas épocas você gostaria de treinar. Todo o conjunto de dados será iterado em cada época, cinco por padrão.

  5. Em Tamanho do lote, especifique quantas instâncias deseja treinar em um lote, por padrão, 16.

  6. Na opção Número da etapa de aquecimento, especifique quantas épocas você deseja usar a fim de aquecer o treinamento, caso a taxa de aprendizado inicial seja um pouco alta para começar a convergência, por padrão ela é 0.

  7. Na opção Taxa de aprendizado, especifique o valor da taxa de aprendizado. O valor padrão é 0,001. A taxa de aprendizado controla o tamanho da etapa usada no otimizador, como SGD, cada vez que o modelo é testado e corrigido.

    Ao definir uma taxa menor, você deve testar o modelo com mais frequência, com o risco de ficar paralisado em um platô local. Ao definir uma taxa maior, será possível executar a convergência de modo mais rápido, com o risco de ultrapassar os valores mínimos.

    Observação

    Caso a perda de treinamento se torne NaN durante o treinamento, uma taxa de aprendizado muito alta poderá causar esse tipo de cenário, diminuir a taxa de aprendizado poderá ajudar. No treinamento distribuído, para manter a descida do gradiente estável, a taxa de aprendizado real é calculada por lr * torch.distributed.get_world_size() porque o tamanho do lote do grupo do processo é o tamanho mundial multiplicado pelo tamanho do processo único. O decaimento da taxa de aprendizado polinomial será aplicado e poderá ajudar a obter um modelo com desempenho mais adequado.

  8. Em Semente aleatória, digite, opcionalmente, um valor inteiro para usar como semente. É recomendado usar uma semente se você quiser garantir a reprodutibilidade do experimento entre trabalhos.

  9. Em Paciência, especifique em quantas épocas deseja interromper o treinamento antecipadamente se a perda de validação não diminuir consecutivamente. Por padrão três.

  10. Em Imprimir frequência, especifique a frequência de impressão do log de treinamento em iterações de cada época, por padrão ela é 10.

  11. Envie o pipeline. Se o seu conjunto de dados tiver um tamanho maior, isso poderá demorar um pouco e a computação da GPU é a recomendada.

Treinamento distribuído

No treinamento distribuído, a carga de trabalho usada para treinar um modelo é dividida e compartilhada entre vários mini processadores chamados nós de trabalho. Esses nós de trabalho funcionam em paralelo para acelerar o treinamento de modelo. No momento, o designer é compatível com o treinamento distribuído para o componente Treinar modelo de PyTorch.

Tempo de treinamento

O treinamento distribuído possibilita treinar em um grande conjunto de dados, como o ImageNet (1.000 classes e 1,2 milhão de imagens), em apenas algumas horas usando o módulo Treinar modelo de PyTorch. A tabela a seguir mostrará o tempo de treinamento e o desempenho durante o treinamento de 50 épocas do Resnet50 no ImageNet do zero com base em diferentes dispositivos.

Dispositivos Tempo de Treinamento Taxa de Transferência de Treinamento Precisão de Validação Superior 1 Precisão de Validação Superior 5
16 GPUs V100 6h22min aproximadamente 3.200 imagens/s 68,83% 88,84%
8 GPUs V100 12h21min aproximadamente 1.670 imagens/s 68,84% 88,74%

Clique na guia "Métricas" deste componente e confira os grafos de métricas de treinamento, como "Treinar imagens por segundo" e "Precisão superior 1".

Uma captura de tela mostrando as métricas de treinamento

Como habilitar um treinamento distribuído

Para habilitar um treinamento distribuído no componente Modelo para treinar PyTorch, é possível definir as Configurações de trabalho no painel direito do componente. Somente o Cluster de cálculo AML é compatível com um treinamento distribuído.

Observação

É necessário usar várias GPUs para ativar um treinamento distribuído porque o componente Treinar modelo de PyTorch de back-end NCCL usa requisitos CUDA.

  1. Selecione o componente e abra o painel direito. Expanda a seção Configurações de trabalho.

    Uma captura de tela mostrando de que modo definir um treinamento distribuído na configuração de execução

  2. Verifique se você selecionou a computação AML para o destino de computação.

  3. Na seção Layout de recurso, é preciso definir os seguintes valores:

    • Contagem de nós: número de nós no destino de computação usado para executar um treinamento. Ele deverá ser menor ou igual aoNúmero máximo de nós de seu cluster de cálculo. Por padrão, ele é igual a 1. Isso significa obter um trabalho de nó único.

    • Contagem de processos por nó: número de processos disparados por nó. Ele deverá ser menor ou igual àUnidade de Processamento de sua computação. Por padrão, ele é igual a 1. Isso significa obter um trabalho de processo único.

    É possível verificar o Número máximo de nós e a Unidade de Processamento de sua computação clicando em cima do nome de computação na página de detalhes de computação.

    Uma captura de tela mostrando de que modo verificar um cluster de computação

É possível saber mais sobre um treinamento distribuído no Azure Machine Learning clicando aqui.

Solução de problemas de um treinamento distribuído

Caso habilite um treinamento distribuído neste componente, haverá logs de driver para cada processo. O 70_driver_log_0 é usado no processo mestre. É possível verificar os logs de driver para obter detalhes dos erros de cada processo na guia Saídas+logs localizada no painel direito.

Uma captura de tela mostrando o log de driver

Caso haja falha no treinamento distribuído habilitado pelo componente sem logs do 70_driver, será possível verificar o 70_mpi_log para obter detalhes do erro.

O exemplo abaixo mostrará um erro comum, que é a Contagem de processos por nó maior do que a Unidade de Processamento da computação.

Uma captura de tela mostrando o log MPI

É possível conferir este artigo para obter mais detalhes sobre a solução de problemas do componente.

Resultados

Após a conclusão do trabalho de pipeline, use o modelo para a pontuação, conecte o Modelo para treinar PyTorch ao Modelo de imagem de pontuação para prever os valores de novos exemplos de entrada.

Observações técnicas

Entradas esperadas

Nome Tipo Descrição
Modelo não treinado UntrainedModelDirectory Modelo não treinado, exige obter o PyTorch
Conjunto de dados de treinamento ImageDirectory Conjunto de dados de treinamento
Conjunto de dados de validação ImageDirectory Conjunto de validação para avaliação a cada época

Parâmetros do componente

Nome Intervalo Type Padrão Descrição
Épocas >0 Integer 5 Selecione a coluna que contém a coluna de rótulo ou de resultado
Tamanho do lote >0 Integer 16 Quantas instâncias treinar em um lote
Número da etapa de aquecimento >=0 Integer 0 Quantas épocas são necessárias para executar o treinamento de aquecimento
Taxa de aprendizado >=double.Epsilon Float 0,1 A taxa de aprendizagem inicial do otimizador Descendente do gradiente estocástico.
Propagação aleatória Qualquer Integer 1 A propagação para o gerador de número aleatório usado pelo modelo.
Paciência >0 Integer 3 Em quantas épocas interromper o treinamento antecipadamente
Frequência de impressão >0 Integer 10 Frequência de impressão do log de treinamento em iterações de cada época

Saídas

Nome Tipo Descrição
Modelo treinado ModelDirectory Modelo treinado

Próximas etapas

Confira o conjunto de componentes disponíveis no Azure Machine Learning.