首页 文章

如何使用SSE4.2和AVX指令编译Tensorflow?

提问于
浏览
227

这是从运行脚本以检查Tensorflow是否正常工作时收到的消息:

I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

我注意到它提到了SSE4.2和AVX,

1)什么是SSE4.2和AVX?

2)这些SSE4.2和AVX如何改进Tensorflow任务的CPU计算 .

3)如何使用这两个库进行Tensorflow编译?

11 回答

  • 114

    我刚遇到同样的问题,似乎Yaroslav Bulatov 's suggestion doesn'覆盖了SSE4.2支持,添加 --copt=-msse4.2 就足够了 . 最后,我成功搭建了

    bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
    

    没有得到任何警告或错误 .

    可能是任何系统的最佳选择:

    bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
    

    Update: the build scripts may be eating -march=native, possibly because it contains an = . )

    -mfpmath=both 仅适用于gcc,而非clang . -mfpmath=sse 可能同样好,如果不是更好,并且是x86-64的默认值 . 32位构建默认为 -mfpmath=387 ,因此更改它将有助于32位 . (但是如果你想要数字运算的高性能,你应该构建64位二进制文件 . )

    -O2 默认为 -O2-O3 是 . gcc -O3 启用完全优化,包括自动矢量化,但有时会使代码变慢 .


    这样做:--copt for bazel build直接将一个选项传递给gcc来编译C和C文件(但不是链接,所以你需要一个不同的选项来进行跨文件链接时优化)

    x86-64 gcc默认只使用SSE2或较旧的SIMD指令,因此您可以在任何x86-64系统上运行二进制文件 . (见https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html) . 's not what you want. You want to make a binary that takes advantage of all the instructions your CPU can run, because you'仅在您构建它的系统上运行此二进制文件 .

    -march=native 启用CPU支持的所有选项,因此它会使 -mavx512f -mavx2 -mavx -mfma -msse4.2 冗余 . (此外, -mavx2 已启用 -mavx-msse4.2 ,因此Yaroslav 's command should have been fine). Also if you'使用不支持其中一个选项的CPU(如FMA),使用 -mfma 会使二进制文件出现非法指令错误 .

    TensorFlow's ./configure defaults to enabling -march=native,因此使用它应该避免需要手动指定编译器选项 .

    -march=native 启用 -mtune=native ,所以it optimizes for your CPU用于哪些AVX指令序列最适合未对齐的载荷 .

    这一切都适用于gcc,clang或ICC . (对于ICC,您可以使用 -xHOST 而不是 -march=native . )

  • 25

    让我们从 why do you see these warnings in the first place 的解释开始 .


    很可能你没有从源代码安装TF,而是使用像 pip install tensorflow 这样的东西 . 这意味着您安装了预先构建的(由其他人)二进制文件,这些二进制文件未针对您的体系结构进行优化 . 这些警告告诉你这一点:你的架构上有一些东西可用,但它不会被使用,因为二进制文件没有用它编译 . 这是documentation的部分 .

    TensorFlow检查启动时是否已使用CPU上可用的优化进行编译 . 如果未包含优化,TensorFlow将发出警告,例如不包括AVX,AVX2和FMA指令 .

    好的是,你很可能只是想学习/试验TF,所以一切都会正常工作,你不应该担心它


    What are SSE4.2 and AVX?

    维基百科对SSE4.2AVX有很好的解释 . 这些知识不需要擅长机器学习 . 您可以将它们视为计算机的一组额外的instructions,以针对单个指令使用多个数据点来执行可以自然并行化的操作(例如,添加两个数组) .

    SSE和AVX都是SIMD(单指令,多数据)的抽象概念的实现,即

    Flynn分类中的一类并行计算机 . 它描述了具有多个处理元素的计算机,这些处理元素同时在多个数据点上执因此,这样的机器利用数据级并行性,但不利用并发性:同时(并行)计算,但在给定时刻只有一个进程(指令)

    这足以回答您的下一个问题 .


    How do these SSE4.2 and AVX improve CPU computations for TF tasks

    它们允许更有效地计算各种矢量(矩阵/张量)操作 . 你可以在these slides阅读更多内容


    How to make Tensorflow compile using the two libraries?

    您需要编译一个二进制文件以利用这些指令 . 最简单的方法是compile it yourself . 正如Mike和Yaroslav建议的那样,你可以使用以下bazel命令

    bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

  • 135

    Let me answer your 3rd question first:

    如果你想在conda-env中运行自编译版本,你可以 . 这些是我运行的一般说明,用于通过附加说明在我的系统上安装tensorflow . 注意:此版本用于AMD A10-7850版本(检查CPU是否支持哪些指令......可能不同)运行Ubuntu 16.04 LTS . 我在conda-env中使用Python 3.5 . Credit转到tensorflow源安装页面和上面提供的答案 .

    git clone https://github.com/tensorflow/tensorflow 
    # Install Bazel
    # https://bazel.build/versions/master/docs/install.html
    sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
    # Create your virtual env with conda.
    source activate YOUR_ENV
    pip install six numpy wheel, packaging, appdir
    # Follow the configure instructions at:
    # https://www.tensorflow.org/install/install_sources
    # Build your build like below. Note: Check what instructions your CPU 
    # support. Also. If resources are limited consider adding the following 
    # tag --local_resources 2048,.5,1.0 . This will limit how much ram many
    # local resources are used but will increase time to compile.
    bazel build -c opt --copt=-mavx --copt=-msse4.1 --copt=-msse4.2  -k //tensorflow/tools/pip_package:build_pip_package
    # Create the wheel like so:
    bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
    # Inside your conda env:
    pip install /tmp/tensorflow_pkg/NAME_OF_WHEEL.whl
    # Then install the rest of your stack
    pip install keras jupyter etc. etc.
    

    As to your 2nd question:

    在我看来,带有优化的自编译版本非常值得 . 在我的特定设置中,过去需要560-600秒的计算现在只需要大约300秒!虽然确切的数字会有所不同,但我认为您的特定设置一般可以提高35-50%的速度 .

    Lastly your 1st question:

    上面已经提供了很多答案 . 总结一下:AVXSSE4.1, SSE4.2,MFA是X86 CPU上不同类型的扩展指令集 . 许多包含用于处理矩阵或向量运算的优化指令 .

    我将强调我自己的错误概念,希望能为您节省一些时间:并不是说SSE4.2是更新版本的指令,取代了SSE4.1 . SSE4 = SSE4.1(一组47条指令)SSE4.2(一组7条指令) .

    在张量流编译的上下文中,如果您的计算机支持AVX2和AVX,以及SSE4.1和SSE4.2,您应该将这些优化标志放入所有中 . 不要像我那样做,只是选择SSE4.2认为它更新,应该取代SSE4.1 . 那显然是错的!我不得不重新编译,因为这让我花了40分钟 .

  • 14

    这些是SIMD vector processing instruction sets .

    对于许多任务,使用向量指令更快;机器学习就是这样一项任务 .

    引用tensorflow installation docs

    为了与尽可能广泛的机器兼容,TensorFlow默认只在x86机器上使用SSE4.1 SIMD指令 . 大多数现代PC和Mac都支持更高级的指令,因此如果您构建的二进制文件只能在自己的计算机上运行,则可以在bazel构建命令中使用--copt = -march = native来启用它们 .

  • 1

    感谢所有这些回复的一些试验和错误,我设法在 clang 的Mac上安装它 . 所以只需分享我的解决方案,以防对某人有用 .

    当指定bazel选项"--config=opt"时,请指定在编译期间使用的优化标志[默认为-march = native]

    然后复制粘贴此字符串:

    -mavx -mavx2 -mfma -msse4.2
    

    (默认选项导致错误,所以其他一些标志也是如此 . 上面的标志没有错误.BTW我回复了所有其他问题的 n

    安装后,我根据默认车轮训练深度模型相对于另一个安装时验证了大约2倍到2.5倍的加速 - Installing TensorFlow on macOS

    希望能帮助到你

  • 5

    我最近从源代码安装了它,而下面是从源代码安装它所需的所有步骤,并提供了上述说明 .

    其他答案已经描述了为什么显示这些消息 . 我的回答逐步介绍了如何安装,这可能会帮助人们像我一样对实际安装进行思考 .

    • 安装Bazel

    从他们可用的releases中下载它,例如0.5.2 . 解压缩,进入目录并进行配置: bash ./compile.sh . 将可执行文件复制到 /usr/local/binsudo cp ./output/bazel /usr/local/bin

    • 安装Tensorflow

    克隆张量流: git clone https://github.com/tensorflow/tensorflow.git 转到克隆目录进行配置: ./configure

    它会提示您几个问题,下面我建议您回答每个问题,当然,您可以根据需要选择自己的答案:

    Using python library path: /usr/local/lib/python2.7/dist-packages
    Do you wish to build TensorFlow with MKL support? [y/N] y
    MKL support will be enabled for TensorFlow
    Do you wish to download MKL LIB from the web? [Y/n] Y
    Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: 
    Do you wish to use jemalloc as the malloc implementation? [Y/n] n
    jemalloc disabled
    Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
    No Google Cloud Platform support will be enabled for TensorFlow
    Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
    No Hadoop File System support will be enabled for TensorFlow
    Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] N
    No XLA JIT support will be enabled for TensorFlow
    Do you wish to build TensorFlow with VERBS support? [y/N] N
    No VERBS support will be enabled for TensorFlow
    Do you wish to build TensorFlow with OpenCL support? [y/N] N
    No OpenCL support will be enabled for TensorFlow
    Do you wish to build TensorFlow with CUDA support? [y/N] N
    No CUDA support will be enabled for TensorFlow
    
    • 点子包 . 要构建它,您必须描述您想要的指令(您知道,Tensorflow告知您缺少这些指令) .

    构建pip脚本: bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package

    构建pip包: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

    安装刚刚构建的Tensorflow pip包: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

    现在,下次启动Tensorflow时,它不会再抱怨丢失指令了 .

  • 49

    这是最简单的方法 . 只有一步 .

    它对速度有重大影响 . 就我而言,训练步骤的时间几乎减半 .

    参考custom builds of tensorflow

  • 2

    我为Mac编译了一个小的Bash脚本(很容易移植到Linux)以检索所有CPU功能并应用其中一些来构建TF . 我是TF大师,经常使用(一个月内几次) .

    https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f

  • 4

    要使用SSE4.2和AVX编译TensorFlow,您可以直接使用

    bazel build --config = mkl --config =“opt”--copt =“ - march = broadwell”--copt =“ - O3”// tensorflow / tools / pip_package:build_pip_package

    资料来源:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl

  • 3

    从源代码构建TensorFlow时,您将运行 configure 脚本 . configure 脚本要求的一个问题如下:

    Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]
    

    configure 脚本会将您指定的标志附加到构建TensorFlow pip包的bazel命令中 . 从广义上讲,您可以通过以下两种方式之一响应此提示:

    • 如果要在与运行TensorFlow的CPU类型相同的CPU类型上构建TensorFlow,则应接受默认值( -march=native ) . 此选项将优化机器CPU类型的生成代码 .

    • 如果要在一种CPU类型上构建TensorFlow但在不同的CPU类型上运行TensorFlow,则考虑提供更具体的优化标志,如the gcc documentation中所述 .

    按照前面的项目符号列表中的说明配置TensorFlow后,您应该能够为目标CPU完全优化TensorFlow将 --config=opt 标志添加到正在运行的任何bazel命令中 .

  • 6

    要隐藏这些警告,您可以在实际代码之前执行此操作 .

    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
    import tensorflow as tf
    

相关问题