Keras和PyTorch都是对初学者非常友好的深度学习框架,两者各有优势,很多研究者和开发者在选择框架时可能会举棋不定。基于这种情况,grid.aiCEO,纽约大学博士。WilliamFalcon创建了PyTorchLightning,它为PyTorch披上了Keras外衣。Lightning是PyTorch的一个非常轻量级的包。研究人员只需编写核心训练和验证逻辑,其他过程自动完成。所以这有点像Keras的高层封装,隐藏了大部分细节,只保留最通俗易懂的接口。Lightning可以保证自动补全部分的正确性,对于核心训练逻辑的细化非常有利。今天,PyTorchLightning在Twitter上宣布1.0.0版本现已推出,并发布了一篇新的博文,详细介绍了PyTorchLightning的工作原理和新的API。WilliamFalcon表示,他非常期待有一天,当用户在GitHub上查看复杂的项目时,深度学习代码不再那么令人生畏。TeslaAI负责人AndrejKarpathy也评论道:“这看起来很棒,很有前途。PyTorchLightning提倡重构深度学习代码,将“工程(硬件)”与“科学(代码)”分开,然后委托前者到框架。”在过去的几个月里,PyTorchLightning团队通过微调API、完善文档和录制教程,终于顺利推出了V1.0.0。在随后的一篇博文中,团队对PyTorchLightning进行了详尽的介绍.博客地址:https://medium.com/pytorch/pytorch-lightning-1-0-from-0-600k-80fc65e2fab0GitHub地址:https://github.com/PyTorchLightning/pytorch-lightningPyTorchLightning的运行原理和目标人工智能的发展速度远远超过单一框架。深度学习领域也在不断发展,主要是在复杂性和规模方面。Lightning提供了为复杂模型交互而设计的用户体验,同时抽象掉了很多工程的零散细节,比如多GPU和多TPU训练、earlystopping、logging等……PyTorch等框架出现的时间正是人工智能主要关注网络架构的阶段。这些框架提供了将极其复杂的模型组合在一起的所有部分,并且在研究和生产方面都做得非常出色。然而,一旦模型开始交互,如GAN、BERT或自动编码器,范式就会被打破,它很快就会失去其出色的灵活性,这在项目规模上很难维护。与以往的框架不同,PyTorchLightning用于封装一系列交互模型,即深度学习系统。Lightning是为当今世界更复杂的研究和生产用例而构建的,其中许多模型使用复杂的规则进行交互。自动编码系统PyTorchLightning的第二个关键原则是硬件和科学代码的分离。Lightning进化为在不向用户呈现任何抽象的情况下大规模利用大量计算。这种分离使您能够获得以前不可能获得的新功能,例如能够在不更改代码的情况下使用笔记本电脑上的CPU调试512GPU。最终,闪电网络希望成为一个社区驱动的框架。建立一个好的深度学习模型需要大量的专业知识和小技巧才能使系统正常工作。在世界各地,数百名工程师和博士一遍又一遍地执行相同的代码。现在,Lightning不断壮大的贡献者社区拥有超过300名最有才华的深度学习头脑,他们选择分配相同的精力并进行完全相同的优化,但还有数千人从他们的努力中受益。PyTorchLightning1.0.0的新特性Lightning1.0.0标志着一个稳定的最终API。这对使用Lightning的研究人员来说是一件好事,因为他们的代码不容易被破坏或更改。1.研究与生产Lightning的核心优势是能够大规模开展最先进的人工智能研究。这是一个为专业研究人员设计的框架,可以在最大的计算资源上尝试最困难的想法,同时又不失任何灵活性。Lightning1.0.0使大规模部署模型变得容易。代码可以轻松导出。这意味着数据科学家、研究人员等团队现在可以成为生成模型的团队,而无需庞大的机器学习工程师团队。Lightning旨在为研究人员提供一种方法,以在不失去研究所需的任何灵活性的情况下显着缩短生产时间GridAI是一种在云上大规模训练模型的原生平台。该平台允许研究人员构建深度学习模型以迭代大规模计算,然后将模型部署到能够处理深度学习系统最大流量的可扩展环境中。2.Metricspytorch_lightning.metrics是一个MetricsAPI,设计用于在PyTorch和PyTorchLightning中轻松开发和使用指标。更新后的API提供了一种内置方法来计算每个步骤的多个GPU(进程)指标,同时存储统计数据。这允许用户在阶段结束时计算指标,而不必担心与分布式后端相关的任何复杂性。classLitModel(pl.LightningModule):def__init__(self):...self.train_acc=pl.metrics.Accuracy()self.valid_acc=pl.metrics.Accuracy()deftraining_step(self,batch,batch_idx):logits=self(x)...self.train_acc(logits,y)#logstepmetricself.log('train_acc_step',self.train_acc)defvalidation_step(self,batch,batch_idx):logits=self(x)...self.valid_acc(logits,y)#logsepochmetricsself.log('valid_acc',self.valid_acc)要实现自定义指标,只需继承Metric基类并实现__init__()、update()和compute()方法即可。用户需要做的就是正确调用add_state()以使用DDP实现自定义指标。reset()在使用add_state()添加的度量状态变量上调用。从pytorch_lightning.metricsimportMetricclassMyAccuracy(度量):def__init__(自我,dist_sync_on_step=False):super().__init__(dist_sync_on_stepdist_sync_on_step=dist_sync_on_step)self.add_state(“正确”,默认=torch.tensor_reum=“自我”).add_state(“总”,default=torch.tensor(0),dist_reduce_fx="sum")defupdate(self,preds:torch.Tensor,target:torch.Tensor):preds,target=self._input_format(preds,target)断言preds.shape==target.shapeself.correct+=torch.sum(preds==target)self.total+=target.numel()defcompute(self):returnself.correct.float()/self.total3.手动优化VS使用Lightning自动优化,用户无需担心何时启用/禁用grad,只需从training_step返回附带图表的损失进行反向传播或更新优化器,Lightning将自动优化。deftraining_step(self,batch,batch_idx):loss=self.encoder(batch[0])returnloss然而,对于一些研究,比如GAN,强化学习,或者一些有多个优化器或内循环的研究,用户可以关闭自动优化并完全控制您的训练循环。首先,关闭自动优化:trainer*=*Trainer(automatic_optimization*=False*)现在训练循环掌握在用户手中。deftraining_step(self,batch,batch_idx,opt_idx):(opt_a,opt_b,opt_c)=self.optimizers()loss_a=self.generator(batch[0])#usethisinsteadofloss.backwardsowecanautomatehalf#precision,etc...self.manual_backward(loss_a,opt_a,retain_graph=True)self.manual_backward(loss_a,opt_a)opt_a.step()opt_a.zero_grad()loss_b=self.discriminator(batch[0])self.manual_backward(loss_b,opt_b)...4.LoggingLightning使得与logger的集成变得非常简单,只要在LightningModule中调用log()方法,系统就会将记录的数量发送给用户选择的logger。默认使用Tensorboard,但您也可以选择其他支持的记录器。deftraining_step(self,batch,batch_idx):self.log('my_metric',x)根据调用.log()的位置,Lightning将自动确定何时记录(在每个步骤和阶段),但用户也可以通过手动使用on_step和on_epoch覆盖默认行为。但是on_epoch=True会在整个训练epoch中累积记录值。deftraining_step(self,batch,batch_idx):self.log('my_loss',loss,on_step=True,on_epoch=True,prog_bar=True,logger=True)5.数据流Lightning弃用了EvaResult和TrainResult,有利于简化数据在训练和验证循环中流动日志记录并将其与数据分离。每个循环(训练、验证和测试)都有三个可以实现的钩子,如下所示:*=*[]*for*batch*in*data:out*=*training_step(batch)outs*.*append(out)training_epoch_end(outs)training_step中返回的任何内容都可以作为training_epoch_end的输入。deftraining_step(self,batch,batch_idx):prediction=...return{'loss':loss,'preds':prediction}deftraining_epoch_end(self,training_step_outputs):foroutintraining_step_outputs:prediction=out['preds']#dosomethingwiththese验证和测试loop代码实现步骤相同。如果要使用DP或DDP2分布式模式(即在GPU上拆分batch),使用x_step_end进行手动聚合(或者不实现,让lightning做自动聚合)。6.Checkpoints现在,Lightning可以自动将checkpoints与用户上次训练epoch的状态一起保存在当前工作目录中。这保证了用户可以在训练中断时恢复。此外,用户可以自定义检查点行为以监控任意数量的训练或验证步骤。例如,如果用户想根据自己的验证损失更新检查点,可以按如下方式完成:计算任何指标或您想要监控的其他数量,例如验证损失;通过log()方法记录数量以及val_loss(key)等键;初始化ModelCheckpoint回调函数,设置monitor为数量的key;将回调函数checkpoint_callback返回给trainer标志。具体代码过程如下:frompytorch_lightning.callbacksimportModelCheckpointclassLitAutoEncoder(pl.LightningModule):defvalidation_step(self,batch,batch_idx):x,y=batchy_hat=self.backbone(x)#1.calculatelosloss=F.cross_entropy(y_hat,y)#2.log`val_loss`self.log('val_loss',loss)#3.InitModelCheckpointcallback,monitoring'val_loss'checkpoint_callback=ModelCheckpoint(monitor='val_loss')#4.Passyourcallbacktocheckpoint_callbacktrainerflagtrainer=Trainer(checkpoint_callbackcheckpoint_callback=checkpoint_callback,所有APIchanges)包括bug修复等,可以参考github项目。【本文为栏目组织《机器之心》微信公众号《机器之心(id:almosthuman2014)》原文翻译】点击此处查看作者更多好文
