WindowsでSSDを増設してデュアルブートしたUbuntuでPyTorch(GPU)を使うまで

# Windows10にUbuntuの導入

## はじめに

備忘録もかねてWindowsでUbuntuをデュアルブートしてPyTorchをGPUで動かすまでの手順を載せておきます。

**追記（2020年1月23日）**

ページ下部によく使用するソフトをインストールする手順を加えています。
（Git, VSCode, Chrome, Dropbox, Docker, kubectl, minikube）

**追記（2020年1月24日）**

root以外でもdockerコマンドを使用できる設定を追加しました。

## 1. SSDの増設

今回使用しているデスクトップPCは、「**GALLERIA XZ　ガレリア XZ（**[**公式サイト**](https://www.dospara.co.jp/5shopping/detail_prime.php?mc=8318&sn=3691)**）**」です。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579673513563_IMG_0158.JPG)


準備したものは以下の4点です。


- SSD（Samsung SSD 512GB 860PRO）
- ミリねじ
- SATAケーブル（赤）
- 電源ケーブル（黒）


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579673522101_IMG_0164.JPG)


購入したSSDに電源ケーブルとSATAケーブルを接続して、Windowsを起動します。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579673579866_IMG_0168.JPG)


Windowsの「ディスクの管理」を起動すると、未割り当てのディスクが認識されていることがわかります。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579605179022_image.png)


ひとまずSSDの増設は終了です。


## 2. Ubuntuの準備

Ubuntuの[公式サイト](https://ubuntu.com/download/desktop)からUbuntu18.04.3 LTS（ubuntu-18.04.3-desktop-amd64.iso）をダウンロードします。
場所はどこでもいいです。

USBメモリへの書き込みに、UNetBootinを使用します。
最低でも4GB必要です。

UNetBootinを起動すると以下のような画面が出てくるので、「ディスクイメージ」を選択してダウンロードしたISOファイルを指定します。
そのあと、Ubuntuの起動に使用するUSBを指定して書き込みます。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579673972131_image.png)


では再起動を行って、BIOSを起動しましょう。
起動時にロゴが表示されている間に「F2」や「Del」などを押してBIOSを起動します。


## 3. BIOSの設定

ガレリアの場合、BIOSを起動すると以下のような画面が表示されます。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579674335227_IMG_0180.JPG)


Ubuntuを起動する前にBIOSの設定を変更しておきます。
NVIDIAドライバを後で入れていきますが、この時にBIOSのSecure Bootが有効化されているとうまくいかないため、一時的に無効化させます。
（なお署名方式でもOKです。）

上記画面の「Advanced Mode（F7）」を選択して「Boot」の「Secure Boot」を選択します。

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579674857750_IMG_0181.JPG)


選択した後で表示される画面で、「OS Type」を「Other OS」に設定するとSecure Bootが無効化されます。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579674882090_IMG_0182+1.JPG)


では元の画面に戻り「Boot Menu（F8）」を選択して、以下のような起動オプションを表示します。
見えづらいですが、一番上は「Windows Boot Manager」です。
今回はUbuntuを起動するので、下の「UEFI: TOSHIBA, Partition 1（7391MB）」を選択します。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579674395642_IMG_0172.JPG)


この後にUbuntuの起動メニューが表示されるので、「try Ubuntu without Install」を選択します。
これでUbuntuの画面が起動できているはずです。
（ディスプレイの出力にNVIDIAのGPUを使用している場合は、解像度が正しく設定されていないことがあります。）


## 4. Ubuntuのインストール

Ubuntuのデスクトップ画面に、Ubuntuのインストールメニューが表示されているので、これを選択してインストールを開始します。

そのあと、画面の操作に従って進めていきますが以下の画面では、Ubuntuのブートローダを増設したSSDにインストールできるように「それ以外」を選択します。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579674688800_IMG_0178.JPG)


この後に新しく増設したSSDにパーティションを作成してインストールを行います。
（画面とり忘れました…）

ここまで行えばUbuntuのインストールが始まります。
では再起動してUbuntuが立ち上がることを確認しましょう。

**注意点**

起動した際に、画面に「Couldn’t get size: 0x800000000000000e」が表示されて動かなくなってしまった場合は、Ubuntuの起動オプションの画面で「e」を押して、オプションを以下のように編集します。


> linux 行の末尾におもむろに nomodeset を追記します。

参考URL：https://qiita.com/yoya/items/026317fe2ddb30ab411d


## 5. 前準備

ここまでで無事Ubuntuの立ち上げが終わっているはずです！
これからCUDAなどのライブラリをインストールしていきますが、その前にUbuntuの設定をいくつか変更しておきます。

まずはソフトウェアを最新の状態にしておきます。


    $ sudo apt update
    $ sudo apt upgrade

**時刻設定**

デフォルトの状態だと、Windowsの標準時刻がー9時間程度ずれるので、Ubuntu側から修正します。


    sudo timedatectl set-local-rtc true

**Directoryを英語にする**


    $ LANG=C xdg-user-dirs-gtk-update

このあと表示される画面で「Update Names」を選択すれば以下のようにディレクトリの名称が英語に変更されます。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579696302342_Screenshot+from+2020-01-22+21-30-48.png)



## 6. GCCのインストール

gccコマンドを使用するのでインストールしておきます。


    $ sudo apt-get install build-essential
    $ gcc --version

以前にgccを導入していたので、以下のような画面になりました。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579697176206_Screenshot+from+2020-01-22+21-45-25.png)



## 7. デフォルトドライバの変更

デフォルではnouveauのドライバが使用されているため、以下のコマンドでデフォルトの設定値を変更します。


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

nouveauが無効化されているかどうかを確認します。
以下のコマンドを実行して、何も表示されなければ大丈夫です。


    $ lsmod | grep -i nouveau


## 8. Nvidia Driverのインストール

まずは以前に導入したNvidiaドライバやCudaがあれば削除をしておきます。


    $ sudo apt-get --purge remove nvidia-*
    $ sudo apt-get --purge remove cuda-*

次にCUDAが実行可能なGPUであるかを確認します。


    $ lspci | grep -i nvidia


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579697846234_Screenshot+from+2020-01-22+21-57-08.png)


次に使用しているUbuntu（今回は18.04）で推奨されているNvidiaドライバを確認します。


    $ ubuntu-drivers devices


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579697943773_Screenshot+from+2020-01-22+21-58-49.png)


nvidia-driver-440が推奨されているので、[公式サイト](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)からダウンロードしてきて実行します。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579698099421_Screenshot+from+2020-01-22+22-01-25.png)


ここで検索を実行すると、以下のようなダウンロード画面に遷移するので、ドライバをダウンロードします。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579698128911_Screenshot+from+2020-01-22+22-01-58.png)


「Continue Installation」


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579698453419_Screenshot+from+2020-01-22+22-07-21.png)


ここまでで「nvidia-smi」を実行すると以下のように、NVIDIAドライバがインストールされていることが確認できます。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579698571841_Screenshot+from+2020-01-22+22-09-26.png)


ここで表示されている「CUDA Version: 10.2」とは実際にインストールしているCUDAではなく（そもそもまだインストールしていない）、インストール可能なCUDAのバージョン情報です。

ここで再起動すると、NVIDIAドライバが適用されディスプレイの解像度も正しく設定されていることがわかります。（なお自分の場合は2画面で操作していますが、1画面でも問題ありません）

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579698886477_Screenshot+from+2020-01-22+22-12-09.png)



## 9. CUDAのインストール

CUDAをインストールしていきますが、現時点（2020年1月22日）で最新版のPyTorchとTensorFlowが対応しているCUDAのバージョンは10.1なので、最新の10.2ではなく10.1をインストールしていきます。

では[公式サイト](https://developer.nvidia.com/cuda-10.1-download-archive-update2?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=runfilelocal)からバージョン10.1のCUDAをダウンロードします。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579699137336_Screenshot+from+2020-01-22+22-18-44.png)




![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579699446589_Screenshot+from+2020-01-22+22-23-51.png)



- Do you accept the above EULA? (accept/decline/quit): 
    - accept

NVIDIAドライバに関しては既に導入しているため、チェックを外しています。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579699582548_Screenshot+from+2020-01-22+22-26-12.png)


今回はドライバをインストールしていないため、最後のほうに警告が発生しています。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579699714804_Screenshot+from+2020-01-22+22-28-21.png)


最後に標準出力で言われているように環境変数を設定します。
なお環境変数の設定には、PATHを永続的に追加する(.bashrc)を利用します。ホームディレクトリ以下の`.bashrc`ファイルにPATHを書き込んでいきましょう（ない場合は新規作成します）。


    echo -e "\n## CUDA paths"  >> ~/.bashrc
    echo 'export PATH=/usr/local/cuda-10.1/bin:${PATH}' >> ~/.bashrc
    echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
    source ~/.bashrc

環境変数が設定されているかどうかを確認します。


    $ export -p | grep cuda


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579700652198_Screenshot+from+2020-01-22+22-44-01.png)


一度ログオフして再度ログインします。
そしてCUDAがインストールされているかどうかを確認します。

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579701204490_Screenshot+from+2020-01-22+22-53-11.png)


無事CUDAのインストールが完了しました！


## 10. cudnnのインストール

cudnnをインストールしていきます。手順に関しては[公式サイト](https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#install-linux)を参考にしましょう。
(なお[NVIDIA Developer Program](https://developer.nvidia.com/accelerated-computing-developer)に登録する必要があります。)

まずは使用しているGPUの計算能力が要求を満たしているかどうかを[CUDA-GPUS](https://developer.nvidia.com/cuda-gpus)で確認します。そして導入したNVIDIAドライバとCUDAのバージョンにあうcudnnのバージョンを[一覧](https://docs.nvidia.com/deeplearning/sdk/cudnn-support-matrix/index.html)から確認しましょう。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579701686830_Screenshot+from+2020-01-22+23-01-15.png)


登録を終えたあとに、以下の画面に遷移するのでCUDAのバージョンにあったcudnnをダウンロードします。

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579701764666_Screenshot+from+2020-01-22+23-02-29.png)


今回はUbuntu18.04なので、対応している「Runtime Library」と「Developer Library」と「Code Samples and User Guide」をダウンロードします。

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579701893273_Screenshot+from+2020-01-22+23-04-41.png)


ではダウンロードした先のフォルダで、コマンドを実行してインストールします。


    $ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
    $ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
    $ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579702625701_Screenshot+from+2020-01-22+23-16-55.png)

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579702669836_Screenshot+from+2020-01-22+23-17-33.png)

![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579702701188_Screenshot+from+2020-01-22+23-18-10.png)


cudnnがインストールされているかどうかをテストします。


    $ cp -r /usr/src/cudnn_samples_v7/ $HOME
    $ cd  $HOME/cudnn_samples_v7/mnistCUDNN
    $ make clean && make
    $ ./mnistCUDNN
    >> Test passed!

cudnnも無事インストールできました！


## 11. PyTorchのインストール

まずはpip3のインストールを行います。


    $ sudo apt install python3-pip

では[PyTorch](https://pytorch.org/get-started/locally/)をインストールします。


    $ pip3 install torch torchvision

以下のようにPyTorchがインストールされており、cudaも使用可能であることがわかります。


![](https://paper-attachments.dropbox.com/s_99A4693D2194157B5E99BEAD73F8B9F16B8E571A456D15A66D6065F2701F464D_1579703615080_Screenshot+from+2020-01-22+23-33-18.png)


終わり！！



## 補足

上記以外にも開発に必要なソフトウェアをいくつかインストールしたので、その手順も書き残しておく。

**Git**


    # Gitのインストール
    $ sudo apt-get install git
    
    # Gitがインストールされたか確認する
    # 以下のコマンドを叩き、バージョンが表示されていればOK
    $ dpkg -l git
    
    # Gitの初期設定を行う
    # 以下のコマンドを叩き、初期設定を行う
    $ git config --global user.name [任意のユーザ名]
    $ git config --global user.email [任意のユーザ名]

**Chrome**


    # 公開鍵の取得＆追加
    $ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
    # aptのインストールリストに追加
    $ sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
    # 更新
    $ sudo apt update
    
    ## インストール
    $ sudo apt install google-chrome-stable

**VSCode**


    # curlを使用できるようにする
    $ sudo apt install curl
    
    # vscodeのdebをインストール
    $ curl -L https://go.microsoft.com/fwlink/?LinkID=760868 -o vscode.deb
    
    # ダウンロードの確認
    $ ls -lh
    
    # debパッケージから直接取得
    $ sudo apt install ./vscode.deb
    
    # version確認
    $ code --version

**Dropbox**

インストーラー（[nautilus-dropbox-1.6.2.tar.bz2](https://linux.dropbox.com/packages/nautilus-dropbox-1.6.2.tar.bz2)  ）を取得する。


    $ tar xjf ./nautilus-dropbox-1.6.2.tar.bz2
    $ cd ./nautilus-dropbox-1.6.2/; ./configure; make; make install;
    
    # pgkpackageがインストールされていないと表示されるので対処する
    $ sudo apt-get install -y pkg-config

うまくいかなかったので以下で対処
まずは[公式サイト](https://www.dropbox.com/ja/install-linux)からdebパッケージをダウンロード


    $ sudo dpkg -i dropbox_2019.02.14_amd64.deb
    $ sudo apt install libpango1.0-0
    $ sudo apt --fix-broken install

あとはDropboxを実行してインストールを実行します。
ただしLinuxではスマートシンクは使用できないため、選択型同期などで対処しましょう。

**Docker**

[公式サイト](https://docs.docker.com/install/linux/docker-ce/ubuntu/)の手順に従う


    # 1. set up the repositpory first
    # aptパッケージを更新
    $ sudo apt-get update
    
    # パッケージをインストールする
    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    
    # dockerの公式GPGキーを追加する
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
    # ダウンロードしたｋきーキーの確認を行う
    $ sudo apt-key fingerprint 0EBFCD88
    
    # stableなリポジトリを設定します。
    $ sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    
    # 2. Docker Engineのインストール
    # aptパッケージの更新
    $ sudo apt-get update
    
    # 最新のDocker Engineをインストールする
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io



    # 上記の最新版ではなくバージョンを指定する場合はお以下のように勧めていきます
    # 使用可能なDockerのバージョンを一覧する
    $ apt-cache madison docker-ce
    
    # 特定のバージョンをインストールする
    $ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

最後にDockerを起動してみましょう。


    $ sudo docker run hello-world

現状のままだと毎回コマンドを実行する際に`sudo`を打つ必要があります。
そこで[公式ガイド](https://docs.docker.com/install/linux/linux-postinstall/)に従って以下のコマンドを実行します。

    $ sudo groupadd docker
    $ sudo usermod -aG docker $USER
    $ newgrp docker 
    $ docker run hello-world

これでrootユーザー以外でも`sudo`を打つ必要なくDockerコマンドを実行できるようになりました。
VSCodeのRemote Development機能を使用する際に必要になると思います。

**Kubectl & Minikube**

まずはKubectlを[公式のガイド](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux)に従って、バイナリでインストールしていきます。


    # 最新版をダウンロード
    $ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
    
    # 実行権限を付与します
    $ chmod +x ./kubectl
    
    # バイナリにPATHを通します
    $ sudo mv ./kubectl /usr/local/bin/
    
    # インストールできているか確認します。
    $ kubectl version --client

次にMinikubeを[公式のガイド](https://kubernetes.io/ja/docs/tasks/tools/install-minikube/)に沿ってインストールしていきます。

まずは以下のコマンドを実行して出力が空でない（＝仮想化がサポートされている）ことを確認します。


    $ grep -E --color 'vmx|svm' /proc/cpuinfo

次にminikubeの実行ファイルをダウンロードして、PATHに追加していきます。


    $ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
      && chmod +x minikube
    
    # PATHが通っているフォルダに追加する
    $ sudo cp minikube /usr/local/bin

今回はDockerとUbuntu環境を使用して、ハイパーバイザを使用せずにminikubeを起動していきます。そのためには起動オプションに`--vm-driver=none`を追加しましょう。


    $ sudo minikube start --vm-driver=none

これでminikubeを使用してKubernetesコンポーネントを実行できました！



## 参考文献

https://qiita.com/yoya/items/026317fe2ddb30ab411d

https://qiita.com/yoshinyan/items/d56a56414f2d21814f88

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0456?page=4

https://blog.hysakhr.com/2019/11/12/%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%80%8Cnvidia-smi-has-failed-because-it-couldnt-communicate-with-the-nvidia-driver-make-sure-that-the-latest-nvidia-driver/#i

https://qiita.com/valzer0/items/67a4c8bf2b1be0fc825a