TensorFlowでGPUを利用するためには、互換性のあるバージョンのCUDAやcuDNNを利用する必要があり、2020/8/9時点で最新のTensorFlow 2.3.0も、CUDA 11やcuDNN 8には対応していません。
そのため、ソースコードからビルドしても互換性の問題で失敗します。
…が、利用している環境が「CUDA 11 + cuDNN 8」になっていて、それでもTensorFlowでGPUを使いたい人向けに「強制的に」TensorFlow 2.3.0をCUDA 11 + cuDNN 8向けにビルドする方法を残しておきます。
なお「本来なら対応していない」バージョンの組み合わせなので、全てが正常に動作する保証はありません。簡単なCNNモデルの学習や推論を試した限りでは正常に動作していますが、実験的な扱いに留めておくことをおすすめします。(CUDA11+cuDNN8に正式対応するまでの暫定的な処置)
環境情報
ビルドに利用した環境です。CUDAやcuDNNのフォルダなど、事前にパスを通した状態になっています。
- Windows 10 Ver1909 (64bit)
- Visual Studio Community 2019 Ver 16.5.4
- Python 3.8.2
- MSYS2(
pacman -S git patch unzip
で必要なパッケージを導入済み) - Bazel 3.4.1 (3.1.0以上のバージョンを使う必要あり)
- CUDA 11.0.3
- cuDNN 8.0.2
ビルド用のフォルダ構成など
今回はS:\build\build_tf230
フォルダ配下にTensorFlowのソースコードをダウンロードしてビルドしています。Pythonの仮想環境も、TensorFlowビルド用に用意します。
S:/build/build_tf230 # 作業フォルダRoot
+ tensorflow # gitで取得してくるソースコード
+ venv # Python仮想環境
+ wheelhouse # 作成したwhlファイルを格納するフォルダ
ビルド手順
x64 Native Tools Command Prompt for VS 2019
を起動して以下の手順でビルドを行います。
# 仮想環境を作成して有効化する
python -m venv s:\build\build_tf230\venv
cd /d s:\build\build_tf230
.\venv\Scripts\activate.bat
# 必要なパッケージのインストール
# 注意:最新の1.19.xシリーズのNumPyを使うとビルドに失敗するので注意
python -m pip install --upgrade pip
pip install numpy==1.18.5
pip install six wheel
pip install keras_applications==1.0.8 --no-deps
pip install keras_preprocessing==1.1.2 --no-deps
# ソースコード取得(v2.3.0のタグ指定)
git clone -b v2.3.0 https://github.com/tensorflow/tensorflow.git
cd tensorflow
# 環境によってはコマンドのパラメーターが長くなりすぎてエラーになるので不要な環境変数を削除
set _OLD_VIRTUAL_PATH=
# ビルド構成の設定
# CUDA support: Y
# CUDA compute capabilities: 7.5 (利用環境に合わせて変更)
# Optimization: /arch:AVX2 (利用環境に合わせて変更)
# それ以外はデフォルト設定(Enter)
python ./configure.py
# CUDA 11を使っていると、次のconfig.hの78行目の部分でエラーになる。
# C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include\thrust\system\cuda\config.h
# CUBバージョンの互換性チェック部分だが、このチェックは「THRUST_IGNORE_CUB_VERSION_CHECK」を定義すればスキップ可能。
# bazelのパラメーターでTHRUST_IGNORE_CUB_VERSION_CHECKを有効にしてTensorFlowをビルド。
bazel build --config=opt --config=avx2_win --config=short_logs --config=cuda --define=no_tensorflow_py_deps=true --copt=-DTHRUST_IGNORE_CUB_VERSION_CHECK --copt=-nvcc_options=disable-warnings //tensorflow/tools/pip_package:build_pip_package
# パッケージの作成(wheelhouseフォルダにパッケージを作成)
# 数分間画面が更新されないので心配になりますが、きちんと処理されているのでしばらく待ちましょう
bazel-bin\tensorflow\tools\pip_package\build_pip_package ..\wheelhouse
これで完了です。
ポイントとしては、bazelのビルドパラメーターに--copt=-DTHRUST_IGNORE_CUB_VERSION_CHECK
を追加して、CUDA 11のCUB互換チェックをスキップさせることです。