Optimisation parallèle des hyperparamètres (HPO) sur Container Runtime pour ML¶
L’API de Snowflake ML Hyperparameter Optimization (HPO) est un cadre agnostique de modèle qui permet un réglage efficace et parallélisé des hyperparamètres des modèles à l’aide d’algorithmes de réglage populaires.
Aujourd’hui, cette API est disponible pour une utilisation au sein d’un Notebook Snowflake configuré pour utiliser le Container Runtime sur Snowpark Container Services (SPCS). Après avoir créé un tel carnet, vous pouvez :
Entraîner un modèle à l’aide de n’importe quel paquet open source, et utiliser cette API pour distribuer le processus de réglage des hyperparamètres
Entraîner un modèle à l’aide des APIs de formation distribuée ML Snowflake, et mettre à l’échelle HPO tout en mettant à l’échelle chacun des cycles de formation
La charge de travail HPO, lancée à partir du carnet, s’exécute à l’intérieur de Snowpark Container Services sur les instances CPU ou GPU, et s’étend jusqu’aux cœurs (CPUs ou GPUs) disponibles sur un seul nœud du pool de calcul SPCS.
L’API HPO parallélisée offre les avantages suivants :
Une seule API qui gère automatiquement toutes les complexités de la distribution de la formation à travers de multiples ressources
La possibilité de s’entraîner virtuellement avec pratiquement n’importe quel cadre ou algorithme en utilisant les cadres ML open-source ou les APIs de modèle ML Snowflake
Une sélection d’options de réglage et d’échantillonnage, y compris des algorithmes de recherche bayésienne et aléatoire, ainsi que diverses fonctions d’échantillonnage continu et non continu
Intégration étroite avec le reste de Snowflake ; par exemple, ingestion efficace des données via les Datasets ou Dataframes de Snowflake et capture automatique du lignage sur ML
Exemples¶
Cet exemple illustre un cas d’utilisation typique de HPO en commençant par ingérer les données d’une table Snowflake via l’API DataConnector de Container Runtime, puis en définissant une fonction d’apprentissage qui crée un modèle XGBoost. L’interface Tuner
fournit la fonctionnalité de réglage, sur la base de la fonction d’apprentissage et de l’espace de recherche donnés.
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
La sortie attendue ressemble à ceci :
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
L’objet tuner_results
contient tous les résultats, le meilleur modèle et le chemin du meilleur modèle.
print(tuner_results.results)
print(tuner_results.best_model)
print(tuner_results.best_model_path)
Vue d’ensemble de API¶
L’API HPO se trouve dans l’espace de noms snowflake.ml.modeling.tune
. La principale API HPO est la classe tune.Tuner
. Lors de l’instanciation de cette classe, vous spécifiez ce qui suit :
Une fonction d’apprentissage qui s’adapte à un modèle
Un espace de recherche (
tune.SearchSpace
) qui définit la méthode d’échantillonnage des hyperparamètresUn objet de configuration du tuner (
tune.TunerConfig
) qui définit l’algorithme de recherche, la métrique à optimiser et le nombre d’essais
Après avoir instancié Tuner
, appelez sa méthode run
avec un mappage d’ensemble de données (qui spécifie un DataConnector
pour chaque ensemble de données d’entrée) pour lancer le processus de réglage.
Pour plus d’informations, exécutez les instructions Python suivantes pour récupérer la documentation sur chaque classe :
from snowflake.ml.modeling import tune
help(tune.Tuner)
help(tune.TunerConfig)
help(tune.SearchSpace)
Limitations¶
L’optimisation bayésienne ne fonctionne qu’avec la fonction d’échantillonnage uniforme. L’optimisation bayésienne s’appuie sur des processus gaussiens comme modèles de substitution et nécessite donc des espaces de recherche continus. Elle est incompatible avec les paramètres discrets échantillonnés à l’aide des méthodes tune.randint
ou tune.choice
. Pour contourner cette limite, vous pouvez soit utiliser tune.uniform
et placer le paramètre à l’intérieur de la fonction d’apprentissage, soit utiliser un algorithme d’échantillonnage qui traite les espaces discrets et continus, tel que tune.RandomSearch
.
Résolution des problèmes¶
Message d’erreur |
Causes possibles |
Solutions possibles |
---|---|---|
Configuration non valide de l’espace de recherche : BayesOpt exige que toutes les fonctions d’échantillonnage soient de type « uniforme ». |
L’optimisation bayésienne ne fonctionne qu’avec un échantillonnage uniforme, pas avec des échantillons discrets. (Voir Limites ci-dessus) |
|
Insuffisance des ressources CPU. Exigence : 16, Disponible : 8. Peut faire référence à CPU ou GPU. Le nombre de ressources requises et disponibles peut varier. |
|
Le message d’erreur complet décrit plusieurs options que vous pouvez essayer. |