重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“将PyTorch投入生产的常见错误有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“将PyTorch投入生产的常见错误有哪些”吧!
成都创新互联公司专注于南岗网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供南岗营销型网站建设,南岗网站制作、南岗网页设计、南岗网站官网定制、小程序定制开发服务,打造南岗网络公司原创品牌,更为您提供南岗网站排名全网营销落地服务。
如果你以前使用过TensorFlow,那么你可能知道TensorFlow和PyTorch之间的关键区别 —— 静态图和动态图。调试TensorFlow非常困难,因为每次模型更改时都要重新构建graph。这需要时间、努力和你的希望。当然,TensorFlow现在更好了。
总的来说,为了使调试更容易,ML框架使用动态图,这些图与PyTorch中所谓的Variables有关。你使用的每个变量都链接到前一个变量,以构建反向传播的关系。
下面是它在实际中的样子:
在大多数情况下,你希望在模型训练完成后优化所有的计算。如果你看一下torch的接口,有很多可选项,特别是在优化方面。eval模式、detach和no_grad的方法造成了很多混乱。让我来解释一下它们是如何工作的。在模型被训练和部署之后,以下是你所关心的事情:速度、速度和CUDA内存溢出异常。
为了加速PyTorch模型,你需要将它切换到eval模式。它通知所有层在推理模式下使用batchnorm和dropout层(简单地说就是不使用dropout)。现在,有一个detach方法可以将变量从它的计算图中分离出来。当你从头开始构建模型时,它很有用,但当你想重用SOTA的模型时,它就不太有用了。一个更全局性的解决方案将是在前向传播的时候在上下文中使用torch.no_grad。这样可以不用在在结果中存储图中变量的梯度,从而减少内存消耗。它节省内存,简化计算,因此,你得到更多的速度和更少的内存使用。
你可以在nn.Module中设置很多布尔标志,有一个是你必须知道的。使用cudnn.benchmark = True来对cudnn进行优化。通过设置cudnn.enabled = True,可以确保cudnn确实在寻找最优算法。NVIDIA在优化方面为你提供了很多神奇的功能,你可以从中受益。
请注意你的数据必须在GPU上,模型输入大小不应该改变。数据的形状的变化越多,可以做的优化就越少。例如,要对数据进行归一化,可以对图像进行预处理。总之,可以有变化,但不要太多。
PyTorch提供了一种简单的方法来优化和重用来自不同语言的模型(见Python-To-Cpp)。如果你足够勇敢,你可能会更有创造力,并将你的模型嵌入到其他语言中。
JIT-compilation允许在输入形状不变的情况下优化计算图。它的意思是,如果你的数据形状变化不大(参见错误#2),JIT是一种选择。老实说,和上面提到的no_grad和cudnn相比,它并没有太大的区别,但可能有。这只是第一个版本,有巨大的潜力。
请注意,如果你的模型中有conditions,这在RNNs中很常见,它就没法用了。
GPU很贵,云虚拟机也一样很贵。即使使用AWS,一个实例也将花费你大约100美元/天(最低价格是0.7美元/小时)。也许有人会想“如果我用5个CPU来代替1个GPU可以吗?”。所有试过的人都知道这是一个死胡同。是的,你可以为CPU优化一个模型,但是最终它还是会比GPU慢。相信我,我强烈建议忘记这个想法。
cudnn - check
no_grad - check
GPU with correct version of CUDA - check
JIT-compilation - check
一切都准备好了,还能做什么?
现在是时候使用一点数学了。如果你还记得大部分NN是如何用所谓的张量训练的。张量在数学上是一个n维数组或多线性几何向量。你能做的就是把输入(如果你有足够的时间的话)分组成张量或者矩阵,然后把它输入到你的模型中。例如,使用图像数组作为发送到PyTorch的矩阵。性能增益等于同时传递的对象数量。
这是一个显而易见的解决方案,但是很少有人真正使用它,因为大多数时候对象都是一个一个地处理的,而且在流程上设置这样的流可能有点困难。别担心,你会成功的!
感谢各位的阅读,以上就是“将PyTorch投入生产的常见错误有哪些”的内容了,经过本文的学习后,相信大家对将PyTorch投入生产的常见错误有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!