Linux(WSL)上でTensorFlowをソースコードからビルドする
ディープラーニングフレームワークのTensorFlowは、Googleが開発しており、ビルド済みのTensorFlowも提供されている。しかし、動作させるCPUによって、対応する拡張命令は異なる。ソースコードからビルドすることで、特定の環境でTensorFlowを高速に動作することが可能となる。 今回は、Linux(WSL)上でTensorFlowをソースコードからビルドする方法について書く。ビルドに使用するPC環境は以下のとおり。
- Ryzen 5 1600
- 32GBメモリ
- Windows Subsystem for Linux(Ubuntu 18.04)
今回は以下の構成でビルドする。
- TensorFlow v1.12.0
- Python 2
- GPUサポートは無し
基本的には、以下の公式ページ通りに進めることでビルドできるが、最新版Bazelを使うとビルドエラーになるため、古いバージョンを導入する必要があることに注意。
ビルドの流れとしては、
- 必要なPythonパッケージ、ビルドツールの導入
- ソースコードの取得
- ビルドコンフィグの生成
- ビルド実施
の順で進める。
ビルドに必要なPythonパッケージの導入
公式手順通りにPythonパッケージを導入する。
$ sudo apt install -y python-dev python-pip
$ pip install -U --user pip six numpy wheel mock
$ pip install -U --user keras_applications==1.0.6 --no-deps
$ pip install -U --user keras_preprocessing==1.0.5 --no-deps
Bazelの導入
2018/12/16時点の最新版(0.20.0)だとビルドできないので、古い0.15.0を導入する。
$ wget https://github.com/bazelbuild/bazel/releases/download/0.15.0/bazel_0.15.0-linux-x86_64.deb
$ sudo dpkg -i bazel_0.15.0-linux-x86_64.deb
$ sudo apt install -f -y
TensorFlowソースコード取得
TensorFlowのソースコードを取得します。今回は、v1.12.0をビルドするので、該当tagをチェックアウトする。
$ git clone https://github.com/tensorflow/tensorflow
$ cd tensorflow
$ git checkout v1.12.0
ビルドコンフィグ生成
ビルドコンフィグを生成する。今回はデフォルトのままで進める。
$ ./configure
WARNING: The following rc files are no longer being read, please transfer their contents or import their path into one of the standard rc files:
/home/mshr/tensorflow/tools/bazel.rc
WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".
INFO: Invocation ID: 2e09c61f-cc51-4ae2-9704-46e8b8f239f5
You have bazel 0.20.0 installed.
Please specify the location of python. [Default is /usr/bin/python]:
Found possible Python library paths:
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages
Please input the desired Python library path to use. Default is [/usr/local/lib/python2.7/dist-packages]
Do you wish to build TensorFlow with Apache Ignite support? [Y/n]:
Apache Ignite support will be enabled for TensorFlow.
Do you wish to build TensorFlow with XLA JIT support? [Y/n]:
XLA JIT support will be enabled for TensorFlow.
Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]:
No OpenCL SYCL support will be enabled for TensorFlow.
Do you wish to build TensorFlow with ROCm support? [y/N]:
No ROCm support will be enabled for TensorFlow.
Do you wish to build TensorFlow with CUDA support? [y/N]:
No CUDA support will be enabled for TensorFlow.
Do you wish to download a fresh release of clang? (Experimental) [y/N]:
Clang will not be downloaded.
Do you wish to build TensorFlow with MPI support? [y/N]:
No MPI support will be enabled for TensorFlow.
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:
Not configuring the WORKSPACE for Android builds.
Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See tools/bazel.rc for more details.
--config=mkl # Build with MKL support.
--config=monolithic # Config for mostly static monolithic build.
--config=gdr # Build with GDR support.
--config=verbs # Build with libverbs support.
--config=ngraph # Build with Intel nGraph support.
Configuration finished
ビルド実施
ビルドを開始する。今回のビルド環境だと1時間半程度かかる。
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
・・省略・・
INFO: From Executing genrule //tensorflow/python/estimator/api:estimator_python_api_gen:
tf.estimator package not installed.
tf.estimator package not installed.
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 5474.748s, Critical Path: 172.25s
INFO: 10641 processes: 10641 local.
INFO: Build completed successfully, 11347 total actions
ビルド完了後、PythonのPIPパッケージを作成します。作成には15分ほどかかります。
$ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Sat Dec 15 22:47:56 DST 2018 : === Preparing sources in dir: /tmp/tmp.qmE6tTngOh
~/tensorflow ~/tensorflow
~/tensorflow
Sat Dec 15 22:49:18 DST 2018 : === Building wheel
warning: no files found matching '*.pd' under directory '*'
warning: no files found matching '*.dll' under directory '*'
warning: no files found matching '*.lib' under directory '*'
warning: no files found matching '*.h' under directory 'tensorflow/include/tensorflow'
warning: no files found matching '*' under directory 'tensorflow/include/Eigen'
warning: no files found matching '*.h' under directory 'tensorflow/include/google'
warning: no files found matching '*' under directory 'tensorflow/include/third_party'
warning: no files found matching '*' under directory 'tensorflow/include/unsupported'
Sat Dec 15 22:50:10 DST 2018 : === Output wheel file is in: /tmp/tensorflow_pkg
ビルドしたTensorFlowの導入
pipコマンドによりビルドしたTensorFlowを導入する。
$ pip install --user /tmp/tensorflow_pkg/tensorflow-1.12.0-cp27-cp27mu-linux_x86_64.whl
MNISTを学習
ビルドしたTensorFlowの動作確認のために、TensorFlow公式チュートリアルに記載のMNISTを学習する。
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
以上で、TensorFlowをソースコードからビルドし、MNISTの学習を実施し、ビルドしたTensorFlowの動作を確認した。次回は、拡張命令の有無による動作速度の変化を検証したい。