Parallel Hyperparameter Optimization (HPO) on Container Runtime¶
A Snowflake ML Hyperparameter Optimization (HPO) API é uma estrutura independente de modelos que permite o ajuste eficiente e paralelo de hiperparâmetros de modelos. Você pode usar qualquer estrutura ou algoritmo de código aberto. Você também pode usar Snowflake ML APIs.
You can use HPO in a Snowflake Notebook that’s configured to use the Container Runtime on Snowpark Container Services (SPCS). After you create such a notebook, you can:
Treinar um modelo usando qualquer pacote de código aberto e usar esta API para distribuir o processo de ajuste de hiperparâmetros
Treinar um modelo usando as APIs de treinamento distribuído do Snowflake ML e dimensione HPO e, ao mesmo tempo, dimensione cada uma das execuções de treinamento
The HPO workload that you initiate from your notebook executes inside Snowpark Container Services on either CPU or GPU instances. The workload scales out to the CPU or GPU cores that are available on a single node in the SPCS compute pool.
A HPO API paralelizada oferece os seguintes benefícios:
Uma única API que lida automaticamente com todas as complexidades da distribuição do treinamento em vários recursos
A capacidade de treinar com praticamente qualquer framework ou algoritmo usando estruturas de código aberto ML ou APIs de modelagem do Snowflake ML
Uma seleção de opções de ajuste e amostragem, incluindo algoritmos de pesquisa Bayesiana e aleatória, juntamente com várias funções de amostragem contínuas e não contínuas
Forte integração com o restante do Snowflake; por exemplo, ingestão eficiente de dados por meio do Snowflake Datasets ou Dataframes e captura automática da linhagem do ML
Nota
Você pode dimensionar a execução do HPO para usar vários nós no pool de computação SPCS. Para obter mais informações, consulte Executar uma carga de trabalho em um cluster de vários nós.
Otimizar os hiperparâmetros de um modelo¶
Use a Snowflake ML HPO API para ajustar um modelo. As etapas a seguir ilustram o processo:
Ingerir os dados.
Usar o algoritmo de pesquisa para definir a estratégia usada para otimizar os hiperparâmetros.
Definir como os hiperparâmetros são amostrados.
Configurar o ajustador.
Obter os hiperparâmetros e as métricas de treinamento de cada trabalho de treinamento.
Iniciar o trabalho de treinamento.
Obter os resultados do trabalho de treinamento.
As seções a seguir explicam as etapas anteriores. Para obter um exemplo, consulte Exemplo do Container Runtime HPO.
Ingerir os dados¶
Use o objeto dataset_map para ingerir os dados na HPO API. O objeto dataset_map é um dicionário que combina o conjunto de dados de treinamento ou teste com o objeto Snowflake DataConnector correspondente. O objeto dataset_map é passado para a função de treinamento. A seguir, um exemplo de um objeto dataset_map:
Definir o algoritmo de pesquisa¶
Defina o algoritmo de pesquisa usado para explorar o espaço do hiperparâmetro. O algoritmo usa os resultados de tentativas anteriores para determinar como configurar os hiperparâmetros. Você pode usar os seguintes algoritmos de pesquisa:
Pesquisa de grade
Explora uma grade para valores de hiperparâmetros que você define. A HPO API avalia todas as combinações possíveis de hiperparâmetros. A seguir, um exemplo de uma grade de hiperparâmetros:
No exemplo anterior, cada parâmetro tem dois valores possíveis. Há 8 (2 * 2 * 2) combinações possíveis de hiperparâmetros.
Otimização bayesiana
Usa um modelo probabilístico para determinar o próximo conjunto de hiperparâmetros a ser avaliado. O algoritmo usa os resultados de tentativas anteriores para determinar como configurar os hiperparâmetros. Para obter mais informações sobre a otimização bayesiana, consulte Otimização bayesiana.
Pesquisa aleatória
São obtidas amostras aleatórias do espaço de hiperparâmetros. É uma abordagem simples e eficaz que funciona particularmente bem com espaços de pesquisa grandes ou mistos (contínuos ou discretos).
Você pode usar o código a seguir para definir o algoritmo de pesquisa:
Definir amostragem de hiperparâmetros¶
Use as funções do espaço de pesquisa para definir o método de amostragem de hiperparâmetros durante cada tentativa. Use-as para descrever o intervalo e o tipo de valores que os hiperparâmetros podem assumir.
Veja a seguir as funções de amostragem disponíveis:
uniform(
lower,upper): são obtidas uniformemente amostras de um valor contínuo entre o inferior e o superior. Útil para parâmetros como taxas de desistência ou pontos fortes de regularização.loguniform(
lower,upper): são obtidas amostras de um valor no espaço logarítmico, ideal para parâmetros que abrangem várias ordens de magnitude (por exemplo, taxas de aprendizado).randint(
lower,upper): são obtidas uniformemente amostras de um número inteiro entre o inferior (inclusivo) e o superior (exclusivo). Adequado para parâmetros discretos, como o número de camadas.choice(options): seleciona aleatoriamente um valor de uma lista fornecida. Geralmente usado para parâmetros categóricos.
A seguir, um exemplo de como você pode definir o espaço de pesquisa com a função uniform:
Configurar o ajustador¶
Use o objeto TunerConfig para configurar o ajustador. No objeto, você especifica a métrica que está sendo otimizada, o modo de otimização e os outros parâmetros de execução. Veja a seguir as opções de configuração disponíveis:
Métrica A métrica de desempenho, como precisão ou perda, que você está otimizando.
Modo Determina se o objetivo é maximizar ou minimizar a métrica (
"max"ou"min").Algoritmo de pesquisa Especifica a estratégia para explorar o espaço de hiperparâmetros.
Número de tentativas Define o número total de configurações de hiperparâmetro a serem avaliadas.
Simultaneidade Define quantas tentativas podem ser executadas ao mesmo tempo.
O código de exemplo a seguir usa a biblioteca de otimização bayesiana para maximizar a precisão de um modelo em cinco tentativas.
Obter os hiperparâmetros e as métricas de treinamento¶
A Snowflake ML HPO API requer as métricas de treinamento e os hiperparâmetros de cada execução de treinamento para otimizar os hiperparâmetros de forma eficaz. Use o objeto TunerContext para obter os hiperparâmetros e as métricas de treinamento. O exemplo a seguir cria uma função de treinamento para obter os hiperparâmetros e as métricas de treinamento:
Iniciar o trabalho de treinamento¶
Use o objeto Tuner para iniciar o trabalho de treinamento. O objeto Tuner usa a função de treinamento, o espaço de pesquisa e a configuração do ajustador como argumentos. A seguir, um exemplo de como iniciar o trabalho de treinamento:
O código anterior distribui a função de treinamento entre os recursos disponíveis. Ele coleta e resume os resultados dos testes e identifica a configuração de melhor desempenho.
Obter os resultados do trabalho de treinamento¶
Após a conclusão de todas as tentativas, o objeto
TunerResultsconsolida os resultados de cada tentativa. Ele fornece acesso estruturado às métricas de desempenho, à melhor configuração e ao melhor modelo.Os atributos disponíveis são os seguintes:
results: um Pandas DataFrame contendo métricas e configurações para cada tentativa.
best_result: uma linha DataFrame que resume a tentativa com o melhor desempenho.
best_model: a instância do modelo associada à melhor tentativa, se aplicável.
O código a seguir obtém os resultados, o melhor modelo e o melhor resultado:
Referência de API¶
Ajustador¶
A seguir, a instrução de importação do módulo Ajustador:
A classe Ajustador é a principal interface para interagir com a HPO API do Container Runtime. Para executar um trabalho de HPO, use o código a seguir para inicializar um objeto Ajustador e chamar o método de execução com os conjuntos de dados do Snowflake.
SearchSpace¶
A seguir, a instrução de importação para o espaço de pesquisa:
O código a seguir define as funções do espaço de pesquisa:
TunerConfig¶
A seguir, a instrução de importação do módulo TunerConfig:
Use o código a seguir para definir a classe de configuração do ajustador:
SearchAlgorithm¶
A seguir, a instrução de importação do algoritmo de pesquisa:
O código a seguir cria um objeto de algoritmo de pesquisa de otimização bayesiana:
O código a seguir cria um objeto de algoritmo de pesquisa aleatória:
TunerResults¶
O código a seguir cria um objeto TunerResults:
get_tuner_context¶
A seguir, a instrução de importação do módulo get_tuner_context:
Esse método auxiliar foi projetado para ser chamado dentro da função de treinamento. Ele retorna um objeto TunerContext que encapsula vários campos úteis para a execução do teste, inclusive:
Hiperparâmetros selecionados pela estrutura de HPO para o teste atual.
O conjunto de dados necessário para o treinamento.
Uma função auxiliar para relatar métricas, orientando a estrutura de HPO na sugestão do próximo conjunto de hiperparâmetros
O código a seguir cria um objeto de contexto do ajustador:
Limitações¶
A otimização bayesiana requer espaços de pesquisa contínuos e funciona apenas com a função de amostragem uniforme. Ela é incompatível com parâmetros discretos amostrados usando os métodos tune.randint ou tune.choice. Para contornar essa limitação, use tune.uniform e converta o parâmetro dentro da função de treinamento ou mude para um algoritmo de amostragem que lide com espaços discretos e contínuos, como tune.RandomSearch.
Solução de problemas¶
Mensagem de erro |
Causas possíveis |
Possíveis soluções |
|---|---|---|
Configuração inválida do espaço de pesquisa: BayesOpt exige que todas as funções de amostragem sejam do tipo ‘Uniforme”. |
A otimização bayesiana funciona apenas com amostragem uniforme, não com amostras discretas. (Consulte Limitações acima.) |
|
Recursos insuficientes de CPU. Necessário: 16, Disponível: 8. O número de recursos necessários e disponíveis pode ser diferente. |
|
Siga as orientações fornecidas pela mensagem de erro. |
Recursos insuficientes de GPU. Necessários: 4, Disponíveis: 2. Pode se referir a CPU ou GPU. O número de recursos necessários e disponíveis pode ser diferente. |
|
Siga as orientações fornecidas pela mensagem de erro. |