Otimização paralela de hiperparâmetros (HPO) em Container Runtime para ML¶
A API do Snowflake ML Hyperparameter Optimization (HPO) é um framework independente de modelo que permite o ajuste eficiente e paralelo de hiperparâmetros de modelos usando algoritmos de ajuste populares.
Hoje, essa API está disponível para uso em um Snowflake Notebook configurado para usar o Container Runtime no Snowpark Container Services (SPCS). Depois que você criar esse notebook, poderá:
Treinar um modelo usando qualquer pacote de código aberto e usar esta API para distribuir o processo de ajuste de hiperparâmetros
Treinar um modelo usando as APIs de treinamento distribuído do Snowflake ML e dimensione HPO e, ao mesmo tempo, dimensione cada uma das execuções de treinamento
A carga de trabalho do HPO, iniciada no Notebook, é executada dentro do Snowpark Container Services nas instâncias CPU ou GPU e é dimensionada para os núcleos (CPUs ou GPUs) disponíveis em um único nó no pool de computação SPCS.
A HPO API paralelizada oferece os seguintes benefícios:
Uma única API que lida automaticamente com todas as complexidades da distribuição do treinamento em vários recursos
A capacidade de treinar com praticamente qualquer framework ou algoritmo usando estruturas de código aberto ML ou APIs de modelagem do Snowflake ML
Uma seleção de opções de ajuste e amostragem, incluindo algoritmos de pesquisa Bayesiana e aleatória, juntamente com várias funções de amostragem contínuas e não contínuas
Forte integração com o restante do Snowflake; por exemplo, ingestão eficiente de dados por meio do Snowflake Datasets ou Dataframes e captura automática da linhagem do ML
Exemplos¶
Este exemplo ilustra um caso de uso típico do HPO, primeiro ingerindo dados de uma tabela Snowflake por meio do Container Runtime DataConnector API e, em seguida, definindo uma função de treinamento que cria um modelo XGBoost. A interface Tuner
fornece a funcionalidade de ajuste, com base na função de treinamento e no espaço de pesquisa fornecidos.
from snowflake.ml.modeling.tune import get_tuner_context
from snowflake.ml.modeling import tune
# Define a training function, with any models you choose within it.
def train_func():
# A context object provided by HPO API to expose data for the current HPO trial
tuner_context = get_tuner_context()
config = tuner_context.get_hyper_params()
dm = tuner_context.get_dataset_map()
model = xgb.XGBClassifier(**config, random_state=42)
model.fit(dm["x_train"].to_pandas(), dm["y_train"].to_pandas())
accuracy = accuracy_score(
dm["y_train"].to_pandas(), model.predict(dm["x_train"].to_pandas())
)
tuner_context.report(metrics={"accuracy": accuracy}, model=model)
tuner = tune.Tuner(
train_func=train_func,
search_space={
"n_estimators": tune.uniform(50, 200),
"max_depth": tune.uniform(3, 10),
"learning_rate": tune.uniform(0.01, 0.3),
},
tuner_config=tune.TunerConfig(
metric="accuracy",
mode="max",
search_alg=search_algorithm.BayesOpt(),
num_trials=2,
max_concurrent_trials=1,
),
)
tuner_results = tuner.run(dataset_map=dataset_map)
# Access the best result info with tuner_results.best_result
O resultado esperado é semelhante a este:
accuracy should_checkpoint trial_id time_total_s config/learning_rate config/max_depth config/n_estimators
1.0 True ec632254 7.161971 0.118617 9.655 159.799091
O objeto tuner_results
contém todos os resultados, o melhor modelo e o caminho do melhor modelo.
print(tuner_results.results)
print(tuner_results.best_model)
print(tuner_results.best_model_path)
Visão geral do API¶
A HPO API está no namespace snowflake.ml.modeling.tune
. A principal HPO API é a classe tune.Tuner
. Ao instanciar essa classe, você especifica o seguinte:
Uma função de treinamento que se ajusta a um modelo
Um espaço de pesquisa (
tune.SearchSpace
) que define o método de amostragem de hiperparâmetrosUm objeto de configuração do sintonizador (
tune.TunerConfig
) que define o algoritmo de pesquisa, a métrica a ser otimizada e o número de tentativas
Depois de instanciar Tuner
, chame seu método run
com um mapa de conjunto de dados (que especifica um DataConnector
para cada conjunto de dados de entrada) para iniciar o processo de ajuste.
Para obter mais informações, execute os seguintes comandos Python para obter a documentação de cada classe:
from snowflake.ml.modeling import tune
help(tune.Tuner)
help(tune.TunerConfig)
help(tune.SearchSpace)
Limitações¶
A otimização bayesiana funciona apenas com a função de amostragem uniforme. A otimização bayesiana se baseia em processos gaussianos como modelos substitutos e, portanto, requer espaços de pesquisa contínuos. Ele é incompatível com parâmetros discretos amostrados usando os métodos tune.randint
ou tune.choice
. Para contornar essa limitação, use tune.uniform
e converta o parâmetro dentro da função de treinamento ou mude para um algoritmo de amostragem que lide com espaços discretos e contínuos, como tune.RandomSearch
.
Solução de problemas¶
Mensagem de erro |
Causas possíveis |
Possíveis soluções |
---|---|---|
Configuração inválida do espaço de pesquisa: BayesOpt exige que todas as funções de amostragem sejam do tipo ‘Uniforme”. |
A otimização bayesiana funciona apenas com amostragem uniforme, não com amostras discretas. (Consulte Limitações acima.) |
|
Recursos insuficientes de CPU. Necessário: 16, Disponível: 8. Pode se referir a CPU ou GPU. O número de recursos necessários e disponíveis pode ser diferente. |
|
A mensagem de erro completa descreve várias opções que você pode tentar. |