TensorFlow 2.2.0-rc0（CUDA10.2+cuDNN7.6.5）のビルド手順 - Windows10

TensorFlow 2.2.0-rc0（GPU版）をWindows 10でビルドする手順です。
細かい説明は省略して要点だけを記載しているので、もう少し詳しい内容は[dev.infohub.ccのBlog](https://dev.infohub.cc/build-tensorflow-220rc0-gpu/)などを参考にしていただければと思います。

# ビルド環境の準備
ビルドには次の環境を利用します。
CUDAやcuDNN、Pythonなどは事前にPATHを通しておきます。

- CPU: AMD Ryzen Threadripper 3960X
- GPU: NVIDIA TITAN RTX
- Windows 10 Pro 64bit (Ver 1909 build 18363.720)
- CUDA 10.2
- cuDNN 7.6.5
- Visual Studio Community 2019 Ver16.4.6
- Python 3.8.2
- [MSYS2](https://www.msys2.org/)<br>インストールして`C:\msys64\usr\bin`にパスを通す。
- [Bazel 2.0.0](https://github.com/bazelbuild/bazel/releases/download/2.0.0/bazel-2.0.0-windows-x86_64.exe)<br>ダウンロードしたファイルを`bazel.exe`にリネームしてパスの通ったフォルダに格納。<br>※TensorFlow 2.2.0-rc0のビルドに使えるバージョンはBazel 2.0.0だけなので注意！<br>

## MSYS2のパッケージ追加
`C:\msys64\msys2_shell.cmd`を起動して、ビルドに必要なパッケージを追加します。

```cmake
# 必要なパッケージの導入
pacman -S git patch unzip

# 以降はMSYS2のコンソールは利用しないので終了
exit
```

# TensorFlowのビルド
ビルド用のPython仮想環境`g:\venvs\build_tf2`を使ってTensorFlowをビルドしていきます。
パス等はそれぞれの環境に合わせて読み替えてください。

以降の操作は、Visual Studio 2019の`x64 Native Tools Command Prompt for VS 2019`で起動したコンソール画面を利用します。

```cmake
# 仮想環境を作成して有効化する
python -m venv g:\venvs\build_tf2
cd /d g:\venvs\build_tf2
g:\venvs\build_tf2\Scripts\activate.bat

# pipのアップグレード（任意）
python -m pip install --upgrade pip

# ビルドに必要なパッケージを導入
pip install six numpy wheel
pip install keras_applications==1.0.8 --no-deps
pip install keras_preprocessing==1.1.0 --no-deps

# TensorFlow v2.2.0-rc0のソースコードを取得
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout v2.2.0-rc0

# 不要な環境変数の削除（オプション）
# 環境変数全てがパラメータで渡されるため、パラメータの文字列が32768文字を超えると
# FATAL: Command line too long (34052 > 32768) というようなエラーが発生する。
# それを防ぐために、ここで不要な環境変数を一時的に削除。
# _OLD_VIRTUAL_PATHは文字数が多くなりがちなので、削除する第一候補。
set _OLD_VIRTUAL_PATH=

# ビルド構成の設定
#----------------------------------------------------------------
# <設定例>
# Location of Python        : (Default)
# ROCm support              : (Default = N)
# CUDA support              : Y
# CUDA compute capabilities : 7.5 (詳細はhttps://developer.nvidia.com/cuda-gpusを参照) 
# Optimization flag         : /arch:AVX2
# Override eigen...         : (Default = Y)
#----------------------------------------------------------------
python ./configure.py

# ビルド（CUDA向け）
# ビルドが完了するまで、数十分～数時間かかります
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true --copt=-nvcc_options=disable-warnings //tensorflow/tools/pip_package:build_pip_package

# Wheelパッケージの作成
# g:\tensorflow_pkgフォルダにパッケージを作成する（数分かかる）
bazel-bin\tensorflow\tools\pip_package\build_pip_package g:\tensorflow_pkg

# これでTensorFlowのビルドが完了。exitで終了。
#----------------------------------------------------------------
# <参考>
# Bazelのワークファイルは %UserProfile%_bazel_%UserName% に作成されるので
# 不要なら、このフォルダを削除してもOK（20GB程度の容量）
#----------------------------------------------------------------
exit
```

# 新規環境にビルドしたTensorFlowを導入
ビルドしたTensorFlowを新しいPythonの仮想環境に導入する方法です。
ここでは`g:\venvs\tf2`に新しい仮想環境を作成する例です。

```cmake
# 仮想環境を作成して有効化
python -m venv g:\venvs\tf2
g:\venvs\tf2\Scripts\activate.bat

# pipのアップデート（任意）
python -m pip install --upgrade pip

# ビルドしたTensorFlowのインストール（作成したwheelファイルを指定するだけ）
pip install g:\tensorflow_pkg\tensorflow-2.2.0rc0-cp38-cp38-win_amd64.whl

# 動作確認
python -c "import tensorflow as tf; print(tf.__version__); print(tf.keras.__version__)"
python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
```


# 備考
TensorFlow 2.2.0-rc0のビルドは、TensorFlow v1の頃に比べると格段に簡単になっている印象を受けます。
今回のビルドでも、`python ./configure.py`としたときに、`FATAL: Command line too long (34052 > 32768)`というエラーに遭遇しただけで、それ以外は何の問題も発生しませんでした。

実行時にDLLが見つからずにエラーになるケースが多くありますが、この場合はCUDA等必要なライブラリへのパスが通っているか確認してみてください。