読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

macOS(High Sierra)でTensorFlowをコンパイルする

古いiMac(2012)を使っているのでGPUが馬力がないので、CPUでもIntel MKLを使って高速化をすべく、macOS(High Sierra)でTensorFlowをコンパイルしようとしたら嵌りました。

TensorFlowはコンパイル時にデフォルトのApple clangを使うのですが、このclangはOpenMPをサポートしていないので、omp.hが見つからないというエラーです。

で、コンパイラを変える方針で対処し始めたら相当失敗しました。

結論ですが、HomeBrewでlibompをインストールして、これをtensorflowのthird_partyフォルダーで登録する方法でうまくいきました。以下、必要な手順です。

1. Installing TensorFlow from Sources  |  TensorFlowでbazel buildを起動する手前まで準備する。

2. HomeBrewでlibompをインストールする

brew install libomp

3. libompをtensorflow/third_partyフォルダに登録する

cd tensorflow/third_pary
mkdir libomp
cd libomp
ln -s /usr/local/opt/libomp/include .
ln -s /usr/local/opt/libomp/lib
touch BUILD

以下はBUILDの内容です。

licenses(["notice"])

cc_library(
    name = "libomp",
    hdrs = glob(["include/*.h"]),
    visibility = ["//visibility:public"],
)

4. tensorflow/tensorflow/core/BUILDを編集する
name="core_cpu_impl"のライブラリで、

copts = tf_copts(),

copts = tf_copts() + ["-Ithird_party/libomp/include"],

に変更します。

copts = tf_copts() + ["-Xpreprocessor -fopenmp", "-Ithird_party/libomp/include"],

のほうが筋がいいかもしれませんが、試してません。ヘッダーだけが必要だったようで上記変更でコンパイルはできました。
また、name="core_cpu_impl"のライブラリのdepsに

"//third_party/libomp",

を追加します。

以上で準備完了です。コンパイルしてインストールしましょう。

bazel build --config=mkl //tensorflow/tools/pip_package:build_pip_package && bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg && pip install /tmp/tensorflow_pkg/tensorflow-1.8.0-cp36-cp36m-macosx_10_13_x86_64.whl

動作確認するには、tensorflowフォルダから出てください。(出ないとimport tensorflowが失敗します)