忘记传编译出来的文件了……
无特殊需求不建议尝试,如果只是普通的CPU+机械盘的话编译一次要很长时间,并且可能会遇到各种问题,最终捣鼓一天都不一定成功
背景
通过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(只有样品展出)。
执行命令: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]
忘记传编译出来的文件了……
无特殊需求不建议尝试,如果只是普通的CPU+机械盘的话编译一次要很长时间,并且可能会遇到各种问题,最终捣鼓一天都不一定成功
我想问下作者,这个是gpu版的么?我下了您的文件运行出来如下图:显示用的是CPU的
200字以内,仅用于支线交流,主线讨论请采用回复功能。