Use seus próprios scripts de treinamento e selecione automaticamente o melhor modelo usando a otimização de hiperparâmetros no Amazon SageMaker PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Use seus próprios scripts de treinamento e selecione automaticamente o melhor modelo usando a otimização de hiperparâmetros no Amazon SageMaker

O sucesso de qualquer pipeline de aprendizado de máquina (ML) depende não apenas da qualidade do modelo usado, mas também da capacidade de treinar e iterar nesse modelo. Uma das principais maneiras de melhorar um modelo de ML é escolher melhores parâmetros ajustáveis, conhecidos como hiperparâmetros. Isso é conhecido como otimização de hiperparâmetros (HPO). No entanto, fazer esse ajuste manualmente pode ser complicado devido ao tamanho do espaço de pesquisa, às vezes envolvendo milhares de iterações de treinamento.

Esta postagem mostra como Amazon Sage Maker permite que você não apenas traga seu próprio algoritmo de modelo usando o modo de script, mas também use o algoritmo HPO integrado. Você aprenderá como produzir facilmente a métrica de avaliação de sua escolha para Amazon CloudWatch, do qual você pode extrair essa métrica para guiar o algoritmo HPO automático. Em seguida, você pode criar um trabalho de ajuste HPO que orquestra vários trabalhos de treinamento e recursos de computação associados. Após a conclusão, você pode ver o melhor trabalho de treinamento de acordo com a métrica de avaliação.

Visão geral da solução

Percorremos os seguintes passos:

  1. Use o modo de script do SageMaker para trazer nosso próprio modelo para um contêiner gerenciado pela AWS.
  2. Refatore nosso script de treinamento para imprimir nossa métrica de avaliação.
  3. Encontre a métrica no CloudWatch Logs.
  4. Extraia a métrica do CloudWatch.
  5. Use HPO para selecionar o melhor modelo ajustando essa métrica de avaliação.
  6. Monitore o HPO e encontre o melhor trabalho de treinamento.

Pré-requisitos

Para este passo a passo, você deve ter os seguintes pré-requisitos:

Use algoritmos personalizados em um contêiner gerenciado pela AWS

Consulte Traga seu próprio modelo com o modo de script do Amazon SageMaker para obter uma visão mais detalhada de como trazer um modelo personalizado para o SageMaker usando um contêiner gerenciado pela AWS.

Usamos o Conjunto de dados MNIST para este exemplo. MNIST é um conjunto de dados amplamente utilizado para classificação de dígitos manuscritos, consistindo de 70,000 imagens em escala de cinza de 28 × 28 pixels rotuladas de dígitos manuscritos. O conjunto de dados é dividido em 60,000 imagens de treinamento e 10,000 imagens de teste, contendo 10 classes (uma para cada dígito).

  1. Abra sua instância de notebook e execute o seguinte comando para baixar o mnist.py arquivo:
    !wget https://raw.githubusercontent.com/aws/amazon-sagemaker-examples/main/hyperparameter_tuning/pytorch_mnist/mnist.py

    Antes de obter e armazenar os dados, vamos criar uma sessão do SageMaker. Também devemos especificar o bucket S3 e o prefixo a serem usados ​​para treinamento e dados de modelo. Isso deve estar na mesma região da instância de notebook, treinamento e hospedagem. O código a seguir usa o balde padrão se já existir, ou cria um novo se não existir. Também devemos incluir o ARN da função IAM para fornecer acesso de treinamento e hospedagem aos seus dados. Nós usamos get_execution_role() para obter a função do IAM que você criou para sua instância de bloco de anotações.

  2. Crie uma sessão com o seguinte código:
    import sagemaker
    from sagemaker.tuner import (
    IntegerParameter,
    CategoricalParameter,
    ContinuousParameter,
    HyperparameterTuner,
    )
    session = sagemaker.Session()
    bucket = session.default_bucket()
    prefix = "sagemaker/DEMO-custom-hpo"
    role = sagemaker.get_execution_role()

  3. Agora vamos pegar os dados, armazená-los em nossa pasta local /datae carregue-o no Amazon S3:
    from torchvision.datasets import MNIST
    from torchvision import transforms
    MNIST.mirrors = ["https://sagemaker-sample-files.s3.amazonaws.com/datasets/image/MNIST/"]
    MNIST(
    "data",
    download=True,
    transform=transforms.Compose(
    [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]
    ),
    )
    inputs = session.upload_data(path="data", bucket=bucket, key_prefix=prefix)

    Agora podemos criar um estimador para configurar o trabalho de treinamento do PyTorch. Não nos concentramos no código de treinamento real aqui (mnist.py) Em grande detalhe. Vejamos como podemos invocar facilmente esse script de treinamento para inicializar um trabalho de treinamento.

  4. No código a seguir, incluímos um script de ponto de entrada chamado mnist.py que contém nosso código de treinamento personalizado:
    from sagemaker.pytorch import PyTorch
    estimator = PyTorch(
    entry_point="mnist.py",
    role=role,
    py_version="py3",
    framework_version="1.8.0",
    instance_count=1,
    instance_type="ml.c5.2xlarge",
    hyperparameters={"epochs": 5},
    )

  5. Para garantir que esse trabalho de treinamento tenha sido configurado corretamente, com o código de treinamento funcionando, podemos iniciar um trabalho de treinamento ajustando-o aos dados que carregamos no Amazon S3. O SageMaker garante que nossos dados estejam disponíveis no sistema de arquivos local, para que nosso script de treinamento possa apenas ler os dados do disco:
    estimator.fit({"training": inputs})

No entanto, não estamos criando um único trabalho de treinamento. Usamos o recurso de ajuste automático de modelo do SageMaker por meio de um trabalho de ajuste de hiperparâmetros. O ajuste do modelo é completamente independente do algoritmo do modelo real. Para obter mais informações sobre todos os hiperparâmetros que você pode ajustar, consulte Realize o ajuste automático do modelo com o SageMaker.

Para cada hiperparâmetro que queremos otimizar, temos que definir o seguinte:

  • Um nome
  • Um tipo (os parâmetros podem ser inteiros, contínuos ou categóricos)
  • Uma gama de valores para explorar
  • Um tipo de dimensionamento (linear, logarítmico, logarítmico reverso ou automático); isso nos permite controlar como um intervalo de parâmetro específico será explorado

Também devemos definir a métrica para a qual estamos otimizando. Pode ser qualquer valor numérico desde que esteja visível no log de treinamento e você pode passar uma expressão regular para extraí-lo.

Se olharmos a linha 181 em mnist.py, podemos ver como imprimimos no logger:

logger.info(
"Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)n".format(
test_loss, correct, len(test_loader.dataset), 100.0 * correct / len(test_loader.dataset)
)

Na verdade, podemos ver essa saída nos logs do trabalho de treinamento que acabamos de executar. Abrindo o grupo de log /aws/sagemaker/TrainingJobs no console do CloudWatch, devemos ter um evento de log começando com pytorch-training- seguido por um carimbo de data/hora e nome gerado.

A captura de tela a seguir destaca o log que estamos procurando.

Vamos agora começar a construir nosso trabalho de ajuste de hiperparâmetros.

  1. Conforme mencionado, devemos primeiro definir algumas informações sobre os hiperparâmetros, sob o objeto da seguinte forma:
    hyperparameter_ranges = {
    "lr": ContinuousParameter(0.001, 0.1),
    "batch-size": CategoricalParameter([32, 64, 128, 256, 512]),
    }

    Aqui definimos nossos dois hiperparâmetros. A taxa de aprendizado (lr) é um parâmetro contínuo (portanto, um valor contínuo) na faixa de 0.001 e 0.1. O tamanho do lote (tamanho do lote) é um parâmetro categórico com os valores discretos anteriores.

    Em seguida, especificamos a métrica objetiva que gostaríamos de ajustar e sua definição. Isso inclui a expressão regular (regex) necessária para extrair essa métrica dos logs do CloudWatch do trabalho de treinamento que vimos anteriormente. Também especificamos um nome descritivo de perda média de teste e o tipo objetivo como Minimizar, de modo que o ajuste do hiperparâmetro busca minimizar a métrica objetiva ao procurar a melhor configuração do hiperparâmetro.

  2. Especifique a métrica com o seguinte código:
    metric_definitions = [{"Name": "average test loss", "Regex": "Test set: Average loss: ([0-9.]+)"}]
    objective_metric_name = "average test loss"
    objective_type = "Minimize"

    Agora estamos prontos para criar nosso HyperparameterTuner objeto. Além do nome, tipo e definição da métrica objetiva, passamos no hyperparameter_ranges objeto e o estimador que criamos anteriormente. Também especificamos o número de tarefas que queremos executar no total, juntamente com o número que deve ser executado em paralelo. Escolhemos o número máximo de trabalhos como 9, mas você normalmente optaria por um número muito maior (como 50) para obter o desempenho ideal.

  3. Criar o HyperparameterTuner objeto com o seguinte código:
    tuner = HyperparameterTuner(
    estimator,
    objective_metric_name,
    hyperparameter_ranges,
    metric_definitions,
    max_jobs=9,
    max_parallel_jobs=3,
    objective_type=objective_type,
    )

Antes de iniciarmos o trabalho de ajuste, vale a pena observar como as combinações de hiperparâmetros são determinadas. Para obter bons resultados, você precisa escolher os intervalos certos para explorar. Por padrão, a estratégia de busca bayesiana é usada, descrita mais adiante em Como funciona o ajuste de hiperparâmetros.

Com a otimização bayesiana, o ajuste de hiperparâmetros é tratado como um regressão problema. Para resolver esse problema de regressão, ele adivinha quais combinações de hiperparâmetros obterão os melhores resultados e executa trabalhos de treinamento para testar esses valores. Ele usa regressão para escolher o próximo conjunto de valores de hiperparâmetros a serem testados. Há uma compensação clara de exploração/exploração que a estratégia de pesquisa faz aqui. Ele pode escolher valores de hiperparâmetros próximos à combinação que resultou no melhor trabalho de treinamento anterior para melhorar o desempenho de forma incremental. Ou pode escolher valores mais distantes, para tentar explorar uma nova gama de valores que ainda não é bem compreendida.

Você pode especificar outras estratégias de pesquisa, no entanto. As seguintes estratégias são suportadas no SageMaker:

  • Pesquisa de grade – Tenta todas as combinações possíveis dentro do intervalo de hiperparâmetros especificado.
  • Pesquisa aleatória – Tenta combinações aleatórias dentro do intervalo de valores especificados. Ele não depende dos resultados dos trabalhos de treinamento anteriores, portanto, você pode executar o número máximo de trabalhos de treinamento simultâneos sem afetar o desempenho do ajuste.
  • Pesquisa de hiperbanda – Usa resultados intermediários e finais de trabalhos de treinamento para realocar épocas para configurações de hiperparâmetros bem utilizados e interrompe automaticamente aqueles com baixo desempenho.

Você também pode explorar trazendo seu próprio algoritmo, conforme explicado em Traga seu próprio algoritmo de otimização de hiperparâmetros no Amazon SageMaker.

  1. Em seguida, iniciamos o treinamento no próprio objeto do sintonizador (não no estimador), chamando .fit() e passando no caminho S3 para nosso conjunto de dados de treinamento e teste:
    tuner.fit({"training": inputs})

Podemos então acompanhar o andamento de nosso trabalho de ajuste no console do SageMaker, no Jobs de ajuste de hiperparâmetros página. O trabalho de ajuste aumenta os recursos de computação subjacentes necessários orquestrando cada execução de treinamento individual e sua computação associada.

Assim, é fácil ver todos os trabalhos de treinamento individuais que foram concluídos ou estão em andamento, junto com seu valor de métrica objetivo associado. Na captura de tela a seguir, podemos ver que o primeiro lote de trabalhos de treinamento está concluído, que contém três no total de acordo com nosso especificado max_parallel_jobs valor de 3. Após a conclusão, podemos encontrar o melhor trabalho de treinamento - aquele que minimiza a perda média do teste - no Melhor trabalho de treinamento aba.

Captura de tela da lista de trabalhos de treinamento

limpar

Para evitar cobranças futuras, exclua os recursos inicializados. Esses são o bucket do S3, a função do IAM e a instância de bloco de anotações do SageMaker.

Conclusão

Nesta postagem, discutimos como podemos trazer nosso próprio modelo para o SageMaker e, em seguida, usar a otimização automatizada de hiperparâmetros para selecionar o melhor trabalho de treinamento. Usamos o popular conjunto de dados MNIST para ver como podemos especificar uma métrica de objetivo personalizada para a qual o trabalho de HPO deve ser otimizado. Ao extrair essa métrica objetiva do CloudWatch e especificar vários valores de hiperparâmetros, podemos iniciar e monitorar facilmente o trabalho HPO.

Se precisar de mais informações ou quiser ver como nossos clientes estão usando o HPO, consulte Ajuste automático de modelo do Amazon SageMaker. Adapte seu próprio modelo para otimização automatizada de hiperparâmetros no SageMaker hoje mesmo.


Sobre o autor

Use seus próprios scripts de treinamento e selecione automaticamente o melhor modelo usando a otimização de hiperparâmetros no Amazon SageMaker PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.Preço Sam é um consultor de serviços profissionais especializado em AI/ML e análise de dados na Amazon Web Services. Ele trabalha em estreita colaboração com clientes do setor público em saúde e ciências biológicas para resolver problemas desafiadores. Quando não está fazendo isso, Sam gosta de tocar violão e tênis e ver suas bandas indie favoritas.

Carimbo de hora:

Mais de Aprendizado de máquina da AWS