Основные понятия Hyperopt
Примечание.
Версия Hyperopt с открытым исходным кодом больше не поддерживается.
Hyperopt будет удален в следующей основной версии DBR ML. Azure Databricks рекомендует использовать Optuna для оптимизации с одним узлом или RayTune для аналогичного использования устаревшей функции настройки гиперпараметра Hyperopt. Дополнительные сведения об использовании RayTune в Azure Databricks.
В этой статье описываются некоторые понятия, которые необходимо знать для использования распределенного Hyperopt.
В этом разделе рассматриваются следующие вопросы.
Примеры, демонстрирующие использование Hyperopt в Azure Databricks, см. в статье Hyperopt.
fmin()
Для выполнения Hyperopt используется fmin()
. Аргументы для fmin()
отображаются в таблице. Дополнительные сведения см. в документации по Hyperopt. Примеры использования каждого аргумента см. в записных книжках с примерами.
Имя аргумента | Description |
---|---|
fn |
Целевая функция. Hyperopt вызывает эту функцию со значениями, созданными из пространства гиперпараметров, предоставленного в аргументе space. Эта функция может возвращать потери в виде скалярного значения или в виде словаря (дополнительные сведения см. в документации по Hyperopt). Эта функция обычно содержит код для обучения модели и расчета потерь. |
space |
Определяет пространство гиперпараметров для поиска. Hyperopt обеспечивает больше гибкости в определении этого пространства. Вы можете выбрать категориальный параметр, такой как алгоритм, или вероятностное распределение для числовых значений, таких как равномерное и логарифмическое. |
algo |
Алгоритм поиска Hyperopt, используемый для поиска в пространстве гиперпараметров. Чаще всего используются hyperopt.rand.suggest для случайного поиска и hyperopt.tpe.suggest для TPE. |
max_evals |
Количество настроек гиперпараметров, которые нужно опробовать (количество моделей для приведения в соответствие). |
max_queue_len |
Число настроек гиперпараметров Hyperopt должно быть заранее сгенерировано. Так как выполнение алгоритма создания Hyperopt TPE может занять некоторое время, имеет смысл использовать для него значение больше единицы, заданной по умолчанию, но обычно не выше указанного в параметре SparkTrials parallelism . |
trials |
Объект Trials или SparkTrials . Используйте SparkTrials при вызове алгоритмов, работающих на одном компьютере, например методов scikit-learn, в целевой функции. Используйте Trials при вызове распределенных алгоритмов обучения, таких как методы MLlib или Horovod, в целевой функции. |
early_stop_fn |
Необязательная функция ранней остановки, позволяющая определить, следует ли останавливать fmin до достижения max_evals . По умолчанию — None . Входная сигнатура функции — Trials, *args , а выходная сигнатура — bool, *args . Выходное логическое значение указывает, нужна ли остановка.
*args является любым состоянием, где выходные данные вызова early_stop_fn служат входными данными для следующего вызова.
Trials может быть объектом SparkTrials . При использовании SparkTrials не гарантируется активация функции ранней остановки после каждой пробной версии, вместо этого используется опрос.
Пример функции ранней остановки |
Класс SparkTrials
SparkTrials
— это API, разработанный Databricks, который позволяет распространять выполнение Hyperopt без внесения других изменений в код Hyperopt.
SparkTrials
ускоряет настройку с использованием одного компьютера за счет распространения пробных версий в рабочие роли Spark.
Примечание.
SparkTrials
предназначен для параллелизации вычислений для моделей ML, использующих один компьютер, таких как scikit-learn. Для моделей, созданных с помощью распределенных алгоритмов ML, таких как MLlib или Horovod, не используйте SparkTrials
. В этом случае процесс создания модели автоматически запускается параллельно в кластере. Следует использовать заданный по умолчанию класс Trials
Hyperopt.
В этом разделе описывается, как настроить аргументы, которые передаются в SparkTrials
, а также аспекты реализации SparkTrials
.
Аргументы
SparkTrials
принимает два дополнительных аргумента:
parallelism
: максимальное количество пробных версий для параллельной оценки. Большее число позволяет горизонтально увеличить масштаб, чтобы тестировать больше настроек гиперпараметров. Поскольку Hyperopt предлагает новые пробные версии на основе прошлых результатов, существует компромисс между параллелизмом и адаптивностью. Для фиксированногоmax_evals
более высокое значение параллелизма ускоряет вычисления, но более низкое его значение может улучшить результаты, так как каждая итерация имеет доступ к большему количеству прошлых результатов.По умолчанию: количество доступных исполнителей Spark. Максимальное количество: 128. Если значение больше числа одновременных задач, разрешенных конфигурацией кластера,
SparkTrials
снижает параллелизм до этого значения.timeout
: максимальный период в секундах, который может занимать вызовfmin()
. В случае превышения этого значения все выполнения завершаются,аfmin()
осуществляет выход. Сведения о завершенных выполнениях сохраняются.
Внедрение
При определении целевой функции fn
передается в fmin()
, а при выборе установки кластера полезно понимать, как SparkTrials
распределяются задачи настройки.
В Hyperopt пробная версия обычно соответствует приведению в соответствие одной модели по одной настройке гиперпараметров. Hyperopt итеративно создает пробные версии, оценивает их и повторяет.
При использовании SparkTrials
узел драйвера кластера создает новые пробные версии, а рабочие узлы их оценивают. Каждая пробная версия создается с помощью задания Spark, которое содержит одну задачу, и оценивается в задаче на рабочем компьютере. Если кластер настроен для выполнения нескольких задач на одном рабочем узле, то на этом узле можно одновременно оценивать несколько испытаний.
SparkTrials
и MLflow
Машинное обучение Databricks Runtime поддерживает ведение журналов в MLflow из рабочих ролей. Пользовательский код ведения журнала можно добавить в целевую функцию, переданную в Hyperopt.
SparkTrials
регистрирует результаты настройки как вложенные выполнения MLflow следующим образом:
- Основное или родительское выполнение: вызов в
fmin()
регистрируется в качестве основного выполнения. Если имеется активное выполнение,SparkTrials
делает запись в этом активном выполнении и не завершает выполнение при возвратеfmin()
. Если активных выполнений нет,SparkTrials
создает новое выполнение, регистрирует в нем данные и завершает выполнение до возвратаfmin()
. - Дочерние выполнения: каждый проверяемый гиперпараметр (пробная версия) заносится в журнал как дочернее выполнение в рамках основного выполнения. Записи журнала MLflow из рабочих ролей также сохраняются в соответствующих дочерних выполнениях.
При вызове fmin()
Databricks рекомендует использовать управление активным выполнением MLflow; то есть включить вызов в fmin()
в операторе with mlflow.start_run():
. Это гарантирует, что каждый вызов fmin()
записывается в отдельный основной запуск MLflow и облегчает добавление дополнительных тегов, параметров или метрик к этому выполнению.
Примечание.
При многократном вызове fmin()
в рамках одного активного выполнения MLflow, эти вызовы регистрируются в том же основном выполнении. Чтобы устранить конфликты имен для зарегистрированных параметров и тегов, MLflow добавляет идентификатор UUID к именам с конфликтами.
При ведении журнала из рабочих ролей вам не нужно явно управлять выполнением в целевой функции. Вызовите mlflow.log_param("param_from_worker", x)
в целевой функции, чтобы зарегистрировать параметр в дочернем выполнении. Параметры, метрики, теги и артефакты можно записывать в целевую функцию.