ディープラーニング以外にも応用が効くPCを求めて

最近ではGPU(Graphics Processing Unit)を使って、初心者でもディープラーニングができる環境を気軽に導入できるようになりました。たとえば以下の情報を参考にすれば、簡単に環境構築ができます。

【決定版】MacでPythonを使って『機械学習』を学ぶための環境構築
https://qiita.com/yoshizaki_kkgk/items/4663148a2b3ca078ddbc

【決定版】WindowsでPythonを使って『機械学習』を学ぶための環境構築
https://qiita.com/yoshizaki_kkgk/items/1057ed4dcc36ed9be7f5

CPUでもディープラーニングを試すことはできますが、GPUとCPUの違いにより、GPUを使ったほうが圧倒的に効率が良いのです。

CPUとGPUの違いを示す参考記事:
説明できますか?CPUとGPUの違い

http://blog.aidemy.net/entry/2017/10/29/005803

CPUとGPUの性能差を示す参考記事:
ディープラーニング向けPC構成をじっくり吟味してみた
https://pc.watch.impress.co.jp/docs/column/pc_koubou/1099331.html

今回は、Intel NUCとAKiTiO Node Pro & NVIDIA GeForce GTX 1080の組み合わせで、ディープラーニング環境を作ってみました。設置スペースを大幅に抑えつつ、ディープラーニング開発環境を構築したい方におすすめの構成です。AKiTiO Node Pro を使えば、GPUを交換するのが簡単で他のPC(Radeonの場合はMac等にも)に簡単につなぎ直すことができるので、GPUの応用範囲が広がります!

ディープラーニング向けのPCにはどんなものがあるのか?

ディープラーニング用にGPUを搭載したPCをネットで探してみると、パソコンショップ等で一般的に取り扱われているのは、いわゆるデスクトップPC(あるいはワークステーション)と呼ばれている大型サイズのものが多いです。ディープラーニングではGPUの性能が最も大きなカギを握っていますので、マザーボードのPCIバスに直接挿して使えるようにするのが最も良いわけですが、結局どのような構成が良いのかは予算や置き場所との相談になります。

深層学習用PCを個人で自作するための部品選定ガイド(Amazon・実店舗)
http://roomba.hatenablog.com/entry/2017/04/11/160635

趣味用に安く深層学習PCを作った
https://qiita.com/bohemian916/items/9f1e053bf73724fe0b1e

上のリンクのようなPCを自作している方々のブログや海外の情報等を見てみると、以下のページが良く読まれているようです。

Which GPU(s) to Get for Deep Learning: My Experience and Advice for Using GPUs in Deep Learning
http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/

これによれば、NVIDIAの1080 Ti、1080、1070などが適しているようです。前回のブログで取り上げたように、アミュレットでは Thunderbolt 3 を使った外付けGPUボックスを取り扱っています。GPUだけを気軽に取り外して他のPCにつなげて別の用途(ゲームや仮想通貨マイニングなど)でも使えたら便利ですよね。では、それを実現するために具体的なハードウェア構成を見ていきましょう!

取り組みイメージ

実際に接続した状態を写真で見てみましょう。

まず左側にOSが入ったIntel NUC(NUC7i5BNH)があります。筐体には Thunderbolt 3 ポートが付いており、Thunderbolt 3 ケーブルで AKiTiO Node Proにつながっています。 AKiTiO Node Pro の中には、NVIDIAのGPU 1080(STRIX-GTX1080-O8G-GAMING)が内蔵されています。

使ったものをおさらい

この構成のメリット

冒頭にも書いたように、ディープラーニングを行う場合に最も重要なのはGPUです。GPUは性能が高いものほど熱を発生するため、体積や寸法が大きくなる傾向があります。そのためデスクトップPCのようなエアフローや電源容量に余裕のあるPCを用意する必要があります。しかし今回のようにGPUを外付けにすることによって、PCの筐体の大きさをかなり小さくすることができます。

さらに、GPUボックスごと取り外して、Thunderbolt 3 ポートを搭載した他のPC(特にラップトップなど)に取り付けて使うことができるため、非常に汎用性と可搬性が高くなります。

そして、GPU本体の取り外しも簡単に行えるため、NVIDIA製とAMD製を付け替えるなどの作業も非常に楽です。

このように、デスクトップPC(ワークステーション)として使う場合には享受できないメリットがあります。

おまけとしては、Intel NUCが2.5インチディスクとM.2の2つのストレージインターフェースを備えているため、片方にLinuxを入れてディープラーニング用に、もう片方にWindowsを入れてゲーム用にと、BIOSの設定だけでOSを切り替えることができます。Thunderbolt 3経由でもファイナルファンタジーやドラゴンクエストを快適にプレーできることは、前回の記事で実験した通りです!

Thunderbolt 3を使うデメリットはあるのか?

残念ながらあります…。GPUをマザーボードのPCIバスに直付けするわけではありませんので、Thunderbolt 3を経由する分のオーバーヘッドが必ず発生します。その結果GPUの性能を100%引き出せないことになります。ここは先程のメリットとトレードオフの関係になります。

Thunderbolt 3 経由でGPUを認識させるまでにやったこと

Thunderbolt 3 デバイスはUbuntu 18.04ではデフォルトで認識できる

今回はOSにUbuntu 18.04 LTSを採用しました。Linuxユーザには馴染みのあるメジャーなOSです。Linuxカーネルも新しいものが入っているため、今回懸念点であったThunderbolt 3の認識も全く問題ありませんでした。

OSをインストールした直後に、「設定」>「デバイス」>「Thunderbolt」の順番で移動すると、AKiTiO Node ProがThunderboltデバイスとして認識されていました。続けて「Authorize」することによって、Direct Accessを有効にし、恒久的に接続状態を維持できるようにします。

プロプライエタリドライバ用リポジトリをaptのソフトウェア一覧に追加する

次に、プロプライエタリドライバ用リポジトリをaptのソフトウェア一覧に追加します。

$ sudo add-apt-repository ppa:graphics-drivers/ppa

nvidia-cuda-toolkitをインストールする

以下のコマンドを実行して、nvidia-cuda-toolkitをインストールします(依存関係で必要なものはインストールされます)

$ sudo apt install nvidia-cuda-*

結果として、主要なソフトウェアは以下のバージョンになりました。
CUDA:9.1(最新版は9.2ですが、Ubuntu 18.04用パッケージはまだ存在していないようです)
nvidia-driver:396.45

OS再起動後、dmesgコマンドで起動ログを確認したところ、高頻度でエラーログが吐き出されていました。

 

調べたところ、NVIDIAのドライバが1080に触れていないようでした。「lspci -v」コマンドで該当部分を見たところ、1080のドライバがnouveau(オープンソースで書かれた、非NVIDIAドライバ)になっていました。

 

grubのブートパラメータを変更する

これを回避するため、grubのブートパラメータを変更します。

$ sudo vim /etc/default/grub
【変更前】GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
【変更後】GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash nouveau.modeset=0″

書き換えただけでは反映されないため、以下のコマンドで反映させます。

$ sudo update-grub

OSを再起動します。

無事1080がPCIデバイスで認識されるようになった!

lspciコマンドで1080が認識されています。

nvidia-smiコマンドでも、ステータスを拾うことができました。

参考リンク:
nvidia-smiコマンドの詳細ついて
https://qiita.com/miyamotok0105/items/1b34e548f96ef7d40370

これでディープラーニングを始めるためのハードウェアの準備は整いました!

TensorFlowのGPU使用パッケージをインストールして、処理が変わるかを確認してみよう

TensorFlowとは、Googleが開発した、深層学習(ディープラーニング)機械学習のライブラリです。
https://techacademy.jp/magazine/17425

ここではTensorFlowの準備についての詳細は省きますが、環境を独立させるためにAnacondaをインストールして環境を構築しました。
https://www.anaconda.com/

Anacondaを使わない場合は、当ブログのこちらの記事もご覧ください。
UbuntuでPython + Jupyter Notebookを使ってディープラーニング勉強用サーバーを構築してみた!
https://www.amulet.co.jp/shop-blog/?p=9208

公式サイトからシェルスクリプトをダウンロードして、実行します。データの保存先を指定し、bashでのパスをユーザーのbashrcに保存して完了します。

conda update conda

でアップデートを行います。

conda create cuda9.1

で「cuda9.1」という名前のPython環境を作成します。

source activate cuda9.1

でターミナルの基本環境が「cuda9.1」に変わります。この状態でパッケージをインストールします。

conda install -c anaconda tensorflow-gpu(anacondaリポジトリから)
conda install jupyter matplotlib scipy h5py scikit-learn keras

主要なバージョンは以下の通りです。
TensorfFlow:1.8
Keras:2.2.0

※TensorFlow,nvidia-driver,cudaは相互にバージョン依存があるため、インストール時は確認が必要です。

参考リンク:
https://www.tensorflow.org/install/install_sources#tested_source_configurations
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html(CUDA Driverの項目を参照)

「cuda9.1」環境上でjupyter-notebookを起動します。

以下のリンクなどを参考に、サンプルスクリプトをネットワークから取得、実行してみます。
https://qiita.com/hoto17296/items/16f57b319a0293bd2688
https://blog.hotolab.net/entry/zbox

GPU使用時に出てきたjupyter-notebookのログ

ちゃんとGPUを使えてます!

2018-07-24 16:25:17.652958: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-07-24 16:25:18.209497: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-07-24 16:25:18.210916: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 0 with properties:
name: GeForce GTX 1080 major: 6 minor: 1 memoryClockRate(GHz): 1.8095
pciBusID: 0000:06:00.0
totalMemory: 7.93GiB freeMemory: 7.81GiB
2018-07-24 16:25:18.210942: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2018-07-24 16:25:19.287910: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-07-24 16:25:19.287981: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929]      0
2018-07-24 16:25:19.288012: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0:   N
2018-07-24 16:25:19.289006: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7545 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080, pci bus id: 0000:06:00.0, compute capability: 6.1)

実際の処理時間を比較してみました。

GPU:最初のみ約9秒、他約4秒!!
CPU:平均132秒…(途中でリソースモニターを起動しています)

GPUを使った場合の結果

CPUを使った場合の結果

GPUを使うといかに効率が良いかがわかりますね…。ちなみにCPUで回した場合、全てのコアが使用率100%で張り付いてしまい、ファンがフルパワーで回りっぱなしでした。😅

手軽にディープラーニング、ゲーミング、マイニングにマルチに使える環境としていかがでしょうか?

これまでIntel NUCとAKiTiO Node Pro & NVIDIA 1080の組み合わせで、ディープラーニングができることを見てきました。

来週8/6〜8/17までの期間、弊社店頭で本記事で構築した環境を展示します!Thunderbolt 3を使って省スペースかつ多用な目的でGPUを使いたい方はぜひご覧になって下さい。

ちなみに、Thunderbolt 3搭載のIntel NUC、AKiTiO Node Pro & ハイエンドGPU、はいずれも弊社で取り扱っています。

POWERTEP VESA T3(NUC7i5BNH
https://www.amulet.co.jp/products/custompc/ps-vesa_t3.html

AKiTiO Node Pro グラフィックボードセット(NVIDIA・AMD両対応)
https://www.amulet.co.jp/products/AKiTiO/AKiTiONodePro_GPUset.html

(2018/08/16 追記)本ブログで作ったディープラーニング環境を元に「AMULET ディープラーニングスターターキット」として販売開始しました!
https://www.amulet.co.jp/products/DLSK/DeepLearning_StarterKit.html