Concepts Hyperopt
La version open source de Hyperopt n'est plus maintenue.
Hyperopt n'est pas inclus dans Databricks Runtime for Machine Learning après 16.4 LTS ML. Databricks recommande d'utiliser soit Optuna pour l'optimisation à nœud unique, soit RayTune pour une expérience similaire à la fonctionnalité obsolète d'ajustement distribué des hyperparamètres d'Hyperopt. En savoir plus sur l'utilisation de RayTune sur Databricks.
Cet article décrit certains des concepts que vous devez connaître pour utiliser Hyperopt distribué.
Dans cette section :
Pour des exemples illustrant comment utiliser Hyperopt dans Databricks, consultez Hyperopt.
fmin()
Vous utilisez fmin() pour lancer une exécution Hyperopt. Les arguments pour fmin() sont présentés dans le tableau ; consultez la documentation Hyperopt pour plus d'informations. Pour des exemples d'utilisation de chaque argument, consultez les Notebooks d'exemple.
Nom de l'argument | Description |
|---|---|
| Fonction objectif. Hyperopt appelle cette fonction avec des valeurs générées à partir de l'espace d'hyperparamètres fourni dans l'argument d'espace. Cette fonction peut renvoyer la perte sous forme de valeur scalaire ou dans un dictionnaire (voir la documentation Hyperopt pour plus de détails). Cette fonction contient généralement du code pour l'entraînement du modèle et le calcul de la perte. |
| Définit l'espace d'hyperparamètres à rechercher. Hyperopt offre une grande flexibilité dans la manière dont cet espace est défini. Vous pouvez choisir une option catégorielle, telle que l'algorithme, ou une distribution probabiliste pour les valeurs numériques, telles que uniforme et logarithmique. |
| Algorithme de recherche Hyperopt à utiliser pour rechercher l’espace d’hyperparamètres. Les plus couramment utilisés sont |
| Nombre de paramètres d'hyperparamètres à essayer (le nombre de modèles à ajuster). |
| Nombre de paramètres d'hyperparamètres qu'Hyperopt devrait générer à l'avance. Étant donné que l'algorithme de génération TPE d'Hyperopt peut prendre un certain temps, il peut être utile d'augmenter cette valeur au-delà de la valeur default de 1, mais généralement pas plus que le paramètre |
| Un objet |
| Une fonction d’arrêt anticipé facultative pour déterminer si |
La classe SparkTrials
SparkTrials est une API développée par Databricks qui vous permet de distribuer une exécution Hyperopt sans apporter d'autres modifications à votre code Hyperopt. SparkTrials accélère l'ajustement de machine unique en distribuant les essais aux Worker Spark.
SparkTrials est conçu pour paralléliser les calculs pour les modèles ML à machine unique tels que scikit-learn. Pour les modèles créés avec des algorithmes de ML distribués tels que MLlib ou Horovod, n'utilisez pas SparkTrials. Dans ce cas, le processus de création de modèles est automatiquement parallélisé sur le cluster et vous devez utiliser la classe Hyperopt par default Trials.
Cette section décrit comment configurer les arguments que vous passez à SparkTrials et les aspects d'implémentation de SparkTrials.
Arguments
SparkTrials accepte deux arguments facultatifs :
-
parallelism: Nombre maximal d'essais à évaluer simultanément. Un nombre plus élevé vous permet de tester un plus grand nombre de configurations d'hyperparamètres de monter en charge. Parce que Hyperopt propose de nouveaux essais basés sur des résultats antérieurs, il y a un compromis entre le parallélisme et l'adaptabilité. Pour unmax_evalsfixe, un parallélisme plus élevé accélère les calculs, mais un parallélisme plus faible peut conduire à de meilleurs résultats, car chaque itération a accès à plus de résultats antérieurs.default: nombre d'exécuteurs Spark disponibles. Maximum : 128. Si la valeur est supérieure au nombre de tâches concurrentes autorisées par la configuration du cluster,
SparkTrialsréduit le parallélisme à cette valeur. -
timeout: Nombre maximum de secondes qu'un appelfmin()peut prendre. Lorsque ce nombre est dépassé, toutes les exécutions sont terminées etfmin()se ferme. Des informations sur les exécutions terminées sont enregistrées.
Mise en œuvre
Lors de la définition de la fonction objectif fn transmise à fmin(), et lors de la sélection d'une configuration de clusters, il est utile de comprendre comment SparkTrials distribue les tâches d'optimisation.
Dans Hyperopt, un essai correspond généralement à l'ajustement d'un modèle sur un seul réglage d'hyperparamètres. Hyperopt génère des essais de manière itérative, les évalue, puis recommence.
Avec SparkTrials, le nœud Driver de votre cluster génère de nouvelles tentatives, et les nœuds Worker évaluent ces tentatives. Chaque tentative est générée avec un Job Spark qui a une tâche, et est évaluée dans la tâche sur une machine Worker. Si votre cluster est configuré pour exécuter plusieurs tâches par worker, alors plusieurs tentatives peuvent être évaluées simultanément sur ce worker.
SparkTrials et MLflow
Databricks Runtime ML prend en charge l'enregistrement vers MLflow à partir des Workers. Vous pouvez ajouter du code de journalisation personnalisé dans la fonction objective que vous transmettez à Hyperopt.
SparkTrials Logs tuning results as nested MLflow runs as follows:
- Exécution principale ou parente : L'appel à
fmin()est consigné comme l'exécution principale. S’il y a une exécution active,SparkTrialsLogs dans cette exécution active et ne met pas fin à l’exécution lorsquefmin()retourne. S'il n'y a pas d'exécution active,SparkTrialscrée une nouvelle exécution, y enregistre des Logs et termine l'exécution avant le retour defmin(). - Exécutions enfant : chaque paramètre d'hyperparamètre testé (un « essai ») est consigné comme exécution enfant sous l'exécution principale. Les enregistrements de Logs MLflow provenant des Worker sont également stockés sous les exécutions enfant correspondantes.
Lors de l'appel de fmin(), Databricks recommande une gestion active de l'exécution MLflow ; c'est-à-dire, d'envelopper l'appel à fmin() dans une instruction with mlflow.start_run():. Cela garantit que chaque appel fmin() est enregistré dans une exécution principale MLflow distincte, et facilite l'enregistrement de balises, de paramètres ou de métriques supplémentaires pour cette exécution.
Lorsque vous appelez fmin() plusieurs fois dans la même exécution MLflow active, MLflow Logs ces appels dans la même exécution principale. Pour résoudre les conflits de nom pour les paramètres et les tags enregistrés, MLflow ajoute un UUID aux noms en conflit.
Lors de la journalisation à partir des workers, vous n'avez pas besoin de gérer explicitement les exécutions dans la fonction objective. Appelez mlflow.log_param("param_from_worker", x) dans la fonction objectif pour log un paramètre dans l'exécution enfant. Vous pouvez log les parameters, les métriques, les tags et les artefacts dans la fonction objective.