LoginSignup
32
32

More than 1 year has passed since last update.

eGPUでハイスペックLinuxデスクトップをDeep Learning Workstation化計画(eGPUセットアップ編)

Last updated at Posted at 2020-03-15

以前投稿した記事「Intel NUC + SSD 2TB + DRAM 32GBでハイスペックLinuxデスクトップを作ってみた」で、自作したハイスペックLinuxデスクトップを紹介した時に今後の課題としてThunderbolt 3に対応していることを生かしてeGPUを用いたGPUマシーン化に挑戦したいと書きました。様々な幸運から予算が編成出来たため、必要なパーツが揃いました。本記事ではeGPUを用いたハイスペックLinuxデスクトップのDeep Learning Workstation化計画の第一弾としてeGPUのセットアップを実施したいと思います。

そもそもeGPUとは?

External GPUつまり外部GPUという意味です。本来はGPUがCPU内蔵GPUのみのラップトップ向けに開発された技術で、グラフィック性能が不足しているマシーンに高速通信規格のインターフェースを用いてより性能の高いGPUを接続してグラフィック性能を向上させることが目的です。最近ではApple StoreがMacBook向けにeGPUのユニット(AMDのRadeonを内蔵)を販売しており、対応しているMacBookに接続するとグラフィック性能を向上させることが出来ます。今回はデスクトップ、しかもLinuxのマシーンでeGPUを接続し、Deep Learning用ワークステーション化したいと思います。接続に使用するインターフェースはThunderbolt 3です。

eGPUのメリット・デメリット

eGPUのメリット・デメリットを記載します。

  • メリット

    1. 必要な時のみGPUを起動出来る(常にGPUが必要では無い用途に最適)
    2. PCが小型化でき、スペースを取らない(狭い関東のマンション住まいには有り難い)
    3. 低消費電力化が実現出来る(メリット1より)
    4. 低予算で自作可能(今回のPCのスペックでPC本体と合わせて22万は結構低予算の筈)
  • デメリット

    1. Thunderbolt 3はPCI Express x16より通信速度が劣る為、GPUとの通信速度は低下する
      → PCI Express x16 接続の約7~8割の性能に低下(参考)
    2. セットアップが煩雑

今回使用するeGPU

今回使用するeGPUは、本来ビデオカードとして販売されているGPUをビデオカードをeGPU化するキットに組み込んだ物です。eGPUの費用は以下の通りです。

パーツの種類 型番 メーカー 価格 備考
ビデオカード NVIDIA Geforce RTX 2080 SUPER
GALAKURO GAMING
玄人志向 ¥74,800. NTT-X Storeで購入
eGPU化キット Razer Core X
RC21-01310100-R3J1
Razer ¥36,080. パソコン工房の通販で購入

合計: ¥110,880.
PC本体との合計: ¥218,065. (PayPay考慮時: ¥173,604.)

使用するGPU: NVIDA Geforce RTX 2080 SUPER

Deep Learning用ワークステーションとして使用することが構築の最重要目標であるため、GPUはNVIDIA社のGeforce RTX 2080 SUPER(玄人志向製)を購入しました。もともと2ランク下の2070 SUPERを購入する予定でしたがNTT-X Storeでセールをしていた為、当該GPUを衝動買いしてしまいました。

RTX2080SP.png (2020/2/18時点でのNTT-X Store販売ページ)

NVIDIAが一般用GPUとして販売しているGeforceシリーズでは上から3番目(TITAN RTX, RTX 2080 Tiの次)のランクのGPUです。正直Thunderbolt 3接続でフル性能が出ない環境での80シリーズの利用はコストパフォーマンス的に最悪かもしれません。。。

使用するeGPU化キット: Razer Core X

ビデオカードをeGPU化するキットです。筆者がPC自作に使用したベアボーンIntel NUCに接続するeGPUの構築にどのメーカーのキットを購入しようかと迷っていた時に見つけた当該サイトで紹介されていました。値段、性能、発売元の信頼性という3つの点でバランスが取れた製品なのではないでしょうか?(あくまで筆者の個人的見解)但し、国内の通販サイトでは軒並み完売しており、1ランク上のUSBポートやLANポートを搭載して2万円高いモデルのみ販売しているサイトが増えています。筆者はパソコン工房の通販でやっと見つけて購入しました。中華製の格安キットも有りますが、失敗して2080 SUPERを破壊してしまうと洒落にならないため、少々高額でもグラフィック系メーカーが販売している製品を購入しました。

image.png

送られて来た現物を見て予想以上の大きさに正直唖然としました。PC本体よりeGPUの方がはるかに大きいという結末を迎えました。:scream:

eGPUのセットアップ

実際に実施したセットアップ手順を以下に記載します。あっさりと記載していますが、この構築方法が分かるまでは苦闘の歴史:scream_cat:でした。(ドライバーインストール行程など)

eGPUの組み立て

Geforce RTX 2080 SUPER(以下RTX2080SP)をRazer Core X(以下Core X)にドッキングし、eGPU化します。取付はCore Xの蓋を開けて内部のPCIスロットににRTX2080SPを取り付けて電源コード(8pin, 6pin)を繋ぐだけなので難しくありませんが、何分本体サイズが大きい為、作業性が劣悪だったり、スロットに入っているか確認するのが大変だったりはします。組み立てが完了したら、この時点ではPC本体に接続しません。以降CUDA Toolkitをインストールし、NVIDIAドライバーでeGPUを動作させる所までのセットアップ方法を記載します。但し、資料があまりにも少ない希少な構成でのセットアップは一筋縄では行かず、何度もリカバリーやドライバーの再インストールを実施し、Trial & Errorで分かった方法です。:dancer::dancer_tone1::dancer_tone2::dancer_tone3::dancer_tone4::dancer_tone5:

:innocent: 2020年3月現在のeGPUをセットアップする方法です。
:warning: あくまでLinux専用マシンとしてセットアップすることを想定しています。

BIOSアップデート

セットアップの為に色々調査していて気が付いたのですが、今回PC自作に用いたIntel NUC 8i7BEHのBIOSのバージョンが古く(0064)、最新版は0077でした。0064はどうやらRTXシリーズが販売される前のバージョンの様なのでアップデートすることにしました。

セキュアブートの無効化

今回構築に使用したIntel NUCはUEFI対応モデルであり、セキュアブートが有効になっている場合が有ります。その場合は、まずセキュアブートを無効化してからセットアップを行って下さい。セキュアブートを有効化したままでのセットアップは鍵登録を実施する必要が有ります。現段階ではeGPUが正常に動作する保証が無い為、無効化していますが、今後セキュアブートやUEFIについて理解が深まったら、セキュアブート有効化時のセットアップも試みたいと思います。

:warning: 上記の操作を行うとWindowsとのデュアルブートは実現できなくなります。:scream:

secure boot

  • Intel NUCのBIOSへの入り方は起動時にF2キーを連打します。
  • BIOS画面でBoot/Secure Boot/Secure Bootのチェックを外し無効にします。

UEFIがサードバーをロードすることを許可

RTX2080SPを動作させる為にNVIDIAドライバーというNVIDIA製ドライバーをインストールします。BIOSでUEFIがサードパーティードライバーをロードすることを許可する設定をしておかないとUEFIでNVIDIAドライバーがロードされずRTX2080SPが使えません。

third party

  • BIOS画面でSeurity/Security Features/Allow UEFI Third Party Driver loadedにチェックを入れ有効にします。

OpenSSH Serverのセットアップ(PCが2台以上有る場合)

2台以上PCが有る場合、セットアップ対象のPCにSSHでログイン出来ると便利です。OpenSSH Serverをインストールして、SSHでログイン出来る様にしておきます。(OSが最新版では無い可能性が有るのでapt upgradeも合わせて実施しておきます)

sudo apt install -y openssh-server

鍵ファイルを用いてパスワード無しログインを行う方法、パスワードログインによる方法など、好み・環境により選択する環境は異なってくると思います。各々の設定方法はネット上の記事を参考にして下さい。

eGPUの接続とThnderbolt 3の認証

eGPUをPC本体に接続します。PCを起動すると、ファンが爆音で回転します。これは故障では無く、Thuderbolt 3機器の認証が完了していない為、ファン制御などの主要機能が働いていないために発生する動作です。GUIが有効な場合(Desktop版の場合)パスワード認証を求める画面が表示されるので、パスワードを入力すれば爆音は止まります。この方法はCLIを利用している場合には使えないので、CLI環境でも認証が出来る方法を記載します。

Thunerbolt 3機器のuuidの確認

boltctlコマンドでThunderbolt 3機器(本記事ではCoreX)のuuidを調べます。以下の様な表示が出ます。uuidを控えておきます。

$ boltctl 
 ● Razer Core X
   ├─ type:          peripheral
   ├─ name:          Core X
   ├─ vendor:        Razer
   ├─ uuid:          <固有のuuid>
   ├─ status:        connected
   │  ├─ domain:     domain0
   │  └─ authflags:  none
   ├─ connected:     <接続した日時>
   └─ stored:        no

認証を実行

以下のコマンドで認証を実行します。パスワードの入力が求めれますので、ユーザーパスワードを入力すれば完了です。

sudo boltctl authorize <控えておいたuuid>

認証が完了すると爆音が止まります。

認証後にboltctlを実行すると以下の様に表示されます。


$ boltctl 
 ● Razer Core X
   ├─ type:          peripheral
   ├─ name:          Core X
   ├─ vendor:        Razer
   ├─ uuid:          <固有のuuid>
   ├─ status:        authorized
   │  ├─ domain:     domain0
   │  └─ authflags:  none
   ├─ authorized:    <認証が完了した日時>
   ├─ connected:     <接続した日時>
   └─ stored:        no

このままでは認証情報が保存されず、シャットダウンすると認証情報が消えてしまいます(爆音の再来)。故に自動的に認証する様に設定を行います。


sudo boltctl enroll --policy auto <控えておいたuuid>

実行結果

● Razer Core X                                                                                                                                                                                                    
   ├─ type:          peripheral
   ├─ name:          Core X
   ├─ vendor:        Razer
   ├─ uuid:          <固有のuuid>
   ├─ dbus path:     /org/freedesktop/bolt/devices/<固有のuuid>
   ├─ status:        authorized
   │  ├─ domain:     domain0
   │  ├─ parent:     c7010000-0090-8d18-a3c2-b11ccc631023
   │  ├─ syspath:    /sys/devices/pci0000:00/0000:00:1c.4/0000:02:00.0/0000:03:00.0/0000:04:00.0/domain0/0-0/0-1
   │  └─ authflags:  none
   ├─ authorized:    <認証を実施した日時>
   ├─ connected:     <接続した日時>
   └─ stored:        <認証情報を保存した日時>
      ├─ policy:     auto
      └─ key:        no

Nouveauドライバーの停止

NVIDIAのビデオカードをLinuxに接続するとNVIDIAドライバーをリバースエンジニアリングして実装されているOSS版ドライバーNouveauドライバーが有効になります。確認方法は以下のコマンドを実行します。

lsmod | grep nouveau

有効になっている場合、nouveau項目が表示されます。無効にする為、以下のコマンドを実行します。

sudo sh -c "echo 'blacklist nouveau' > /etc/modprobe.d/blacklist-nouveau.conf"
sudo sh -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u
sudo reboot

NVIDAドライバーのセットアップ

Ubuntuのaptにリポジトリを追加し、ドライバーをインストールします。NVIDA公式のスクリプトからインストールする方法は本記事で試した構成(eGPU構成)では上手く実行出来ませんでした。

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
ubuntu-drivers devices
ubuntu-drivers devicesを実行すると以下の様な表示が出ます。(実行環境によって表示は異なります)
vendor   : NVIDIA Corporation
driver   : nvidia-driver-440 - third-party free recommended
driver   : nvidia-driver-435 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

インストール時は、recommendedが付いているバージョンをインストールします。

sudo apt install nvidia-driver-xxx
sudo reboot

2022/12/17追記 ドライバーのインストール方法(最新版)

以下の記事を参照して下さい。

再起動後、nvidia-smiコマンドでGPUの状態を確認します。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64       Driver Version: 440.64       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:07:00.0 Off |                  N/A |
|  0%   38C    P8    16W / 250W |      0MiB /  7982MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

eGPU Switcherのセットアップ(eGPU上で動作するX-Window System)

eGPUをセットアップすると、X-Window Systemが動作不能(つまりGUIが起動しない)に陥り、散々手を尽くしましたが全く改善しませんでした。万事休す。今までの投資は全て水泡に帰する:scream:のかと思っていたところ、eGPUの普及を推進するコミュニティーなるものが発足しており、そのコミュニティーのページで解決の糸口が掲載されていました。海外はこういうコミュニティーの発足が本当に早いですね。英語力を磨いて積極的に参加出来る様になりたいと今回ばかりは本気で思いました。また、eGPU Switcherをセットアップすることでマザーボード上の映像出力端子も使える様になるので、必要に応じてeGPUをON/OFF可能となります。

sudo add-apt-repository ppa:hertg/egpu-switcher
sudo apt update
sudo apt install -y egpu-switcher
sudo egpu-switcher setup
sudo reboot

後は表示されるオプション(GPUの選択等)を行い、再起動すればeGPU上でX-Window Systemが起動します。再起動後、ビデオカード側の出力ポートにケーブルを接続すればGUIがディスプレイに表示されます。(起動前に接続を推奨)

egpu-switcherのセットアップ行程例

Found 2 possible GPUs...

  1: NVIDIA Corporation Device 1e81 (rev a1) (7:0:0)
  2: Intel Corporation Device 3ea5 (rev 01) (0:2:0)

Would you like to define a specific INTERNAL GPU? [y/N]: y
Choose your preferred INTERNAL GPU [1-2]: 2
Choose your preferred EXTERNAL GPU [1-2]: 1

[info] Saved new configuration to /etc/egpu-switcher/egpu-switcher.conf
[info] Automatically detecting if egpu is connected... 
[info] EGPU is connected.
[info] Create symlink /etc/X11/xorg.conf -> /etc/X11/xorg.conf.egpu
Created symlink /etc/systemd/system/multi-user.target.wants/egpu.service → /etc/systemd/system/egpu.service.
[success] Done... Setup finished
再起動後の`nvidia-smi`の表示例

$ nvidia-smi 
Sun Mar 15 17:37:20 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64       Driver Version: 440.64       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:07:00.0  On |                  N/A |
|  0%   30C    P8    17W / 250W |    240MiB /  7973MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1324      G   /usr/lib/xorg/Xorg                            18MiB |
|    0      1446      G   /usr/bin/gnome-shell                          49MiB |
|    0      1627      G   /usr/lib/xorg/Xorg                            96MiB |
|    0      1772      G   /usr/bin/gnome-shell                          72MiB |
+-----------------------------------------------------------------------------+


CUDA Toolkitのインストール

以下のコマンドでインストール出来ます。

sudo apt install -y nvidia-cuda-*
sudo reboot

この方法でインストールを実施するとCUDA 9.1のToolkitがインストールされてしまうことが分かりました。ここは最新のCUDA Toolkitをインストールしたいのでここで漸くNVIDIA公式サイトで掲載されている方法でインストールを実施します。


wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
sudo apt update
sudo apt -y install cuda

インストール後、.bashrcに以下のPATHを登録します。


export cuda_version=$(/usr/local/cuda/bin/nvcc -V | grep "Cuda compilation" | awk '{print $5}' | awk '{sub(",.*","");print $1;}')
export PATH=/usr/local/cuda-${cuda_version}/bin:$PATH
export CPATH=/usr/local/cuda-${cuda_version}/include:$CPATH
export LIBRARY_PATH=/usr/local/cuda-${cuda_version}/lib64:$LIBRARY_PATH
  • 2020/3/16追記: CUDAのバージョンが変わってもPATHが通る様に変更

CUDAの動作確認

再起動後、以下のテストソースをnvccでビルド、実行します。

hello.cu
#include <stdio.h>

__global__ void helloFromGPU()
{
    printf("Hello World from GPU\n");
}

int main(void)
{
    printf("Hello World from CPU\n");

    helloFromGPU <<<1, 10>>>();
    cudaDeviceReset();
    return 0;
}
以下の様に表示されればセットアップ成功です。
ビルドと実行
$ nvcc hello.cu
$ ./a.out 
Hello World from CPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
最新アーキテクチャ対応版(2020/3現在)

$ nvcc -arc sm_75 hello.cu
$ ./a.out 
Hello World from CPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU
Hello World from GPU

参考: https://developer.nvidia.com/cuda-gpus

追記: lspciによる確認

セットアップ完了後、lspciコマンドで状態を確認してみます。この時GPUの名前が正しく反映されていない場合が有ります。その場合は、update-pciidsコマンドを実行すると名前が正しく反映されます。

参考: https://www.nemotos.net/?p=3176


$ lspci | grep -i nvidia                                                                                                                   
07:00.0 VGA compatible controller: NVIDIA Corporation Device 1e81 (rev a1) 
07:00.1 Audio device: NVIDIA Corporation Device 10f8 (rev a1) 
07:00.2 USB controller: NVIDIA Corporation Device 1ad8 (rev a1) 
07:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device 1ad9 (rev a1) 
$ sudo update-pciids
Downloaded daily snapshot dated 2020-03-07 03:15:01
$ lspci | grep -i nvidia
07:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080 SUPER] (rev a1) 
07:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1) 
07:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1) 
07:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1)

2020/4/12追記 cuDNNのインストール

Deep Neural Networkを高速に演算する為のライブラリcuDNNのインストール方法を追記します。

インストーラーのダウンロードページにログイン

ダウンロードページにアクセスします。ダウンロードには会員登録が必要です。初めてダウンロードする時にはJoin nowをクリックし、会員登録を実施します。

cudnn login.png

会員登録完了後Loginをクリックし、ダウンロードページにログインします。I Agree To the Terms of the cuDNN Software License Agreementにチェックを入れます。ダウンロード可能なcuDNNの一覧が表示されるので、自分のOSやインストールしたCUDAのバージョンに合ったバージョンのcuDNNをダウンロードします。

cudnn download.png

cuDNN Library for Linuxを例に説明

以降cuDNN v7.6.5 (November 18th, 2019), for CUDA 10.2を例に説明します。cuDNN Library for Linuxのリンクをクリックするとtarファイルのダウンロードが開始します。

download sources.png

ソースが格納されてディレクトリに移動し、tarファイルを解凍する。

tar xvf cudnn-10.2-linux-x64-v7.6.5.32.tgz

cudaというディレクトリが作られ、その中にファイルが展開される。

cuda/
├── NVIDIA_SLA_cuDNN_Support.txt
├── include
│   └── cudnn.h
└── lib64
    ├── libcudnn.so -> libcudnn.so.7
    ├── libcudnn.so.7 -> libcudnn.so.7.6.5
    ├── libcudnn.so.7.6.5
    └── libcudnn_static.a

ソースファイルの格納

/usr/local/cuda-<CUDA_VERSION>ディレクトリ内のincludeディレクトリにcudnn.hを格納し、lib64ディレクトリにcuda/lib64内のソースファイルを格納します。以上でcuDNNのインストールは完了です。

2020/11/22追記: aptを利用する方法

aptを利用してインストールすることも出来ます。

export OS=ubuntu1804
export cudnn_version=8.0.5.39
export cuda_version=cuda10.2

wget https://developer.download.nvidia.com/compute/cuda/repos/${OS}/x86_64/cuda-${OS}.pin 
sudo mv cuda-${OS}.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/${OS}/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/${OS}/x86_64/ /"
sudo apt update

sudo apt install -y libcudnn8=${cudnn_version}-1+${cuda_version}
sudo apt install -y libcudnn8-dev=${cudnn_version}-1+${cuda_version}

まとめ

Razer Core XとNVIDIA Geforce RTX 2080 SUPERを用いてeGPUを構築し、Linuxマシーンへの接続、各種セットアップを実施しました。今回はOSSの強さ・弱さ双方を身をもって体験した構築作業となりました。今後、Jupyter LabサーバーをDockerで構築したり、K8Sの環境構築などを行い、このWorkstationをフル活用して行きたいと思います。

Reference

俺的備忘録 〜なんかいろいろ〜

32
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
32