Share via


Hyperopt 개념

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

이 섹션에서는 다음을 수행합니다.

Azure Databricks에서 Hyperopt를 사용하는 방법을 보여 주는 예제는 Hyperopt를 사용한 하이퍼 매개 변수 튜닝을 참조하세요.

fmin()

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

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

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