在Windows10下编译Tensorflow-GPU 1.12 + CUDA10.0
phpskycn2018/12/24软件综合 IP:云南

背景

通过pip直接安装的Tensorflow-GPU是基于CUDA9.0的,并且不支持AVX2指令集,因此打算尝试自行编译基于CUDA10.0并且支持AVX2的Tensorflow-GPU。
通过前期调研可知,当前版本的Tensorflow可以编译出基于CUDA10.0的版本。

环境

CPU:AMD Ryzen ThreadRipper 1950X
RAM:4 * DDR4 2400 8GB
SSD1:Samsung 970Pro 512GB
SSD2:Samsung 960Pro 512GB
GPU:NVIDIA Geforce RTX2080TI 11GB *
2
PSU:EVGA 1600 G2
SYS:Windows 10 x64 1809 build 17763

准备工作

阅读Tensorflow网站上的相关内容,了解编译相关的步骤,国内可以访问:XXXXXXXXXXXXXXXXXXXXXXXXXXXX/install/source

下载相关的软件

NVIDIA CUDA 10.0 for Windows10

NVIDIA cuDNN 7.4 for CUDA 10.0

Google bazel 0.20.0 for Windows X64

MSYS2

Microsoft Visual C++ 2015 Redistributable Update 3

Microsoft Build Tools 2015 Update 3

安装相关软件

Tensorflow 源码

其中cuDNN要注册一个NVIDIA的开发者账号才能下载,正常注册即可。对于bazel的版本选择,TF的网站上写着经过测试的编译工具版本是0.15.0,但是实际上当前从master branch获取的TF已经不支持这个版本了。查看Tensorflow的Github页面上的Continuous build status,找到Windows GPU这一项点进去看日志,会发现Google使用的是0.20.0,选择一样的版本可以减小出问题的可能性。
另外Google内部使用的编译工具似乎和网站上提供的不完全一致……可能会出现提供了相关发行版本但是自己无论如何都编译不出来的情况。
我直接从Github上download了master分支,大概对应的是commit cd8c6c995e0b29e793854e712d2fbd683b5cbd3f

完成编译配置

根据Tensorflow网站上的建议,CD到解压后的源码目录,执行python ./XXXXXXXXXXXX:

禁用XLA,当前版本的Tensorflow-GPU在Windows上编译如果启用了XLA会遇到问题CUDA版本输入10.0cuDNN版本输入7.4附加的编译选项输入/arch:AVX2GPU计算能力根据自己的硬件情况设置,RTX2080TI对应的是7.5,这里最大只能输入7.0(对应Titan V),于是只能输入7.0

另外在Github上看到的一些讨论,目前编译Tensorflow的时候启用AVX512会遇到编译问题,我的CPU不支持AVX512,暂时没有测试。目前支持AVX512F的CPU只有Skylake-SP、CannonLake-U(仅发布极少数OEM型号)、IceLake(只有样品展出)。

编译、报错、提交issue

执行命令:bazel build –config=opt –config=cuda –copt=-nvcc_options=disable-warnings –define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package
开始编译,结果跑了一段时间之后报错(这时候用的代码还是r1.12分支,不是最新的):


1
2
3
4
5
6
.\tensorflow/compiler/tf2xla/cpu_function_runtime.h(71): error C2338:
......
Target //tensorflow/tools/pip_package:build_pip_package failed to build
INFO: Elapsed time: 97.739s, Critical Path: 37.10s
INFO: 234 processes: 234 local.
FAILED: Build did NOT complete successfully


报错的文件是源码中(而不是protobuf生成的),进去看了一下相关代码:


1
2
3
4
5
6
7
private:
BufferInfo() = default;

enum class Kind : unsigned {
kConstant,
kTempBuffer,
kEntryParamete


似乎没啥问题,到Github上提交了一个issue,得到了解释:
This is because MSVC does not merge bit-fields if the size of the types are different (4 bytes for kind_, 8 bytes for size_).
并且开发人员修正了这个问题。之后下载了更新的源码,禁用XLA之后编译通过。
编译非常耗费时间,在我的硬件上(16核32线程的CPU,4通道DDR4内存,PCI-E接口的SSD)依然耗费了7937秒,并且相当一段时间CPU占用达到了100%,似乎普遍反映编译要3-4个小时,不知道bazel是否支持NUMA模式,有多路CPU的童鞋可以试试。

编译时候可能遇到的问题:

编译开始时提示一个位于user目录下的文件没有访问权限:bazel的缓存文件似乎不会自己清除,自己去删掉,有时候自己删也有占用的问题,重启系统才行,似乎bazel shutdown或者bazel clean命令也没什么效果。建议每次遇到编译失败,都手动清理一次。编译结束开始连接的时候提示没有权限执行bash.exe:用管理员身份运行cmd执行编译

打包安装

执行命令:bazel-bin\tensorflow\tools\pip_package\build_pip_package C:/tmp/tensorflow_pkg,生成打包好的tensorflow-1.12.0-cp36-cp36m-win_amd64.whl文件,之后pip3 install 安装即可

性能测试

使用tensorflow/benchmark跑了几个常见的网络,具体数据懒得贴了。和之前的环境相比仅仅升级了CUDA(从CUDA9.0+ Patch 4)相比,FP16下的性能提高了15%-25%,FP32性能没变化(驱动版本为417.22)。

[修改于 6年1个月前 - 2018/12/24 01:10:57]

来自:计算机科学 / 软件综合
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
phpskycn 作者
6年0个月前 IP:云南
853309

忘记传编译出来的文件了……

attachment icon tensorflow-1.12.0-cp36-cp36m-win_amd64.zip 93.97MB ZIP 115次下载


无特殊需求不建议尝试,如果只是普通的CPU+机械盘的话编译一次要很长时间,并且可能会遇到各种问题,最终捣鼓一天都不一定成功

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
gongtengchaotian
5年11个月前 IP:陕西
853955

我想问下作者,这个是gpu版的么?我下了您的文件运行出来如下图:显示用的是CPU的


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
gongtengchaotian
5年11个月前 IP:陕西
853956

QQ图片20190126213019.png

 

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn作者
5年11个月前 IP:云南
853957

是GPU版本,这个提示似乎是AVX2的问题

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
phpskycn
专家 老干部 学者 机友 笔友
文章
402
回复
4591
学术分
8
2009/03/15注册,3个月3天前活动

CV

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}