使用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
相关产品推荐
相关产品推荐

