特別感謝我司愛折騰小夥百忙之中抽空整理投稿!

如果能用官方預編譯的版本,還是不要折騰為好,不過萬一碰到 CPU 不支持 AVX 指令集之類的情況,那就只能折騰了。

  1. 按照官方說明,安裝好 msys64,bazel(<=0.23.0),從 github clone 好 tensorflow 源碼。

2. 將 c:msys64usrin 和 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/tensorflow?

github.com圖標

哦,對了,bazel 會在用戶主目錄裏存放編譯結果,當前目錄下的只是個鏈接,保持 C: 盤有足夠的12G以上磁碟空間,SSD 的話多多留點兒以免影響I/O性能。

編譯這個東東非常費內存,如果只有 8GB,那應該經常會看到編譯器抱怨堆空間不足。16GB 以上就沒問題了。

5. 編譯成功的話,接下來就可以打包、安裝了:

bazel-outx64_windows-optin ensorflow oolspip_packageuild_pip_package tensorflow_pkg
pip install tensorflow_pkg ensorflow-2.0.0a0-cp37-cp37m-win_amd64.whl

6、安裝成功的後,就可以驗證是否可用了

python
>>> import tensorflow as tf

如果這時看到:

Traceback (most recent call last): File "E:github ensorflow ensorflowpythonplatformself_check.py", line 25, in <module> from tensorflow.python.platform import build_info

ImportError: cannot import name build_info from tensorflow.python.platform (E:github ensorflow ensorflowpythonplatform\__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):
……
…….condaenvs f2libsite-packages
bconvertpostprocessorsserve.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 就會有這種麻煩啦。


推薦閱讀:
相關文章