Основные понятия Hyperopt
В этой статье описываются некоторые понятия, которые необходимо знать для использования распределенного hyperopt.
В этом разделе:
Примеры использования Hyperopt в Azure Databricks см. в статье Настройка гиперпараметров с помощью Hyperopt.
fmin()
Вы используете fmin()
для выполнения выполнения Hyperopt. Аргументы для fmin()
показаны в таблице. Дополнительные сведения см. в документации hyperopt . Примеры использования каждого аргумента см. в примерах записных книжек.
Имя аргумента | Описание |
---|---|
fn |
Целевая функция. Hyperopt вызывает эту функцию со значениями, созданными из пространства гиперпараметров, предоставленного в аргументе пробела. Эта функция может возвращать потери в виде скалярного значения или в словаре (дополнительные сведения см . в документации Hyperopt ). Эта функция обычно содержит код для обучения модели и вычисления потерь. |
space |
Определяет пространство гиперпараметров для поиска. Hyperopt обеспечивает большую гибкость в определении этого пространства. Можно выбрать категориальный параметр, например алгоритм, или вероятностное распределение для числовых значений, таких как единообразие и журнал. |
algo |
Алгоритм поиска Hyperopt, используемый для поиска пространства гиперпараметров. Чаще всего используются hyperopt.rand.suggest для случайного поиска и hyperopt.tpe.suggest для TPE. |
max_evals |
Количество параметров гиперпараметров для попытки (количество моделей для соответствия). |
max_queue_len |
Количество параметров гиперпараметров, которые Hyperopt должен создать заранее. Так как алгоритм создания TPE Hyperopt может занять некоторое время, может быть полезно увеличить его за пределами значения по умолчанию 1, но, как правило, не больше, чем 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
предназначен для параллелизации вычислений для моделей машинного обучения с одним компьютером, таких как scikit-learn. Для моделей, созданных с помощью распределенных алгоритмов машинного обучения, таких как 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 ML поддерживает ведение журнала в MLflow из рабочих ролей. Вы можете добавить пользовательский код ведения журнала в целевую функцию, передаваемую в Hyperopt.
SparkTrials
записывает в журнал результаты настройки при выполнении вложенных MLflow следующим образом:
- Основное или родительское выполнение: вызов
fmin()
регистрируется как main выполнения. Если есть активное выполнение,SparkTrials
записывается в этот активный запуск и не завершает его приfmin()
возврате. Если активного запуска нет,SparkTrials
создает новый запуск, записывает его в журнал и завершает выполнение доfmin()
возврата. - Дочерние запуски. Каждый проверенный параметр гиперпараметров (пробная версия) регистрируется как дочерний запуск в main выполнения. Записи журнала MLflow из рабочих ролей также хранятся в соответствующих дочерних запусках.
При вызове fmin()
Databricks рекомендует активное управление запуском MLflow, то есть заключите вызов в fmin()
with mlflow.start_run():
оператор . Это гарантирует, что каждый fmin()
вызов регистрируется в отдельном main выполнения MLflow и упрощает запись в него дополнительных тегов, параметров или метрик.
Примечание
При многократном вызове fmin()
в рамках одного и того же активного запуска MLflow MLflow регистрирует эти вызовы в один и тот же main выполнения. Чтобы разрешить конфликты имен для зарегистрированных параметров и тегов, MLflow добавляет UUID к именам с конфликтами.
При ведении журнала из рабочих ролей не нужно явно управлять запусками в целевой функции. Вызовите mlflow.log_param("param_from_worker", x)
функцию objective, чтобы записать параметр в дочерний запуск. Вы можете записывать параметры, метрики, теги и артефакты в целевую функцию.