Container Runtime for ML에 대한 병렬 하이퍼 매개 변수 최적화(HPO)¶
Snowflake ML Hyperparameter Optimization(HPO) API 는 모델에 구애받지 않는 프레임워크로, 모델의 효율적이고 병렬화된 하이퍼 매개 변수 튜닝을 가능하게 합니다. 모든 오픈 소스 프레임워크 또는 알고리즘을 사용할 수 있습니다. Snowflake ML API를 사용할 수도 있습니다.
현재, 이 API 는 Snowpark Container Services(SPCS)의 Container Runtime을 사용하도록 구성된 Snowflake Notebook 내에서 사용할 수 있습니다. 그와 같은 노트북을 만든 후 다음을 수행할 수 있습니다.
오픈 소스 패키지를 사용하여 모델을 학습시키고 하이퍼 매개 변수 튜닝 프로세스를 배포하려면 이 API 를 사용할 수 있습니다.
Snowflake ML 분산 학습 API를 사용하여 모델을 학습시키고 HPO 를 확장하면서도 각 학습 실행을 확장할 수 있습니다.
Notebook에서 시작된 HPO 워크로드는 Snowpark Container Services 내에서 CPU 또는 GPU 인스턴스에서 실행되며, SPCS 컴퓨팅 풀의 단일 노드에서 사용 가능한 코어(CPU 또는 GPU)로 확장됩니다.
병렬화된 HPO API 는 다음과 같은 이점을 제공합니다.
여러 리소스에 걸쳐 학습을 배포하는 모든 복잡한 작업을 자동으로 처리하는 단일 API
오픈 소스 ML 프레임워크 또는 Snowflake ML 모델링 API를 사용하여 거의 모든 프레임워크 또는 알고리즘으로 학습할 수 있는 기능
다양한 연속 및 비연속 샘플링 함수와 함께 베이지안 및 무작위 검색 알고리즘을 포함한 다양한 튜닝 및 샘플링 옵션 제공
나머지 Snowflake와의 긴밀한 통합(예: Snowflake Datasets 또는 Dataframes를 통한 효율적인 데이터 수집 및 자동 ML 계보 캡처)
참고
SPCS 컴퓨팅 풀의 여러 노드를 사용하도록 HPO 실행을 확장할 수 있습니다. 자세한 내용은 멀티 노드 클러스터에서 워크로드 실행하기 섹션을 참조하십시오.
모델의 하이퍼 매개 변수 최적화하기¶
Snowflake ML HPO API 를 사용하여 모델을 조정합니다. 다음 단계에서는 이 과정을 설명합니다.
데이터를 수집합니다.
검색 알고리즘을 사용하여 하이퍼 매개 변수를 최적화하는 데 사용되는 전략을 정의합니다.
하이퍼 매개 변수를 샘플링하는 방법을 정의합니다.
튜너를 구성합니다.
각 학습 작업에서 하이퍼 매개 변수와 학습 메트릭을 가져옵니다.
학습 작업을 시작합니다.
학습 작업 결과를 받습니다.
다음 섹션에서는 이전 단계를 안내합니다. 예제는 Container Runtime HPO 예제 섹션을 참조하십시오.
데이터 수집하기¶
dataset_map
오브젝트를 사용하여 HPO API 로 데이터를 수집합니다. dataset_map
오브젝트는 학습 또는 테스트 데이터 세트를 해당 Snowflake DataConnector 오브젝트와 쌍을 이루는 사전입니다. dataset_map
오브젝트가 학습 함수에 전달됩니다. 다음은 dataset_map
오브젝트의 예입니다.
dataset_map = {
"x_train": DataConnector.from_dataframe(session.create_dataframe(X_train)),
"y_train": DataConnector.from_dataframe(
session.create_dataframe(y_train.to_frame())
),
"x_test": DataConnector.from_dataframe(session.create_dataframe(X_test)),
"y_test": DataConnector.from_dataframe(
session.create_dataframe(y_test.to_frame())
),
}
검색 알고리즘 정의하기¶
하이퍼 매개 변수 공간을 탐색하는 데 사용되는 검색 알고리즘을 정의합니다. 알고리즘은 이전 실험의 결과를 사용하여 하이퍼 매개 변수를 구성하는 방법을 결정합니다. 다음 검색 알고리즘을 사용할 수 있습니다.
그리드 검색
사용자가 정의한 하이퍼 매개 변수 값에 대한 그리드를 탐색합니다. HPO API 는 가능한 모든 하이퍼 매개 변수 조합을 평가합니다. 다음은 하이퍼 매개 변수 그리드의 예시입니다.
search_space = { "n_estimators": [50, 51], "max_depth": [4, 5]), "learning_rate": [0.01, 0.3], }
앞의 예에서 각 매개 변수에는 두 가지 가능한 값이 있습니다. 하이퍼 매개 변수의 가능한 조합은 8개(2 * 2 * 2)입니다.
베이지안 최적화
확률 모델을 사용하여 평가할 다음 하이퍼 매개 변수 세트를 결정합니다. 알고리즘은 이전 실험의 결과를 사용하여 하이퍼 매개 변수를 구성하는 방법을 결정합니다. 베이지안 최적화에 대한 자세한 내용은 베이지안 최적화 섹션을 참조하십시오.
무작위 검색
하이퍼 매개 변수 공간을 무작위로 샘플링합니다. 간단하고 효과적인 접근 방식으로, 특히 대형 검색 공간 또는 혼합(연속형 또는 불연속형) 검색 공간에서 잘 작동합니다.
다음 코드를 사용하여 검색 알고리즘을 정의할 수 있습니다.
from entities import search_algorithm
search_alg = search_algorithm.BayesOpt()
search_alg = search_algorithm.RandomSearch()
search_alg = search_algorithm.GridSearch()
하이퍼 매개 변수 샘플링 정의하기¶
검색 공간 함수를 사용하여 각 시도 중에 하이퍼 매개 변수 샘플링 방법을 정의할 수 있습니다. 이를 사용하여 하이퍼 매개 변수가 취할 수 있는 값의 범위와 유형을 설명합니다.
사용 가능한 샘플 함수는 다음과 같습니다.
uniform(
lower
,upper
): 아래쪽과 위쪽 사이의 연속 값을 균일하게 샘플링합니다. 드롭아웃 비율이나 정규화 강도와 같은 매개 변수에 유용합니다.loguniform(
lower
,upper
): 로그 공간에서 값을 샘플링하며, 여러 차수에 걸쳐 있는 매개 변수(예: 학습 속도)에 이상적입니다.randint(
lower
,upper
): 하위(포함)와 상위(제외) 사이의 정수를 균일하게 샘플링합니다. 계층 수와 같은 불연속 매개 변수에 적합합니다.choice(선택 사항): 제공된 목록에서 값을 임의로 선택합니다. 카테고리형 매개 변수에 자주 사용됩니다.
다음은 uniform 함수를 사용하여 검색 공간을 정의하는 방법의 예시입니다.
search_space = {
"n_estimators": tune.uniform(50, 200),
"max_depth": tune.uniform(3, 10),
"learning_rate": tune.uniform(0.01, 0.3),
}
튜너 구성하기¶
TunerConfig
오브젝트를 사용하여 튜너를 구성합니다. 오브젝트 내에서 최적화할 메트릭, 최적화 모드 및 기타 실행 매개 변수를 지정합니다. 다음은 사용 가능한 구성 옵션입니다.
메트릭: 최적화 중인 정확도 또는 손실과 같은 성능 메트릭입니다.
모드: 오브젝트를 최대화할지 최소화할지 결정합니다(
"max"
또는"min"
).검색 알고리즘: 하이퍼 매개 변수 공간을 탐색하기 위한 전략을 지정합니다.
시도 횟수: 평가할 하이퍼 매개 변수 구성의 총 개수를 설정합니다.
동시성: 동시에 실행할 수 있는 시도 횟수를 정의합니다.
다음 예제 코드는 베이지안 최적화 라이브러리를 사용하여 5번의 시도에서 모델의 정확도를 최대화하는 코드입니다.
from snowflake.ml.modeling import tune
tuner_config = tune.TunerConfig(
metric="accuracy",
mode="max",
search_alg=search_algorithm.BayesOpt(
utility_kwargs={"kind": "ucb", "kappa": 2.5, "xi": 0.0}
),
num_trials=5,
max_concurrent_trials=1,
)
하이퍼 매개 변수 및 학습 메트릭 가져오기¶
각 학습 실행의 학습 메트릭과 하이퍼 매개 변수를 효과적으로 최적화하려면 Snowflake ML HPO API 에 하이퍼 매개 변수가 필요합니다. TunerContext
오브젝트를 사용하여 하이퍼 매개 변수와 학습 메트릭을 가져옵니다. 다음 예제는 하이퍼 매개 변수와 학습 메트릭을 가져오는 학습 함수를 생성합니다.
def train_func():
tuner_context = get_tuner_context()
config = tuner_context.get_hyper_params()
dm = tuner_context.get_dataset_map()
...
tuner_context.report(metrics={"accuracy": accuracy}, model=model)
학습 작업 시작하기¶
Tuner
오브젝트를 사용하여 학습 작업을 시작합니다. Tuner
오브젝트는 학습 함수, 검색 공간, 튜너 구성을 인자로 받습니다. 다음은 학습 작업을 시작하는 방법의 예입니다.
from snowflake.ml.modeling import tune
tuner = tune.Tuner(train_func, search_space, tuner_config)
tuner_results = tuner.run(dataset_map=dataset_map)
앞의 코드는 가용성 있는 리소스 전체에 학습 함수를 배포합니다. 시도 결과를 수집 및 요약하고 가장 성능이 좋은 구성을 식별합니다.
학습 작업 결과 받기¶
모든 시도가 완료되면
TunerResults
오브젝트에 각 시도의 결과가 통합됩니다. 성능 메트릭, 최적의 구성, 최적의 모델에 대한 정형 액세스를 제공합니다.사용 가능한 특성은 다음과 같습니다.
결과: 모든 시도에 대한 메트릭과 구성이 포함된 Pandas DataFrame.
best_result: 최고의 성과를 보인 시도를 요약한 DataFrame 행.
best_model: 최상의 시도와 연결된 모델 인스턴스(해당되는 경우).
다음 코드는 결과, 최상의 모델 및 최상의 결과를 가져옵니다.
print(tuner_results.results)
print(tuner_results.best_model)
print(tuner_results.best_result)
API 참조¶
Tuner¶
다음은 Tuner 모듈에 대한 import 문입니다.
from snowflake.ml.modeling.tune import Tuner
Tuner 클래스는 Container Runtime HPO API 와 상호 작용하기 위한 기본 인터페이스입니다. HPO 작업을 실행하려면 다음 코드를 사용하여 Tuner 오브젝트를 초기화하고 Snowflake 데이터 세트로 실행 메서드를 호출하십시오.
class Tuner:
def __init__(
self,
train_func: Callable,
search_space: SearchSpace,
tuner_config: TunerConfig,
)
def run(
self, dataset_map: Optional[Dict[str, DataConnector]] = None
) -> TunerResults
SearchSpace¶
다음은 검색 공간에 대한 import 문입니다.
from entities.search_space import uniform, choice, loguniform, randint
다음 코드는 검색 공간 함수를 정의합니다.
def uniform(lower: float, upper: float)
"""
Sample a float value uniformly between lower and upper.
Use for parameters where all values in range are equally likely to be optimal.
Examples: dropout rates (0.1 to 0.5), batch normalization momentum (0.1 to 0.9).
"""
def loguniform(lower: float, upper: float) -> float:
"""
Sample a float value uniformly in log space between lower and upper.
Use for parameters spanning several orders of magnitude.
Examples: learning rates (1e-5 to 1e-1), regularization strengths (1e-4 to 1e-1).
"""
def randint(lower: int, upper: int) -> int:
"""
Sample an integer value uniformly between lower(inclusive) and upper(exclusive).
Use for discrete parameters with a range of values.
Examples: number of layers, number of epochs, number of estimators.
"""
def choice(options: List[Union[float, int, str]]) -> Union[float, int, str]:
"""
Sample a value uniformly from the given options.
Use for categorical parameters or discrete options.
Examples: activation functions ['relu', 'tanh', 'sigmoid']
"""
TunerConfig¶
다음은 TunerConfig 모듈에 대한 import 문입니다.
from snowflake.ml.modeling.tune import TunerConfig
다음 코드를 사용하여 Tuner의 구성 클래스를 정의합니다.
class TunerConfig:
"""
Configuration class for the tuning process.
Attributes:
metric (str): The name of the metric to optimize. This should correspond
to a key in the metrics dictionary reported by the training function.
mode (str): The optimization mode for the metric. Must be either "min"
for minimization or "max" for maximization.
search_alg (SearchAlgorithm): The search algorithm to use for
exploring the hyperparameter space. Defaults to random search.
num_trials (int): The maximum number of parameter configurations to
try. Defaults to 5
max_concurrent_trials (Optional[int]): The maximum number of concurrently running trials per node. If not specified, it defaults to the total number of nodes in the cluster. This value must be a positive
integer if provided.
Example:
>>> from entities import search_algorithm >>> from snowflake.ml.modeling.tune import TunerConfig
>>> config = TunerConfig(
... metric="accuracy",
... mode="max",
... num_trials=5,
... max_concurrent_trials=1
... )
"""
SearchAlgorithm¶
다음은 검색 알고리즘에 대한 import 문입니다.
from entities.search_algorithm import BayesOpt, RandomSearch, GridSearch
다음 코드는 베이지안 최적화 검색 알고리즘 오브젝트를 생성합니다.
@dataclass
class BayesOpt():
"""
Bayesian Optimization class that encapsulates parameters for the acquisition function.
This class is designed to facilitate Bayesian optimization by configuring
the acquisition function through a dictionary of keyword arguments.
Attributes:
utility_kwargs (Optional[Dict[str, Any]]):
A dictionary specifying parameters for the utility (acquisition) function.
If not provided, it defaults to:
{
'kind': 'ucb', # Upper Confidence Bound acquisition strategy
'kappa': 2.576, # Exploration parameter for UCB
'xi': 0.0 # Exploitation parameter
}
"""
utility_kwargs: Optional[Dict[str, Any]] = None
다음 코드는 무작위 검색 알고리즘 오브젝트를 생성합니다.
@dataclass
class RandomSearch():
The default and most basic way to do hyperparameter search is via random search.
Attributes:
Seed or NumPy random generator for reproducible results. If set to None (default), the global generator (np.random) is used.
random_state: Optional[int] = None
TunerResults¶
다음은 TunerResults 모듈에 대한 import 문입니다.
from entities.tuner_results import TunerResults
다음 코드는 TunerResults 오브젝트를 생성합니다.
@dataclass
class TunerResults:
results: pd.DataFrame
best_result: pd.DataFrame
best_model: Optional[Any]
get_tuner_context¶
다음은 get_tuner_context
모듈에 대한 import 문입니다.
from snowflake.ml.modeling.tune import get_tuner_context
이 도우미 메서드는 학습 함수 내에서 호출되도록 설계되었습니다. 다음을 포함하여 시도 실행에 유용한 여러 필드를 캡슐화한 TunerContext 오브젝트를 반환합니다.
현재 시도의 경우 HPO 프레임워크에서 선택한 하이퍼 매개 변수입니다.
학습에 필요한 데이터 세트입니다.
메트릭을 보고하는 도우미 함수로, HPO 프레임워크가 다음 하이퍼 매개 변수 세트를 제안하도록 안내합니다.
다음 코드는 Tuner 컨텍스트 오브젝트를 생성합니다.
class TunerContext:
"""
A centralized context class for managing trial configuration, reporting, and dataset information.
"""
def get_hyper_params(self) -> Dict[str, Any]:
"""
Retrieve the configuration dictionary.
Returns:
Dict[str, Any]: The configuration dictionary for the trial.
"""
return self._hyper_params
def report(self, metrics: Dict[str, Any], model: Optional[Any] = None) -> None:
"""
Report metrics and optionally the model if provided.
This method is used to report the performance metrics of a model and, if provided, the model itself.
The reported metrics will be used to guide the next set of hyperparameters selection in the
optimization process.
Args:
metrics (Dict[str, Any]): A dictionary containing the performance metrics of the model.
The keys are metric names, and the values are the corresponding metric values.
model (Optional[Any], optional): The trained model to be reported. Defaults to None.
Returns:
None: This method doesn't return anything.
"""
def get_dataset_map(self) -> Optional[Dict[str, Type[DataConnector]]]:
"""
Retrieve the dataset mapping.
Returns:
Optional[Dict[str, Type[DataConnector]]]: A mapping of dataset names to DataConnector types, if available.
"""
return self._dataset_map
제한 사항¶
베이지안 최적화는 연속 검색 공간이 필요하며 균일 샘플링 함수로만 작동합니다. 불연속 매개 변수와는 호환되지 않습니다. tune.randint
또는 tune.choice
메서드를 사용하여 샘플링된 것입니다. 이 제한을 해결하려면 tune.uniform
을 사용하여 학습 함수 내에서 매개 변수를 캐스팅하거나 tune.RandomSearch
와 같이 불연속 공간과 연속 공간을 모두 처리하는 샘플링 알고리즘으로 전환하십시오.
문제 해결하기¶
오류 메시지 |
가능한 원인 |
가능한 해결책 |
---|---|---|
유효하지 않은 검색 공간 구성: BayesOpt 에서는 모든 샘플 함수가 ‘Uniform’ 유형이어야 합니다. |
베이지안 최적화는 불연속 샘플이 아닌 균일한 샘플링에서만 작동합니다. (위의 제한 사항 을 참조하십시오.) |
|
CPU 리소스가 부족합니다. 필요한 양: 16, 사용 가능한 양: 8. 필요한 리소스와 사용 가능한 리소스의 수가 다를 수 있습니다. |
|
오류 메시지가 제공하는 안내를 따릅니다. |
GPU 리소스가 부족합니다. 필요한 양: 4, 사용 가능한 양: 2. CPU 또는 GPU 를 지칭할 수 있습니다. 필요한 리소스와 사용 가능한 리소스의 수가 다를 수 있습니다. |
|
오류 메시지가 제공하는 안내를 따릅니다. |