技術資料課題 written by いずみ♡立命館大学 理工学部 電子情報工学科  


いずみ研 GPU マシンで TensorFlow を走らせる方法

研究室にまあまあの性能の GPU マシンを用意している。 自PCから接続して使用することができる。 ぜひ活用されたし。

GeForce RTX 2080 Ti (本来はゲーム用? 整数演算が速い DeepLearningも速い)
CPU: Intel Core i9-9900X (10cores/20threads, 3.5GHz, 20MB cache), 64GB memory
GPU: NVIDIA GeForce RTX2080 Ti, 11GB memory
OS: Ubuntu18.04
RTX A5000 (科学技術計算用? 浮動小数点演算が速い)
CPU: Intel Core i9-10940X (14cores/28threads, 3.30GHz, 19.25MB cache), 16GB memory
GPU: NVIDIA RTX A5000 (24GB)
OS: Ubuntu 20.04.3

ついでに、NVIDIA GPU を搭載した Windows 10 マシンで TensorFlow (with GPU) を走らせる方法も記載しておく。

準備

前提とする知識・能力(できないなら復習すること!)

接続方法の概要

VPN接続、電源オン、ログインなどの詳細は manaba+R の卒業研究のコースにて確認するか、泉に尋ねること。(外部から見える場所にはおけないので)

自PCでの準備


研究室マシンでの準備 (venv)

TensorFlow はバージョン等によって必要な実行環境が異なる。 環境を切り替えるようにしていないとうまく動かない。 そのための venv というツールがあり、 これを利用してバージョン毎の環境を構築する。

ログインするたびにすること

構築した環境を使う際には activate(活性化)/deactivate(不活性化)が必要です。

python コード実行例

TensorFlow と Keras で 動かしながら学ぶ ディープラーニングの仕組み (中井悦司, マイナビ出版, 2019) サンプルコード を実行する例を示す。 第1章の最初のサンプルコード " 1. Least squares method with low-level API " は TensorFlow 1.*系の例、 ふたつめのサンプルコード " 2. Least squares method with Keras " は TensorFlow 2.*系の例、のようである。

これらに次の変更を加える。

変更・追加したソースコードは以下のとおり。この3つをダウンロードして適当なデ ィレクトリに置いておく。

実行の例を以下に示す。

実行結果の例を以下に示す。

実演動画

性能比較

TensorFlow と Keras で 動かしながら学ぶ ディープラーニングの仕組み (中井悦司, マイナビ出版, 2019) サンプルコード について、 2章以降も含めて いずみ研の環境で実行するように修正したサンプルコード他を colab_tfbook_rizm.tgz にまとめた。

設定メモ: /usr/local/cuda/bin に PATH を通す。 /usr/local/cuda/lib64 に LD_LIBRARY_PATH を通す。

このうち、次の3つの学習について、学習にかかる計算時間を計測する。 model.fit(), model.fit_generator(), または model.train_on_batch() のループの 直前の開始時刻と直後の終了時刻を time.perf_counter() で計測し算出する。

[ex5-1] 5.1.2 Kerasによる多層CNNの実装
MNIST手書き数字認識のための多層CNNの学習
[ex5-5] 5.3.1 CIFAR-10(カラー写真画像)の分類に向けた拡張
CIFAR-10画像分類のための多層CNNの学習
[ex5-7] 5.3.3 DCGANによる画像生成モデル
MNIST風数字画像の生成器&識別器の学習

それぞれのレイヤ構成、学習の設定は次の通りである

実験に使用した計算機は次の5台である。 このうち(1)(2)については、GPU使用/不使用(CPUのみ)の二通りで実験した

  1. (1) i9-9 + RTX2080
  2. 仕様
    CPU: Intel Core i9-9900X (10C20T, 3.50GHz, 20MB cache) + 64GB mem
    OS: Ubuntu 18.04.5
    NVIDIA GeForce RTX2080 Ti (11GB)
    NVIDIA Driver 470.57.02, CUDA 11.4, CUDNN 8.2.4
    Python 3.8.0, TensorFlow 2.6.0
    
  3. (2) mobile i7-10 + T1000
  4. 仕様
    CPU: Intel Core i7-10875H (8C16T, 2.30GHz, 16MB cache) + 32GB mem
    OS: Windows 10 Pro 64bit 日本語 build 19042.1237
    GPU: NVIDIA Quadro T1000 Max-Q (4GB GDRR5)
    NVIDIA Driver 471.41, CUDA 11.4, CUDNN 8.2.4
    Python 3.9.6, TensorFlow 2.6.0
    
  5. (3) i7-10
  6. 仕様
    Intel Core i7-10700 CPU (8C16T, 2.90GHz, 16MB cache) + 32GB mem
    OS: Ubuntu 18.04.5
    Python 3.8.0, TensorFlow 2.6.0
    
  7. (4) Xeon E5
  8. 仕様
    Intel Xeon E5-2667 v4 (8C16T, 3.20GHz, 25MB cache) + 32GB mem
    OS: Ubuntu 20.04.3
    Python 3.8.10, TensorFlow 2.6.0
    
  9. (5) i5-4
  10. 仕様
    CPU: Intel Core i5-4570 (4C, 3.20GHz, 6MB cache) + 16GB mem
    OS: Ubuntu 18.04.6
    Python 3.8.0, TensorFlow 2.6.0
    
  11. (6) i9-10 + RTX A5000
  12. 仕様
    CPU: Intel Core i9-10940X (14C/28T, 3.30GHz, 19.25MB cache) + 16GB mem
    NVIDIA RTX A5000 (24GB)
    OS: Ubuntu 20.04.3
    NVIDIA Driver 470.74, CUDA 11.3.109, CUDNN 8.8.0
    Python 3.8.10, TensorFlow 2.6.0
    

各学習に各計算機での計算時間を次の表にまとめる。

[ex5-1] MNIST[ex5-5] CIFAR-10[ex5-7] DCGAN[ex2-1] 回帰
(1) i9-9 + RTX2080 17.6 410.41361.9 6.2
(2) mobile i7-10 + T1000 53.4 487.62261.614.7
(1') i9-9 131.4 635.81881.9 3.4
(6) i9-10 + RTX A5000 35.2 648.42957.820.1
(3) i7-10 193.0 775.91788.5 3.2
(6') i9-10 122.9 802.43491.310.4
(4) Xeon E5 205.2 906.83044.7 7.8
(2') mobile i7-10 366.81875.53872.1 4.1
(5) i5-4 478.61810.04286.3 5.2

CPUでの計算では、概ね新しい世代のもの高性能なものが速い(1'>3>4>2'>5)、ことが見て取れる。 [ex5-1] [ex5-5] の典型的な畳み込みニューラルネットワークの学習では、 GPUの性能が引き出され RTX2080, mobile T1000 ともに高性能プロセッサを凌駕している。 [ex5-1] と比べて [ex5-5] の性能向上が控えめなのは、 バッチごとにデータ拡張の処理が入り、それがGPUの効率的処理を妨げているのかも知れない。 [ex5-7] では mobile T1000 GPU が i9-9, i7-10 CPU よりも遅くなっている。 DCGANではバッチごとに学習対象の入れ替え(識別器⇔生成器)られ、 CPU の介入が必要かつ GPU の一様連続処理が妨げられることで、 GPU が活用しきれない状況になっていると思われる。 なお、参考までに、単純な2変数のロジスティック回帰 [ex2-1] では、 GPU を使用するとむしろ遅くなる。 計算が逐次的な場合にはGPUの並列性が活かされず、CPUが優位である。 (6) RTX A5000 は期待ほど性能が出ていない。 DeepLearningのライブラリが整数演算器向けに最適化されており、 (1) RTX 2080 Ti や (2) T1000 で性能が出やすいためと思われる。 (6') i9-10 が (1') i9-9 を下回っているのは、搭載メモリの差(16GB v.s. 64GB)と思われる。 また (6),(6') は2年遅れで実験しており、 無理なバージョンダウンによる不整合のために遅くなっている可能性もある。



以下は他のやり方など調査中、まとめ中のメモ



環境構築 docker 編 memo

docker インストールから動作確認
sudo apt update
sudo apt install apt-transport-https
sudo apt install ca-certificates
sudo apt install curl
sudo apt install gnupg-agent
sudo apt install software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
#ここ↓arch と release を確認すること
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl show --property=Environment docker
sudo usermod -aG docker ${USER}
sudo docker run --rm hello-world
docker container 準備
docker images
----------------------------------------------------------------
# ubuntu:18.04, python3.6, numpy==1.16.4, tensorflow==1.14
sudo docker run \
	--name con-tf1 \
	-p 10022:22 \
	-v /var/docker:/var/docker \
	-it ubuntu:18.04 /bin/bash
adduser --uid 1000 --home /home/t-izumi t-izumi
apt update
apt install net-tools iputils-ping vim ssh xserver-xorg x11-apps pciutils
vi /etc/ssh/sshd_config # allow X11 forwarding
#export DISPLAY=192.168.11.80:0.0
service ssh restart
systemctl enable ssh
apt install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt install python3.6 python3.6-dev python3-pip
python3 -m pip install numpy==1.16.4
python3 -m pip install tensorflow==1.14
python3 -m pip install matplotlib
python3 -m pip install pandas
python3 -m pip install psutil
----------------------------------------------------------------
docker container 準備
docker images
----------------------------------------------------------------
# ubuntu:20.04, python3.8, tensorflow==2.6
sudo docker run \
	--name con-tf2 \
	-p 10022:22 \
	-v /var/docker:/var/docker \
	-it ubuntu:20.04 /bin/bash
adduser --uid 1000 --home /home/t-izumi t-izumi
apt update
apt install net-tools iputils-ping vim ssh xserver-xorg x11-apps pciutils
vi /etc/ssh/sshd_config # allow X11 forwarding
#export DISPLAY=192.168.11.80:0.0
service ssh restart
apt install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt install python3.8 python3.8-dev python3-pip
python3 -m pip install numpy
python3 -m pip install tensorflow==2.6
python3 -m pip install matplotlib
python3 -m pip install pandas
python3 -m pip install psutil
----------------------------------------------------------------
docker 基本動作 memo

docker ps -a
cid=ContainerID

#images
docker pull
docker images
docker rmi 

#remove
docker stop $cid
docker rm $cid

#continue session
docker start $cid
docker restart $cid
docker attach $cid
      

環境構築 penv 編 memo

penv というツール python の複数バージョンを管理できるらしい


おまけ Windows10 + GPU + TensorFlow の環境構築

docker + GPU は面倒 : 当初 docker でできるだろうと考えて試行錯誤したのだが、 でききなくはないが面倒、という結論に達した。 Windows10 + WSL2 + Docker で Ubuntu18.04+Python3.6 や Ubuntu20.04+Python3.8 の仮想環境を 切り替えて使うことはできたがGPU (--gpus all) が使えない。 WSL2 で GPU を使うには Windows 10 のバージョンアップが必要で、 それは Insider Preview でいわゆる Win11 相当にしないといけないらしい。

Python のインストール方法に注意 : それなら Windows native で環境を構築するしかないかと試行錯誤したが、 インストールできたようでいざ tensorflow を実行すると cuda ライブラリが読み込めずに GPU なしでの計算になってしまう。 cudart64_110.dll はそこにあるし PATH も通しているのに! いろいろ調べたところ Python を Microsoft Store からインストールしたらダメで Python 公式サイトからダウンロードしてインストールしたら大丈夫とのこと。 そうしてみたら動きました… 言わせてください… 「なんでやねん!」

以下、動作確認できた、インストールのポイント、バージョン、など


参考資料