背景介绍
最简单的tensorflow的安装方法是在pip一键式安装官方预编译好的包 pip install tensorflow 通常这种预编译的包的编译参数选择是为了最大兼容性而不是为了最优性能,导致在使用过程中,每次运行代码都会输出一大堆的warning信息。例如在安装了谷歌官方的tensorflow 1.3.0包后,运行以下测试代码时
Console会输出
表示此tensorflow版本只用到了CPU SSE指令集优化,可以运行在很多老架构的CPU指令集上。为了充分利用AVX/AVX2来加速tensorflow的CPU版本的计算速度,需要自己下载tensorflow的源码,在编译时使用这些指令集。以下教程基于最新的tensorflow 1.3.1源码,利用用Visual Studio 2015/Visual Studio 2017来编译一个基于AVX/AVX2的CPU版本的tensorflow python安装包。
编译过程
准备工作
- VS2015(编译支持AVX的tensorflow包)或VS2017(编译支持AVX2的tensorflow包)
- Anaconda + Python 3.6 64位版本
- Swigwin 3.0.12
- cmake-3.9.3-win64-x64
- Git-2.14.2-64-bit
- Tensorflow源码,目前最新版本为1.3.1
VS2015编译过程
- 打开VS2015 64位命令行编译环境
<img alt="" class=" data-fid=" 604126"="" data-cke-saved-src="https://software.intel.com/sites/default/files/managed/7d/5f/tftow-pic3.png" src="https://software.intel.com/sites/default/files/managed/7d/5f/tftow-pic3.png" typeof="foaf:Image"> - 在命令行环境中进入tensorflow的源码路径tensorflow-1.3.1\tensorflow\contrib\cmake 新建一个文件夹build2015,进入build2015文件夹
- 用CMake生成VS2015的编译项目
C:\...\build2015>cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release
-DSWIG_EXECUTABLE=C:\work\swigwin-3.0.12\swig.exe
-DPYTHON_EXECUTABLE="C:\Users\jgu23\AppData\Local\Continuum\Anaconda3\python.exe"
-DPYTHON_LIBRARIES="C:\Users\jgu23\AppData\Local\Continuum\Anaconda3\libs\python36.lib"
-Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX - 用MSBuild编译生成tensorflow的pip安装包 C:\...\build2015>MSBuild /p:Configuration=Release tf_python_build_pip_package.vcxproj 编译时需要联网,git会从网上下载必要的项目包经过漫长的编译过程(我的编译环境是i5 7440hq + 12G内存)
- pip安装tensorflow pip安装包 如果编译没错误的话,进入到C:\...\build2015\tf_python\dist目录下,可以看到一个文件 tensorflow-1.3.1-cp36-cp36m-win_amd64.whl 这个就是编译出来的tensorflow安装包在进入Anaconda Prompt界面
进入到C:\...\build2017\tf_python\dist目录下,输入“pip install tensorflow-1.3.1-cp36-cp36m-win_amd64.whl” 到这里,tensorflow就已经编译安装成功了 - 最后验证一下,运行代码
Console输出
说明这个tensorflow包支持AVX指令集 - 注意
VS2015编译tensorflow最高只支持到AVX, 如果CMake生成编译项目时指定CPU指令集支持到AVX2,编译时将出现error C3861: 'xxx': identifier not found错误。要支持AVX2指令集,必须用VS2017编译
VS2017编译过程
- 打开VS2017 64位命令行编译环境
- 在命令行环境中进入tensorflow的源码路径tensorflow-1.3.1\tensorflow\contrib\cmake 新建一个文件夹build2017,进入build2017文件夹
- 用CMake生成VS2017的编译项目
C:\...\build2017>cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release
-DSWIG_EXECUTABLE=C:\work\swigwin-3.0.12\swig.exe
-DPYTHON_EXECUTABLE="C:\Users\jgu23\AppData\Local\Continuum\Anaconda3\python.exe"
-DPYTHON_LIBRARIES="C:\Users\jgu23\AppData\Local\Continuum\Anaconda3\libs\python36.lib"
-Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX2 - 这里比VS2015的编译多了一步
用VS2017打开tf_core_kernels.vcxproj
进入Properties->Configuration Properties->VC++ Directories->Executable Directories
将Executable Directories下的$(VC_ExecutablePath_x64)改为$(VC_ExecutablePath_x64_x64)
保存项目,退出 - 用MSBuild编译生成tensorflow的pip安装包C:\...\build2017>MSBuild /p:Configuration=Release tf_python_build_pip_package.vcxproj编译时需要联网,git会从网上下载必要的项目包,经过漫长的编译过程(我的编译环境是i5 7440hq + 12G内存)
- pip安装tensorflow 安装包
如果编译没错误的话,进入到C:\...\build2017\tf_python\dist目录下,可以看到一个文件tensorflow-1.3.1-cp36-cp36m-win_amd64.whl,这个就是tensorflow的安装包,在进入Anaconda Prompt界面
进入到C:\...\build2017\tf_python\dist目录下,输入“pip install tensorflow-1.3.1-cp36-cp36m-win_amd64.whl” 到这里,tensorflow就已经编译安装成功了 - 最后验证一下,运行代码
Console输出
没有任何warning输出,说明这个tensorflow包支持AVX2指令集
常见错误及解决方法
- 编译re2.vcxproj时出错
warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
以及 Error C2001: Newline in constant
错误原因:此错误和编译平台的windows操作系统的locale设为中文有关,英文的windows没有这个错误
解决办法: 修改CMakeCache.txt,让MSBuild编译这个项目时,强制按照utf-8编码文件的格式来解析文件,进入C:\...\tensorflow-1.3.1\tensorflow\contrib\cmake\build2017\re2\src\re2目录,用文本编辑器打开CMakeCache.txt,找到以下2行
在CMAKE_CXX_FLAGS_RELEASE这里添加红色部分,修改为 CMAKE_CXX_FLAGS_RELEASE:STRING=/MD /O2 /Ob2 /DNDEBUG /source-charset:utf-8 - 编译tf_core_kernels.vcxproj时出错 fatal error c1060: the compiler is out of heap space
以及 fatal error C1002: compiler is out of heap space in pass 2
错误原因:VS编译环境默认的编译工具链为32位,tensorflow编译时会消耗大量的内存,导致编译器消耗的内存超出了32位编译器的寻址范围。
解决方法:- VS2015
需要运行64位命令行编译环境,在“开始”菜单中选择运行“VS2015 x64 Native Tools Command Prompt”,如本文2.2章中“打开VS2015 64位命令行编译环境”部分所示,或者在命令行里手工切换,首先进入VS2015的安装目录 “cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC”,输入“vcvarsall amd64”,参考MSDN “How to: Enable a 64-Bit Visual C++ Toolset on the Command Line”,https://msdn.microsoft.com/en-us/library/x4d2c09s.aspx - VS2017
可能因为tensorflow项目中CMake脚本对VS2017支持不好,所以无法按照VS2015的修改办法来通过指定64位编译环境的方法来解决这个问题。我们需要用VS2017打开tf_core_kernels.vcxproj,手工将Properties->Configuration Properties->VC++ Directories->Executable Directories下的$(VC_ExecutablePath_x64)改为$(VC_ExecutablePath_x64_x64)
如本文2.3章中“VS2017打开tf_core_kernels.vcxproj”部分所示
- VS2015
结论
通过手工编译tensorflow源码来支持AVX/AVX2指令,可以消除运行tensorflow程序时烦人的warning提示,并且可以获得比官方预编译版本更快的tensorflow学习/推理速度,节省了tensorflow开发者的时间。