56
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

ディープラーニング用に自作PCを作る

自作PCの備忘録を残します.

最終的に,Ubuntuをインストールしてdockerでディープラーニング環境を作るところまでを記します.

目次

  1. 自作PCの作り方を調べる
  2. PCを組み立てる
  3. 環境構築

1. 自作PCの作り方を調べる

用途に応じてスペックを決めるのが良いようです.

  • 前処理を頻繁に実行するので,CPUのコア数は多めに
  • GPUを増設したくなったときのために,大きめの電源とケースにしておく

検討した結果,次のような構成にしました.

作ったもの

CPU Core i7-9700K 45,000円
GPU GeForce RTX2080Ti 11GB GamingPro OC 89,000円(中古)
マザーボード ASUS PRIME Z390-A 22,000円
メモリ Kingston FURY RGB(DDR4 2666MHz 16GBx2) 20,000円
ケース O11 DYNAMIC WHITE 14,000円
電源 Corsair HX1000i 25,000円
SSD Intel SSD 660P 13,000円
HDD SEAGATE ST6000DM003 11,000円
簡易水冷ファン Novonest CC240RGB 7,000円
無線LANカード Ziyituod ZYT-WIE9260 4,000円
ケースファン Ubanner RB001 4,500円

合計 254,500円

※最後のケースファンはLEDで楽しむためのものなので,特に必要ありません.

下調べをあまりせず「えいや!」で買ってしまいましたが,後述のようにもっと調べるべきでした

その他買ったもの

RGBファンのコントローラ Fractal Design Adjust R1 3,000円

これは,アドレサブルRGBという規格に対応していないマザーボードを買ったにも関わらず,アドレサブルRGBの簡易水冷ファンを買ったせいで買う羽目になったものです.(同じ失敗をしないようご注意を…)

熱伝導グリス ThermalGrizzly 750円

検討したこと・反省点

  • コア数だけ見るとXeonThreadripperもあるようですが,とても手が出ませんでした.

  • Intel 9900kRyzen 3900Kも検討しましたが,価格や冷却を考慮する必要がありそうでしたので,楽そうなCore i7にしました.

  • GPUを中古で買うのは推奨されていないので,新品を買うべきでした….多少のリスクは受け入れつつ,人柱になったつもりで使い続けてみます.

  • GPUは上を見ればTitan RTX, Tesla V100などありますが,高額だし私には使い切れる気がしません.

  • 正直,ディープラーニングを回すだけならもっと安く作れたはずです.

    • 簡易水冷をやめて空冷にする
    • メモリを普通の(光らない)ものにする
    • CPU, GPUをコスパのよいものにする
    • GPU1枚を前提にして,電源やケースを小さめのものにする
    • SSDの容量を減らす

等々,色々無駄が省けそうです.

2. PCを組み立てる

マザーボードの説明書を熟読しつつ,こちらを参考に組み立てました.

  1. CPUをマザボに取り付け
  2. CPUクーラー(今回は簡易水冷)をマザボに取り付け
  3. メモリの取り付け
  4. SSDの取り付け
  5. 電源を繋いで動作確認
  6. ケースにマザボを取り付け
  7. ケースに水冷ファンを取り付け
  8. 電源の取り付け
  9. HDDの取り付け
  10. GPUの取り付け
  11. 無線LANカードの取り付け
  12. ケースファンの取り付け
  13. 配線
  14. 電源を入れて動作確認(CPU温度やファン回転数が正常値に収まることを確認)
  15. 綺麗なLEDに満足してビール飲んで寝る

pc_image

3. 環境構築

3.1 Ubuntu 18.04.4 LTSをインストール

3.2 グラフィックドライバのインストール

Ubuntuを日本語でインストールした場合は,ドキュメントなどの日本語を英語に直しておきます.

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

パッケージを更新

terminal
sudo apt-get update
sudo apt-get upgrade

NVIDIAドライバダウンロードから対応するドライバを選択してダウンロード

ダウンロードしたファイルの実行に必要なものをインストール
sudo apt-get install build-essential

ドライバのインストール中にグラフィックドライバが落ちることがあるので,念のためCtrl+Alt+F1でCUIに切り替えます.(Ctrl+Alt+F2などで切り替わる場合もあるようです.それでもダメならファンクションキーを3~12に変えてみる)
この時, --no-opengl-files, --no-libglx-indirect, --dkmsを指定します
--noうんたらの指定が足りないとログインループにハマったり,--dkmsが足りないと再起動するたびにnvidia driverが無効になったりします.

ダウンロードしたファイルを実行
chmod +x ./NVIDIA-Linux-x86_64-440.31.run
sudo ./NVIDIA-Linux-x86_64-440.31.run --no-opengl-files --no-libglx-indirect --dkms
再起動
reboot

(モニタをマザボに接続している場合は,グラボの端子に繋ぎ変える.)

ドライバの動作確認
nvidia-smi

GPUの情報が表示されれば完了

3.3 dockerインストール

公式にしたがってインストール.2019年11月4日時点では以下のコマンドを実行しました.

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

sudoなしでdockerコマンドを実行する設定もしておきます.

sudo groupadd docker
sudo gpasswd -a $USER docker
sudo service docker restart
reboot

3.4 nvidia-dockerインストール

NVIDIA Container Toolkitにしたがってインストール.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

以下のコマンドでGPUの情報が見えたら成功です.

docker run --gpus all --rm nvidia/cuda nvidia-smi

3.5 dockerイメージで動作確認

tensorflow公式のdocker imageを動かしてみます.

docker pull tensorflow/tensorflow:1.14.0-gpu-py3-jupyter
docker run --gpus all -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:1.14.0-gpu-py3-jupyter

jupyterが起動したらブラウザでlocalhost:8888に接続

tensorflowからGPUが見えているか確認します

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices()) 

以下のようにGPUが見えていれば成功です.

output
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14740279898702566726
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 10721268506091676345
physical_device_desc: "device: XLA_GPU device"
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 16980550380766421160
physical_device_desc: "device: XLA_CPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 10512030106
locality {
  bus_id: 1
  links {
  }
}
incarnation: 10531017116676756003
physical_device_desc: "device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5"
]

3.6 MNIST

いよいよディープが回せます!

簡単なCNNでMNISTを回してみます.

!pip install keras

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, MaxPooling2D, Conv2D
from keras.callbacks import TensorBoard

(X_train,y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(60000,28,28,1).astype('float32')
X_test = X_test.reshape(10000,28,28,1).astype('float32')

X_train /= 255
X_test /= 255

n_classes = 10
y_train = keras.utils.to_categorical(y_train, n_classes)
y_test = keras.utils.to_categorical(y_test, n_classes)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)) )
model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())          
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(n_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

import time
start = time.time()

model.fit(X_train, y_train, batch_size=128, epochs=15, verbose=1,
          validation_data=(X_test,y_test))

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
output
elapsed_time:65.47733306884766[sec]

Google ColaboratoryのGPUはランダムに割り当てられるのですが,P100を引いたときは62秒でした.

20万以上使ったPCが,無料のColaboratoryに負けてしまうのは悲しい気もしますが,時間制限もありませんし,レスポンスも早く,好きに拡張できるのは大きなメリットになりそうです.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
56
Help us understand the problem. What are the problem?