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
Copy

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)
Copy

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ètres

  • Un 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)
Copy

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)

  • Utilisez tune.uniform et inscrivez le résultat dans votre fonction de formation.

  • Passez à l’algorithme RandomSearch, qui accepte les échantillons discrets et non discrets.

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.

max_concurrent_trials est fixé à une valeur supérieure à celle des cœurs disponibles.

Le message d’erreur complet décrit plusieurs options que vous pouvez essayer.