Exemple de configuration d’un balayage pour Sweeps
"""
Exemple de configuration de balayage pour W&B Sweeps.
sweep_configuration est un exemple de configuration de balayage à imbrication simple
sweep_configuration_nested est un exemple de configuration de balayage à double imbrication
Remplacez :
- les valeurs entre chevrons par les vôtres
- les valeurs entières, flottantes et les listes de valeurs par votre propre espace de recherche d'hyperparamètres
"""
sweep_configuration = {
"program": "<program_name>",
"name": "<sweep_name>",
"method": "<sweep_method>",
"metric": {
"name": "<metric_name>",
"goal": "<goal_type>"
},
"parameters": {
"hyperparameter_1": {
"search_constraint_1": 0.0001,
"search_constraint_2": 0.1
},
"hyperparameter_2": {
"values": [16, 32, 64]
},
"hyperparameter_3": {
"values": [5, 10, 15]
},
"hyperparameter_4": {
"values": ["value_1", "value_2"]
},
},
}
## Exemple de configuration de balayage à double imbrication
sweep_configuration_nested = {
"program": "<program_name>",
"name": "<sweep_name>",
"method": "<sweep_method>",
"metric": {
"name": "<metric_name>",
"goal": "<goal_type>"
},
"parameters": {
"hyperparameter_1": {
"values": ["<value_1>", "<value_2>"]
},
"hyperparameter_2": {
"values": [128, 256, 512]
},
"hyperparameter_3": {
"values": [0.3, 0.4, 0.5]
},
"hyperparameter_4": {
"value": 1
},
"hyperparameter_5": {
"distribution": "<distribution_type>",
"search_constraint_1": 0,
"search_constraint_2": 0.1
},
"nested_category_1": {
"parameters": {
"nested_hyperparameter_1": {
"distribution": "<distribution_type>",
"search_constraint_1": 0.0,
"search_constraint_2": 0.9
},
"nested_hyperparameter_2": {
"values": [0.0001, 0.0005, 0.001]
}
}
},
"nested_category_2": {
"parameters": {
"nested_hyperparameter_1": {
"distribution": "<distribution_type>",
"search_constraint_1": 0.0,
"search_constraint_2": 0.9
},
"nested_hyperparameter_2": {
"values": [0.1, 0.2, 0.3]
}
}
},
"nested_category_3": {
"parameters": {
"nested_hyperparameter_1": {
"distribution": "<distribution_type>",
"search_constraint_1": 0.5,
"search_constraint_2": 0.7
},
"nested_hyperparameter_2": {
"values": [0.2, 0.3, 0.4]
}
}
}
}
}
Définissez une configuration de balayage, initialisez-la et lancez le balayage
"""
Définir une configuration de balayage, initialiser et démarrer un balayage W&B.
sweep_configuration est une configuration de balayage à imbrication simple. Voir sweep_config.py
pour un exemple de configuration de balayage à double imbrication.
"""
import wandb
import numpy as np
import random
import argparse
def train_one_epoch(epoch, lr, batch_size):
acc = 0.25 + ((epoch / 30) + (random.random() / 10))
loss = 0.2 + (1 - ((epoch - 1) / 10 + random.random() / 5))
return acc, loss
def evaluate_one_epoch(epoch):
acc = 0.1 + ((epoch / 20) + (random.random() / 10))
loss = 0.25 + (1 - ((epoch - 1) / 10 + random.random() / 6))
return acc, loss
def main(args=None):
# Lorsqu'appelé par l'agent de balayage, args sera None,
# donc nous utilisons le projet issu de la configuration du balayage
project = args.project if args else None
with wandb.init(project=project) as run:
# Récupère les valeurs des hyperparamètres depuis l'objet `wandb.Run.config`
lr = run.config["lr"]
batch_size = run.config["batch_size"]
epochs = run.config["epochs"]
# Exécute la boucle d'entraînement et enregistre les valeurs de performances dans W&B
for epoch in np.arange(1, epochs):
train_acc, train_loss = train_one_epoch(epoch, lr, batch_size)
val_acc, val_loss = evaluate_one_epoch(epoch)
run.log(
{
"epoch": epoch,
"train_acc": train_acc,
"train_loss": train_loss,
"val_acc": val_acc, # Métrique optimisée
"val_loss": val_loss,
}
)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--project", type=str, default="sweep-example", help="nom du projet W&B")
args = parser.parse_args()
# Définir un dictionnaire de configuration de balayage
sweep_configuration = {
"method": "random",
"name": "sweep",
"metric": {
"goal": "maximize",
"name": "val_acc"
},
"parameters": {
"batch_size": {"values": [16, 32, 64]},
"epochs": {"values": [5, 10, 15]},
"lr": {"max": 0.1, "min": 0.0001},
},
}
# Initialiser le balayage en transmettant le dictionnaire de configuration
sweep_id = wandb.sweep(sweep=sweep_configuration, project=args.project)
# Démarrer le job de balayage
wandb.agent(sweep_id, function=main, count=2)
Initialiser un balayage
"""
Initialiser un balayage W&B.
Remplacer :
- les valeurs entre chevrons par les vôtres
- sweep_configuration par votre propre dictionnaire de configuration de balayage. Voir
sweep_config.py pour des exemples de configurations de balayage à un et deux niveaux d'imbrication.
"""
import wandb
# Exemple de configuration de balayage
sweep_configuration = {
"method": "<sweep_method>",
"name": "<sweep_name>",
"metric": {
"goal": "<goal>",
"name": "<metric_name>"
},
"parameters": {
"hyperparameter_1": {
"values": [16, 32, 64]
},
"hyperparameter_2": {
"values": [5, 10, 15]
},
"hyperparameter_3": {
"search_constraint_1": 0.1,
"search_constraint_2": 0.0001
},
},
}
sweep_id = wandb.sweep(sweep=sweep_configuration, project="<project>")
Lancez un job de balayage pour exécuter un agent de balayage
"""
Démarrez un job de balayage pour exécuter un agent de balayage.
Remplacez :
- les valeurs entre chevrons par les vôtres
- sweep_id par l'ID de votre balayage, qui est renvoyé lors de l'initialisation d'un balayage.
Voir sweep_initialize.py pour un exemple d'initialisation d'un balayage et d'obtention
du sweep_id.
- count par le nombre de runs que vous souhaitez exécuter dans votre balayage
"""
import wandb
sweep_id, count = "<sweep_id>", 10
wandb.agent(sweep_id, count=count)