【问题标题】:How to use early terminate in wandb sweep?如何在wandb扫描中使用提前终止?
【发布时间】:2023-02-03 08:41:56
【问题描述】:

我正在尝试使用 wandb sweep 来调整模型中的超参数,并尝试使用 hyperband early terminate 方法来加速它。

但是,通过查找文档https://docs.wandb.ai/guides/sweeps/define-sweep-configuration#early_terminate 和论文https://arxiv.org/abs/1603.06560,我不明白这种机制是如何工作的。

在这篇论文中,作者提出了“资源”的概念。在我看来,在 wandb 设置中,“资源”应该是 num of training epochs。但是,在“early terminate”的配置中,我只能看到“s”、“eta”、“min_iter”和“max_iter”的参数。通过文档的解释,我不明白它们的真正含义。

在github的例子中,很难看出early terminate是否生效,所以希望能有一段简单的代码来解释一下early terminate是如何工作的。

我想知道记录的指标是否应该是“valid_acc”。如果有人能帮助我理解 wandb sweep 中的提前终止机制实际上做了什么,特别是参数的含义,以及如何更改训练代码,我将不胜感激。

我尝试将 max_iter 设置为 9 和 s 1。但是,它一直在运行并且永不停止。

【问题讨论】:

    标签: deep-learning hyperparameters wandb


    【解决方案1】:

    感谢你的提问。澄清术语和参数:

    • “s” - 对应于算法可以评估潜在终止运行的括号总数
    • “eta”对应于在每个括号中丢弃的运行的反比例。
    • “min_iter”是每个配置应运行的最小迭代次数。
    • “max_iter”是每个配置可以运行的最大迭代次数。

    默认情况下,eta 设置为 3。在您将 max_iter 设置为 9 的情况下,可以在第 3 个时期评估 early_termination。 (9/3)

    注意:提前终止可以在完成之前终止现有运行。然而,最终算法的筛选标准是由原始搜索策略决定的。要执行有限搜索,您可以使用具有离散空间的网格搜索(随机搜索和贝叶斯搜索将连续对搜索空间进行采样)。您还可以在扫描配置中提供 run_cap。最后,您还可以在代理级别指定 count 参数。

    对于示例代码:

    import numpy as np
    import random
    import wandb
    import time
    
    def train_one_epoch(epoch, lr, bs): 
      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():
        run = wandb.init()
    
        lr  =  wandb.config.lr
        bs = wandb.config.batch_size
    
        for epoch in range(10):
          # Sleep a sufficient amount of time each epoch for early stopping to terminate an ongoing run 
          time.sleep(35) 
          train_acc, train_loss = train_one_epoch(epoch, lr, bs)
          val_acc, val_loss = evaluate_one_epoch(epoch)
    
          wandb.log({
            'train_acc': train_acc,
            'train_loss': train_loss,
            'val_acc': val_acc,
            'val_loss': val_loss
          })
    
    # ? Step 2: Define sweep config
    sweep_configuration = {
        'method': 'random',
        'name': 'hyperband_sweep_test',
        'metric': {'goal': 'maximize', 'name': 'val_acc'},
        'parameters':
        {
            'batch_size': {'values': [16, 32, 64]},
            'lr': {'max': 0.1, 'min': 0.0001}
         },
         "early_terminate": {
            "type": "hyperband",
            "eta": 2,
            "min_iter":2
         }
    }
    
    
    # run once to obtain a sweep ID
    # sweep_id = wandb.sweep(sweep=sweep_configuration, project='hyperband_example_project2')
    
    # ? Step 4: Call to `wandb.agent` to start a sweep
    wandb.agent('<entity>/<project>/<sweep_id>', function=main)
    

    您将希望同时使用多个代理运行它以观察提前停止。 eta 设置为 2,min_iter 设置为 2。因此括号点将位于 2、4、8 个纪元。在每个支架上,可以停止一半的配置。 (1/埃塔)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2015-11-23
      相关资源
      最近更新 更多