Pular para o conteúdo principal

Paralelizar o ajuste de hiperparâmetros do Hyperopt

nota

A versão de código aberto do Hyperopt não está mais sendo mantida.

O Hyperopt não está incluído no Databricks Runtime for Machine Learning após a versão 16.4 LTS ML. A Databricks recomenda o uso do Optuna para otimização de nó único ou do RayTune para uma experiência semelhante à funcionalidade de ajuste de hiperparâmetros distribuídos do Hyperopt, que foi descontinuada. Saiba mais sobre como usar o RayTune no Databricks.

Este exemplo de Notebook mostra como escalar o ajuste de hiperparâmetros de uma única máquina para um cluster Databricks usando Hyperopt com SparkTrials. Ajustando um classificador SVM scikit-learn no dataset Iris, você primeiro constrói um fluxo de trabalho de máquina única fmin() e depois o paraleliza em vários workers Spark com MLflow acompanhando automaticamente cada tentativa.

Importe o pacote necessário e carregue dataset

Python
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

from hyperopt import fmin, tpe, hp, SparkTrials, STATUS_OK, Trials

# If you are running Databricks Runtime for Machine Learning, `mlflow` is already installed and you can skip the following line.
import mlflow
Python
# Load the iris dataset from scikit-learn
iris = iris = load_iris()
X = iris.data
y = iris.target

Parte 1. Fluxo de trabalho Hyperopt de máquina única

Aqui estão os passos em um fluxo de trabalho Hyperopt:

  1. Defina uma função a ser minimizada.
  2. Defina um espaço de busca sobre os hiperparâmetros.
  3. Selecione um algoritmo de busca.
  4. execução do algoritmo de ajuste com Hyperopt fmin().

Para mais informações, consulte a documentaçãoHyperopt.

Defina uma função para minimizar

Neste exemplo, utilizamos um classificador de máquina de vetores de suporte. O objetivo é encontrar o melhor valor para o parâmetro de regularização C.

A maior parte do código para um fluxo de trabalho Hyperopt está na função objetivo. Este exemplo utiliza o classificador de vetores de suporte do scikit-learn.

Se o seu cluster usa o Databricks Runtime 11.3 ML, edite o classificador de vetor de suporte para aceitar um argumento posicional, clf = SVC(C).

Python
def objective(C):
# Create a support vector classifier model
clf = SVC(C=C)

# Use the cross-validation accuracy to compare the models' performance
accuracy = cross_val_score(clf, X, y).mean()

# Hyperopt tries to minimize the objective function. A higher accuracy value means a better model, so you must return the negative accuracy.
return {'loss': -accuracy, 'status': STATUS_OK}

Defina o espaço de busca sobre os hiperparâmetros.

Consulte a documentação do Hyperopt para obter detalhes sobre como definir um espaço de busca e expressões de parâmetros.

Python
search_space = hp.lognormal('C', 0, 1.0)

Selecione um algoritmo de pesquisa

As duas principais opções são:

  • hyperopt.tpe.suggestÁrvore de Estimadores de Parzen: uma abordagem Bayesian que seleciona, de forma iterativa e adaptativa, novas configurações de hiperparâmetros a serem exploradas com base em resultados anteriores.
  • hyperopt.rand.suggestBusca aleatória, uma abordagem não adaptativa que realiza amostragens no espaço de busca.
Python
algo=tpe.suggest

execução do algoritmo de ajuste com Hyperopt fmin()

Defina max_evals como o número máximo de pontos no espaço de hiperparâmetros a serem testados, ou seja, o número máximo de modelos a serem ajustados e avaliados.

Python
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16)
Python
# Print the best value found for C
print("Best value found: ", argmin)

Parte 2. Ajuste distribuído usando Apache Spark e MLflow

Para distribuir o ajuste, adicione mais um argumento a fmin(): uma classe Trials chamada SparkTrials.

SparkTrials Aceita 2 argumentos opcionais:

  • parallelismNúmero de modelos a serem ajustados e avaliados simultaneamente. O default é o número de slots de tarefas Spark disponíveis.
  • timeout: Tempo máximo (em segundos) que fmin() pode ser executado. Por default não há limite máximo de tempo.

Este exemplo usa a função objetivo muito simples definida no comando 7. Nesse caso, a execução da função é rápida e a sobrecarga de iniciar o trabalho Spark domina o tempo de cálculo, portanto, os cálculos para o caso distribuído levam mais tempo. Para problemas típicos do mundo real, a função objetivo é mais complexa e usar SparkTrails para distribuir os cálculos é mais rápido do que o ajuste de máquina única.

O acompanhamento automatizado MLflow está ativado por default. Para usá-lo, chame mlflow.start_run() antes de chamar fmin() como mostrado no exemplo.

Python
from hyperopt import SparkTrials

# To display the API documentation for the SparkTrials class, uncomment the following line.
# help(SparkTrials)
Python
spark_trials = SparkTrials()

with mlflow.start_run():
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16,
trials=spark_trials)
Python
# Print the best value found for C
print("Best value found: ", argmin)

Para view o experimento MLflow associado ao Notebook, clique no ícone de Experimento na barra de contexto do Notebook, no canto superior direito. Lá, você pode view toda a execução. Para view a execução na interface do usuário MLflow , clique no ícone no canto direito, ao lado de Execução do experimento .

Para examinar o efeito da sintonia de C:

  1. Selecione a execução resultante e clique em Comparar .
  2. No gráfico de dispersão, selecione C para o eixo X e perda para o eixo Y.

Depois que o senhor executar as ações na última célula do Notebook, a interface do usuário do MLflow deverá ser exibida:

Demonstração do Hyperopt MLflow

Exemplo de caderno

Paralelizar o ajuste de hiperparâmetros do Hyperopt

Abrir notebook em uma nova aba