ディープラーニング用の自作PCを作ってDockerでjupyterlabとPyTorchを導入するまで

# 自作PCのテーマ
機械学習エンジニア的な仕事をしつつ、趣味でもディープラーニングをいじっていたら自宅にGPUが欲しくなりました。会社のGPUもkaggle用とか研究用なら使わせてもらえるようなのですが、自分個人のコンピュータで計算したいという思いを止められず、コロナで10万円の給付金をもらえることですし(?)、購入することにしました。

今回の自作PCを作るに際して、以下の基準を立てました。

* __10万円以内__
* GPUのメモリ__8GB以上__
* CPU __8スレッド以上__
* ストレージ__4TB以上__（オープンデータセットをいくつか保存したいため）

また、パーツの選定の際にはこれらの記事を参考にさせていただきました。特に上側2つの記事は構成についても参考にしました、ありがとうございました。
[ディープラーニングのための初めての自作PC](https://qiita.com/yusuke-saruya/items/af86ee3a8e434ff1bf43)
[ディープラーニング用に自作PCを作る](https://qiita.com/futakuchi0117/items/5d31aacac5f6ab6665dd#3-%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)
[GPU（グラフィックボード）性能比較表【2020年最新版】](https://pcfreebook.com/article/459993300.html)


# 選定パーツ一覧
さて、上記の基準に合わせてパーツ選定をしていったわけですが、結果的に10.5万円くらいになってしまいました。PCケースをデザイン的な部分で妥協できなかったためです。一応、10万円以内に収まるプランも書いておきます。

## 10万円で収まるパーツ一覧

| No. | 部品 | 商品名 | 価格（購入時、税込） | 購入場所 |
| ---- | ---- | ---- | ---- | ---- |
| 1 | GPU | [MSI GeForce RTX 2060 SUPER VENTUS XS J OC](https://www.amazon.co.jp/MSI-GeForce-2060-SUPER-VENTUS/dp/B08164NQ1G/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=MSI+GeForce+RTX+2060+SUPER+VENTUS+XS+J+OC+%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%83%9C%E3%83%BC%E3%83%89+VD7099&qid=1592146597&sr=8-1) | ¥44,978 | Amazon |
| 2 | CPU | [AMD Ryzen 3 3100 3.6GHz 4コア / 8スレッド 65W](https://www.amazon.co.jp/gp/product/B0876Y2TMZ/ref=ox_sc_mini_detail?ie=UTF8&psc=1&smid=AN1VRQENFRJN5) | ¥13178 | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
| 3 | メモリ | [TEAM DDR4 2666Mhz PC4-21300 8GBx2枚](https://www.amazon.co.jp/gp/product/B07HJWXKXP/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) | ¥7,780 | Amazon |
| 4 | Cドライブ用ストレージ | [Crucial SSD 内蔵2.5インチ SATA接続 BX500 シリーズ 120GB](https://www.amazon.co.jp/Crucial-%E5%86%85%E8%94%B52-5%E3%82%A4%E3%83%B3%E3%83%81-SATA%E6%8E%A5%E7%B6%9A-%E5%9B%BD%E5%86%85%E6%AD%A3%E8%A6%8F%E4%BB%A3%E7%90%86%E5%BA%97%E5%93%81-CT120BX500SSD1JP/dp/B07JFPWWSC/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=ssd+sata+128gb&qid=1592144472&s=computers&sr=1-4) | ¥2,981 | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
| 5 | Dドライブ用ストレージ | [Seagate BarraCuda 3.5インチ 6TB 内蔵ハードディスク HDD](https://www.amazon.co.jp/gp/product/B07X93LCY5/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) | ¥11,091 | Amazon |
| 6 | マザーボード | [GIGABYTE B450M S2H](https://www.amazon.co.jp/gp/product/B07NQMX1Z1/ref=ox_sc_act_title_1?smid=AN1VRQENFRJN5&psc=1) | ¥6,578 (1000円割引後) | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
| 7 | 電源ユニット | [Corsair CX550M 80PLUS](https://www.amazon.co.jp/gp/product/B01DJ30HWK/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) | ¥6,364 | Amazon |
| 8 | ケース | [Versa H18 CA-1J4-00S1WN-00](https://www.amazon.co.jp/Thermaltake-Versa-%E3%83%9F%E3%83%8B%E3%82%BF%E3%83%AF%E3%83%BC%E5%9E%8BPC%E3%82%B1%E3%83%BC%E3%82%B9-CS7097-CA-1J4-00S1WN-00/dp/B077GFVY21) | ¥3,108 | Amazon |
| 9 | ファン | [Novonest 120mm PCケースファン 静音タイプ 25mm厚 3ピン1200rpm(3本1セット)](https://www.amazon.co.jp/Novonest-PC%E3%82%B1%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%83%B3-3%E3%83%94%E3%83%B31200rpm-3%E6%9C%AC1%E3%82%BB%E3%83%83%E3%83%88-%E3%80%9012BK3-3%E3%80%91/dp/B07149Y3R8) | ¥1,080 | Amazon |
| 10 | ファン電源用分岐ケーブル | [変換名人 ペリフェラル(大4ピン) → FAN用電源(3ピン)変換4分岐ケーブル](https://www.amazon.co.jp/%E5%A4%89%E6%8F%9B%E5%90%8D%E4%BA%BA-%E3%83%9A%E3%83%AA%E3%83%95%E3%82%A7%E3%83%A9%E3%83%AB-FAN%E7%94%A8%E9%9B%BB%E6%BA%90-%E5%A4%89%E6%8F%9B4%E5%88%86%E5%B2%90%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-IDEP-FAN3/dp/B007ST3WY2) | ¥494 | Amazon |
|  | 合計 |  | ¥97,632 |

PCケースにファンが付いていない場合はファンが必要になる。ケースにファンが無い状態だと、ディープラーニングでGPUを回しっぱなしにするとケース内部が熱くなりすぎて、GPUの方で一定温度以上の時に制御されてパフォーマンスが100%出なくなったりしてしまう。

Tsukumo ex.で見た最安値のPCケース。Amazonでも売れ行きは良いみたい。
![IMG_3273.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/e8dc0255-8f38-90a1-454e-7af42bea71aa.jpeg)


また、このマザーボードは本当に最低限の機能（というか足りないからファン電源用分岐ケーブルを買うのだが）しか持ち合わせておらず、メモリは2枚までで最大32GBまで対応している。大きさもMicro ATXなためGPUは1枚しか乗せられない。もし後でGPUを追加したいと考えているならば、ATXやExtended ATXを購入する必要がある。


## 今回買ったパーツ一覧

| No. | 部品 | 商品名 | 価格（購入時、税込） | 購入場所 |
| ---- | ---- | ---- | ---- | ---- |
| 1 | GPU | [MSI GeForce RTX 2060 SUPER VENTUS XS J OC](https://www.amazon.co.jp/MSI-GeForce-2060-SUPER-VENTUS/dp/B08164NQ1G/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=MSI+GeForce+RTX+2060+SUPER+VENTUS+XS+J+OC+%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%83%9C%E3%83%BC%E3%83%89+VD7099&qid=1592146597&sr=8-1) | ¥44,978 | Amazon |
| 2 | CPU | [AMD Ryzen 3 3100 3.6GHz 4コア / 8スレッド 65W](https://www.amazon.co.jp/gp/product/B0876Y2TMZ/ref=ox_sc_mini_detail?ie=UTF8&psc=1&smid=AN1VRQENFRJN5) | ¥13,178 | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
| 3 | メモリ | [TEAM DDR4 2666Mhz PC4-21300 8GBx2枚](https://www.amazon.co.jp/gp/product/B07HJWXKXP/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) | ¥7,780 | Amazon |
| 4 | Dドライブ用ストレージ | [Seagate BarraCuda 3.5インチ 6TB 内蔵ハードディスク HDD](https://www.amazon.co.jp/gp/product/B07X93LCY5/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) | ¥11,091 | Amazon |
| 5 | マザーボード | [GIGABYTE B450M S2H](https://www.amazon.co.jp/gp/product/B07NQMX1Z1/ref=ox_sc_act_title_1?smid=AN1VRQENFRJN5&psc=1) | ¥6,578 (1000円割引後) | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
| 6 | 電源ユニット | [Corsair CX550M 80PLUS](https://www.amazon.co.jp/gp/product/B01DJ30HWK/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1) | ¥6,364 | Amazon |
| 7 | ケース | [LANCOOL ONE Digital White](https://www.dirac.co.jp/lancool-one-lancool-one-digital/) | ¥13,808 | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
| 8 | ファン電源用分岐ケーブル | [ainexアイネックスCA-864 ファン用電源4分岐ケーブル](https://www.yodobashi.com/product/100000001002694010/?gad1=&gad2=g&gad3=&gad4=56278881131&gad5=13765655425324558519&gad6=&gclid=EAIaIQobChMI1PyDyYyV6gIV2cEWBR2-eAoPEAQYAyABEgIWoPD_BwE&xfr=pla) | ¥13,808 | [Tsukumo ex.](https://tenpo.tsukumo.co.jp/stores/view/ex) |
|  | 合計 |  | ¥103,777 |

（目標より4000円オーバーした。。。）
※ SSDは修士の時とある先生にもらったCrucialのSSD（128GB）を使うことにしたため、その分は入れていない。

用意したパーツの一覧写真
![IMG_3275.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/1f66d912-20f1-adbc-6f62-a53aaa5c6adf.jpeg)

パーツ選定には3日くらいかけた。自作PCを作った経験がある友人に聞きつつ、ネットやお店や調べて選定した。いつも通りAppleのnote appを使ってメモして比較しました。

マザーボードをCPUと一緒に買うことで、Tsukumo ex.で1000円（税別）の割引をしてくれた。Tsukumo ex.というのは秋葉原のPCパーツショップ。Tsukumoは本店も秋葉原にある。他にもドスパラ、パソコン工房というお店も有名。それらのお店も行った。軽い熱中症になりました。

私は秋葉原のすぐ近くに住んでいるため徒歩or自転車で何回か見に行けたが、秋葉原や新宿のようなPCショップが充実した場所から遠い人はこの記事などを参考にしてもらってネットで買った方が交通費もかからないし何より楽だと思う。（まあ当然、交通費や労力を気にしなければ実店舗に見に行くに越したことはない。）


## 1. GPU
どうしても8GB欲しい！ということで値段も手頃なところでRadeon RX 5700かGeForce RTX 2060あたりで考えた。Radeonの方が安いが、ドライバの安定性や信頼性を考えてGeForceを選んだ。
![IMG_3280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/954babf5-62a7-4571-65db-db645234167a.jpeg)

## 2. CPU
本当はRyzen 3300Xにしたかったのだが、ネットも店舗も売り切れで、仕方なく3100にした。3300Xの方がクロック数が高く、3.8Hzもある。3100は3.6Hz。ただ3100も4コア8スレッドなため、次点には収まった。
![IMG_3281.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/43fcf4e6-3b9a-f226-a0db-f546b117ebcd.jpeg)

## 3. メモリ
普段メモリ16GBのMacBookProを使っていて、16GBで十分かなと思ったので16GBで揃えた。
![IMG_3277.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/71180185-a04b-2f49-42a0-9ee7b49ed8a8.jpeg)

## 4. Cドライブ用ストレージ
Cドライブは速度的にSSD一択。HDDの起動スピードには戻れない。ディープラーニングではストレージの読み書きスピードよりも計算スピードの方がボトルネックになるので、システムが乗ればいいやということで128GBで良しとした。


## 5. Dドライブ用ストレージ
画像などの重いデータセットをいくつか保存するので、値段とのバランスを見て6TBにした。後で追加もできるが最初は6TBあれば十分だろう。

## 6. マザーボード
AMDのCPUが動作するマザーボード選んだ。下の画像は[重視でAMD Ryzenを組むならこれ！マザーボード3選 (1/4)](https://amd-heroes.jp/article/2019/03/0146/)からスクショさせていただいた表。
<img width="895" alt="Screen Shot 2020-06-17 at 23.20.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/8976bb7c-0643-4764-9492-bbb8c49f48d7.png">
自分にとってはマルチGPUにできるかどうかが一番の違いになりそう。また、CPUが最初に対応するのはB450で、A320は廉価版という扱いのようだ。GPUはほとんどのマザーボードで使えるらしい。
![IMG_3276.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/3fba92c0-49b4-f781-5d84-fa7096a6a919.jpeg)

## 7. 電源ユニット
最大消費電力を計算します。CPUが65W、GPUが175Wで合計240Wなので、他諸々入れてもだいたい300W。で、かなり安全を見て550Wにした。
![IMG_3282.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/fa346af6-bee0-d025-cb84-4d9f764c7f58.jpeg)

## 8. ケース
ケースを買うときには、特に対応マザーボードを確認する。だいたいはATX、microATX、Mini-ITXなのか、microATX、Mini-ITXのみなのかである。後者の場合にはATXというマザーボードの規格は使えない。

価格帯は3000円〜30000円くらいと幅広い。マイクロタワーは普通のWindowsデスクトップPCみたいなサイズ。ここの価格帯は分からないが他のサイズより安め。ミニタワーなら3000円〜10000円、ミドルタワーなら3000円〜20000円、フルタワーなら7000円〜30000円みたいな価格レンジ。

# 組み立て
今回購入したPCケースに全てのパーツを組み立てた。自作PCを組み立てたことがある友人に手伝いに来てもらったにもかかわらず、計7時間くらいかかった。結構疲れる。そしてどのケーブルがどれに接続されるべき、という感覚が友人にはあるようだったが筆者には無かったため、経験があるとかなり楽に自作PCを作れそうだと感じた。

組み立てには当然ながら工具も必要である。と言っても、プラスドライバーさえあれば大抵の場合大丈夫なようだ。今回も例に漏れずプラスドライバー、あとハサミがあればOKだった。

プラスドライバーが短すぎて回すのに苦労することがあったため、長めのプラスドライバーがあるといいかも
![IMG_3299.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/c9b8b46b-639f-822d-9557-5753384ddf7d.jpeg)


友人と組み立てている様子
![IMG_3287.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/245d8807-806a-4054-8d15-aea1c3e43868.jpeg)

フロントパネルを開けた状態
![IMG_3295.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/8160e9db-58e8-f092-fad3-533ba86fa76b.jpeg)


PCケースのフロントパネルが開かずにかなり苦労した。15分くらい格闘していたが、ググって出てきたYouTubeの動画[Building a full Gaming PC inside the Lian Li LANCOOL ONE R7 3800X RTX 2080 Super - Time Lapse](https://www.youtube.com/watch?v=jFpIbGSSI9Q&t=144s)を見て開け方が分かった。説明書的なものがついていないし、オンラインのマニュアルにもフロントパネルの開け方は書いてなかった。あの動画も英語だしググり方が甘い初心者には無理ゲーだったと思う。


# Ubuntuを入れてDockerを使う
## Ubuntuをインストール

まず、USBメモリにUbuntuを入れる。[MacでUbuntu18.04LTSのブートUSBを作成する](https://qiita.com/hktmtsk/items/0bacdd144365c2da1165)を参考にした。

# nvidia-driverをインストール
Ubuntuインストール後にGIUでのログインロープ地獄にハマったので、ctrl + alt + F3でターミナルに移動する。

どのnvidia driverが必要かを[NVIDIAドライバダウンロード](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)で確認。自分の場合はGeForce 2060でLinuxだったためそのように選択すると次のページに移る。[LINUX X64 (AMD64/EM64T) DISPLAY DRIVER](https://www.nvidia.co.jp/Download/driverResults.aspx/159364/jp)

どうやらnvidia-driver-440を入れればいいらしい。インストール後に再起動
`sudo apt install nvidia-driver-430`
`reboot`
すると、再起動後に無事にUbuntuのGUIホーム画面が出た。

## sudo apt updateでエラー
まさかここでエラーが出るとは。
https://ts0818.hatenablog.com/entry/2018/01/08/094444 を参考に
`sudo rm /var/lib/apt/lists/lock`
`sudo rm /var/lib/dpkg/lock`
をすると、
`sudo apt update`
がすんなり通った。ついでに
`sudo apt upgrade`
もしておく。


## ssh接続
以下の記事を参考にした。
[自宅のUbuntuサーバに外からsshでアクセスする](https://futurismo.biz/archives/6862)

自分の場合はMacからUbuntu（今回作成したコンピュータ）にssh接続する。
Ubuntuの方で
`hostname -I`
とすると、
`192.168.1.5 172.18.0.1 240d:1d:...`
のような結果が表示される。この場合であればMacで
`ssh username@192.168.1.5`
とする。usernameはUbuntuの方で最初に設定したもので、だいたいはあなたのfirst nameとかlast nameにしているだろう。パスワードを求められるので、入力してEnterを押せばssh接続ができる。


## Dockerを入れる
[DockerでDeep Learningなどの環境をドカドカ構築](https://qiita.com/verb55/items/61b7e1a924f854bc0b9c)
[Docker(19.03)でgpu有効化してpytorchで訓練するまでやる(Ubuntu18.04)](https://qiita.com/tomp/items/50081b99df7963462488#pytorch%E3%82%92%E3%83%93%E3%83%AB%E3%83%89) の「pytorchをビルド」
[Python3.7.3 と jupyterLab を入れたコンテナの作成](https://qiita.com/yasthon/items/a47baa2a11d515a82b17)
を参考にした。

同じディレクトリに`docker-compose.yml`, `Dockerfile`, `jupyter_notebook_config.py`を保存する。各ファイルは以下のように書いた。dockerは初心者なので無駄なコードが結構あると思う。

docker-compose.yml

```yaml
version: "3"
services:
  jupyter-lab:
    build:
      context: .
    environment:
      - USERNAME
      - JUPYTER_HOME=/mnt/jupyter
    image: jupyter-lab
    volumes:
      - /etc/passwd:/etc/passwd:ro
      - /etc/group:/etc/group:ro
      - /home:/home
      - ./:/mnt/jupyter
    ports:
      - "127.0.0.1:8888:8888"
```

Dockerfile

```Dockerfile
FROM pytorch/pytorch

# Install required libraries
RUN conda config --add channels pytorch \
 && conda config --append channels conda-forge \
 && conda update --all --yes --quiet \
 && conda install --yes --quiet \
    ipywidgets \
    jupyterlab \
    matplotlib \
    nodejs \
    opencv \
    pandas \
    scikit-learn \
    seaborn \
    sympy \
 && conda clean --all -f -y

# Install jupyter extensions
RUN jupyter nbextension enable --py --sys-prefix widgetsnbextension \
 && jupyter labextension install @jupyter-widgets/jupyterlab-manager

COPY jupyter_notebook_config.py /root/.jupyter/

WORKDIR /workspace
```

jupyter_notebook_config.py

```python
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.port = 8888
c.NotebookApp.open_browser = False
c.NotebookApp.allow_root = True
c.NotebookApp.password = 'sha1:xxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

sha1:xxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxの部分は、ssh-keygenで得られた認証鍵です。そのへんは「ssh-keygen　jupyter」とかでググれば出てくると思います。

上記のファイルが保存してあるディレクトリに移動し、以下のコマンドを実行していきます。
`$ docker-compose build`
`$ docker run -d --rm --gpus all -v ~/ddrive/workspace:/workspace --shm-size=16g -p 8888:8888 --name pytorch jupyter-lab jupyter lab`

`docker-compose build`は実行に結構時間がかかる。

`-v ~/xxx:/xxx`は、ホストとdocker内でストレージを共有したい時に書く。筆者はworkspaceというディレクトリがあるので同じworkspaceディレクトリをdocker内で作成しworkspace以下を共有するようにした。

# Docker上のjupyterlabでGPUの認識を確認
`nvidia-smi`で無事にGPUを認識していることを確認した。
<img width="1435" alt="Screen Shot 2020-06-22 at 18.43.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/5d33aebb-e78c-b75a-4a32-209eb152d8aa.png">

75℃まで上がった。ファンはぶんぶん回っているのだが。。
![IMG_3304.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67762/8cb6b3dc-bc23-2de7-2861-c1398453ed6e.jpeg)
上記のソフトは`apt install psensor`とかでインストールできる。


# Dockerを使わない（Pyenvを使った）セットアップ
## cudaのインストール
nvidiaのインストールで失敗して再インストールを余儀なくされた。BIOSから入ってUbuntuをインストールし直した後、[Ubuntu 18.04へのCUDAインストール方法](https://qiita.com/yukoba/items/4733e8602fa4acabcc35)の通りにやったらうまくいった。

## D Driveをマウント
マウントは[Linuxでのマウントに必要なコマンド](https://pctrouble.net/knowledge/linux_mount.html)を参考にした。

## Google Chromeを入れる
ここは好み。

## Pyenv、anaconda、pipで機械学習の実行環境を作る
タイトルの通りで、これらの単語でいい感じにググればやり方は出てきます。


# まとめ
10.4万円くらいで自作PCを作れた。PCショップで既存PCのスペックと値段をいくつか見た感じ、__既製品を買うより数万円以上安く__済んでいるはずである。パーツ選定から購入、組み立てまで短く見積もって1週間は見た方がいい。

また、__組み立ては初心者には難しい__と感じた。経験のある友人に聞いたり手伝ったりしてもらうか、ググりまくって自己責任で頑張るかになる。筆者の場合はパーツ選定から自作PCを組み立てたことがある友人に聞いていたので比較的スムーズに進められた。