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

以前投稿した記事「[Intel NUC + SSD 2TB + DRAM 32GBでハイスペックLinuxデスクトップを作ってみた](https://qiita.com/y-vectorfield/items/2fcbc669a43fe0d0cb15)」で、自作したハイスペックLinuxデスクトップを紹介した時に[今後の課題](https://qiita.com/y-vectorfield/items/2fcbc669a43fe0d0cb15#%E4%BB%8A%E5%BE%8C%E3%81%AE%E6%94%B9%E8%89%AF%E4%BA%88%E5%AE%9A%E8%A6%81%E4%BA%88%E7%AE%97%E3%81%A8%E3%81%AE%E7%9B%B8%E8%AB%87)として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割の性能に低下([参考](https://www.pc-koubou.jp/magazine/13464))
  2. セットアップが煩雑

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

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

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

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

<img width="724" alt="RTX2080SP.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/b8680eec-ee00-2f6d-29be-40049e904a8d.png">
(2020/2/18時点でのNTT-X Store販売ページ)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/d312002f-4dc7-99a8-f4a6-78bcb4534672.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シリーズが販売される前のバージョンの様なのでアップデートすることにしました。

* 参考  
[インテル® NUC の BIOS アップデートおよびリカバリー手順](https://www.intel.co.jp/content/www/jp/ja/support/articles/000005636/intel-nuc.html)  
[BIOS アップデート](https://downloadcenter.intel.com/ja/download/29437/BIOS-JYGLKCPX-86A-?product=129982)

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

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

![secure boot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/10b616c3-37df-f564-a7c4-7d6440845140.jpeg)

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

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

![third party](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/7beb4208-3f0d-cc36-2fe5-2bff29e4f697.jpeg)

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

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

```bash
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を控えておきます。

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

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

```bash
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

```

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

```bash

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

```

<details><summary>実行結果</summary><div>

```bash

● 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

```

</div></details>

* 参考  
https://www.mankier.com/1/boltctl  
http://manpages.ubuntu.com/manpages/cosmic/man1/boltctl.1.html

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

```
lsmod | grep nouveau
```

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

```bash
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構成)では上手く実行出来ませんでした。

```bash
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
ubuntu-drivers devices
```

<details><summary>ubuntu-drivers devicesを実行すると以下の様な表示が出ます。(実行環境によって表示は異なります)</summary><div>

```bash
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
```

</div></details>

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

```bash
sudo apt install nvidia-driver-xxx
sudo reboot
```

### 2022/12/17追記　ドライバーのインストール方法(最新版)
以下の記事を参照して下さい。

https://qiita.com/y-vectorfield/items/72bfb66d8ec85847fe2f

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


```bash

+-----------------------------------------------------------------------------+
| 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                                                 |
+-----------------------------------------------------------------------------+

```

</div></details>

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

```bash
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がディスプレイに表示されます。（起動前に接続を推奨)

<details><summary>egpu-switcherのセットアップ行程例</summary><div>

```bash

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
```

</div></summary>

<details><summary>再起動後の`nvidia-smi`の表示例</summary><div>

```bash

$ 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 |
+-----------------------------------------------------------------------------+


```

</div></details>

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

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

この方法でインストールを実施するとCUDA 9.1のToolkitがインストールされてしまうことが分かりました。ここは最新のCUDA Toolkitをインストールしたいのでここで漸く[NVIDIA公式サイト](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=deblocal)で掲載されている方法でインストールを実施します。

```bash

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を登録します。

```bash

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`でビルド、実行します。

```c: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;
}
```

<details><summary>以下の様に表示されればセットアップ成功です。</summary><div>

```bash:ビルドと実行
$ 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
```

```bash:最新アーキテクチャ対応版(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

</div></details>

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

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

```bash

$ 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のインストール方法を追記します。

### インストーラーのダウンロードページにログイン
[ダウンロードページ](https://developer.nvidia.com/rdp/form/cudnn-download-survey)にアクセスします。ダウンロードには会員登録が必要です。初めてダウンロードする時には`Join now`をクリックし、会員登録を実施します。

<img width="1438" alt="cudnn login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/5cfda563-d7fc-311c-2d84-9983d5e45123.png">

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

<img width="1439" alt="cudnn download.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/6a902791-63e6-878e-482e-54bdb2b464a1.png">

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

<img width="1439" alt="download sources.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/efbe8391-a41b-e95c-c2b9-5e74af5218aa.png">

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

```bash
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のインストールは完了です。

* 参考: [Ubuntu 18.04にCUDA Toolkit 9.0 とCuDNNをインストールする](https://codelabo.com/posts/20200229074818)
* 参考: [その他のcuDNNのインストール方法](https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html)

## 2020/11/22追記: aptを利用する方法
aptを利用してインストールすることも出来ます。

```bash
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
[俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2016/02/linuxunix%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%81%8B%E3%82%89%E7%89%B9%E5%AE%9A%E9%83%A8%E5%88%86%E5%8F%B3%E3%81%8B%E3%82%89%E3%83%BB%E5%B7%A6%E3%81%8B%E3%82%89%E4%BD%95%E5%80%8B%E3%80%81%E3%80%87/#i-6)