Поделиться через


Основные понятия 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 может занять некоторое время, имеет смысл использовать для него значение больше единицы, заданной по умолчанию, но обычно не выше указанного в параметре SparkTrialsparallelism.
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) в целевой функции, чтобы зарегистрировать параметр в дочернем выполнении. Параметры, метрики, теги и артефакты можно записывать в целевую функцию.