Paralelizar o ajuste de hiperparâmetros do Hyperopt
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
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
# 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:
- Defina uma função a ser minimizada.
- Defina um espaço de busca sobre os hiperparâmetros.
- Selecione um algoritmo de busca.
- 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).
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.
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.
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.
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16)
# 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) quefmin()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.
from hyperopt import SparkTrials
# To display the API documentation for the SparkTrials class, uncomment the following line.
# help(SparkTrials)
spark_trials = SparkTrials()
with mlflow.start_run():
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16,
trials=spark_trials)
# 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:
- Selecione a execução resultante e clique em Comparar .
- 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:
