MSI製ゲーミングノートに機械学習環境を構築する時の罠と対策 【GS65 GTX1070】

# はじめに

## 目標

- [MSI GS65 Stealth Thin](https://jp.msi.com/Laptop/GS65-Stealth-Thin-8RF-007JP)でWindows 10とUbuntu 17.10をデュアルブートする
- Ubuntu 17.10にCUDAとChainerを入れる

## 罠
追記（2019/0613）
以下の罠は最新のUbnutu 18.04を入れると回避できます

- ~~Ubuntu 16.04をインストールすると有線・無線ともにネットワークに繋がらない~~
    - 頑張れば16.04でも大丈夫らしいです
    - （カーネルのバージョンが最初から新しいものを入れるとうまくいく？）
- Ubuntu 18.04はgrubのインストールに失敗するためインストールできない
- グラフィックドライバはnvidia-390以外入れてはいけない
- 公式が配布しているイメージのカーネルはnvidiaのドライバを認識しない
- wifiアダプタがKiller製でUbuntuのサポート外

## 正解の手順

正解の手順は一つしかなく、私はこれを発見するのに50時間かかりました。

1. Ubuntu 17.10を入れる
2. カーネルのバージョンを上げる
3. wifiドライバを入れる
4. nvidia-390を入れる
5. CUDA 9.1をrunfileから入れる
6. CuPyをcupy-cuda91で入れる
7. Chainerを入れる

## GS65 Stealth Thin

今回はMSIのゲーミングノートである[GS65 Stealth Thin](https://jp.msi.com/Laptop/GS65-Stealth-Thin-8RF-007JP)を使います。
GS65は先月発売されたMSIの新型ゲーミングノートで、薄さ18ミリの筐体にGeForce GTX 1070（8GB）が載っており、ディスプレイのベゼルが細く洗練されたデザインになっています。

![gs65-new-bz.jpg](https://qiita-image-store.s3.amazonaws.com/0/109322/d22cb623-7779-6ae6-92f9-6312db0cba31.jpeg)

CPUも第8世代のi7（6コア12スレッド）であり、機械学習の開発環境として非常に魅力的です。
またストレージとしてm.2のSSDを最大2本挿せるため、Windows 10とのデュアルブートが可能となっています。
しかし、実際に環境を構築すると数々の罠に引っかかってしまうため、普段通りにUbuntuをインストールすると確実に失敗します。
本記事では私がGS65にUbuntuを入れChainerを動かすまでにやったことを書いています。

## Razer Blade 2018 Edition

この記事を公開してからRazer Bladeの新型が発表されました。
https://www.razer.com/gaming-laptops/razer-blade
GS65よりも薄いのでこちらも選択肢に入れてもいいと思います。
https://www.razer.com/comparisons/blade-15

# 構築手順

## Ubuntu 17.10のインストール

### はじめに

GS65にインストール可能なUbuntuのバージョンは16.04と17.10です。
しかし16.04は有線・無線ともに一切ネットワークに繋ぐことができません。（専用ドライバを入れてもwifiアダプタが認識されません）
そのためUbuntu 17.10以外のバージョンは諦める必要があります。
Ubuntu 18.04はOSインストールの最後にgrubがインストールできず完了できません。
発生するエラーは「grub-efi-amd64-signed'パッケージを/target/にインストールするのに失敗しました。」です。
これは有名なエラーでネットには様々な対処法がありますが、今回はどの方法でも解消できません。
正確なエラーメッセージは「grub-install: error: efibootmgr failed to register the boot entry」ですが、これは現時点では解決されていないバグであるためどうすることもできません。

### Live USBの作成

[日本語Remix](https://www.ubuntulinux.jp/News/ubuntu1710-ja-remix)など、何でもいいのでLive USBを作成します。
Ubuntuには「ブータブルUSBの作成」というソフトが標準で入っているためこれを使うと手軽に作れます。

### BIOSの設定変更

起動時にDelteキーを押すとBIOSの設定に入れます。
Fast Bootとセキュアブートは切り、BootをUEFIからUEFI with CSMに変えます。

### OSインストール

GS65にLiveUSBを刺し起動します。
grubの画面が出たらTry ubuntu without installingが選択されている状態でeキーを押しメニュー編集モードに入ります。

```
linux   /casper/vmlinuz file=... quiet splash --- debian ...
```

のようになっている部分のquiet splashの後ろにacpi=offを追加します。

```
linux   /casper/vmlinuz file=... quiet splash acpi=off --- debian ...
```

**こうしないと起動後にフリーズします。**
またこの操作はすべての手順が完了するまでは起動ごとにやる必要があります。
追記したらF10キーを押すとUbuntuが起動します。
この時点ではディスプレイドライバがおかしくなっているので解像度が800x600程度になっていると思います。
Ubuntuが起動したらまずGPartedを起動します。
デュアルブートする方は注意が必要ですが、まず**Windowsが入っていない方のSSD**を選択します。
パーティションが現時点では無いので、パーティション追加ボタンを押して以下のように設定し追加します。

![Screenshot from 2018-05-20 02-27-40.png](https://qiita-image-store.s3.amazonaws.com/0/109322/a9487b01-e765-619a-af3d-8344d87ecbd3.png)

適用ボタンを押した後、右クリックから「フラグを編集」を選択し以下のように設定します。

![Screenshot from 2018-05-20 02-28-23.png](https://qiita-image-store.s3.amazonaws.com/0/109322/732c925e-234c-9de9-73b7-3adee51eb6fe.png)

スクリーンショットを撮り忘れましたが、この時点で先頭に先程作った200MB程度のFAT32のパーティションがあり、残りの空き容量すべてが未割り当てのまま残っていると思います。
この操作はUbuntuを手動でインストールするときに必要な領域を作るために行っています。
（参考：[https://askubuntu.com/questions/789998/16-04-new-installation-gives-grub-efi-amd64-signed-failed-installation-target](https://askubuntu.com/questions/789998/16-04-new-installation-gives-grub-efi-amd64-signed-failed-installation-target)）
ここでGPartedを閉じ、デスクトップにあるインストーラを起動します。

![Screenshot from 2018-05-20 02-29-43.png](https://qiita-image-store.s3.amazonaws.com/0/109322/0afec9d7-411d-c0e3-5d8c-69b9c6ee5da4.png)

サードパーティ製のソフトウェアはインストールしたところでwifiが使えるようになるわけではないのでスキップします。
インストールの種類は「それ以外」を選択します。

![Screenshot from 2018-05-20 02-29-50.png](https://qiita-image-store.s3.amazonaws.com/0/109322/83590c0f-2341-9e06-b3c5-97cacf21f056.png)

先程作った先頭の200MBの領域とそれ以外の空き領域に分かれていると思います。

![Screenshot from 2018-05-20 02-30-17.png](https://qiita-image-store.s3.amazonaws.com/0/109322/aba64104-bfed-fa36-1f0f-d563e405767b.png)

**デュアルブートにする場合はどのSSDにWindowsが入っているかを把握し間違えないようにしましょう。**
この空き領域にパーティションを作成します。

![Screenshot from 2018-05-20 02-30-23.png](https://qiita-image-store.s3.amazonaws.com/0/109322/ac54dd40-b280-d5e3-dd28-8abfa20bc9e6.png)

作成すると以下のようになります。
ブートローダをインストールするデバイスを**Windowsが入っていない方のSSD**に設定します

![Screenshot from 2018-05-20 02-30-50.png](https://qiita-image-store.s3.amazonaws.com/0/109322/75aafeb9-d78f-d032-ec88-fabd2a84b805.png)

ディスプレイの解像度が低すぎるため下にあるボタンが見えませんが、下にボタンが３つあるので「ブートローダをインストールするデバイス」を選択中にタブキーを３回押してエンターを押すと先に進めます。
以下の画面でWindowsが入っているSSDには影響が出ないことを確認しましょう。

![Screenshot from 2018-05-20 02-31-35.png](https://qiita-image-store.s3.amazonaws.com/0/109322/6a48b576-8d69-e1b9-d2f6-921356eaf49e.png)

インストールが終われば再起動します。
ただしこの時点では再起動処理も失敗するので電源ボタン長押しで強制シャットダウンさせます。
再起動時もgrubの編集メニューでacpi=offを指定します。
Ubuntu起動後に以下を実行します。

```
sudo apt update
sudo apt upgrade
```

ちなみにこの時点でタッチパッドは動作しません。

### Wi-Fiドライバのインストール

GS65のwifiアダプタはKiller Wireless-AC 1550です。
これはLinuxで未サポートとなっていますが、有志の開発しているドライバを入れることでwifiが利用可能になります。

[https://forum.manjaro.org/t/solved-killer-wireless-ac-1550i-adapter-9560ngw-not-work/46167/20](https://forum.manjaro.org/t/solved-killer-wireless-ac-1550i-adapter-9560ngw-not-work/46167/20)を参考にwifiモジュールをインストールします。

```
sudo apt-get install git
git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git
cd backport-iwlwifi
make defconfig-iwlwifi-public
make -j6
sudo make install
```

### カーネルのアップデート

以下のようにしてUkuuを入れます。

```
sudo apt-add-repository -y ppa:teejee2008/ppa
sudo apt update
sudo apt install ukuu
```

参考：https://iberianpig.github.io/posts/2017-02-06_how_to_upgrade_kernel/

`ukuu-gtk`で起動します。
バージョン一覧からLinux 4.16.5を選択しインストールします。
これより高いバージョンはインストールに失敗します。
Close window to exitが出たらalt+f4を押して画面を閉じ、Ubuntuを再起動します。
再起動後念の為もう一度以下を実行します。

```
sudo apt update
sudo apt upgrade
```

しばらくすると「新しいバージョンのUbuntuが利用可能です。アップグレードしますか？」と聞かれますが、**絶対にアップグレードしてはいけません。**
ここでアップグレードをすると18.04になりますが、上述のようにgrubのインストールで失敗するため不完全なアップグレードになりUbuntuが壊れます。
また、ここまでの手順が完了すれば起動時にacpi=offを付ける必要がなくなります。

## Deep Learning環境の構築

### NVIDIAのドライバを入れる

まずnouveauを消します。
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nouveau-ubuntu

次にnvidia-390を入れます。

```
sudo add-apt-repository ppa:graphics-drivers
sudo apt update
sudo apt install nvidia-390
```

現時点の最新のドライバは396ですが、モバイルの1070は390までに対応しています。
またグラフィックドライバを入れるとなぜかタッチパッドが反応するようになります。

### gccをダウングレード

gccとg++のバージョンを6に下げます。
これはCUDA9.1がgcc-7をサポートしていないからです。（エラーが出ます）
参考：https://askubuntu.com/questions/1028830/install-cuda-on-ubuntu-18-04

まずgccをアンインストールします。

```
sudo apt remove gcc
sudo apt autoremove
```
次にgcc-6を入れます。

```
sudo apt install gcc-6
sudo apt install g++-6
```
[ここ](
https://askubuntu.com/questions/26498/choose-gcc-and-g-version)を参考にupdate-alternativesでシンボリックリンクを作ります。（優先度は適当です）

```
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-6 10
```

こうすることで`gcc`するとgcc-6が使われるようになります。

### CUDA 9.1のインストール

[NVIDIAのサイト](https://developer.nvidia.com/cuda-91-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1704&target_type=runfilelocal)からCUDA 9.1のrunfileをダウンロードします。（17.04となっていますが無視します）
runfileを実行しCUDA Toolkitのみインストールします。
ディスプレイドライバは入れてはいけません。

### CuPyのインストール

CuPyはcupy-cuda91を入れます。

```
sudo pip3 install cupy-cuda91
```

このとき`--user`を付けてホームディレクトリにインストールしてはいけません。（`import cupy`ができなくなる謎の現象が起きます）

### Chainerのインストール

```
pip3 install chainer --user
```

### CUDA Sample

まずOpenGL関連を入れます。

```
sudo apt-get install freeglut3-dev libglu1-mesa-dev
```

参考：http://ksakiyama134.hatenablog.com/entry/2016/09/25/005130

![Screenshot from 2018-05-20 20-40-37.png](https://qiita-image-store.s3.amazonaws.com/0/109322/567046ed-c09f-31d4-676e-5b413045905c.png)


# 終わりに

思い出しながら書いたので抜け落ちている部分があるかもしれません。
不明な箇所があればコメントでお聞きください。

# 分解する

**一度分解すると保証は受けられません。**自己責任でお願いします。（保証シールがネジ穴を隠しており、このシールは破損無効になっています）
GS65はゲーミングノートにしては分解しやすい構造をしているため、定期的な冷却ファンの掃除などがやりやすくなっています。
裏蓋を外すとマザーボードが見えますが、m.2スロットやメモリスロットはキーボード側についているためマザーボードを外す必要があります。
まずマザーボードの上下に刺さっているコネクタを外し、CPUファンのコネクタを剥がすとマザーボードをひっくり返せます。
m.2スロットとメモリスロットはともに2つです。