コンピューター好きのブログ

主にコンピューター・ラズパイと電子工作・オーディオ関連の記事を書いています。

古いグラフィックカードでTensorFlowのGPU環境を構築してみました(Ubuntu編)

以前、Windows10上に古いグラフィックカード(NVIDIA Geforce GTX 660 Ti)を使ったTensorFlowのGPU環境を作成した記事を書きました。

www.toomath.net

だいぶ間が空きましたが、今度は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環境を作ってみたお話でした。

(c) 2018 toomath