您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    将PyTorch投入消费的5个常见错误
    时间:2020-10-29 12:10 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    ML是幽默的,ML是受欢迎的,ML无处不在。大少数公司要么运用TensorFlow,要么运用PyTorch,还有些老家伙喜欢Caffe。

    虽然大少数教程和在线教程运用TensofFlow,但我的大部分阅历都是运用PyTorch。在这里,我想分享在消费中运用PyTorch最常见的5个错误。思索过运用CPU吗?运用多线程?运用更多的GPU内存?这些坑我们都踩过。

    错误 #1 — 在推理形式下保存静态图

    假设你以前运用过TensorFlow,那么你能够知道TensorFlow和PyTorch之间的关键区别 —— 静态图和静态图。调试TensorFlow十分困难,由于每次模型更改时都要重新构建graph。这需求时间、努力和你的希望。当然,TensorFlow如今更好了。

    总的来说,为了使调试更容易,ML框架运用静态图,这些图与PyTorch中所谓的Variables有关。你运用的每个变量都链接到前一个变量,以构建反向传达的关系。

    下面是它在实践中的样子:

    将PyTorch投入消费的5个常见错误

    在大少数状况下,你希望在模型训练完成后优化一切的计算。假设你看一下torch的接口,有很多可选项,特别是在优化方面。eval形式、detach和no_grad的办法形成了很多混乱。让我来解释一下它们是如何任务的。在模型被训练和部署之后,以下是你所关心的事情:速度、速度和CUDA内存溢出异常。

    为了减速PyTorch模型,你需求将它切换到eval形式。它通知一切层在推理形式下运用batchnorm和dropout层(复杂地说就是不运用dropout)。如今,有一个detach办法可以将变量从它的计算图中别离出来。当你从头末尾构建模型时,它很有用,但当你想重用SOTA的模型时,它就不太有用了。一个更全局性的处置方案将是在前向传达的时分在上下文中运用torch.no_grad。这样可以不用在在结果中存储图中变量的梯度,从而增加内存消耗。它节省内存,简化计算,因此,你失掉更多的速度和更少的内存运用。

    错误 #2 — 没有使能cudnn优化算法

    你可以在nn.Module中设置很多布尔标志,有一个是你必须知道的。运用cudnn.benchmark = True来对cudnn停止优化。经过设置cudnn.enabled = True,可以确保cudnn确真实寻觅最优算法。NVIDIA在优化方面为你提供了很多神奇的功用,你可以从中受益。

    请留意你的数据必须在GPU上,模型输入大小不应该改动。数据的外形的变化越多,可以做的优化就越少。例如,要对数据停止归一化,可以对图像停止预处置。总之,可以有变化,但不要太多。

    错误 #3 — 重用 JIT-compilation

    PyTorch提供了一种复杂的办法来优化和重用来自不同言语的模型(见Python-To-Cpp)。假设你足够英勇,你能够会更有发明力,并将你的模型嵌入到其他言语中。

    JIT-compilation允许在输入外形不变的状况下优化计算图。它的意思是,假设你的数据外形变化不大(参见错误#2),JIT是一种选择。老实说,和下面提到的no_grad和cudnn相比,它并没有太大的区别,但能够有。这只是第一个版本,有庞大的潜力。

    请留意,假设你的模型中有conditions,这在RNNs中很常见,它就没法用了。

    错误 #4 — 尝试扩展运用CPU

    GPU很贵,云虚拟机也一样很贵。即使运用AWS,一个实例也将破费你大约100美元/天(最低价钱是0.7美元/小时)。也许有人会想“假设我用5个CPU来替代1个GPU可以吗?”。一切试过的人都知道这是一个死胡同。是的,你可以为CPU优化一个模型,但是最终它还是会比GPU慢。置信我,我剧烈建议遗忘这个想法。

    错误 #5 — 处置向量而不是矩阵

    cudnn - check

    no_grad - check

    GPU with correct version of CUDA - check

    JIT-compilation - check

    一切都预备好了,还能做什么?

    如今是时分运用一点数学了。假设你还记得大部分NN是如何用所谓的张量训练的。张量在数学上是一个n维数组或多线性几何向量。你能做的就是把输入(假设你有足够的时间的话)分组成张量或许矩阵,然后把它输入到你的模型中。例如,运用图像数组作为发送到PyTorch的矩阵。功用增益等于同时传递的对象数量。

    这是一个不言而喻的处置方案,但是很少有人真正运用它,由于大少数时分对象都是一个一个地处置的,而且在流程上设置这样的流能够有点困难。别担忧,你会成功的!

    【编辑引荐】

    HarmonyOS系统中的JS开发框架

    大数据编排框架

    一篇文章教会你了解Scrapy网络爬虫框架的任务原理和数据采集进程

    如何在PyTorch和TensorFlow中训练图像分类模型

    框架篇:小白也能秒懂的Linux零拷贝原理

    (责任编辑:admin)