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

使用Lightning Trainer、WandB和Hydra记录模型时的配置结构异常问题

解决WandB Logger记录OmegaConf配置时的字符拆分问题

核心原因

WandB Logger在记录模型工件时会递归遍历模型的可迭代属性,而OmegaConf对象本身属于可迭代类型(会遍历字符串键的单个字符),最终导致self.cfg被拆分为单个字符的键值对。

解决方案

方案1:保留OmegaConf引用,同时存入字典格式配置

在LightningModule中同时保留OmegaConf实例(满足代码可读性)和字典格式的配置(供WandB正确记录):

from omegaconf import OmegaConf
import pytorch_lightning as pl

class MyModel(pl.LightningModule):
    def __init__(self, cfg):
        super().__init__()
        # 保留OmegaConf实例,继续使用点表示法访问
        self.cfg = cfg
        # 转为字典并存入模型超参数,WandB会读取这个结构
        self.save_hyperparameters(OmegaConf.to_container(cfg, resolve=True))

方案2:手动传入配置给WandB Logger

初始化WandB Logger时直接传入转好的字典配置,避免依赖模型属性遍历:

wandb_logger = WandbLogger(
    log_model='all',
    project=cfg.experiment_name,
    name=cfg.experiment_name,
    config=OmegaConf.to_container(cfg, resolve=True)
)

此方法下,WandB会直接使用传入的config参数,不会再遍历模型的self.cfg属性。

方案3:标记OmegaConf属性为非日志追踪项

通过PyTorch Lightning的工具标记self.cfg,让WandB Logger跳过对它的遍历:

from pytorch_lightning.utilities import ignore_logger
import pytorch_lightning as pl

class MyModel(pl.LightningModule):
    def __init__(self, cfg):
        super().__init__()
        # 标记cfg属性不被日志追踪
        @ignore_logger
        def _get_cfg():
            return cfg
        self.cfg = _get_cfg()

验证方式

启动训练后,在WandB平台的模型工件页面查看Run Config,应该能看到正常的层级配置结构,而非单个字符的拆分;同时代码中依然可以使用self.cfg.dataset.batch_size这类点表示法访问配置项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:04:58