Conceitos do Hyperopt
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. A Databricks recomenda o uso do Optuna para otimização de nó único ou do RayTune para obter uma experiência semelhante à funcionalidade de ajuste de hiperparâmetro distribuído Hyperopt, que foi descontinuada. Saiba mais sobre o uso do RayTune no Databricks.
Este artigo descreve alguns dos conceitos que o senhor precisa conhecer para usar o Hyperopt distribuído.
Nesta secção:
Para obter exemplos que ilustram como usar o Hyperopt no Databricks, consulte Hyperopt.
fmin()
O senhor usa fmin() para executar uma Hyperopt execução. Os argumentos para fmin() são mostrados na tabela; consulte a documentação do site Hyperopt para obter mais informações. Para obter exemplos de como usar cada argumento, consulte o Notebook de exemplo.
Nome do argumento  | Descrição  | 
|---|---|
  | Função objetiva. O Hyperopt chama essa função com valores gerados a partir do espaço de hiperparâmetros fornecido no argumento space. Essa função pode retornar a perda como um valor escalar ou em um dicionário (consulte os documentos do Hyperopt para obter detalhes). Normalmente, essa função contém código para treinamento de modelos e cálculo de perdas.  | 
  | Define o espaço de hiperparâmetros a ser pesquisado. O Hyperopt oferece grande flexibilidade na definição desse espaço. O senhor pode escolher uma opção categórica, como algoritmo, ou uma distribuição probabilística para valores numéricos, como uniforme e log.  | 
  | Algoritmo de pesquisa Hyperopt a ser usado para pesquisar o espaço do hiperparâmetro. Os mais usados são   | 
  | Número de configurações de hiperparâmetros a serem testadas (o número de modelos a serem ajustados).  | 
  | Número de configurações de hiperparâmetro que o Hyperopt deve gerar antecipadamente. Como o algoritmo de geração de Hyperopt TPE pode levar algum tempo, pode ser útil aumentar esse valor além do valor default de 1, mas geralmente não maior do que a configuração   | 
  | Um objeto   | 
  | Uma função opcional de parada antecipada para determinar se   | 
A classe SparkTrials
SparkTrials é uma API desenvolvida pela Databricks que permite que o senhor distribua uma execução do Hyperopt sem fazer outras alterações no código do Hyperopt. SparkTrials acelera o ajuste de uma única máquina, distribuindo as tentativas para Spark trabalhador.
SparkTrials foi projetado para paralelizar os cálculos de modelos ML de máquina única, como o scikit-learn. Para modelos criados com algoritmos de ML distribuídos, como MLlib ou Horovod, não use SparkTrials. Nesse caso, o processo de criação de modelos é automaticamente paralelizado no clustering e o senhor deve usar a classe default Hyperopt Trials.
Esta seção descreve como configurar os argumentos que você passa para SparkTrials e os aspectos de implementação de SparkTrials.
Argumentos
SparkTrials usa dois argumentos opcionais:
- 
parallelism: Número máximo de ensaios a serem avaliados simultaneamente. Um número maior permite que o senhor amplie o teste de mais configurações de hiperparâmetros. Como o Hyperopt propõe novas tentativas com base em resultados anteriores, há uma compensação entre paralelismo e adaptabilidade. Para ummax_evalsfixo, um maior paralelismo acelera os cálculos, mas um menor paralelismo pode levar a melhores resultados, pois cada iteração tem acesso a mais resultados anteriores.padrão: Número de Spark executor disponível. Máximo: 128. Se o valor for maior do que o número de tarefas concorrentes permitidas pela configuração de clustering, o site
SparkTrialsreduzirá o paralelismo a esse valor. - 
timeout: Número máximo de segundos que uma chamadafmin()pode levar. Quando esse número for excedido, todas as execuções serão encerradas e o sitefmin()sairá. as informações sobre a execução concluída são salvas. 
Implantação
Ao definir a função objetiva fn passada para fmin() e ao selecionar uma configuração de agrupamento, é útil entender como SparkTrials distribui a tarefa de ajuste.
No Hyperopt, uma tentativa geralmente corresponde ao ajuste de um modelo em uma configuração de hiperparâmetros. O Hyperopt gera tentativas de forma iterativa, avalia-as e repete.
Com SparkTrials, o nó condutor do seu clustering gera novas tentativas e os nós worker avaliam essas tentativas. Cada tentativa é gerada com um Spark Job que tem uma tarefa e é avaliada na tarefa em uma máquina worker. Se o seu clustering estiver configurado para executar várias tarefas por worker, então várias tentativas poderão ser avaliadas de uma só vez nesse worker.
SparkTrials e MLflow
Databricks Runtime ML suporta o registro em MLflow a partir do trabalhador. O senhor pode adicionar código de registro personalizado na função objetiva que passa para o Hyperopt.
SparkTrials logs O ajuste resulta em uma execução aninhada em MLflow da seguinte forma:
- Execução principal ou principal: A chamada para 
fmin()é registrada como a execução principal. Se houver uma execução ativa,SparkTrialslogs para essa execução ativa e não encerra a execução quandofmin()retorna. Se não houver nenhuma execução ativa,SparkTrialscria uma nova execução, logs para ela e termina a execução antes quefmin()retorne. - Execução secundária: Cada configuração de hiperparâmetro testada (uma "tentativa") é registrada como uma execução filha sob a execução principal. MLflow log Os registros do trabalhador também são armazenados na execução filha correspondente.
 
Ao chamar fmin(), a Databricks recomenda o gerenciamento ativo da execução do MLflow; ou seja, envolva a chamada para fmin() em uma instrução with mlflow.start_run():. Isso garante que cada chamada fmin() seja registrada em uma execução principal MLflow separada e facilita a log inclusão de tags, parâmetros ou métricas extras nessa execução.
Quando o senhor chama fmin() várias vezes dentro da mesma execução ativa MLflow, MLflow logs essas chamadas para a mesma execução principal. Para resolver conflitos de nomes para parâmetros e tags de registros, o site MLflow acrescenta um UUID aos nomes com conflitos.
Ao fazer o logon do trabalhador, o senhor não precisa gerenciar a execução explicitamente na função objetiva. Chame mlflow.log_param("param_from_worker", x) na função objetiva para log um parâmetro para a execução filha. O senhor pode log parâmetros, métricas, tags e artefatos na função objetiva.