TensorFlow 2.16.2 C++ library build for GPU.
TensorFlow 2.16.2 C++ library build の GPU対応版です。
1. 開発環境
PC: Ubuntu Mate 22.04
Virtual_env
python 3.10.12
bazel 6.4.0
clang-14(llvm-14) <--- NG
clang-17(llvm-17) <--- needed
GPU: GeForce GTX1070 Compute Capability 6.1
GPU 本体のドライバー
mvidia-driver-525
GPUプログラム開発用のライブラリー群
CUDA Toolkit 12.3
cuDNN v8.9.6
Nvidia 提供のライブラリー
TensorRT 8.6.1.6
1.1 ドライバーのインストールから、簡単におさらいする。
i) GPU 本体のドライバーをインストールする。
$ sudo apt install mvidia-driver-525
ii) GPUソフトウエア 開発用に、CUDA 12.3 を使うので、
CUDA Toolkit 12.3 を、Nvidia のサイトからダウンロード&インストールする。
google で、 CUDA Toolkit 12.3 を検索すると出てくると思う。
cuda-12-3-0-download-archive
Linux -> x86_64 -> Ubuntu -> 22.04 -> (deb)local
> Base Installer の欄を実行する。
/usr/local/cuda-12.3/ へ、インストールされる。
include/cuda.h
bin/nvcc <-- nvcc もある。
iii) cuDNN v8.9.6 for CUDA 12.x をダウンロード&インストールする。
やり方は、上記と同じ。
cudnn-archive
-> Local Installer for Ubuntu22.04 x86_64 (Deb)
libcudnn8, libcudnn8-dev
インストール先は、/usr になる。
$ sudo dpkg -L libcudnn8-dev
/usr/include/cudnn.h
/usr/include/cudnn_version.h
iv) TensorRT 8.6.1.6 のインストール。
本当は、使いたくないが、configure で、指定しないと、うまくいかないので、使う。
TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz を、google で探して、
~/usr/local/share/ 下で展開しました。
/home/nishi/usr/local/share/TensorRT-8.6.1.6
v) clang-17(llvm17) のインストール。(必須)
下記を参考にインストールする。
How to install Clang 17 or 16 in Ubuntu 22.04 | 20.04
$ wget https://apt.llvm.org/llvm.sh
$ chmod u+x llvm.sh
$ sudo ./llvm.sh 17
$ sudo apt list --installed >/dev/null | grep clang
$ dpkg -L clang-17
remove
$ sudo apt remove --purge clang-17
$ sudo apt autoremove --purge
もしかしたら、下記も必要かも?
$ sudo dpkg-reconfigure clang-14
下記は、参考にしたページの記載です。
$ sudo rm /etc/apt/sources.list.d/archive_uri-http_apt_llvm_org_*.list
sudo rm /etc/apt/trusted.gpg.d/apt.llvm.org.asc
2. 手順
1) ソースのダウンロード。
TensorFlow 12.6 のソースダウンロードは、TensorFlow 2.16.2 C++ library build を参照してください。
2) bazel でのビルド。
virtual env 上で行う。
$ cd
$ source kivy_env/bin/activate <-- 自分の環境を使う。
$cd ~/local/tensorflow/tensorflow-2.16.2
$ export TF_PYTHON_VERSION=3.10
$ bazel clean --expunge
$ bazel clean --async
i) config
$ ./configure
ii)
.bazelrc を修正する。
line 246
#build:cuda_clang --repo_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_50,sm_60,sm_70,sm_80,compute_90"
build:cuda_clang --repo_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_60"
iii) start build
$ export TF_PYTHON_VERSION=3.10
$ bazel build --verbose_failures --config=opt --copt=-march=native //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so //tensorflow:install_headers
注) --config=v2 は、指定しないほうがよさそう。指定したら、逆に v1 のライブラリーができた気がする。
build OK!!
32,708 steps
6時間30分
3) あとは、必要なファイルをコピーするだけ。
ここから後は、TensorFlow 2.16.2 C++ library build を参照しとうせ。
3. 下記は、bazel build エラーになったときの対応の記録です。
エラー
How to resolve bazel "undeclared inclusion(s)" error?
が参考になるか?
$ bazel clean --expunge
再度ビルド
エラー
再度試す。
$ bazel clean --expunge
$ bazel build --verbose_failures --config=v2 --copt=--cuda-gpu-arch=sm_60 //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so //tensorflow:install_headers
エラー
もしかして、
-Werror,-Wunused-command-line-argument の指定がNGか。
-Werror が、NG みたい。
下記に、参考になる記述があった。
Failure to compile TF 2.15.0/2.16.1 (with Cuda support) using clang in Ubuntu 22.04 #62459
I built v2.16.1 successfully with CUDA 12.3 + cuDNN 8.9.7 + tensorrt 8.6.1 with clang 17 on Ubuntu 22.04, with command line option --copt=-Wno-error=unused-command-line-argument.
下記 configure オプションを加えてみる。
さらに、--copt=--cuda-gpu-arch=sm_60 を加えて、ビルド。
$ bazel build --verbose_failures --config=v2 --copt=--cuda-gpu-arch=sm_60 //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so //tensorflow:install_headers
やはり同じみたい。
でも今回は、出しているところがわかったようだ。
external/boringssl のビルド時に、win-aarch64 を加えているのがいかんのか?
win-aarch64/crypto/test/trampoline-armv8-win.S で
[-Werror,-Wunused-command-line-argument]
が使われているみたい。
しかし、なぜ win-aarch64 をビルドすのか?
もしかして、--config=opt --copt=-march=native が必要か?
それなら、かきは、どうか?
$ bazel build --verbose_failures --config=v2 --config=opt --copt=-march=native //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so //tensorflow:install_headers
.bazelrc を修正してみるか?
line 246
#build:cuda_clang --repo_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_50,sm_60,sm_70,sm_80,compute_90"
build:cuda_clang --repo_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_60"
再度、ビルドエラー
texture は、cuda 12.3 では、使われていないみたい。
なので、llvm-xx で、条件コンパイルが必要だが、llvm-14、llvm-15 では、対応していないみたい。
#if CUDA_VERSION < 12000
なので、 clang-17(llvm-17) が必要みたいぞね。--> clang-17 をインストールする。
[CUDA 12] clang error: no template named 'texture' #61340
後でわかったきがするが、
下記で良かったのかも?
$ bazel build --verbose_failures --config=v2 --config=opt //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so //tensorflow:install_headers