以前、Windows10上に古いグラフィックカード(NVIDIA Geforce GTX 660 Ti)を使ったTensorFlowのGPU環境を作成した記事を書きました。
だいぶ間が空きましたが、今度はLinux(Ubuntu)でTensorFlowのソースをビルドしてTensorFlowのGPU環境を作ってみましたのでご紹介します。
ソースからビルドする理由
私が試した限りですが、pipで導入可能な tensorflow-gpu パッケージは、CUDA 9 で使える最低バージョンの 1.5 でも Compute Capability 3.5以上を要求します。このため、Compute Capability が 3.0 の Geforce GTX 660 Ti は使えませんでした。
そこで、Windows 10 の時と同様、TensorFlow をソースからビルドすることにしました。
なお、別に CUDA のバージョンを 9 以上にすることにこだわりがあるわけではないです。9ならいけるだろうなと思っただけです(^^;
使用するTensorFlowなどのバージョン
最初はどうせビルドするのなら新しい方が良いだろうとTensorFlow 2.0.0以降をビルドしてみましたが、作成したtensorflowパッケージはCompute Capability 3.5以上のGPUしか使えないものになることが分かりました。
configureでCompute Capabilityを指定するときに最低3.5以上じゃないとダメだよと言われるのですが、3.0でもエラーにはならないので使えるものだと勘違いしてしまいました。
これが分かるまでに3回ほどTensorFlowのビルドを実施し、軽く9時間ほど無駄にしました(泣)
このため、最終的に Compute Capability 3.0 でもいける可能性が高いと感じた※ CUDA 9.0 での動作確認が取れている最新の TensorFlow 1.12 を使うことにしました。
※根拠はありません。個人的な印象です。
https://www.tensorflow.org/install/source?hl=ja#gpu_support_2
上のリンク先の「テスト済みのビルド構成→Linux→GPU」の表によると、TensorFlow 1.12 で実績があるPython等の組み合わせは下記になります。基本はこれに合わせた環境を作っていきますが、GCC だけは私の用意した Ubuntu 16.04 LTS に入っている 5.4 を使いました。
- Python 2.7、3.3-3.6
- GCC 4.8
- Bazel 0.15.0
- cuDNN 7
- CUDA 9
OSとハードウェア
OS:Ubuntu 16.04 LTS
CPU:Core i7-2600K
メモリ:DDR3 16GB
グラフィックカード:Geforce GTX 660 Ti GDDR5 2GB
構築手順
NVIDIA製ドライバーの導入
まずはCUDAを使えるようにするため、NVIDIA製のドライバーを導入します。
私は下記を実行しました。2020/8/7時点で nvidia-450 が最新だと思いますが、パッケージが見つからなかったので nvidia-418 にしています。(後のCUDA導入時にアップデートされて 450 になります)
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt upgrade
sudo apt-get install nvidia-418
sudo reboot
マシンが再起動した後、下記を実行してグラフィックボードの情報が出力されれば成功です。
nvidia-smi
CUDAの導入
まず下記より cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb をダウンロードします。
CUDA Toolkit 9.0 Downloads | NVIDIA Developer
次に下記を実行してCUDA 9.0をインストールしました。
sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-9-0 cuda-drivers
sudo reboot
これでドライバーが更新され、下記のようにドライバーのバージョンが 450 になりました。nvidia-smiを実行すると「NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0」と表示されました。
続けてcudaのモジュールにパスを通すため、下記の内容を ~/.bashrc の末尾に追記しておきます。
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
bazelの導入
TensorFlowをビルドするには bazel というツールが必要です。bazelはコンパイルなどを並列実行してビルド時間を短縮してくれるもののようです。
bazel というバイナリファイルが1個あればOKです。
下記からバージョン 0.15.0 のファイル(bazel-0.15.0-linux-x86_64)をダウンロードし、/home/toomath/temp に置きました。
https://github.com/bazelbuild/bazel/releases/tag/0.15.0
そして、下記で実行権を付与し、bazel に名前を変えました。
chmod a+x bazel-0.15.0-linux-x86_64
mv bazel-0.15.0-linux-x86_64 bazel
続けて下記を実行して /home/toomath/temp をPATHに追加しておきます。
export PATH=/home/toomath/temp:${PATH}
cuDNNを導入
下記から cuDNN 7.0.5 関連のパッケージをダウンロードします。
https://developer.nvidia.com/rdp/cudnn-archive
「Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0」の下にある下記の3つです。
- cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
- cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
- cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)
下記のコマンドでインストールしました。
インストールしたファイルは /usr/lib/x86_64-linux-gnu の下に格納されます。
sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.0.5.15-1+cuda9.0_amd64.deb
このため、先ほど .bashrc に追加したexport LD_LIBRARY_PATHの行を下記のように書き換えます。
export LD_LIBRARY_PATH="/usr/local/cuda-9.0/lib64:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
ここで下記を実行して環境変数PATHとLD_LIBRARY_PATHを ~/.bashrc に記載した内容にします。
source ~/.bashrc
Pyhton環境の構築
TensorFlowを実行するためのPython環境を構築します。
下記のコマンドを実行しました。
venv を使ってPythonの仮想環境を作り、そこにTensorFlow用の環境を作っています。
sudo apt-get install python3-venv
cd /home/toomath
python3 -m venv venv
source venv/bin/activate
sudo apt-get install python3-dev python3-pip
pip3 install --upgrade pip
pip3 install -U --user pip six numpy wheel setuptools mock
pip3 install -U pip six numpy wheel setuptools mock
pip install -U keras_applications --no-deps
pip install -U keras_preprocessing --no-deps
TensorFlowをビルドする
まずTensorFlowのソースをgitで取得します。ここでは 1.12 をチェックアウトしています。
cd /home/toomath
sudo apt-get install git
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow/
git checkout r1.12
次に、下記のように configure を実行します。対話形式でビルド環境を聞かれるので、CUDAを使うか?と聞かれたら Y、CUDAのバージョンを聞かれたら 3.0 と答えます。また、私の場合、cuDNNのパスがデフォルトと違ったので /usr/lib/x86_64-linux-gnu に修正しました。
./configure
準備ができたらいよいよビルドです。下記を実行します。
--jobs=6 はメモリを使い過ぎてビルドが止まらないようにするための予防策です。コンパイル等の並列数を6に制限します。
すごーく時間がかかるので放っておきます。私の場合3時間くらいかかりました。
bazel build --jobs=6 --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
ビルドに成功したら下記を実行して作成したTensorFlowパッケージをインストールします。
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
pip3 install /tmp/tensorflow_pkg/tensorflow-1.12.3-cp35-cp35m-linux_x86_64.whl
TensorFlowがインストールされたことを確認する
インストールが終わったらTensorFlowが使えることを確認します。
まず今いるディレクトリを移動します。
tensorflowをビルドしたディレクトリがカレントディレクトリになっているとうまくtensorflowが使えないからです。
pip3 list でPythonのパッケージを確認すると下記のように「tensorflow 1.12.3」がインストールされていることが分かります。
$ pip3 list
Package Version
------------------- -------
absl-py 0.9.0
astor 0.8.1
gast 0.3.3
grpcio 1.31.0
h5py 2.10.0
importlib-metadata 1.7.0
Keras-Applications 1.0.8
Keras-Preprocessing 1.1.2
Markdown 3.2.2
mock 3.0.5
numpy 1.18.5
pip 20.2.1
pkg-resources 0.0.0
protobuf 3.12.4
setuptools 49.2.1
six 1.15.0
tensorboard 1.12.2
tensorflow 1.12.3
termcolor 1.1.0
Werkzeug 1.0.1
wheel 0.34.2
zipp 1.2.0
GPUの効果を確認する
最後にWindowsの時と同様に↓で公開してくださっているGPUのパフォーマンスを測るPythonコードを実行します。
https://qiita.com/sho8e69/items/66c1662c49ac89a024be
すると下記のようにCPUより4倍高速!と出ました。Windowsと同じです。当たり前か(^_^;)
CPU (s):
2.3987787730000036
GPU (s):
0.5310798530001648
GPU speedup over CPU: 4x
以上、Ubuntu で古いグラフィックカードを使ってTensorFlowのGPU環境を作ってみたお話でした。