标签: pytorch-lightning

Pytorch-lightning 中的“on_validation_epoch_end”和“validation_epoch_end”有什么区别?

在 内部LightningModule,Pycharm 允许 2 种自动完成方法:

class MyModel(LightningModule):

    def on_validation_epoch_end(self):

    def validation_epoch_end(self, outs):
Run Code Online (Sandbox Code Playgroud)

on_validation_epoch_end引用于hooks.py

def on_validation_epoch_end(self) -> None:
    """
    Called in the validation loop at the very end of the epoch.
    """
    # do something when the epoch ends
Run Code Online (Sandbox Code Playgroud)

validation_epoch_end称为evaluation_loop.py导致.eval_results = model.validation_epoch_end(eval_results)__run_eval_epoch_end


其中每一个的目的是什么?

我只能假设其中一个已被弃用。找不到任何相关文档。

python pytorch pytorch-lightning

6
推荐指数
1
解决办法
6941
查看次数

如何防止 pytorch Lightning 中的张量板记录器记录当前纪元?

在 pytorch Lightning 中创建新的张量板记录器时,默认记录的两件事是当前纪元和 hp_metric。我能够通过设置禁用 hp_metric 日志记录default_hp_metric=False,但我找不到任何可以禁用纪元日志记录的内容。我在 Lightning.py、trainer.py 和 tensorboard.py 文件中进行了搜索,其中包含模块、训练器和张量板记录器的代码,但在任何地方都找不到 epoch 的日志记录调用。

即使采用 pytorch Lightning 教程中的准系统示例,也会发生这种行为。

有没有办法禁用纪元记录以防止张量板界面混乱?

Tensorboard 历元记录

python logging tensorboard pytorch pytorch-lightning

6
推荐指数
1
解决办法
2957
查看次数

训练 PyTorch 脚本直至收敛的标准方法是什么?

检测模型是否收敛的标准方法是什么?我打算记录 5 次损失,每次损失有 95 个置信区间,如果他们都同意,那么我\xe2\x80\x99d 停止脚本。我假设收敛之前的训练必须已经在 PyTorch 或 PyTorch Lightning 中的某个地方实现。我不需要一个完美的解决方案,只需自动执行此操作的标准方法 - 即收敛时停止。

\n

我的解决方案很容易实现。一旦创建了一个标准并将减少更改为none。然后它将输出一个大小为 的张量[B]。每次记录时都会记录下来,并且它是 95 置信区间(如果您愿意,也可以是 std,但这精度要低得多)。然后,每次添加新损失及其置信区间时,请确保其大小保持为 5(或 10),并且 5 个损失彼此之间的 CI 范围在 95 以内。那么如果这是真的就停下来。

\n

您可以使用以下方法计算 CI:

\n
def torch_compute_confidence_interval(data: Tensor,\n                                           confidence: float = 0.95\n                                           ) -> Tensor:\n    """\n    Computes the confidence interval for a given survey of a data set.\n    """\n    n = len(data)\n    mean: Tensor = data.mean()\n    # se: Tensor = scipy.stats.sem(data)  # compute standard error\n    # se, mean: Tensor = …
Run Code Online (Sandbox Code Playgroud)

python machine-learning deep-learning pytorch pytorch-lightning

6
推荐指数
1
解决办法
1836
查看次数

从 PyTorch 闪电模型中检索 PyTorch 模型

我训练了一个 PyTorch 闪电模型,如下所示:

In [16]: MLP
Out[16]:
DecoderMLP(
  (loss): RMSE()
  (logging_metrics): ModuleList(
    (0): SMAPE()
    (1): MAE()
    (2): RMSE()
    (3): MAPE()
    (4): MASE()
  )
  (input_embeddings): MultiEmbedding(
    (embeddings): ModuleDict(
      (LCLid): Embedding(5, 4)
      (sun): Embedding(5, 4)
      (day_of_week): Embedding(7, 5)
      (month): Embedding(12, 6)
      (year): Embedding(3, 3)
      (holidays): Embedding(2, 1)
      (BusinessDay): Embedding(2, 1)
      (day): Embedding(31, 11)
      (hour): Embedding(24, 9)
    )
  )
  (mlp): FullyConnectedModule(
    (sequential): Sequential(
      (0): Linear(in_features=60, out_features=435, bias=True)
      (1): ReLU()
      (2): Dropout(p=0.13371112461182535, inplace=False)
      (3): LayerNorm((435,), eps=1e-05, elementwise_affine=True)
      (4): Linear(in_features=435, out_features=435, bias=True)
      (5): ReLU()
      (6): …
Run Code Online (Sandbox Code Playgroud)

python pytorch pytorch-lightning

6
推荐指数
1
解决办法
6160
查看次数

如何获得 PyTorch Lightning 的总体测试精度?

如何trainer.test使用该方法获得所有批次的总准确度?

我知道我可以实施,model.test_step但这只是针对单个批次。我需要整个数据集的准确性。我可以用来torchmetrics.Accuracy积累准确性。但是将其结合起来并获得总准确度的正确方法是什么?model.test_step由于批量测试分数不是很有用,无论如何应该返回什么?我可以以某种方式破解它,但令我惊讶的是,我在互联网上找不到任何示例来演示如何使用 pytorch-lightning 原生方式获得准确性。

pytorch-lightning

6
推荐指数
1
解决办法
4768
查看次数

从检查点加载模型不起作用

我训练了一个普通的 vae,我从这个存储库修改了它。当我尝试使用经过训练的模型时,我无法使用 加载权重load_from_checkpoint。我的检查点对象和我的对象之间似乎不匹配lightningModule

VAEXperiment使用 . 设置了一个实验 ( ) pytorch-lightning LightningModule。我尝试使用以下方法将权重加载到网络中:

#building a new model
model = VanillaVAE(**config['model_params'])
model.build_layers()

#loading the weights
experiment = VAEXperiment(model, config['exp_params'])
experiment.load_from_checkpoint(path_to_checkpoint, config['exp_params'])
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

checkpoint = torch.load(path_to_checkpoint, map_location=lambda storage, loc: storage)
model.load_state_dict(checkpoint['state_dict'])
Run Code Online (Sandbox Code Playgroud)

但我收到错误 Unexpected key(s) in state_dict: "model.encoder.0.0.weight", "model.encoder.0.0.bias"...

我还关注了https://github.com/PyTorchLightning/pytorch-lightning/issues/924 https://github.com/PyTorchLightning/pytorch-lightning/issues/2798上的问题

为什么我会收到此错误?是因为我的模型中的编码器和解码器模块吗?根据 git 上的问题日志,错误似乎已解决。我究竟做错了什么?

pytorch pytorch-lightning

5
推荐指数
1
解决办法
6008
查看次数

Pytorch Lightning 为每个 GPU 重复主脚本

我有一台带有两个显卡的机器。我想用两者来训练我的模型。为了让我的生活更轻松,我正在使用 pytorch lighting。

当我在没有 GPU 的情况下运行脚本时,一切正常:

trainer = Trainer(gpus=None)
Run Code Online (Sandbox Code Playgroud)

但我想在多个 GPU 上运行它。令人困惑的是,手册首先指出,对于一台具有多个 GPU 的机器,您应该使用“dp”加速器:

trainer = Trainer(gpus=2, accelerator='dp')
Run Code Online (Sandbox Code Playgroud)

这会启动训练课程,但会出现一个 BroadcastBackward 错误,只有当我尝试使用 dp 加速器时才会出现该错误(详细信息如下)。

然而手册继续说

PyTorch 和 Lightning 不鼓励使用 DP。使用更稳定且至少快 3 倍的 DDP

听起来很棒!所以我这样做:

trainer = Trainer(gpus=2, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)

但现在当我运行时trainer.fit,训练器启动第二个进程(proc = subprocess.Popen(command, env=env_copy, cwd=cwd)在 ddp_accelerator.py 中)。

一方面,这是预期的行为(每个 GPU 一个进程),但另一方面,它确实重新运行了我的主脚本(它不仅仅是重新导入,因此保护并if __name__ == "__main__":没有帮助)。我的脚本是一个优化方案,流程如下:

  1. 生成超参数(基于早期运行的结果)
  2. 构建、训练、评估模型:回报绩效衡量
  3. 从 1 开始重复

这意味着第二个进程获得的超参数与第一个进程不同,这显然会引发错误。

顺便说一句,在 1 个 GPU 上运行效果很好(训练完成且没有错误):

trainer = Trainer(gpus=1, accelerator='ddp')
Run Code Online (Sandbox Code Playgroud)

我应该如何解决这个问题?坚持使用“dp”并修复我的 BroadcastBackward 错误?或者坚持使用 ddp,但是如何修复脚本重复错误呢?

dp错误详细信息:

在文件 X,第 …

gpu machine-learning pytorch pytorch-lightning

5
推荐指数
0
解决办法
1060
查看次数

PyTorch Lightning:同一 Tensorboard 图中的多个标量(例如训练和有效损失)

使用 PyTorch Tensorboard,我可以在单个 Tensorboard 图中记录我的训练和有效损失,如下所示:

writer = torch.utils.tensorboard.SummaryWriter()

for i in range(1, 100):
    writer.add_scalars('loss', {'train': 1 / i}, i)

for i in range(1, 100):
    writer.add_scalars('loss', {'valid': 2 / i}, i)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何使用 Pytorch Lightning 的默认 Tensorboard 记录器实现相同的效果?

def training_step(self, batch: Tuple[Tensor, Tensor], _batch_idx: int) -> Tensor:
    inputs_batch, labels_batch = batch

    outputs_batch = self(inputs_batch)
    loss = self.criterion(outputs_batch, labels_batch)

    self.log('loss/train', loss.item())  # creates separate graph

    return loss

def validation_step(self, batch: Tuple[Tensor, Tensor], _batch_idx: int) -> None:
    inputs_batch, labels_batch = batch

    outputs_batch = self(inputs_batch) …
Run Code Online (Sandbox Code Playgroud)

pytorch-lightning

5
推荐指数
1
解决办法
3975
查看次数

使用 Pytorch Lightning 时如何将指标(例如验证损失)记录到 TensorBoard?

我正在使用 Pytorch Lightning 来训练我的模型(在 GPU 设备上,使用 DDP),TensorBoard 是 Lightning 使用的默认记录器。

我的代码设置为分别记录每个训练和验证步骤的训练和验证损失。

class MyLightningModel(pl.LightningModule):

    def training_step(self, batch):
        x, labels = batch
        out = self(x)
        loss = F.mse_loss(out, labels)
        self.log("train_loss", loss)
        return loss

    def validation_step(self, batch):
        x, labels = batch
        out = self(x)
        loss = F.mse_loss(out, labels)
        self.log("val_loss", loss)
        return loss
Run Code Online (Sandbox Code Playgroud)

TensorBoard在选项卡中正确绘制train_loss和图表。但是,在选项卡中的左侧栏上,仅在 下可见。val_lossSCALERSHPARAMShp_metricMetrics

在此输入图像描述

但是,在HPARAMS选项卡中的左侧栏上,仅hp_metric在 下可见Metrics

在此输入图像描述

我们如何将train_loss和添加val_loss到该Metrics部分?这样,我们就可以使用val_lossinPARALLEL COORDINATES VIEW来代替hp_metric …

python machine-learning tensorboard pytorch pytorch-lightning

5
推荐指数
1
解决办法
2345
查看次数

Pytorch Lightning:在训练期间获取完整训练数据的模型输出

TL;DR:在 on_train_epoch_start 期间,我想获取所有训练数据上的模型输出,作为一些预训练计算的一部分。我问的是,闪电友好的方法是什么。

这是一个奇怪的问题。

在我的项目中,每 10 个时期我都会选择完整训练数据的一个子集,并仅在该子集上进行训练。在计算要使用哪个子集的过程中,我计算了训练数据集中每个数据点的模型输出。

我的问题是,在 pytorch lighting 中做到这一点的最佳方法是什么?目前我有一个带有on_train_epoch_start钩子的回调。在此挂钩期间,回调从生成自己的数据加载器trainer.datamodule.train_dataloader(),并手动迭代数据加载器,计算模型输出。这并不理想,对吧?

这让我遇到了 pytorch lighting 的问题。例如,当在 GPU 上训练时,我收到错误,因为我的回调使用其自己的数据加载器,而不是训练器的train_dataloader,因此它不在 GPU 上。但是,我无法使用 trainer's train_dataloader,因为在我的回调选择其子集之后,它将 trainer's 更改train_dataloader为该子集,而不是完整的数据集。

我想我有两个主要问题:

  1. 有什么方法可以避免制作单独的数据加载器?我可以以某种方式调用火车环路吗?在完整数据集上获取模型输出似乎是一个如此简单的操作,我认为这只是一个简单的操作。
  2. 如何获取/使用与所有 Pytorch Lightning 自动修改同步的数据加载器?(例如 GPU/CPU、数据加载工作线程、pin_memory)

python pytorch pytorch-lightning

5
推荐指数
0
解决办法
946
查看次数