Anaconda(Miniconda)を使えば、WindowsでもGPU版(CUDA 9.0ベース)のTensorFlow環境を簡単に構築できますが、TensorFlowをWindowsでビルドしようとすると急にハードルが高くなります。
ここでは、Windows 10でTensorFlow 1.12.0のGPU版(CUDA 10.0 + cuDNN 7.4.2)をビルドする方法を載せておきます。なお利用するツールのバージョンもシビアで、少しでもバージョンが違うとビルドに失敗する場合があります。
TensorFlow 1.13.1(CUDA 10.1、cuDNN 7.5.0)のビルド方法も公開しました。tf1.13.1をビルドしたい場合は、こちらの記事を参考にしてください。
ビルド環境のアウトライン
- ハードウェア/OS
- CPU: Intel Core i7-7700K(AVX2に対応したCPU)
- OS: Windows 10 Pro Build 17763(64bit)
- TensorFlow関連
- TensorFlow 1.12.0
- CUDA 10.0 for Windows
- cuDNN 7.4.2 for Windows
- ビルド関連
- Microsoft Visual C++ 2015 Redistributable Update 3
- Microsoft Build Tools 2015 Update 3
- MSYS2 x64
- Bazel 0.19.0
- Python 3.6.8
ビルド環境の構築
Visual C++ Build Tools 2015のインストール
Microsoft Visual Studio サイトの「再頒布可能パッケージおよびビルド ツール」から、以下のツールをダウンロードしてインストールします。なお、私が試した限りでは、Visual Studio 2017を使うとビルドに失敗します。
- Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3(x64版)
- Microsoft Build Tools 2015 Update 3
MSYS2のセットアップ
MSYS2のインストール
MSYS2のサイトから、64bit版のMSYS2(msys2-x86_64-20180531.exe)をダウンロードしてインストールします。
インストール先は、デフォルトのC:\msys64
にしています。
環境変数PATHの設定
環境変数のPATHにC:\msys64\usr\bin
を追加します。
コマンドプロンプトでwhere bashと入力して、MSYS2配下のbash.exeが最初に見つかるかどうか確認します。
> where bash C:\msys64\usr\bin\bash.exe
MSYS2パッケージの更新と追加
C:\msys64\msys2_shell.cmd でMSYS2のコンソールを起動し、以下のコマンドでインストール済みパッケージを最新化します。
pacman -Syu
MSYS2のコンソールを再起動して、以下コマンドで必要なパッケージを追加します。
pacman -Su pacman -S git patch unzip
Bazelのセットアップ
TensorFlowのビルドにはBazelが利用されているので、Bazelを導入します。ビルドするTensorFlowのバージョンによって、利用可能なBazelバージョンの組み合わせが異なります。TensorFlow 1.12.0をビルドする場合は、Bazel 0.19.0を利用してください。(最新バージョンを使うとビルドエラーになります)
Bazelのダウンロード
BazelはGitHubのReleasesからビルド済みの実行ファイルをダウンロードすることもできますが、MSYS2に含まれているwgetコマンドで直接取得してきた方が簡単です。
コマンドプロンプトで以下のコマンドを実行し、C:\tools
配下にBazel 0.19.0をダウンロードします。
> cd /d c:\ > mkdir tools > cd tools > wget https://github.com/bazelbuild/bazel/releases/download/0.19.0/bazel-0.19.0-windows-x86_64.exe -O bazel.exe
wgetでSSL関連のエラーが出る場合、wgetコマンドの最後に--no-check-certificate
を付ければOKです。
環境変数の設定
Bazelを利用するために、以下の環境変数を設定します。
環境変数名 | 設定値 |
PATH | C:\toolsを追加 |
BAZEL_SH |
C:\msys64\usr\bin\bash.exe(bash.exeのフルパス)
|
BAZEL_VC | C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC |
コマンドプロンプトでbazel.exeへのパスが通っているか確認します。
> where bazel.exe C:\tools\bazel.exe
Python 3.6.8のセットアップ
Python 3.6.8のインストール
Python.orgのダウンロードページからWindows用のPython 3.6.8(x64版)をダウンロードしてインストールします。Python 3.7以降のバージョンには対応していないので、必ずPython 3.6.8を利用してください。また、AnacondaやMinicondaを使うとビルドエラーになるようなので、TensorFlowのビルドにはPython.orgのPythonを使用してください。
インストール先はC:\Python36
にしています。
環境変数PATHの設定
インストーラーでPATHの追加も自動で行われると思いますが、念のためパス設定が行われているか、whereコマンドで確認します。
> where pip3 python C:\Python36\Scripts\pip3.exe C:\Python36\python.exe
もし、パスが通っていない場合は環境変数のPATHにC:\Python36\Scripts\
とC:\Python36\
の2つのパスを追加してください。
CUDA 10.0、cuDNN 7.4.2のセットアップ
CUDA 10.0のインストール
NVIDIAのCUDA Toolkitのページから、Windows 10向けのCUDA Toolkit 10.0 for Windows(cuda_10.0.130_411.31_win10.exe)をダウンロードしてインストールします。
私の場合は、カスタム設定で全てにチェックを入れてインストールしました。
cuDNN 7.4.2のインストール
NVIDIAのcuDNNのページから、Windows 10用のcuDNN 7.4.2 for CUDA 10.0(cudnn-10.0-windows10-x64-v7.4.2.24.zip)をダウンロードします。なお、cuDNNをダウンロードするには、Membershipへの登録(無料)が必要になります。
ダウンロードしたzipファイルのcudaフォルダに含まれているlib,bin,includeフォルダ
を、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
フォルダに上書きコピーします。
CUDA 10.0とcuDNN 7.4.2の導入方法については、以前に書いた「nVIDIA CUDA Toolkit 10 のインストール」も参考にしてみてください。
なお、2019/2/21にcuDNN 7.5.0がリリースされましたが、cuDNN 7.5.0を使ったTensorFlow 1.12.0のビルドは未検証です。
環境変数PATHの設定
環境変数のPATHに以下3つのパスを追加します。なお、既にPATHに追加されている場合は追加する必要はありません。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64
パスが通っているかどうか、whereコマンドで確認します。
> where nvcc.exe nvvp.exe cupti64_100.dll C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\nvcc.exe C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp\nvvp.exe C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64\cupti64_100.dll
Windowsのロングパス名を有効化
ファイル名を指定して実行(Windowsキー+R)でgpedit.mscを実行して、ローカルグループポリシーエディターを起動します。
コンピューターの構成> 管理者用テンプレート> システム> ファイルシステム を選択し、その中にある「Win32の長いパスを有効にする」を「有効」に変更します。
TensorFlow 1.12.0のビルド
ビルド用のPython環境作成
スタートメニューから「Visual C++ 2015 x64 Native Build Tools Command Prompt」を起動して、以下のコマンドでTensorFlowビルド用のPython環境を作成していきます。なお、後続のパッケージ作成まで、このコンソールを継続して利用するのでコンソール画面は閉じないでください。
cmd.exeなどで単純にコマンドプロンプトを開くと、ビルドに必要な環境変数が設定されないため、必ずスタートメニューの「Visual C++ 2015 x64 Native Build Tools Command Prompt」からプロンプトを開いてください。
> where python C:\Python36\python.exe rem Python仮想環境用のフォルダ(C:\venvs)を作成 > mkdir c:\venvs rem 仮想環境(build_tf1120)を作成し有効化 > python -m venv c:\venvs\build_tf1120 > C:\venvs\build_tf1120\Scripts\activate.bat rem build_tf1120のpython.exeが有効になったことを確認 > where python C:\venvs\build_tf1120\Scripts\python.exe C:\Python36\python.exe rem pipのアップグレード(任意) > python -m pip install --upgrade pip rem 必要なパッケージのインストール > pip3 install six numpy wheel > pip3 install keras_applications==1.0.5 --no-deps > pip3 install keras_preprocessing==1.0.3 --no-deps
pip3 list
と入力して、導入したパッケージの確認が可能です。
> pip3 list Package Version ------------------- ------- Keras-Applications 1.0.5 Keras-Preprocessing 1.0.3 numpy 1.16.1 pip 19.0.3 setuptools 40.6.2 six 1.12.0 wheel 0.33.1
コンソールは閉じずに、後続のステップに進みます。
TensorFlow 1.12.0のソースコード取得
TensorFlowビルド用のフォルダを作成しGitHubからソースコードを取得してきます。ビルド用のフォルダはC:\build\tf1120
に設定しました。
> mkdir C:\build\tf1120 > cd /d c:\build\tf1120 > pwd /c/build/tf1120 rem TensorFlow1.12.0のソースコード取得 > git clone https://github.com/tensorflow/tensorflow.git > cd tensorflow > git checkout v1.12.0
GitでSSLのエラーが出る場合は、コンソールでgit config --global http.sslVerify false
を実行してください。
eigenのバグ修正
TensorFlow 1.12.0にはeigenのバグが含まれているので、eigenのバグ修正が必要です。
C:\build\tf1120\tensorflow\third_party\
フォルダにeigen_half.patch
というファイルを作成し、以下のパッチコードを貼り付けて保存します。(UTF-8のBOMなどが付いていると正しく認識できないかもしれないので、UTF-8形式で保存する場合はBOM無しでファイルを保存した方が良いと思います)
--- ./Eigen/src/Core/arch/CUDA/Half.h 2018-06-22 18:09:44.000000000 -0400 +++ ./Eigen/src/Core/arch/CUDA/Half.h 2018-07-25 01:19:55.462313100 -0400 @@ -209,7 +209,7 @@ // conversion steps back and forth. EIGEN_STRONG_INLINE __device__ half operator + (const half& a, const half& b) { - return __hadd(a, b); + return __hadd(::__half(a), ::__half(b)); } EIGEN_STRONG_INLINE __device__ half operator * (const half& a, const half& b) { return __hmul(a, b); @@ -218,9 +218,7 @@ return __hsub(a, b); } EIGEN_STRONG_INLINE __device__ half operator / (const half& a, const half& b) { - float num = __half2float(a); - float denom = __half2float(b); - return __float2half(num / denom); + return __hdiv(a, b); } EIGEN_STRONG_INLINE __device__ half operator - (const half& a) { return __hneg(a);
上のeigen_half.patchファイルですが、1~2行目のパス指定は./Eigen/src/~
というように、パスの最初に./
を追加しないとパッチを当てる対象のファイルが見つからずにエラーになる場合があるようです。
C:\build\tf1120\tensorflow\tensorflow\workspace.bzl
をテキストエディタで開き、129行目の後にpatch_file = clean_dep("//third_party:eigen_half.patch"),
を追加します。
tf_http_archive( name = "eigen_archive", build_file = clean_dep("//third_party:eigen.BUILD"), sha256 = "d956415d784fa4e42b6a2a45c32556d6aec9d0a3d8ef48baee2522ab762556a9", strip_prefix = "eigen-eigen-fd6845384b86", urls = [ "https://mirror.bazel.build/bitbucket.org/eigen/eigen/get/fd6845384b86.tar.gz", "https://bitbucket.org/eigen/eigen/get/fd6845384b86.tar.gz", ], patch_file = clean_dep("//third_party:eigen_half.patch"), )
Bazelでビルド設定
コンソール画面に戻って、以下コマンドでTensorFlowのビルド設定を行います。
> cd /d C:\build\tf1120\tensorflow > pwd /c/build/tf1120/tensorflow > python ./configure.py
対話形式で設定を行っていくので、それぞれ以下のように画面から値を入力して設定を行ってください。なお、何も入力せずにEnterキーを押すと、画面に表示されているデフォルト値がそのまま設定されます。
Pythonのパス(Location of python)
Enterキーを押してデフォルト値(c:\venvs\build_tf1120\Scripts\python.exe)を設定します。
Pythonライブラリのパス(Python Library path to use)
Enterキーを押してデフォルト値(c:\venvs\build_tf1120\lib\site-packages)を設定します。
Apache Ignite supportの設定: Y
Enterキーを押してデフォルト値(Y)を設定します。
XLA JIT supportの設定: N
Enterキーを押してデフォルト値(N)を設定します。
XLA JIT supportを有効にするとビルドに失敗するため、必ずNを選択してください。
ROCm supportの設定: N
Enterキーを押してデフォルト値(N)を設定します。
CUDA supportの設定: Y
今回はCUDAを利用するため「y」と入力してEnterキーを押します。
ここでデフォルト値の(N)を設定すると、CUDAが利用されないので注意してください。
CUDA SDK versionの設定: 10.0
CUDA 10.0を利用するので「10.0」と入力してEnterキーを押します。
CUDA 10.0 toolkitのパス設定
Enterキーを押してデフォルト値(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.0)を設定します。
cuDNN versionの設定: 7.4.2
今回利用するcuDNNのバージョン「7.4.2」を入力してEnterキーを押します。
cuDNNのパス設定
Enterキーを押してデフォルト値(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.0)を設定します。
CUDAのCCバージョン設定
利用するGPUに合わせて、CUDA compute capabilitiesのバージョンを指定します。私の場合はTuringのTITAN RTXを利用するので「7.5」と入力しEnterキーを押します。
GPUごとに対応しているバージョンはNVIDIAのCUDA GPUのページから調べられます。なお、現時点ではTITAN RTXやGEFORCE RTX 2080TiなどのTuringのバージョンが載っていませんが、Turing系のチップを搭載したGPUの場合は「7.5」になります。
対応するバージョンはカンマ区切りで複数指定可能ですが、指定バージョンを増やすほど最終的に作成されるファイルのサイズが大きくなります。TensorFlowのビルドでは32bit版のzipが使われている(?)ようなので、ファイルサイズが大きくなりすぎるとzipの容量制限オーバーでビルドに失敗することがあるようなので、特に理由が無ければ、利用しているGPUに合わせたバージョンを1つだけ選択することをおすすめします。
最適化オプションの設定
利用しているCPUに合わせて最適化オプションを設定します。
私の場合はAVX2に対応しているIntel Core i7-7700Kを利用しているので「/arch:AVX2」と入力してEnterキーを押します。
inline overrideの設定: Y
Enterキーを押してデフォルト値(Y)を設定します。
設定値のサマリ
これでビルド設定が完了です。
分かりやすいように、今回の設定値を以下の表にまとめています。
設定項目 | 設定値 |
Location of python | c:\venvs\build_tf1120\Scripts\python.exe |
Python Library path | c:\venvs\build_tf1120\lib\site-packages |
Apache Ignite support | Y |
XLA JIT support | N |
ROCm support | N |
CUDA support | Y |
CUDA SDK version | 10.0 |
CUDA location | C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.0 |
cuDNN version | 7.4.2 |
cuDNN location | C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.0 |
CUDA CC version | 7.5 |
optimization flags | /arch:AVX2 |
override eigen inline | Y |
Bazel関連の不具合修正
Bazel 0.19.0で生成される.bazelrcファイルに不具合があるため、C:\build\tf1120\tensorflow\.bazelrc
をテキストエディタで開いて、最初の行にC:\build\tf1120\tensorflow\tools\bazel.rc
をインポートするコードを追加します。(パスの区切り文字にはスラッシュを指定します)
import c:/build/tf1120/tensorflow/tools/bazel.rc import c:/build/tf1120/tensorflow/.tf_configure.bazelrc
TensorFlow 1.12.0のビルド
セキュリティソフトの一時無効化
ビルド時に必要なパッケージのダウンロードが行われるのですが、Kaspersky Internet Securityなどのセキュリティソフトを導入している場合、対象のパッケージがダウンロードできずにビルドエラーになる場合があります。
そのため、このタイミングでセキュリティソフトを一時的に無効化します。
ビルドの実行
これまで作業してきたコンソールで以下のコマンドを実行し、Bazelを使ったTensorFlowのビルドを行います。
なお、ビルドが完了するまで1時間くらいかかります。
> cd /d C:\build\tf1120\tensorflow > pwd /c/build/tf1120/tensorflow rem ビルド実行 > bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow/tools/pip_package:build_pip_package rem ビルドが完了すると以下のようなメッセージが表示されます INFO: Elapsed time: 3380.601s, Critical Path: 372.35s, Remote (0.00% of the time): [queue: 0.00%, setup: 0.00%, process: 0.00%] INFO: 4504 processes: 4504 local. INFO: Build completed successfully, 5995 total actions
Bazelの作業ファイルは%USERPROFILE%\_bazel_%USERNAME%
というフォルダに作成されます。(%USERPROFILE%
や%USERNAME%
は環境変数名)
例えば、ユーザー名がTaroの場合、C:\Users\Taro\_bazel_Taro
というフォルダが作成され、そこに各パッケージや中間ファイルが格納されます。そこそこ大きなファイルサイズになるのでパッケージ作成後は、このフォルダを削除しても問題ありません。
バックグラウンドでBazelが起動しているとフォルダの削除ができないので、その場合はコマンドプロンプトからbazel shutdown
と入力してBazelをシャットダウンしてからフォルダの削除を行ってください。
セキュリティソフトの有効化
セキュリティソフトを無効化した場合は、ここでセキュリティソフトを有効にします。
wheelパッケージの作成
これまで作業してきたコンソール画面でwheelパッケージを作成します。
いくつかWarningが表示されますが、問題ありません。
> cd /d C:\build\tf1120\tensorflow > pwd /c/build/tf1120/tensorflow rem 出力フォルダの作成 > mkdir ..\out rem wheelパッケージの作成 > .\bazel-bin\tensorflow\tools\pip_package\build_pip_package ..\out
パッケージの作成が完了すると、C:\build\tf1120\out
フォルダにtensorflow-1.12.0-cp36-cp36m-win_amd64.whl
が作成されます。
ビルド作業の終了
これでGPU版TensorFlow 1.12.0 CUDA 10.0 + cuDNN 7.4.2のビルド作業が完了です。この後はBazelも使わないので、以下コマンドでBazelとコンソール画面を終了させます。
> bazel shutdown > exit
TensorFlow 1.12.0のインストール
仮想環境の作成
独自にビルドしたTensorFlowを利用するため、専用の仮想環境を作成します。このあたりは、TensorFlow向け…というよりも、Pythonを利用する時の一般的な流れになります。
今回は、C:\venvs\
配下にtf1120
という仮想環境を作成します。
コマンドプロンプト(普通のコマンドプロンプトでOK)を開いて以下のコマンドを実行します。
> python -m venv C:\venvs\tf1120 rem 仮想環境のActivateとpipのバージョンアップ > C:\venvs\tf1120\Scripts\activate.bat > python -m pip install --upgrade pip rem 導入されたパッケージ > pip3 list Package Version ---------- ------- pip 19.0.3 setuptools 40.6.2
作成したwheelパッケージの導入
続けて、以下のコマンドで作成したwheelパッケージからTensorFlowを導入します。
> pip3 install c:\build\tf1120\out\tensorflow-1.12.0-cp36-cp36m-win_amd64.whl rem 導入されたパッケージ > pip3 list Package Version ------------------- ------- absl-py 0.7.0 astor 0.7.1 gast 0.2.2 grpcio 1.18.0 h5py 2.9.0 Keras-Applications 1.0.7 Keras-Preprocessing 1.0.9 Markdown 3.0.1 numpy 1.16.1 pip 19.0.3 protobuf 3.6.1 setuptools 40.6.2 six 1.12.0 tensorboard 1.12.2 tensorflow 1.12.0 termcolor 1.1.0 Werkzeug 0.14.1 wheel 0.33.1
TensorFlowの動作確認
最後に、導入したTensorFlowの動作確認を簡単に行います。
上で利用したコンソールを引き続き利用し、以下コマンドでTensorFlowの動作確認を行います。
> python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"
正しくビルドできていれば以下のようにTensorFlowが動作します。Anaconda経由で導入したtensorflow-gpuの時に表示されていたAVX2に関するメッセージも表示されなくなります。(下のログは一部見やすいように編集しています)
2019-02-25 : Found device 0 with properties: name : TITAN RTX major: 7 minor: 5 memoryClockRate(GHz): 1.77 pciBusID : 0000:01:00.0 totalMemory: 24.00GiB freeMemory: 20.00GiB 2019-02-25 : Adding visible gpu devices: 0 2019-02-25 : Device interconnect StreamExecutor with strength 1 edge matrix: 2019-02-25 : 0 2019-02-25 : 0: N 2019-02-25 : Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 19380 MB memory) -> physical GPU (device: 0, name: TITAN RTX, pci bus id: 0000:01:00.0, compute capability: 7.5) tf.Tensor(-910.0499, shape=(), dtype=float32)
これで、独自にビルドしたTensorFlowを利用する環境が整いました。後はjupyter-labなど好みに応じてパッケージを追加してご利用ください。
ビルドに関する教訓など
Windows 10でTensorFlow 1.12.0 GPU with CUDA 10.0 + cuDNN 7.4.2のビルドに成功するまで、色々なエラーに遭遇しました。今でも原因が分からない事象もありますが、ビルド時の教訓などをメモとして残しておきます。
独自にビルドしても速度は大きく変わらない
長々とビルド手順を説明してきましたが、CPUのAVX2命令を有効化し、TITAN RTXなどTuring向けにCC7.5を有効にして独自にTensorFlow 1.12.0をビルドしても、コマンド一発で簡単に導入できるAnacondaのTensorFlow-GPU(CUDA 9.0)と速度はほとんど変わりません。MNISTの学習に必要な時間を計測してみましたが、その速度差は1%にも満たない物でした。
ネットワークが複雑になってくると異なる結果になる可能性もありますが、ビルドに関する手間を考えると、Anaconda(Miniconda)でサクッとTensorFlow-GPUを導入するのもありだと思います。(CUDAやcuDNNのインストールも不要なので、本当にお手軽です)
ちなみに、NumpyやSciPyなどもWindowsでMKLに対応させようとすると手間がかかりますが、Anaconda(Miniconda)なら、最初からMKLに対応した状態で導入されます。
必要なソフトのバージョンにシビア
上の手順でも説明していますが、ビルドに使用するソフトバージョンの組み合わせがシビアです。なんとなく最新のツールを使いたくなるかもしれませんが、最新のツールを使用するとビルドに失敗します。
Anacondaだとビルドに失敗する
TensorFlow 1.12.0をビルドするにはPython 3.6の環境が必要になりますが、AnacondaでPython 3.6の環境を作成してもビルドに失敗します。
Anacondaで何度か試してダメで、Python.orgのPythonに切り替えるとOKだったので、素直にPython.orgのPythonを利用しましょう。また、必要なパッケージをpipではなく、condaを使って導入する…なんて事もダメでした。
Hyper-V環境ではビルドに失敗する!?
ビルドを初めて数時間でエラー…という繰り返しだったので途中で原因究明を断念しましたが、Hyper-V環境でビルドすると、ビルド後半部分でエラーになります。(確か必要なライブラリがロードできない…というエラーだったはず)
セキュリティソフトによる通信ブロック
Kaspersky Internet Securityなど、パーソナルファイアウォールソフトなどが導入されていると、Bazelを使ったビルド時のダウンロードでエラーになる場合があります。
https://~への接続に失敗しているようなエラーメッセージが出ている場合は、セキュリティソフトによるブロックを疑ってみてください。
私の場合はKaspersky Internet Securityを導入していますが、KasperskyがBazelのダウンロードをブロックしているようで、ビルド時にはKasperskyを一時的に無効化する必要がありました。
テンポラリのパス設定に関する注意
Windowsではテンポラリのパスとして、環境変数にtemp
、tmp
が設定してありますが、デフォルトの設定(各ユーザーフォルダの配下)だとBazelで書き込みエラーが発生することがありました。
手動でC:\temp
フォルダを作成し、環境変数のtmp
とtemp
にC:\temp
を指定することでBazelの書き込みエラーは解消しました。
Bazelのシャットダウン
Bazelはサーバーとして(?)バックグラウンドで起動した状態になるようなので、ビルドに失敗した後など、単純に環境変数などを修正して再ビルドしても、設定が反映されないことがあるようです。
ビルド失敗後に設定を修正したあとは、以下のコマンドでBazelを終了させる必要がありそうです。また中間ファイルなど全て削除した上で最初からビルドしたい場合などは、cleanコマンドを使うとワークスペースをクリアできます。
> bazel clean > bazel shutdown