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


Основные понятия 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. В этом случае процесс создания модели автоматически параллелизуется в кластере, и следует использовать класс TrialsHyperopt по умолчанию .

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