TensorFlowをUbuntu16.04、GeforceGTX1070の環境でコンパイルしたときのメモ

ヨメレバCSS
オリジナルCSS


※本サイトはアフィリエイトプログラムによる収益を得ています。
 ページ内のリンクがアフィリエイトリンクの場合があります。

 TensorFlowをソースコードからコンパイルしたときのメモです。CUDA 8でGPUを使わせるため。

 CUDA、cuDNNはインストール済みとします。参考はこちら。

GTX-1080を入手したものの、pip でインストールしたTensorFlowでは使えないとのこと四苦八苦したのでメモPythonの経験がまだ半年程度なのでインストール周りで無駄が多そう...環…
スポンサーリンク
GoogleAdSence レクタングル(大)

ソースコードを取得

 Geforce GTX 1070はCUDA 8を使わなければならないが、TensorFlowのほうで用意されているバイナリはCUDA 7.5が対象のよう。

 なので、ソースコードからインストールします。

を参考に、githubから取得してきます。

git clone https://github.com/tensorflow/tensorflow

 

Bazel環境の構築 

 しかしTensorFlowのコンパイルに入る前に、BazelというGoogleのビルドツールが使えるようにしておかないといけない。
なので、こちらを見ながらセットアップ。
書いてあるとおりJDKを入れて、
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
書いてあるとおりリポジトリを追加して、
$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -
apt-getでOK。
$ sudo apt-get update && sudo apt-get install bazel
$ sudo apt-get upgrade bazel
 

TensorFlowのコンパイル

configureの実行

 まずはconfigure。

 libcurl3-devをインストールしておきます。
$ apt- get install libcurl3-dev
 
gccも4.9でないとCUDAのほうでエラーになるようなので、4.9をインストール。
$ sudo apt-get install gcc-4.9
$ sudo apt-get install g++-4.9
$ sudo apt-get install libstdc++6-4.9-dbg
 
 そしてtensorflowの下に移動して./configure。
 cudaを有効に、google cloudもついでに有効にします。
 gccは、上でインストールしたgcc-4.9を指定します。
 

ビルドの実行

 次にビルドを実行します。
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
 
 ここでエラーが発生。
 

ERROR: /usr/local/src/tensorflow/tensorflow/core/kernels/BUILD:2207:1: no such target '//tensorflow/core:android_proto_lib_no_rtti_lite_runtime': target 'android_proto_lib_no_rtti_lite_runtime' not declared in package 'tensorflow/core' defined by /usr/local/src/tensorflow/tensorflow/core/BUILD and referenced by '//tensorflow/core/kernels:android_tensorflow_kernels_no_rtti_lite_runtime'.
ERROR: /usr/local/src/tensorflow/tensorflow/core/kernels/BUILD:2207:1: no such package 'base': BUILD file not found on package path and referenced by '//tensorflow/core/kernels:android_tensorflow_kernels_no_rtti_lite_runtime'.
ERROR: /usr/local/src/tensorflow/tensorflow/core/kernels/BUILD:2207:1: no such target '//tensorflow/core:android_tensorflow_lib_lite_no_rtti_lite_runtime': target 'android_tensorflow_lib_lite_no_rtti_lite_runtime' not declared in package 'tensorflow/core' defined by /usr/local/src/tensorflow/tensorflow/core/BUILD and referenced by '//tensorflow/core/kernels:android_tensorflow_kernels_no_rtti_lite_runtime'.
ERROR: /usr/local/src/tensorflow/tensorflow/core/kernels/BUILD:2207:1: no such target '//tensorflow/core:android_proto_lib_no_rtti_lite_runtime': target 'android_proto_lib_no_rtti_lite_runtime' not declared in package 'tensorflow/core' defined by /usr/local/src/tensorflow/tensorflow/core/BUILD and referenced by '//tensorflow/core/kernels:android_tensorflow_kernels_no_rtti_lite_runtime'.
ERROR: Evaluation of query "deps((//... union @bazel_tools//tools/jdk:toolchain))" failed: errors were encountered while computing transitive closure.
Configuration finished

 
 
ちょっとよくわからないですね… 
 
 
より、 

Confirmed that if I make these changes to the following three files configure runs without error:

  • Remove all if_mobile and if_android conditions from tensorflow/contrib/session_bundle/BUILD
  • Remove the ios_tensorflow_test_lib target from tensorflow/core/BUILD
  • Remove the android_tensorflow_kernels_no_rtti_lite_runtime target fromtensorflow/core/kernels/BUILD
という記述を見つけてきて、このようにBUILDを修正してやったら通りました。

GCCは4.9を使うこと

試しにgcc-5.3でビルドしてやったら
ERROR: /usr/local/src/tensorflow/tensorflow/core/kernels/BUILD:1584:1: error while parsing .d file: /root/.cache/bazel/_bazel_root/fd8e200c02b3d1983454b39c189f0f13/execroot/tensorflow/bazel-out/local_linux-opt/bin/tensorflow/core/kernels/_objs/batchtospace_op_gpu/tensorflow/core/kernels/batchtospace_op_gpu.cu.pic.d (No such file or directory).
nvcc warning : option '--relaxed-constexpr' has been deprecated and replaced by option '--expt-relaxed-constexpr'.
In file included from /usr/local/cuda-8.0/include/cuda_runtime.h:78:0,
                 from <command-line>:0:
/usr/local/cuda-8.0/include/host_config.h:115:2: error: #error -- unsupported GNU version! gcc versions later than 5.3 are not supported!
 #error -- unsupported GNU version! gcc versions later than 5.3 are not supported!
と怒られたのでやはりgccは4.9。
 

パッケージの作成

 ビルドが通ったら、
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
とすれば/tmp/tensorflow_pkgに.whlファイルが生成されます。
そしたらそれを、pipでインストールしてやればOK。
 
 しかしここでエラーが発生。
Traceback (most recent call last):
  File "setup.py", line 26, in <module>
    from setuptools import find_packages, setup, Command, Extension
ImportError: No module named setuptools
となった。
 
 setuptoolsが何かかと思ったけれど、どうもそうではなさそうで、そもそもビルドがエラーで落ちていたよう。
 
ERROR: /usr/local/src/tensorflow/tensorflow/contrib/rnn/BUILD:65:1: undeclared inclusion(s) in rule '//tensorflow/contrib/rnn:python/ops/_gru_ops_gpu':
this rule is missing dependency declarations for the following files included by 'tensorflow/contrib/rnn/kernels/gru_ops_gpu.cu.cc':
  '/usr/local/cuda-8.0/include/cuda_runtime.h'
  '/usr/local/cuda-8.0/include/host_config.h'
  '/usr/local/cuda-8.0/include/builtin_types.h'
  '/usr/local/cuda-8.0/include/device_types.h'
  '/usr/local/cuda-8.0/include/host_defines.h'
  '/usr/local/cuda-8.0/include/driver_types.h'
  '/usr/local/cuda-8.0/include/surface_types.h'
  '/usr/local/cuda-8.0/include/texture_types.h'
  '/usr/local/cuda-8.0/include/vector_types.h'
  '/usr/local/cuda-8.0/include/library_types.h'
  '/usr/local/cuda-8.0/include/channel_descriptor.h'
  '/usr/local/cuda-8.0/include/cuda_runtime_api.h'
  '/usr/local/cuda-8.0/include/cuda_device_runtime_api.h'
  '/usr/local/cuda-8.0/include/driver_functions.h'
  '/usr/local/cuda-8.0/include/vector_functions.h'
  '/usr/local/cuda-8.0/include/vector_functions.hpp'
  '/usr/local/cuda-8.0/include/common_functions.h'
  '/usr/local/cuda-8.0/include/math_functions.h'
  '/usr/local/cuda-8.0/include/math_functions.hpp'
  '/usr/local/cuda-8.0/include/math_functions_dbl_ptx3.h'
  '/usr/local/cuda-8.0/include/math_functions_dbl_ptx3.hpp'
  '/usr/local/cuda-8.0/include/cuda_surface_types.h'
  '/usr/local/cuda-8.0/include/cuda_texture_types.h'
  '/usr/local/cuda-8.0/include/device_functions.h'
  '/usr/local/cuda-8.0/include/device_functions.hpp'
  '/usr/local/cuda-8.0/include/device_atomic_functions.h'
  '/usr/local/cuda-8.0/include/device_atomic_functions.hpp'
  '/usr/local/cuda-8.0/include/device_double_functions.h'
  '/usr/local/cuda-8.0/include/device_double_functions.hpp'
  '/usr/local/cuda-8.0/include/sm_20_atomic_functions.h'
  '/usr/local/cuda-8.0/include/sm_20_atomic_functions.hpp'
  '/usr/local/cuda-8.0/include/sm_32_atomic_functions.h'
  '/usr/local/cuda-8.0/include/sm_32_atomic_functions.hpp'
  '/usr/local/cuda-8.0/include/sm_35_atomic_functions.h'
  '/usr/local/cuda-8.0/include/sm_60_atomic_functions.h'
  '/usr/local/cuda-8.0/include/sm_60_atomic_functions.hpp'
  '/usr/local/cuda-8.0/include/sm_20_intrinsics.h'
  '/usr/local/cuda-8.0/include/sm_20_intrinsics.hpp'
  '/usr/local/cuda-8.0/include/sm_30_intrinsics.h'
  '/usr/local/cuda-8.0/include/sm_30_intrinsics.hpp'
  '/usr/local/cuda-8.0/include/sm_32_intrinsics.h'
  '/usr/local/cuda-8.0/include/sm_32_intrinsics.hpp'
  '/usr/local/cuda-8.0/include/sm_35_intrinsics.h'
  '/usr/local/cuda-8.0/include/surface_functions.h'
  '/usr/local/cuda-8.0/include/texture_fetch_functions.h'
  '/usr/local/cuda-8.0/include/texture_indirect_functions.h'
  '/usr/local/cuda-8.0/include/surface_indirect_functions.h'
  '/usr/local/cuda-8.0/include/device_launch_parameters.h'
  '/usr/local/cuda-8.0/include/cuda_fp16.h'
  '/usr/local/cuda-8.0/include/math_constants.h'
  '/usr/local/cuda-8.0/include/curand_kernel.h'
  '/usr/local/cuda-8.0/include/curand.h'
  '/usr/local/cuda-8.0/include/curand_discrete.h'
  '/usr/local/cuda-8.0/include/curand_precalc.h'
  '/usr/local/cuda-8.0/include/curand_mrg32k3a.h'
  '/usr/local/cuda-8.0/include/curand_mtgp32_kernel.h'
  '/usr/local/cuda-8.0/include/cuda.h'
  '/usr/local/cuda-8.0/include/curand_mtgp32.h'
  '/usr/local/cuda-8.0/include/curand_philox4x32_x.h'
  '/usr/local/cuda-8.0/include/curand_globals.h'
  '/usr/local/cuda-8.0/include/curand_uniform.h'
  '/usr/local/cuda-8.0/include/curand_normal.h'
  '/usr/local/cuda-8.0/include/curand_normal_static.h'
  '/usr/local/cuda-8.0/include/curand_lognormal.h'
  '/usr/local/cuda-8.0/include/curand_poisson.h'
  '/usr/local/cuda-8.0/include/curand_discrete2.h'.
 
 こちらについては、includeパスにLD_LIBRARY_PATHなどが設定されていなかったので、それを行う。
$ echo 'export CUDA_ROOT=/usr/local/cuda' >> ~/.bash_profile
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bash_profile
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:$LD_LIBRARY_PATH' >> ~/.bash_profile
$ echo 'export CPATH=/usr/local/cuda/include:$CPATH' >> ~/.bash_profile
 
あと、
にあった

Work-around from #1157 seems to work

addcxx_builtin_include_directory: "/usr/local/cuda-8.0/include" to 

third_party/gpus/crosstool/CROSSTOOL
を見て、該当コードを見ると
 
cxx_builtin_include_directory: "/usr/local/cuda%{cuda_version}/include"
になっていたので、これを
cxx_builtin_include_directory: "/usr/local/cuda-8.0/include"
にしてみた。
configureをしないとそれまでのコンパイルがクリアされなかったので、それをする。
 
 ここまでやると、無事.whlファイルができ、インストールしてTensorFlowを使うことができました。
スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)