特别感谢我司爱折腾小伙百忙之中抽空整理投稿!
如果能用官方预编译的版本,还是不要折腾为好,不过万一碰到 CPU 不支持 AVX 指令集之类的情况,那就只能折腾了。
- 按照官方说明,安装好 msys64,bazel(<=0.23.0),从 github clone 好 tensorflow 源码。
2. 将 c:msys64usrbin 和 bazel.exe 所在加到 PATH 里。 安装 cudatoolkit 10,它会自动加 PATH,下载 cudnn 解压缩后放到 cudatoolkit 安装目录里。注意,cudatookit 10 要求 Geforce Driver 版本 411 以上,但是安装时并不会抱怨。
3. 然后 python configure.py 就好,注意 CUDA 支持默认是关闭的,输个y,脚本应该能找到正确的CUDA版本和安装位置,如果最后安装的不是10.0,手工指定一下。当然,建议 conda create -n tf2 开个新环境,以免搞乱工作环境。
如果很不幸,CPU 不支持默认打开的 AVX 指令集,default opt 改成 /arch:SSE2 或者更低,这个参数只是覆盖默认值其实没用,cl 认为是个 CPU 都支持的东东就不要放参数里了,非要放它会直接忽略之。如果 CPU 好,可以有 /arch:AVX2。
4. 然后就可以调用
bazel build -c opt --config=opt --config=v2 --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package
如果很快跳出来:
Cuda Configuration Error: None of the libraries match their SONAME: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.0/lib/x64/cudart.lib
这个比较坑,Windows 环境应该找不到 objdump,但是万一装了 Haskell Platform 之类的,在 PATH 里有这条命令,那么 dump 出来的信息里是不会有 SONAME 的,把这个临时从 PATH 里干掉就好。当然也可以手工改一下 tensorflow/third_party/gpus/cuda_configure.bzl ,目前在 733 行左右,如果变了就找找 objdump 字样。给 tensorflow 提 PR 的时候发现,几天前 main stream 上已经修掉了,但是 r2.0 上没有,都已经折腾了,就发过去吧,至少多了一点儿 Windows 上为什么有 objdump 的背景吧……
avoid SONAME check using objdump on Windows by pinxue · Pull Request #26710 · tensorflow/tensorflowgithub.com哦,对了,bazel 会在用户主目录里存放编译结果,当前目录下的只是个链接,保持 C: 盘有足够的12G以上磁盘空间,SSD 的话多多留点儿以免影响I/O性能。
编译这个东东非常费内存,如果只有 8GB,那应该经常会看到编译器抱怨堆空间不足。16GB 以上就没问题了。
5. 编译成功的话,接下来就可以打包、安装了:
x64_windows-opt
6、安装成功的后,就可以验证是否可用了
python
>>> import tensorflow as tf
如果这时看到:
Traceback (most recent call last): File "E:githubtensorflowtensorflowpythonplatformself_check.py", line 25, in <module> from tensorflow.python.platform import build_info
ImportError: cannot import name 'build_info' from 'tensorflow.python.platform' (E:githubtensorflowtensorflowpythonplatform__init__.py)
别惊慌,这是你还在在 tensorflow 源码目录里的副作用,cd 到没有 tensorflow 子目录的地方去再试就好了。
7、干这一行的,总是要搞个 Jupyter Notebook 耍才方便的,然后你可能会看到:
[E 00:43:10.163 NotebookApp] Uncaught exception GET /notebooks/ai/tf2.0/%E6%9C%AA%E5%91%BD%E5%90%8D.ipynb?kernel_name=python3 (::1)
HTTPServerRequest(protocol='http', host='localhost:8888', method='GET', uri='/notebooks/ai/tf2.0/%E6%9C%AA%E5%91%BD%E5%90%8D.ipynb?kernel_name=python3', version='HTTP/1.1', remote_ip='::1')
Traceback (most recent call last):
……
…….condaenvstf2libsite-packagesnbconvertpostprocessorsserve.py", line 21, in ProxyHandler
@web.asynchronous
AttributeError: module 'tornado.web' has no attribute 'asynchronous'
[E 00:43:10.175 NotebookApp] {
"Referer": "http://localhost:8888/tree/ai/tf2.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763",
"Accept-Encoding": "gzip, deflate",
"Host": "localhost:8888",
"Connection": "Keep-Alive",
"Cookie": "..."
}
别慌,这是安装 Jupyter Notebook 时带进来的 Python web 框架 Tornado 版本太新了,从 6 降到 5 就好了:
conda install tornado==5.1.1
或者
conda install nbconvert=5.4.1
升级一下 nbconvert 也成。 混用 conda 和 pip 就会有这种麻烦啦。