Pytorch Lightning调用training_step时self.log报NoneType无'_results'属性错误
错误原因
self.log是PyTorch Lightning封装的自动日志接口,它的运行依赖Trainer实例提供的运行时上下文。你直接手动调用training_step方法时,模型的self.trainer属性还处于未初始化的None状态,无法访问日志存储需要的_results属性,因此触发AttributeError。
解决方案
分两种适用场景:
场景1:正常训练(推荐用法)
不要手动调用training_step,PL的Trainer会自动调度执行训练、验证、测试的step逻辑,同时自动处理日志、梯度更新、分布式训练等能力。示例代码如下:
from torch.utils.data import DataLoader, TensorDataset import pytorch_lightning as pl import torch import torch.nn as nn import torch.nn.functional as F class LitModel(pl.LightningModule): def __init__(self): super().__init__() self.l1 = nn.Linear(100, 4) def forward(self, x): return torch.relu(self.l1(x.view(x.size(0), -1))) def training_step(self, batch, batch_idx): x, y = batch y_hat = self(x) loss = F.cross_entropy(y_hat, y.long()) self.log("train_loss", loss) return loss def configure_optimizers(self): return torch.optim.Adam(self.parameters(), lr=0.02) # 组装数据集与数据加载器 x = torch.rand((100,100)) y = torch.randint(0,4, size=(100,)) dataset = TensorDataset(x, y) dataloader = DataLoader(dataset, batch_size=10) # 启动训练 pl_model = LitModel() trainer = pl.Trainer(max_epochs=5) trainer.fit(pl_model, train_dataloaders=dataloader)
该场景下self.log会正常工作,日志可以通过Trainer配置的日志器查看,也会自动同步到训练进度条。
场景2:手动单步调试training_step
如果需要单独调用training_step做调试,可选择以下两种处理方式:
方案A:给log逻辑加判空保护
修改training_step中的log调用,只有存在Trainer上下文时才调用self.log:
def training_step(self, batch, batch_idx): x, y = batch y_hat = self(x) loss = F.cross_entropy(y_hat, y.long()) # 加判空,手动调用时跳过自动日志逻辑 if self.trainer is not None: self.log("train_loss", loss) return loss
方案B:手动初始化上下文(仅适合临时调试)
如果需要在手动调用时也触发log逻辑,可以提前初始化Trainer相关上下文变量:
pl_model = LitModel() # 实例化Trainer并绑定到模型 trainer = pl.Trainer() pl_model.trainer = trainer # 初始化日志存储所需的上下文属性 trainer._results = pl.core.results.ResultCollection() pl_model._current_fx_name = "training_step" # 此时调用training_step不会报错 x = torch.rand((10,100)) y = torch.randint(0,4, size=(10,)) batch = (x,y) loss = pl_model.training_step(batch, 0)
注意:方案B调用了PL的内部API,不同版本之间可能存在兼容性问题,仅推荐用于本地临时调试,不要在生产训练代码中使用。
内容的提问来源于stack exchange,提问作者Jingles
相关产品推荐
相关产品推荐

