在Windows*上编译Tensorflow教程
背景介绍
最简单的 Tensorflow 的安装方法是在 pip 一键式安装官方预编译好的包
pip install tensorflow |
通常这种预编译的包的编译参数选择是为了最大兼容性而不是为了最优性能,导致在使用过程中,每次运行代码都会输出一大堆的 warning 信息。例如在安装了谷歌官方的 Tensorflow 1.3.0 包后,运行以下测试代码时
import tensorflow as tf |
hello = tf.constant('Hello, TensorFlow!') |
sess = tf.Session() |
print(sess.run(hello)) |
Console 会输出
C:\Users\jgu\Anaconda3\python.exe C:/Users/sandman/PycharmProjects/untitled/tf_helloworld.py |
2017-10-27 13:42:20.005261: W C:\work\tensorflow-1.3.1\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. |
2017-10-27 13:42:20.005475: W C:\work\tensorflow-1.3.1\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations. |
b'Hello, TensorFlow!' |
Process finished with exit code 0 |
表示此 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位版本
https://www.anaconda.com - Swigwin 3.0.12
http://www.swig.org/ - cmake-3.9.3-win64-x64
https://cmake.org/ - Git-2.14.2-64-bit
https://git-scm.com/ - Tensorflow源码,目前最新版本为1.3.1
https://github.com/tensorflow/tensorflow
VS2015编译过程
- 打开 VS2015 64 位命令行编译环境

- 在命令行环境中进入 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 就已经编译安装成功了 - 最后验证一下
运行代码import tensorflowastfhello = tf.constant('Hello, TensorFlow!')sess = tf.Session()print(sess.run(hello))Console 输出
C:\Users\jgu\Anaconda3\python.exe C:/Users/sandman/PycharmProjects/untitled/tf_helloworld.py2017-10-27 13:48:20.005261: W C:\work\tensorflow-1.3.1\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.b'Hello, TensorFlow!'说明这个 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>www.wmyl11.com MSBuild /p:Configuration=Release tf_python_www.mcyllpt.com build_pip_package.vcxproj
编译时需要联网,git 会从网上下载必要的项目包
经过漫长的编译过程(我的编译环境是 i5 7440hq + 12G 内存)
- pip安装 Tensorflow 安装包
如果编译没错误的话,进入到 C:\...\www.caibaoyule.cn build2017\tf_python\dist目录下,可以看到一个文件
tensorflow-1.3.1-cp36-cp36m-win_amd64.whl
这个就是 Tensorflow 的安装包
在进入 Anaconda Prompt 界面
进入到 C:\...\build2017\tf_python\dist 目录下,输入 “www.douniu178.com pip install tensorflow-1.3.1-cp36-cp36m-win_amd64.whl”
到这里,Tensorflow 就已经编译安装成功了 - 最后验证一下
运行代码import tensorflowastfhello = tf.constant('Hello, TensorFlow!')sess = tf.Session()print(sess.run(hello))Console输出
C:\Users\jgu\Anaconda3\python.exe C:/Users/sandman/PycharmProjects/untitled/tf_helloworld.pyb'Hello, TensorFlow!'Process finished with exit code 0没有任何 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”部分所示
结论
通过手工编译 Tensorflow 源码来支持 AVX/AVX2 指令,可以消除运行 Tensorflow 程序时烦人的 warning 提示,并且可以获得比官方预编译版本更快的 Tensorflow 学习/推理速度,节省了 Tensorflow 开发者的时间。
在Windows*上编译Tensorflow教程的更多相关文章
- 在 Windows 上安装 Hadoop 教程(转)
在 Windows 上安装 Hadoop 教程 一见 2010.1.6 www.hadoopor.com/hadoopor@foxmail.com 1. 安装 JDK 不建议只安装 JRE,而是建议直 ...
- 在 Windows 上安装 TensorFlow(转载)
在 Windows 上安装 TensorFlow windows下配置安装Anaconda+tensorflow Spyder——科学的Python开发环境 Windows7 安装TensorFlow ...
- 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法
这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...
- [ZZ] 在windows上编译Mesa3d opengl32库
在windows上编译Mesa3d opengl32库 cheungmine http://blog.csdn.net/ubuntu64fan/article/details/8061475 Mesa ...
- 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl
利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...
- 在windows上编译wireshark源代码
终于在windows上成功编译了wireshark源代码,个中酸辛,都是泪..只能说要多试! windows上编译wireshark共用到三个东西:wireshark源代码.python.cygwin ...
- 在windows 上编译部署Rap2
在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...
- 在windows上编译MatConvNet
有个BT的要求,在windows上使用MatConvNet,并且需要支持GPU. 费了些力气,记录一下过程(暂不支持vl_imreadjpeg函数) 在这里下载MatConvNet,机器配置vs201 ...
- 如何在 Windows上编译Objective-C
Objective-C现在几乎已经变成了苹果的专利了,可以直接在苹果的Xcode上编译Objective-C程序,但是在Windows平台下的编译工具就寥寥无几了,本身这种语言用的人就不是很多.今天在 ...
随机推荐
- android分析windowManager、window、viewGroup之间关系(一)
本文将主要介绍addview方法,在windowManager.window.viewGroup中的实现原理.首先将介绍这些类结构关系,然后分析其内在联系,介绍实现原理,最后介绍重要的一个参数wind ...
- WPF & EF & Prism useful links
Prism Attributes for MEF https://msdn.microsoft.com/en-us/library/ee155691%28v=vs.110%29.aspx Generi ...
- 微信小程序—day02
全局配置 在app.json中,对小程序进行全局配置.官方文档 tabBar是对底部/顶部导航栏的配置,图片的icon 大小限制为40kb,建议尺寸为 81px * 81px 去阿里矢量图网站,找到图 ...
- web自动化测试框架总结
web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09
- Python序列及其操作(常见)
python序列及函数入门认识: 0. 我们根据列表.元组和字符串的共同特点,把它们三统称为什么? 序列,因为他们有以下共同点: 1)都可以通过索引得到每一个元素 2)默认索引值总是从0开始(当 ...
- caffe Mac 安装
参考了 https://zhuanlan.zhihu.com/p/24853767 安装caffe的依赖项 brew install --fresh -vd snappy leveldb gflags ...
- 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(上)
第1章.基础篇(上) Abstract:文档树.节点操作.属性操作.样式操作.事件 DOM (Document Object Model) - 文档对象模型 以对象的方式来表示对应的html,它有一系 ...
- JAVA 面试须知
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...
- Aizu - 2249
注意先保证距离最短,再来判断价格 邻接矩阵回朝内存 ,要用邻接表的 #include<bits/stdc++.h> using namespace std; #define inf 0x ...
- appium关键字:
## Appium 服务关键字 <expand_table> |关键字|描述|实例||----|-----------|-------||`automationName`|你想使用的自动化 ...