【问题标题】:Is there a version of TensorFlow not compiled for AVX instructions?有没有为 AVX 指令编译的 TensorFlow 版本?
【发布时间】:2019-05-12 09:20:15
【问题描述】:

我正在尝试在我的 Chromebook 上安装 TensorFlow,我知道这不是最好的地方,但我只是想感受一下。我在 Python 开发环境或任何开发环境中没有做太多工作,所以请耐心等待。 搞清楚pip后,我安装TensorFlow并尝试导入它,收到这个错误:

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2018-12-11 06:09:54.960546: F tensorflow/core/platform/cpu_feature_guard.cc:37] The TensorFlow library was compiled to use AVX instructions, but these aren't available on your machine.
Aborted (core dumped)

经过一番研究,我发现我的处理器(Intel Celeron N2840(Bay Trail-M 架构))不支持 AVX 指令,所以我想知道是否有办法使用为其他指令编译的版本放。 Cog 告诉我,我可以使用 MMX 和各种 SSE(不管是什么意思)。

附:这有点像TensorFlow error using AVX instructions on Linux while working on Windows on the same machine 的重复,但不完全是。另外,我无法发表评论,因为我没有 50 声望。

附言我看着How to compile Tensorflow with SSE4.2 and AVX instructions? 吓了一跳

【问题讨论】:

  • 如果你不介意使用旧版本,TF 直到 1.5 版才使用 AVX 指令编译,所以如果你安装那个,你会尝试一些东西(并错过很多更多)
  • 否则,您要么需要从源代码构建它,要么尝试从某人那里搜索非官方的轮子,因为 TF 现在只支持带 AVX 的 CPU
  • @GPhilo 我可以通过 pip 获得以前的版本,还是需要使用其他东西?
  • pip install tensorflow=1.5
  • @GPhilo 你缺少一个等号:pip install tensorflow==1.5

标签: python tensorflow avx


【解决方案1】:

peter-cordes 建议的最佳实践方法是通过发出以下命令来查看 gcc 将对您的“cpu 具有哪些功能”产生什么影响:

gcc -O3 -fverbose-asm -march=native -xc /dev/null -S -o- | less

此命令将从 gcc 的角度提供有关您的 cpu 功能的(全部)信息,由谁来进行构建,因此 gcc 的观点很重要。

什么时候出现?当程序提供为您的 cpu 定制自己时。当。我对我的 CPU 了解多少。好吧,上面一行会告诉你所有你需要知道的。

也就是说,一般来说,如果您的 cpu 具有 *.以上将给你*。仔细阅读你所看到的。如果你没有它,你就不想要它,即

-mno-avx(whatever you don't want;in my case it was avx)

提供了在旧 CPU 上安装 CPU 能力的一个很好的概述: Mikael Fernandez Simalango 用于 Ubuntu 16.04 LTS。它采用 python2.7 环境,但很容易转换为 python3。问题的核心是通过 /proc/cpuinfo 提取除 -march=native 之外的特定 cpu 上可用的 cpu 指令扩展,(但请注意,它似乎仅限于它接受的标志,因此可能是最好仔细阅读上面的说明并反思)

grep flags -m1 /proc/cpuinfo | cut -d ":" -f 2 | tr '[:upper:]' 
'[:lower:]' | { read FLAGS; OPT="-march=native"; for flag in $FLAGS; 
do case "$flag" in "sse4_1" | "sse4_2" | "ssse3" | "fma" | "cx16" | 
"popcnt" | "avx" | "avx2") OPT+=" -m$flag";; esac; done; 
MODOPT=${OPT//_/\.}; echo "$MODOPT"; }

在我的旧盒子输出上运行它:

-march=native -mssse3 -mcx16 -msse4.1 -msse4.2 -mpopcnt

它到了那里。不清楚的是如何说“不是这个”和“不是那个”,对于旧 CPU,这很可能是 -mno-avx。

对于旧 CPU,-march 很重要,Nephanth 非常有用地解决了这个问题:

gcc -march=native -Q --help=target|grep march

生产

-march=                             westmere

这意味着我对 ./compile 问题的回答应该是或可能是,并注意 gcc 文档中的引号“westmere”,因此“”必须存在是有原因的

-march='westmere' -mssse3 -mcx16 -msse4.1 -msse4.2 -mpopcnt -mno-avx

但这可能要好得多(见下面的讨论):

-march=native -mssse3 -mcx16 -msse4.1 -msse4.2 -mpopcnt -mno-avx

-mno-avx 是 gcc 的一个选项,并且在数小时后会在

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more 
information.
>>> import tensorflow as tf
>>> 
>>> tf.__version__
'2.0.0-alpha0'

看起来很成功。

重述: 以任一顺序,找出您的 cpu 支持(或不)哪些指令,并明确说明这些指令。

【讨论】:

  • 如果 -march=native 在 TensorFlow 的 bazel 构建脚本中正常工作,这就是您所需要的。它暗示了支持它们的目标上的其他-m 选项。它不能自行工作的事实意味着构建脚本必须吃掉它(和/或-mtune=native),而不是像不包含=的args那样将它传递给GCC。
  • @user:224132 事实上,谜团还在继续,我发现自己在玩另一个构建,其中似乎有一些负面说明不能或不应该做的事情需要还要说明,按 -mnoavx2 的顺序,因为我当前的构建失败了,我觉得我应该删除我的答案。在这种情况下,配置文件的构造非常无用,至少来自更多的 Make 思维模式,
  • 我前段时间下载了 bazel 来看看调试 TensorFlow 的构建脚本,但它只是一层又一层的脚本。由于我自己不使用 TensorFlow,所以我感到无聊并停止了。
  • 经过反思,gcc 不会进行挖掘以确定原生是什么,因为这意味着测试,因此原生可能是一个占位符,等待通过其他方式得出的特异性。
  • 不,-march=native 确实可以可靠地工作,并且确实启用了您正在编译的 CPU 支持的所有 -m 选项。如果您运行gcc -O3 -fverbose-asm -march=native -xc /dev/null -S -o- | less(将一个空文件编译为C,将asm 输出通过管道传输到stdout),您将看到asm cmets 显示哪些选项被启用/禁用。例如在我的 Skylake CPU 上,它显示 -mavx2 -mfma -mbmi2 以及许多其他内容,以及检测调整设置,如 --param l1-cache-size=32 --param l1-cache-line-size=64。推测它使用cpuid指令来检查CPU特征位和缓存。
【解决方案2】:

试试Anaconda。它应该具有适用于旧 CPU 的 TensorFlow 分发版。 TensorFlow编译is difficult.

【讨论】:

    【解决方案3】:

    您可以在 Github 上找到预制轮子(支持 windows):https://github.com/fo40225/tensorflow-windows-wheel 或者您可以自己构建轮子

    我也遇到了同样的问题,但我已经解决了。

    【讨论】:

    • 理想情况下,我们应该在这里得到答案,以防提供的链接变为 404
    猜你喜欢
    • 2017-05-08
    • 2019-07-08
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多