You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Optuna集成Wandb:如何实现每个Trial的独立日志记录?

问题:Optuna多Trial实现Wandb单独日志记录

我在Optuna研究中希望Wandb单独记录每个Trial的日志,但目前运行后,Wandb仪表板仅跟踪最终结果,所有epoch的结果被合并展示,多个Trial被合并为一个运行记录。

我参照Optuna文档中的多运行模式示例代码实现:

import optuna
from optuna.integration.wandb import WeightsAndBiasesCallback

wandb_kwargs = {"project": "my-project"}
wandbc = WeightsAndBiasesCallback(wandb_kwargs=wandb_kwargs, as_multirun=True)


@wandbc.track_in_wandb()
def objective(trial):
    x = trial.suggest_float("x", -10, 10)
    return (x - 2) ** 2


study = optuna.create_study()
study.optimize(objective, n_trials=10, callbacks=[wandbc])

但运行后触发以下错误:

ConfigError: Attempted to change value of key "learning_rate" from 5e-05 to 0.0005657929921495451 If you really want to do this, pass allow_val_change=True to config.update()    wandb: Waiting for W&B process to finish... (failed 1).

请问如何成功实现多Trial研究中每个Trial单独日志记录的功能?


解决方法

这个错误的核心原因是Wandb默认禁止修改已存在的配置项,而每个Optuna Trial的超参数(如learning_rate)不同,导致多Trial运行时尝试修改同一配置项触发限制。可以通过以下方式解决:

  1. 允许配置项修改
    如果你的objective函数中手动调用了wandb.config.update(),需要在调用时添加allow_val_change=True参数,确保不同Trial的超参数可以正常更新:
wandb.config.update({"learning_rate": trial.suggest_float("learning_rate", 1e-5, 1e-3)}, allow_val_change=True)
  1. 正确使用多运行模式
    确保WeightsAndBiasesCallback初始化时设置了as_multirun=True,这个参数会让每个Trial对应Wandb的一个独立子运行,自动隔离不同Trial的日志。

  2. 修改后的完整示例代码

import optuna
import wandb
from optuna.integration.wandb import WeightsAndBiasesCallback

wandb_kwargs = {
    "project": "my-project",
    # 可选:提前声明可变配置项,避免初始化报错
    "config": {"learning_rate": None}
}
wandbc = WeightsAndBiasesCallback(wandb_kwargs=wandb_kwargs, as_multirun=True)


@wandbc.track_in_wandb()
def objective(trial):
    lr = trial.suggest_float("learning_rate", 1e-5, 1e-3)
    # 手动更新config时允许修改
    wandb.config.update({"learning_rate": lr}, allow_val_change=True)
    
    # 模拟训练过程,记录每个epoch的指标
    for epoch in range(10):
        loss = (lr - 0.001)**2 + epoch * 0.01
        wandb.log({"epoch": epoch, "loss": loss})
    
    return loss


study = optuna.create_study()
study.optimize(objective, n_trials=10, callbacks=[wandbc])

这样配置后,每个Trial会在Wandb的multirun项目下生成独立的子运行记录,每个子运行包含自身的超参数和所有epoch的日志数据,不会出现合并展示的问题。

另外需要检查代码中是否有重复初始化Wandb的逻辑,确保所有Wandb相关操作都由Optuna的回调统一管理,避免多个Trial共用同一个Wandb运行实例。


内容的提问来源于stack exchange,提问作者resei09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:23:16