是否有一个未编译AVX指令的TensorFlow版本?

31

我正在尝试在我的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 Architecture))不支持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 指令,因此如果您安装该版本,您将能够尝试一些东西(但会错过很多其他功能)。 - GPhilo
否则,您将需要从源代码构建它或尝试搜索来自某人的非官方wheel,因为TF现在仅支持具有AVX CPU。 - GPhilo
@GPhilo 我能通过pip获取以前的版本吗,还是需要使用其他工具? - bobe
2
pip install tensorflow=1.5 - GPhilo
7
你漏掉了一个等号:pip install tensorflow==1.5 - Desty
没错,我永远不记得我需要一个还是两个。 - GPhilo
3个回答

5

peter-cordes提出的最佳实践方法是通过执行以下命令来查看gcc将如何处理“CPU具有哪些功能”:

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

这个命令将提供有关您的CPU功能的所有信息,从gcc的视角来看,gcc将进行构建,因此gcc的视角很重要。
什么时候会出现这种情况?当程序提供自适应于您的CPU时。我对我的CPU了解多少?好吧,上面的行将告诉您所需了解的一切。
话虽如此,通常,推广基于CPU功能的人/开发人员将陈述或建议一些事物的列表,如果您的CPU具有*,则这些事物将变得更快/更好/更强大。上述内容将为您提供*。仔细阅读您看到的内容。如果您没有它,您就不需要它,即。
-mno-avx(whatever you don't want;in my case it was avx)

在Ubuntu 16.04 LTS上,Mikael Fernandez Simalango提供了有关在旧CPU上安装支持的CPU的很好概述。它假定一个Python2.7环境,但很容易转换为Python3。问题的核心是提取您特定CPU上可用的CPU指令扩展,这些扩展将与-march = native一起使用,并通过/ proc / cpuinfo进行检查(但请注意,它似乎受到其接受的标志的限制,因此最好实际阅读上面的说明并反映)。
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"问题的回答,并注意引号中的'westmere',这也在gcc文档中出现,所以引号必须有其原因。
-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支持哪些指令(或不支持),并明确说明它们。

经过反思,gcc不会进行挖掘以确定本地是什么,因为这意味着测试,因此本地可能是一个占位符,等待通过其他方式到达的具体性。 - Chris
好的,刚刚运行了它,gcc -O3 -fverbose-asm -march=native -xc /dev/null -S -o- | less,你是正确的,我的观点是没有根据的。尽管如此,我的安装在我用westmere替换native之前并没有进行,这是无法解释的。 - Chris
在你的回答中,你提到了-mno-avx。是的,那是正确的选项。例如,gcc -march=skylake -mno-avx会禁用AVX1/AVX2和FMA,因为这取决于AVX。(但它仍将使用像shlx这样使用VEX编码的BMI2指令,并且不支持westmere。)我不知道为什么-march=westmere可以工作,而-march=native不能。两者都没有禁用早期的-m选项。例如,-mfma -march=westmere启用了FMA和AVX,以及popcnt和其他Nehalem东西。 - Peter Cordes
为了讨论目的,我的方法对于-march=nativemarch=westmere是不确定的,因为在成功构建时我还规定了-mno-avx。而且,针对你的观点,-mno-avx可能已经足够完成任务,而-march=westmere则是一种不必要的特定性。但总体而言,我希望人们能够感受到一种方法或过程,以实现他们安装的目标,无论是当前的Chrome平板电脑还是古老的CPU。感谢您继续参与并指导我的思考,在这里对我和其他人都非常有价值。 - Chris
我的观点是,对于与您不同的CPU的未来读者,在Core2或K10上使用“-march=native -mno-avx”是安全的,但在“-march=westmere -mno-avx”上则不是;它会启用SSE4.1和popcnt,可能导致非法指令错误。(我不知道TensorFlow构建脚本可能会隐式启用什么其他功能;希望只有AVX) - Peter Cordes
显示剩余8条评论

1
尝试使用Anaconda。它应该有适用于旧CPU的TensorFlow发行版。编译TensorFlow 很困难

0

2
理想情况下,我们应该在此处提供一个答案,以防链接失效。 - Book Of Zeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接