0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyTorch可以和TensorFlow一样快,有时甚至比TensorFlow更快了?

DPVg_AI_era 来源:lq 2019-09-07 07:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

PyTorch可以和TensorFlow一样快,有时甚至比TensorFlow更快了?这是怎么回事?最近Reddit的一个帖子引起热议。

近日,Reddit 上有一个热帖:为什么 PyTorch 和 TensorFlow 一样快 (有时甚至比 TensorFlow 更快)?

作者说:

由于这两个库都在底层使用 cuDNN,所以我预想各个操作的速度是相似的。然而,TensorFlow (在 graph 模式下) 编译一个 graph,因此当你运行实际的训练循环时,在 session.run 调用之外没有任何 Python 开销。在 PyTorch 中,由于动态图的关系,需要经常使用 Python,所以我预想这回增加一些开销。更不用说,拥有静态图意味着可以进行图优化,比如节点修剪和排序操作。但我在网上看到的许多基准测试中,在 GPU 上,PyTorch 都可以轻松地赶上 TensorFlow。

一个具体的例子是,在 PyTorch 和 TensorFlow 两个库中的 Adam 实现:

https://github.com/pytorch/pytorch/blob/master/torch/optim/adam.py https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py

PyTorch 拥有你所期望的所有操作。对于 {_resource} _apply_density 情况下的 TensorFlow (据我所知这是常见情况), TensorFlow 有一个专用的 C++ 实现。因此,在这里,TensorFlow 不会在 Python 上花费额外的时间,而且它在 C++ 中有一个优化的实现。在这种情况下,为什么 TensorFlow 版本没有更快一些呢?

我听说 PyTorch 在 cuDNN 级别上进行了更好的优化。有人能提供更多细节吗?是什么阻止了 TensorFlow 做同样的事情?我所知道的惟一优化是 PyTorch 使用 NCHW 格式 (针对 cuDNN 进行了更好的优化),而 TensorFlow 默认使用 NHWC。

更新:看起来新的 Volta GPU 使用 NHWC 格式 (TensorFlow 的默认格式) 的性能更好:https://devblogs.nvidia.com/tensor-core-ai-performance- ones/

这个问题引发了诸多 Reddit 网友的关注,大家纷纷给出自己的答案。

SR2Z:

这里的关键是异步执行 —— 除非你不断地在 GPU 之间复制数据,否则 PyTorch 操作只会为 GPU 排队。对 torch 函数的 Python 调用将在排队操作后返回,因此大多数 GPU 工作都不会占用 Python 代码。这将瓶颈从 Python 转移到了 CUDA,这就是为什么它们执行起来如此相似。

huberloss (回复 SR2Z):

TF 构建了一个执行图,然后由 C++ 后端处理,这意味着你在 Python 中所做的唯一工作就是设置这个图 (至少在 TF1.x 中是这样)。我不认为 TF 会移动移入 / 移出 GPU,除非需要 (例如,op1 运行在 CPU 上,op2 运行在 GPU 上,op3 运行在 CPU 上 -> 这将导致向 GPU 复制或从 GPU 复制)。TF 有执行程序,它也将异步运行所有内容 (这意味着独立节点将以一种你能够尽快满足输出节点的方式执行)。

关于 OP 的观点,我真的不知道为什么有时候会更快。我可以想到的唯一猜测是数据格式,或者某些 ops 调用 CUDA/cuDNN 的方式。

entarko:

正如你所说,这两个库都使用 cuDNN,所以在较低级别上使用的大多数算法是相似的。我的理解是,在默认情况下,PyTorch 中的执行是异步的。这意味着 Python 命令在 GPU 上执行某项调用,但不等待该调用的结果,除非下一个操作需要该结果。因此,GPU 操作速度的唯一不同之处在于 python 调用所需的时间,这与 GPU 上的实际计算相比总体上较小。这并不能解释为什么有时候 PyTorch 更快,这在一定程度上来自 NCHW (尽管并不总是这样),而且还来自算法为不同的操作进行的选择 (cuDNN 的 benchmark flag)。

patrickkidger:

这与 PyTorch 和 TensorFlow 没有直接关系,但是既然 NCHW 和 NHWC 被提了出来,我希望这里有人能知道答案……

为什么 batch size N 是第一个而不是最后一个?在我看来,由于缓存的局部性,最后使用它通常会加快速度。

大多数数据集格式不统一应该不是大问题:相比于在整个计算的其余部分中具有 N-last 格式的好处而言,单个副本转到 N-last 格式(即在将其送入神经网络之前)的开销应该是微不足道的。

programmerChilli (回复 patrickkidger):

我认为你是正确的,将批处理维度放在最后可以实现一些非常有趣的优化 (想想所有的向量化)。

但是,如果你的 batch size 很小,会发生什么呢?比如 batch size 为 2 (可能 3 会更糟)。突然之间,你可以在批处理维度上进行向量化的数量变得非常少了,并且你已经传播了其余的数据,但没有获得多少收益。

实际上,以前有几个框架使用这种格式,比如来自 Nervana 的 Neon。

我想主要的答案是人们尝试了,但是由于各种原因,一些政治上 / 技术上的原因,我们目前已经把 batch size 作为第一个维度确定下来。

un_om_de_cal:

根据我将项目从 PyTorch 转移到 TF 的经验,虽然 PyTorch 的基本训练操作 (前向传播、反向传播、更新参数) 更快,但是一些不寻常的操作 (包括 argmax 和 slicing),PyTorch 比 TF 要慢得多。因此,也许 PyTorch 更适合通常基准测试的更常见的操作,而 TF 针对更广泛的操作进行了优化?

我想到的另一点是,PyTorch 教程在 CPU 上做数据增强,而 TF 教程在 GPU 上做数据增强 (至少 1-2 年前我看到的教程是这样)。如果你像这样做项目,那么你将在 CPU 上执行一些计算,只要你没有耗尽 CPU, 就可以提高效率。

各位 PyTorcher 和 TF boy,你们怎么看?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据集
    +关注

    关注

    4

    文章

    1240

    浏览量

    26261
  • tensorflow
    +关注

    关注

    13

    文章

    336

    浏览量

    62365
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14921

原文标题:Reddit热议:为什么PyTorch比TensorFlow更快?

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    800V超充技术:让电动汽车补能像加油一样

    2024年以来,800V高压平台成为新能源车企竞逐焦点。小米SU7Ultra、极氪007、智己LS6等车型相继量产,“让补能像加油一样快捷”从实验室走进现实生活。2026年3月,
    的头像 发表于 03-20 11:40 376次阅读
    800V超充技术:让电动汽车补能像加油<b class='flag-5'>一样</b><b class='flag-5'>快</b>

    在 NPU 上运行了 eIQ TensorFlow Lite 示例模型报错

    我们已经在 NPU 上运行了 eIQ TensorFlow Lite 示例模型,但它们失败并出现以下错误: 信息:加载的模型 mobilenet_v1_1.0_224_quant.tflite
    发表于 03-18 06:52

    PyTorch 中RuntimeError分析

    原生实现。这是个已知的 PyTorch 限制,常见于 Stable Diffusion、ComfyUI 等使用 interpolate(..., mode=\'nearest\') 的模型中
    发表于 03-06 06:02

    Pytorch 与 Visionfive2 兼容吗?

    Pytorch 与 Visionfive2 兼容吗? $ pip3 install torch torchvision torchaudio --index-url https
    发表于 02-06 08:28

    使用NORDIC AI的好处

    × 在 CPU 上运行时可 10×、更省电,平均模型体积 <5 KB。[Edge AI 软件页] Axon NPU 对同 TensorFlow Lite 模型:* 推理速度最高可比
    发表于 01-31 23:16

    借助谷歌LiteRT构建下代高性能端侧AI

    ) 框架。虽然 TFLite 为传统端侧机器学习设定了标准,但我们的使命是让开发者能够像过去集成传统端侧机器学习一样,无缝地在设备端部署当今最前沿的 AI (如大语言模型)。
    的头像 发表于 01-30 11:23 3109次阅读
    借助谷歌LiteRT构建下<b class='flag-5'>一</b>代高性能端侧AI

    如何在TensorFlow Lite Micro中添加自定义操作符(1)

    来支持各种神经网络层的计算。也就是说,我们不仅可以使用内嵌的算子运算,还可以自己注册个新的算子,更加的灵活。本期就将用两期的文章以 `reshape.cpp` 为例,详细说明如何在 Tens
    的头像 发表于 12-26 10:34 5729次阅读

    一样的展会,不一样的精彩 2025湾芯展圆满收官

    10月17日,2025湾区半导体产业生态博览会(2025湾芯展)在深圳会展中心(福田)圆满收官。全球600多家展商、超30场论坛,在6万平方米的展区内,打造场“不一样的展会”,呈现出“不一样的精彩
    的头像 发表于 10-29 16:56 1480次阅读
    不<b class='flag-5'>一样</b>的展会,不<b class='flag-5'>一样</b>的精彩 2025湾芯展圆满收官

    一样的展会,不一样的精彩:2025湾芯展顺利收官

    内,打造场"不一样的展会",呈现出"不一样的精彩"。本届展会人气火爆,展期三天累计接待总量达到11.23万人次。参展企业集中发布年度新品数约2500件,新品发布与商业合作收获颇丰。   不
    的头像 发表于 10-19 20:27 889次阅读
    不<b class='flag-5'>一样</b>的展会,不<b class='flag-5'>一样</b>的精彩:2025湾芯展顺利收官

    【上海晶珩睿莓1开发板试用体验】将TensorFlow-Lite物体归类(classify)的输出图片移植到LVGL9.3界面中

    既然调通了TensorFlow-Lite物体归类(classify)和LVGL9.3代码,那么把这两个东西结合起来也是没问题的,需要注意的是,TensorFlow-Lite是C++代码,而
    发表于 09-21 00:39

    【上海晶珩睿莓1开发板试用体验】TensorFlow-Lite物体归类(classify)

    用。 OpenCV库编译成功之后,就可以新建个线程进行TensorFlow-Lite物体归类了,这里我直接使用现成的pb和pbtxt文件,具体内容不赘述,来看看识别效果:
    发表于 09-12 22:43

    现场解决EMC电磁辐射干扰:“望闻问切”,像中医一样

    南柯电子|现场解决EMC电磁辐射干扰:“望闻问切”,像中医一样
    的头像 发表于 09-04 09:47 1028次阅读

    Nordic收购 Neuton.AI 关于产品技术的分析

    生成传统框架(如 TensorFlowPyTorch 等)小 10 倍的模型,模型体积可低至个位数 KB,并且推理速度更快、功耗更低。此次收购将 Neuton 的自动化 TinyM
    发表于 06-28 14:18

    无法将Tensorflow Lite模型转换为OpenVINO™格式怎么处理?

    Tensorflow Lite 模型转换为 OpenVINO™ 格式。 遇到的错误: FrontEnd API failed with OpConversionFailure:No translator found for TFLite_Detection_PostProcess node.
    发表于 06-25 08:27

    贴片电容和瓷片电容一样吗?

    贴片电容和瓷片电容并不完全一样,它们在结构、材料、特点和应用等方面存在些差异。以下是对这两种电容器的详细比较: 、结构差异 贴片电容: 结构上,贴片电容是个硅芯片,电极片被镀在芯
    的头像 发表于 04-30 15:05 1044次阅读
    贴片电容和瓷片电容<b class='flag-5'>一样</b>吗?