NUC9VXQNXにRTX2060を入れて色々設定する

# はじめに
[インテル® NUC 9 Pro キット - NUC9VXQNX](https://www.intel.co.jp/content/www/jp/ja/products/boards-kits/nuc/kits/nuc9vxqnx.html)(以下、NUC)に[DUAL-RTX2060-O6G-MINI](https://www.asus.com/jp/Graphics-Cards/DUAL-RTX2060-O6G-MINI/)(以下、GPU)を入れて、Kubuntu 20.04をインストールして動かそうとしたときのトラブル対処の色々。

# インストール、初期設定あれこれ
## ベースボードのM.2スロットはNVMeだけしか認識しない
筐体には合計三個のM.2スロットがある。二つが、Compute Elementの中で、もう一つがベースボードのCompute Element下のヒートシンクの下にある。
このなかで、後者はNVMeしか認識しないので、注意。SATAのSSDをつけていたら、ディスクを認識しなかったため混乱した。Compute Element内につけたところ、無事認識した。

## 起動時にいつも現れる表示
起動時に

```
tpm tpm0: tpm_try_transmit: send(): error -5
tpm tpm0: [Firmware Bug]: TPM interrupt not working, polling instead 
```
のメッセージが現れる。
何となくsecure boot関連のメッセージのようだけれども、結局これが表示されても特に問題が無いことが、色々な試行錯誤の中で分かった。なので、基本放置している。

## DVDからインストールするときに`Start Kubuntu (safe graphics)`を選択

```
Start Kubuntu
Start Kubuntu (safe graphics)
OEM install (for manufactures)
Boot from next volume
UEFI FIrmware Settings
```
から選択することになる。この時、GPUを挿した状態で起動するときは、二つ目の`Start Kubuntu (safe graphics)`を選択する。一つ目の選択肢だと、進行しない。また、この時画面出力はGPU側から行う事。私のケースではHDMIを使った。

実験的にGPUを取り除いた状態でインストールした時は、一つ目の選択肢でも進行した。

### 2021/08/16に表れた症状とその対策
2,3間前から、OSの挙動が妙になり、古いイメージからでないと、起動しなくなり、遂にインストールされている任意のイメージから起動が出来なくなった。
GPU(RTX2060)が原因かと思い、外した状態でKubuntu 20.04のisoの入ったDVDとUSBフラッシュメモリからブートを試みたが、うまく起動しない。ハードが壊れている？

[https://www.intel.co.jp/content/www/jp/ja/support/articles/000059452/intel-nuc.html](https://www.intel.co.jp/content/www/jp/ja/support/articles/000059452/intel-nuc.html)に不穏な情報が書いてあるが、該当の情報がどこで見れるのかわからないので、手元でできる作業をまずやってみることに。
BIOSの設定を[https://www.intel.co.jp/content/www/jp/ja/support/articles/000005845/intel-nuc.html](https://www.intel.co.jp/content/www/jp/ja/support/articles/000005845/intel-nuc.html)を参考に、BIOSを工場出荷状態にリセットしたら、とりあえずisoから作ったLIVEメディアは立ち上がった。

## Secure bootをdisableに

インストール自体は、secure bootがenableの状態でもできる。そこからインストールしたOSで起動しようとすると、進まなくなる。secure bootをdisableにしたことで起動するようになった。

実験的にGPUを取り除いた状態でインストールしたOSは、secure bootがenableのままでも起動した。

## 4Kディスプレイへの対応あれこれ

インストールは2KディスプレイにHDMIをGPU経由でつないで行った。この過程では上記の問題はあったものの、画面に表示されなかったり、信号がGPUから送られてこない という症状はなかった。

これを、4KディスプレイにGPUからHDMIでつないだところ、挙動がおかしくなり、うまく起動しなくなった。具体的には、画面に何も表示されず信号が届かないためにディスプレイがスリープモードに入っては、再度信号が来て起動するも、画面には何も表示されないという症状が現れた。この問題を解決するために以降の取り組みをした。

### DP-HDMI変換ケーブルを通すと2K解像度で表示される

変換ケーブルを使って、DP(GPU)-HDMI(変換ケーブル)-HDMI(ディスプレイ)と繋ぐことで、ディスプレイに表示がされ、無事起動したことが確認できた。(失敗しているケースでは、そもそも画面での表示が確認できないため、起動が成功しているか否かすらわからない)ただし、解像度のmaxが2Kになっていた。これは変換ケーブルの仕様によっている気がする。
この事実から、「起動時にいきなり4KにHDMIで出力をしようとするとコケるのでは」という仮説を立てた。この仮説は十分検証しきれていない。

### ドライバーをインストール時に入ったものからNVIDIA製のものに変更

コマンド`ubuntu-driver-decives`での表示を見ると、どうもnvidia-driver-450の個所に"recommended"の表示があったため、`sudo apt install nvidia-driver-450`でインストールした。コマンド`nvidia-smi`でドライバーが設定されている事が確認できる。

この状態(DP-HDMI変換ケーブルでの2K表示)で、HDMIケーブルを、直接GPU側に指すと4Kの解像度で表示できた。これでめでたしめでたし と思ったが、これは誤りだった。再起動をすると、相変わらず画面に何も表示されない。(したがって、正しく起動しているのどうかもわからない)

### 起動時はDP-HDMI変換ケーブルをつけて、その後HDMIをGPUに直接挿す

とにかく、起動時にDP-HDMI変換ケーブルをつけてログインし、その後HDMIを直接GPU側に指す(変換ケーブルを介しない)ことで、起動成功してかつ4K出力が得られることができることを確認した。起動時にHDMIを直接GPUに指して、4Kディスプレイが正しく表示される方法は**わかっていない**。

### 起動時にDPケーブルでつなぐ
DP-HDMI変換ケーブルを使って、起動後にディスプレイとの接続をDPケーブルにすると、正常に4K表示が得られる。
一方で、起動前にDPケーブルでディスプレイと接続しておくとHDMIの時と同様、うまく起動されない。ここから「起動時に4K解像度の出力を選ぶと起動しない」という仮説が導かれる。ちなみに、BIOSとブートローダーまでは正常に立ち上がる。

## Cuda 11.1を入れる
公式ページの
https://developer.nvidia.com/cuda-11.1.0-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=debnetwork
のBase instalerの個所にあるコマンドをコピペして入力した。
但し、最後のコマンドだけはうまく通らないので、以下のようにバージョンを指定したものに差し替えた。

```console
sudo apt-get  install cuda-11-1
```
なんか、中途でupdateをかけたら、こけているように見えたが、再起動したら問題なく動いているように見える。この過程で、ドライバーがどこかの時点で"455"に代わっていた。(中途で行ったupdate?)

```bash
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```
でPATHを通して、おしまい。

`nvcc -V`でインストールがされているか、確認できる。
参考にしたページ: https://k-hyoda.hatenablog.com/entry/2020/07/09/223907
https://developer.nvidia.com/cuda-11.0-update1-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=debnetwork

## PyTorchをインストール
pyenvでanaconda3-5.3.1を入れて、

```console
pip install torch==1.7.0+cu110 torchvision==0.8.1+cu110 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html
```
でインストール。ipython3で

```python
import torch
print(torch.cuda.is_availabel())
```
で`True`が返ってきたので、cudaもそれを使ったpytorchも正しく入っているっポイ。