Melhores práticas e resolução de problemas do Hyperopt
Nota
A versão de código aberto do Hyperopt não está mais sendo mantida.
O Hyperopt será removido na próxima versão principal do DBR ML. O Azure Databricks recomenda o uso do Optuna para uma experiência semelhante e acesso a algoritmos de ajuste de hiperparâmetros mais atualizados.
Melhores práticas
- As abordagens bayesianas podem ser muito mais eficientes do que a pesquisa em grelha e a pesquisa aleatória. Assim, com o algoritmo Hyperopt Tree of Parzen Estimators (TPE), você pode explorar mais hiperparâmetros e intervalos maiores. Usar o conhecimento do domínio para restringir o domínio de pesquisa pode otimizar o ajuste e produzir melhores resultados.
- Quando você usa
hp.choice()
o , o Hyperopt retorna o índice da lista de opções. Portanto, o parâmetro registrado no MLflow também é o índice. Usehyperopt.space_eval()
para recuperar os valores dos parâmetros. - Para modelos com longos tempos de treinamento, comece a experimentar pequenos conjuntos de dados e muitos hiperparâmetros. Use o MLflow para identificar os modelos com melhor desempenho e determinar quais hiperparâmetros podem ser corrigidos. Dessa forma, você pode reduzir o espaço de parâmetros à medida que se prepara para ajustar em escala.
- Aproveite o suporte Hyperopt para dimensões condicionais e hiperparâmetros. Por exemplo, quando você avalia vários sabores de descida de gradiente, em vez de limitar o espaço de hiperparâmetros apenas aos hiperparâmetros comuns, você pode fazer com que o Hyperopt inclua hiperparâmetros condicionais — aqueles que são apropriados apenas para um subconjunto dos sabores. Para obter mais informações sobre como usar parâmetros condicionais, consulte Definindo um espaço de pesquisa.
- Ao usar
SparkTrials
o , configure o paralelismo adequadamente para clusters somente para CPU versus clusters habilitados para GPU. No Azure Databricks, os clusters de CPU e GPU usam números diferentes de threads de executor por nó de trabalho. Os clusters de CPU usam vários threads de executor por nó. Os clusters de GPU usam apenas um thread de execução por nó para evitar conflitos entre várias tarefas do Spark que tentam usar a mesma GPU. Embora isso seja geralmente ideal para bibliotecas escritas para GPUs, significa que o paralelismo máximo é reduzido em clusters de GPU, portanto, esteja ciente de quantas GPUs cada avaliação pode usar ao selecionar tipos de instância de GPU. Consulte Clusters habilitados para GPU para obter detalhes. - Não use
SparkTrials
em clusters de dimensionamento automático. O Hyperopt seleciona o valor de paralelismo quando a execução começa. Se o cluster for dimensionado automaticamente, o Hyperopt não poderá aproveitar o novo tamanho do cluster.
Resolução de Problemas
- Uma perda relatada de NaN (não um número) geralmente significa que a função objetiva passou para
fmin()
NaN retornado. Isso não afeta outras execuções e você pode ignorá-lo com segurança. Para evitar esse resultado, tente ajustar o espaço do hiperparâmetro ou modificar a função objetiva. - Como o Hyperopt usa algoritmos de pesquisa estocásticos, a perda geralmente não diminui monotonicamente a cada execução. No entanto, esses métodos muitas vezes encontram os melhores hiperparâmetros mais rapidamente do que outros métodos.
- Tanto o Hyperopt quanto o Spark incorrem em sobrecarga que pode dominar a duração do teste para pequenas execuções de teste (baixas dezenas de segundos). A aceleração observada pode ser pequena ou até mesmo zero.
Exemplo de bloco de anotações: práticas recomendadas para conjuntos de dados de tamanhos diferentes
SparkTrials
executa os testes nos nós de trabalho do Spark. Este bloco de anotações fornece diretrizes sobre como mover conjuntos de dados de diferentes ordens de magnitude para nós de trabalho ao usar SparkTrials
o .