다음을 통해 공유


Hyperopt 개념

참고 항목

Hyperopt의 오픈 소스 버전은 더 이상 유지 관리되지 않습니다.

Hyperopt는 다음 주 DBR ML 버전에서 제거됩니다. Azure Databricks는 단일 노드 최적화를 위해 Optuna를 사용하거나 사용되지 않는 Hyperopt 분산 하이퍼 매개변수 튜닝 기능과 유사한 환경을 위해 RayTune 를 권장합니다. Azure Databricks에서 RayTune 사용하는 방법에 대해 자세히 알아봅니다.

이 문서에서는 분산 Hyperopt를 사용하기 위해 알아야 할 몇 가지 개념에 대해 설명합니다.

이 구역의 내용:

Azure Databricks에서 Hyperopt를 사용하는 방법을 보여 주는 예제는 Hyperopt를 참조하세요.

fmin()

fmin()을 사용하여 Hyperopt 실행을 실행합니다. fmin() 인수는 table에 나와 있습니다; 자세한 내용은 Hyperopt 설명서 를 참조하세요. 각 인수를 사용하는 방법의 예는 예제 Notebooks을 참조하세요.

인수 이름 설명
fn 목적 함수. Hyperopt는 공간 인수에 제공된 하이퍼 매개 변수 공간에서 생성된 values 사용하여 이 함수를 호출합니다. 이 함수는 손실을 스칼라 값이나 사전으로 반환할 수 있습니다(자세한 내용은 Hyperopt 문서 참조). 이 함수는 일반적으로 모델 학습 및 손실 계산을 위한 코드를 포함합니다.
space 검색할 하이퍼 매개 변수 공간을 정의합니다. Hyperopt는 이 공간이 정의되는 방식이 크게 유연할 수 있도록 합니다. 알고리즘과 같은 범주 옵션 또는 균일 및 로그와 같은 숫자 values 대한 확률 분포를 선택할 수 있습니다.
algo 하이퍼 매개 변수 공간을 검색하는 데 사용할 Hyperopt 검색 알고리즘입니다. 가장 일반적으로 사용되는 것은 임의 검색의 경우 hyperopt.rand.suggest고 TPE의 경우 hyperopt.tpe.suggest입니다.
max_evals 시도할 하이퍼 매개 변수 설정 수(맞출 모델 수).
max_queue_len Hyperopt가 미리 generate 하이퍼 매개 변수 설정의 수입니다. Hyperopt TPE 생성 알고리즘은 시간이 걸릴 수 있으므로 이를 기본값 1 이상으로 늘리는 것이 도움이 될 수 있지만 일반적으로 SparkTrials 설정 parallelism보다 크지 않습니다.
trials Trials 또는 SparkTrials 개체입니다. 목적 함수에서 scikit-learn 메서드와 같은 단일 컴퓨터 알고리즘을 호출할 때 SparkTrials를 사용합니다. 목적 함수에서 MLlib 메서드 또는 Horovod와 같은 분산 학습 알고리즘을 호출할 때 Trials를 사용합니다.
early_stop_fn fmin에 도달하기 전에 max_evals을 중지해야 하는지 여부를 결정하기 위한 선택적 조기 중지 함수입니다. 기본값은 None입니다. 함수의 입력 서명은 Trials, *args고 출력 서명은 bool, *args입니다. 출력 부울은 중지 여부를 나타냅니다. *args 모든 상태입니다. whereearly_stop_fn 호출의 출력은 다음 호출에 대한 입력으로 사용됩니다. TrialsSparkTrials 개체일 수 있습니다. SparkTrials를 사용하는 경우 조기 중지 함수가 모든 시도 후에 실행되는 것이 보장되지 않고 대신 폴링됩니다. 조기 중지 함수의 예

SparkTrials 클래스

SparkTrials 는 Hyperopt 코드를 변경하지 않고 Hyperopt 실행을 배포할 수 있도록 하는 Databricks에서 개발한 API입니다. SparkTrials 는 Spark 작업자에게 평가판을 배포하여 단일 컴퓨터 튜닝을 가속화합니다.

참고 항목

SparkTrials 는 scikit-learn과 같은 단일 컴퓨터 ML 모델에 대한 컴퓨팅을 병렬화하도록 설계되었습니다. MLlib 또는 Horovod와 같은 분산 ML 알고리즘으로 만들어진 모델의 경우 SparkTrials를 사용하지 마세요. 이 경우 모델 빌드 프로세스는 클러스터에서 자동으로 병렬화되며 기본 Hyperopt 클래스 Trials를 사용해야 합니다.

이 섹션에서는 SparkTrials에 전달하는 인수를 구성하는 방법과 SparkTrials의 구현 측면을 설명합니다.

인수

SparkTrials 는 두 개의 선택적 인수를 사용합니다:

  • parallelism: 동시에 평가할 최대 시도 수입니다. 숫자가 높을수록 더 많은 하이퍼 매개 변수 설정에 대한 테스트를 스케일 아웃할 수 있습니다. Hyperopt는 과거 결과를 기반으로 새로운 시도를 제안하기 때문에 병렬성과 적응성 사이에는 균형이 있습니다. 고정된 max_evals의 경우 병렬 처리가 클수록 계산 속도가 빨라지지만 각 반복에서 더 많은 과거 결과에 액세스할 수 있으므로 병렬 처리가 낮을수록 더 나은 결과를 얻을 수 있습니다.

    기본값: 사용 가능한 Spark 실행기의 수입니다. 최대: 128. 값이 클러스터 구성에서 허용하는 동시 작업 수보다 큰 경우 SparkTrials는 병렬 처리를 이 값으로 줄입니다.

  • timeout: fmin() 호출에 걸리는 최대 시간(초)입니다. 이 수를 초과하면 모든 실행이 종료되고 fmin()이 종료됩니다. 완료된 실행에 대한 정보가 저장됩니다.

구현

fn에 전달된 목적 함수 fmin()를 정의하고 클러스터 설정을 선택할 때 SparkTrials가 튜닝 작업을 분산하는 방법을 이해하는 것이 도움이 됩니다.

Hyperopt에서 시행은 일반적으로 하이퍼 매개 변수의 한 설정에 하나의 모델을 맞추는 것에 해당합니다. Hyperopt는 반복적으로 시도를 생성하고 평가하고 반복합니다.

SparkTrials를 사용하면 클러스터의 드라이버 노드가 새 평가판을 생성하고 작업자 노드가 이러한 평가판을 평가합니다. 각 평가판은 하나의 작업이 있는 Spark 작업으로 생성되며 작업자 컴퓨터의 작업에서 평가됩니다. 클러스터가 작업자당 여러 작업을 실행하도록 set 경우 해당 작업자에서 한 번에 여러 평가판을 평가할 수 있습니다.

SparkTrials 및 MLflow

Databricks Runtime ML은 작업자에서 MLflow에 대한 로깅을 지원합니다. Hyperopt에 전달하는 목적 함수에 사용자 지정 로깅 코드를 추가할 수 있습니다.

SparkTrials 는 다음과 같이 중첩된 MLflow가 실행될 때 튜닝 결과를 기록합니다:

  • 기본 또는 부모 실행: fmin()에 대한 호출은 기본 실행으로 기록됩니다. 활성 실행이 있는 경우 SparkTrials는 이 활성 실행에 기록하고 fmin()가 반환될 때 실행을 종료하지 않습니다. 활성 실행이 없으면 SparkTrials는 새 실행을 만들고 기록하고 fmin()가 반환되기 전에 실행을 종료합니다.
  • 자식 실행: 테스트된 각 하이퍼 매개 변수 설정("평가판")은 기본 실행에서 자식 실행으로 기록됩니다. 작업자의 MLflow 로그 레코드도 해당 자식 실행 아래에 저장됩니다.

fmin()을 호출할 때 Databricks는 활성 MLflow 실행 관리를 권장합니다. 즉, fmin() 문 내에서 with mlflow.start_run():에 대한 호출을 래핑합니다. 이렇게 하면 각 fmin() 호출이 별도의 MLflow 주 실행에 기록되고 해당 실행에 대한 추가 태그, parameters또는 메트릭을 더 쉽게 기록할 수 있습니다.

참고 항목

동일한 활성 MLflow 실행 내에서 fmin()을 여러 번 호출하면 MLflow는 이러한 호출을 동일한 기본 실행에 기록합니다. 기록된 parameters 및 태그에 대한 이름 충돌을 해결하기 위해 MLflow는 충돌이 있는 이름에 UUID를 추가합니다.

작업자에서 로깅할 때 목적 함수에서 명시적으로 실행을 관리할 필요가 없습니다. 목적 함수에서 mlflow.log_param("param_from_worker", x)을 호출하여 자식 실행에 매개 변수를 기록합니다. 목표 함수에서 parameters, 메트릭, 태그 및 아티팩트 등을 기록할 수 있습니다.