显然狮子、熊和老虎是朋友
PyTorch-lightning是最近发布的库,它是PyTorch的一个类似Kera的ML库。它将核心训练和验证逻辑留给您,并自动完成其余的工作。(顺便说一句,Keras我指的是没有样板,没有过度简化)。
作为 lightning 的核心作者,我曾多次被问及 lightning 与 fast.ai,PyTorch ignite 之间的核心区别的问题。
在这里,我将「尝试」对这三个框架进行客观的比较。列出所有三个框架的教程和文档中客观存在的异同。
Ummmm
Fast.ai 最初是为了便于教学 fast.ai课程(https://www.fast.ai/2018/10/02/fastai-ai/)。它最近也变成了一个通用方法的实现库,比如GANs、RL和迁移学习。
PyTorch Ignite 和 Pytorch Lightning 的创建都是为了要求研究人员为训练循环和验证循环中发生的事情定义函数,从而给研究人员提供足够的灵活性。
Lightning还有两个更具野心的动机:可重复性和民主化的最佳实践,只有Pythorch高级用户才能实现(分布式训练、16位精度等)。我将在后面的部分详细讨论这些动机。
因此,在基本级别,目标用户很清楚:fast.ai,专注于「对深度学习感兴趣的人」,而另外两个则是针对ML或使用ML的「活跃的研究者」 (例如:生物学家,神经科学家等)
框架过载
Lightning和Ignite都有非常简单的界面,因为大多数工作仍然是由用户在纯Pythorch中完成的。主要工作分别在Engine和 Trainer对象内部进行。
但是,Fast.ai 确实需要在Pythorch之上学习另一个库。API在大多数情况下并不直接对纯Pythorch代码进行操作(有些地方是这样做的),但它需要诸如DataBunches,DataBlocs等的抽象。当“最好的”方式作用不明显时,这些API是非常有用的。
然而,于研究人员来说,关键是不必再学习另一个库,直接控制研究的关键部分,如数据处理,而不需要其他抽象操作。
在这种情况下,fast.ai库有一个更高的学习曲线,但是如果您不一定知道做某事的“最佳”方法,而只是想采用黑匣子,那么它是值得的。
更像是分享
从上面可以看出,考虑到用例和用户是不同的,将fast.ai与这两个框架是不公平的(但是,我仍然要添加fast.ai到本文末尾的比较表格中)。
Lightning和ignite之间的第一个主要区别是它的操作界面。
在Lightning中,有一个每个模型都必须遵循9种必需方法的标准接口(请参见LightningModule:https://williamfalcon.github.io/pytorch-lightning/LightningModule/RequiredTrainerInterface/)。
class CoolModel(ptl.LightningModule):
def __init__(self):
super(CoolModel, self).__init__()
# not the best model...
self.l1 = torch.nn.Linear(28 * 28, 10)
def forward(self, x):
return torch.relu(self.l1(x.view(x.size(0), -1)))
def training_step(self, batch, batch_nb):
x, y = batch
y_hat = self.forward(x)
return {'loss': F.cross_entropy(y_hat, y)(y_hat, y)}
def validation_step(self, batch, batch_nb):
x, y = batch
y_hat = self.forward(x)
return {'val_loss': F.cross_entropy(y_hat, y)(y_hat, y)}
def validation_end(self, outputs):
avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean()
return {'avg_val_loss': avg_loss}
def configure_optimizers(self):
return [torch.optim.Adam(self.parameters(), lr=0.02)]
@ptl.data_loader
def tng_dataloader(self):
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32)
@ptl.data_loader
def val_dataloader(self):
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32)
@ptl.data_loader
def test_dataloader(self):
return DataLoader(MNIST(os.getcwd(), train=True, download=True, transform=transforms.ToTensor()), batch_size=32)
view rawfa_1.py hosted with ❤ by GitHub
这种灵活的格式允许在训练和验证方面获得最大的自由。这个接口应该被看作是一个「系统」,而不是一个模型。系统可能有多个模型(GANs、seq-2-seq等),也可能是单个模型,如简单的MNIST示例。
因此,研究人员可以随心所欲地尝试疯狂的事情,只需关注这9种方法。
Ignite需要非常相似的设置,但并没有每个模型都需要遵循的「标准」接口。
请注意,「run」函数的定义可能有所不同,即:可能向训练器中添加了许多不同的事件,或者甚至可以将其命名为不同的名称,例如「main,train,等等…」。
在复杂的系统中,可能会以奇怪的方式进行训练(看着您的GAN和RL),对于看这段代码的人来说,发生了什么并不是很明显。而在Lightning中,您可通过查看训练步骤来了解正在发生的情况。
当你试图再现工作时
正如我所提到的,Lightning的创建还有另一个更为雄心勃勃的动机:「再现性」。
如果您尝试阅读某人的论文实现,那么你将很难弄清正在发生的事情。那些只是设计不同的神经网络架构的日子已经一去不复返了。
现代的SOTA模型实际上是「系统」,它使用许多模型或训练技术来获得特定的结果。
如前所述,LightningModule是一个「系统」,而不是一个模型。因此,如果你想知道所有疯狂的技巧和超级复杂的训练发生在哪里,你可以看看训练步骤和验证步骤。
如果每个研究项目和论文都是使用LightningModule模板来实现的,那么它将「非常」容易发现发生了什么(但可能不容易理解,哈哈)。
整个人工智能社区的这种标准化也将使生态系统蓬勃发展,它可以使用LightningModule接口来做一些很酷的事情,比如自动化部署、审计系统偏差,甚至支持将权重散列到区块链后端,以重建用于可能需要审计的关键预测的模型。
Ignite和Lightning的另一个主要区别是Lightning支持开箱即用(现成)的功能。开箱即用意味着你「没有」额外的代码。
为了说明这一点,让我们尝试在同一台机器的多个gpu上训练一个模型。
「Ignite(」「演示」「)」
「Lightning(」「演示」「)」
好吧,两者都不坏…但是如果我们想在多台机器上使用多个GPU呢?让我们用200个GPU进行训练吧。
「Ignite」
…
好吧,这里没有内置的支持……你必须扩展这个例子(https://github.com/pytorch/ignite/blob/master/examples/mnist/mnist_dist.py),并添加了一种容易提交脚本的方法。然后你就得注意加载/保存,而不是用所有进程覆盖权重/日志等等……你明白了。
「Lightning」
使用lightning,您只需设置节点数并提交适当的作业。以下是有关正确配置作业的深入教程:https://medium.com/@_willfalcon/trivial-multi-node-training-with-pytorch-lightning-ff75dfb809bd。
开箱即用的功能是这些你「不需要做任何事情就可以得到」的特性。这意味着你现在可能不需要它们中的大多数功能,但是当你需要说…累积梯度、梯度裁剪或16位训练时,你不会花数天/数周的时间阅读教程来让它发挥作用。
只需设置适当的Lightning标志,继续你的研究。
Lightning预装了这些功能,因此用户可以花更多的时间进行研究,而不是进行工程设计。这对于非CS/DS的研究人员特别有用,比如物理学家、生物学家等,他们可能对编程这部分的知识不太精通。
这些特性使PyTorch的特性民主化,只有高级用户才会花时间来实现。
下面是按功能分组的3个框架的功能比较表。
如果我遗漏了任何重要的东西,请发表评论,我会更新表格!
在这里,我们对这三个框架进行了多层次的深入比较。各有各的优点。
如果您只是在学习或者不了解最新的最佳实践,则不需要超级高级的训练技巧,并且有足够的时间来学习新的库,那么请使用fast.ai吧.
如果你需要更多的灵活性,可以选择Ignite或Lightning。
如果你不需要超高级的功能,并且可以添加你的tensorboard支持,累积梯度,分布式训练等…那么请使用Ignite吧。
如果您需要更高级的功能、分布式训练、最新和最好的深度学习训练技巧,并且希望看到一个在世界范围内实现标准化,那么就使用Lightning。
原文链接:https://towardsdatascience.com/pytorch-lightning-vs-pytorch-ignite-vs-fast-ai-61dc7480ad8a