다음을 통해 공유


Hyperopt 개념

참고 항목

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

Hyperopt는 더 이상 Databricks Runtime ML 17.0 이상에 사전 설치되지 않습니다. Azure Databricks는 유사한 환경을 위해 Optuna를 대신 사용하고 최신 하이퍼 매개 변수 튜닝 알고리즘에 액세스하는 것이 좋습니다.

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

이 섹션의 내용:

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

fmin()

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

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

구현

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

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

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

SparkTrials 및 MLflow

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

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

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

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

참고 항목

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

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