Skip to main content
Configurez les définitions de balayage, créez des balayages et lancez des agents de balayage avec le SDK Python W&B.

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)