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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:48:03