GPU環境のPCを自作し、外出先から利用したい
昨今、ディープラーニングが流行っておりますが、ディープラーニングが利用できるようになったのには計算速度の向上、とりわけGPUの性能向上が大きな要因です。
仕事柄GPUを使ってディープラーニングのモデルを作ることが多いのですが、自宅で個人的にディープラーニングのモデルを作りたいなと思うとまずはGPU環境を用意しなければなりません。
最近はAWS(Amazon Web Service)やGCP(Google Cloud Platform)にGPU環境が用意され、わざわざ自分でGPUありのマシンを購入したりしなくても、クラウドサービス上でGPUを利用した分だけ課金される仕組みができあがっており、かなりGPU環境の利便性はあがっております。
ただ、まだまだGPU環境は、CPU環境に比べて値段が高く、誤ってGPU環境で計算を回したまま消し忘れると、翌月に数十万円の請求がくるなんていう恐ろしいことにもなりかねません。ということで、自分でGPUマシンを自作しようということを考えました。
ただし、家にGPUマシンをおいてしまうと家でしか作業ができなくなってしまいます。個人的には家にいるとだらけてしまってあまり作業がはかどらないので、喫茶店などで作業しながら、外出先から自分の家のGPU環境にアクセスしたいと考えたわけです。要はクラウドのようなサーバー環境を自分専用に作るということです。
Linux(Ubuntu)PC自作からサーバー化するまでの流れ
UbuntuPCを自作し、サーバー化するまでの流れとその際に参照したサイトのリンク集をざっと書きます。ほぼ自分の備忘録なので、参考程度にしていただければと思います。
PCパーツの購入
まずはPCを制作するためのパーツを購入する必要があります。
パーツの購入に関しては別ブログにまとめましたのでそちらを参照願います。
PCの組み立て
次にPCの組み立てになります。PCの組み立ては多くの人が記事にされているので、色々検索してわかりやすいサイトを利用いただければと思います。
参考までに私が参照したサイトはこちらになります。
自作パソコンの組み立て方
自作PCの作り方
OS(Ubuntu)のインストール
ハードウェア部分が作成できたら、次はOSのインストールになります。
OSには、Windows, MacOSなどありますが、サーバー系だったらLinuxでしょうというのと、Linux系OSの1つであるUbuntuがフリーなので、Ubuntuをインストールすることにします。
OS(Ubuntu16.04LTS)の取得
最新のUbuntuOSは以下の公式ページで無料で配布されています。
サーバーを作るのですが、自宅用なのでDesktop版をダウンロードする形で良いと思います。
https://ubuntu.com/download/desktop
ただ、私は個人的な事情により少し古い16.04LTSのOSが欲しかったので、探したところこちらのサイトで取得できることがわかりました。
https://www.ubuntulinux.jp/News/ubuntu1604-ja-remix
OS(Ubuntu16.04LTS)のインストール
OSが取得できたのでインストールします。ところが私が自作したPCにはDVDなどを入れるドライブがありません。(今どきレンタル動画はNetflixとかで見れるし、できるかぎり安く、小さくしたいと思ったのでDVDドライバはつけませんでした。)
なので、OSのインストールはUSBを使って行います。
ということでこちらの「USBメモリからUEFIモードでUbuntuをインストールする」というサイトを参考にインストールしました。
インストールメディアの作成
USBを使ってUbuntuのインストールメディアを作成するのですが、普通にUSBにダウンロードしたUbuntuOSをコピペするだけではBiosがうまく認識してくれません。
私は別PCとしてMacを利用していたので、Macを使って、BiosがBootableなUSBインストールメディアを以下のサイト参考に作成しました。
MacでBOOTABLE USBを作成する!【USBブート】
nvidia driverのインストール
ここまではそれなりに順調だったのですが、USBインストールメディアを使ってUbuntuOSの画面から「Try ubuntu without installing」を押すのですが、何度インストールしようとしても黒い画面しかでません。
悩んだ挙げ句、画面に何も表示されないので、グラフィックボードが原因ではないかと思い、GTX1660を外し、マザーボード付属のグラフィックカードにHDMIをつなげて「Try ubuntu without installing」したところ。。。うまくいった!!
けどそれじゃあ意味がない!
同じ事象で悩んでいる人がいないかと思い調べたところこちらのページで同じような悩みを抱えている人を見つけました。
発生トラブル1:https://forums.ubuntulinux.jp/viewtopic.php?id=18592
発生トラブル2:https://forums.ubuntulinux.jp/viewtopic.php?id=18639
GPU(GTX1660Ti)が新しいことが原因だったようなので、nvidia driverのサイトに行き、対応するnvidia driverをインストールしてようやく解決することができました。
対応するnvidia driverはnvidiaの公式サイトの以下のページで調べることができます。
対応nvidia driverの検索:https://www.nvidia.co.jp/Download/index.aspx?lang=jp
nvidia driverのインストールは以下の2つのサイトを参照しながら行いました。
インストール方法1:https://qiita.com/conta_/items/d639ef0068c9b7a0cd12
インストール方法2:http://pynote.hatenablog.com/entry/env-install-nvidia-driver-on-ubuntu1604
LANの設定
ようやくPCができあがったので、ここからネットワークの設定になります。
ネットワークには、ルーターから内側のLAN(Local Area Network)の世界とルーターより外側のWAN(World Area Network)の世界に大きくわかれます。
この違いを理解しないとグローバルIPアドレスとローカルIPアドレスの違いやDNSがやっていることがわからなくなるので、よく理解してください。
NICの認識
自作したUbuntuPCをネットワークにつなげようとしたのですが、何故かWifiは認識するのに優先LANは認識してくれないという自体が起こりました。原因はUbuntuがNIC(Network Interface Card)を認識していないためのようでした。
以下のサイトを参考にNICを認識させる処理をしました。
UbuntuでNICを認識しない場合の対応
UbuntuでNICを認識しない場合の対処法
ssh接続設定
優先LANが無事につながったので、ローカルエリア内で、クライアントPCからUbuntuPCにssh接続することを試みます。
私はクライアントPCとしてMacを使用しているので、ターミナルの画面からsshコマンドでアクセスします。(Windowsはどうやるかわかりません。)
ssh接続に関してはこちらのサイトを参照してください。
MacのTerminalで「 ssh 接続名」で SSH 接続
ここまでくれば、家の中(同じネットワーク)にいればローカルIPアドレスを入力することで、UbuntuPCにアクセスできるようになっているはずです。
WANの設定
LANの世界でUbuntuにアクセスできるようになったので、ようやくWANの世界に入ります。
全体的な流れはFuturismoさんのサイトを大いに参考にさせていただきました。同じことをやろうしている人ってやっぱりいるんですね。
自宅のUbuntuサーバに外からsshでアクセスする(以下、Futurismoリンク)
ローカルIPアドレスの固定
放っておくとUbuntuのローカルIPアドレスがころころ変わってしまいますので、まずはローカルIPアドレスを固定してあげます。
以下の2サイトを参考にローカルIPアドレスを固定しました。
Ubuntu 16.04 LTS の NIC に固定 IP アドレスを振る
[Ubuntu]ローカルIPアドレスを固定にする(18.04/16.04)
ルーターのポート転送設定
次にルーター側のポート転送設定をする必要があります。
これはルーターにより設定方法が異なるので、自分のルーターが何かを確認してそれに合った設定を行う必要があります。私の場合はソフトバンクBBのルーターでしたので以下のサイトからアクセスして設定を行いました。
光BBユニット:http://ybb.softbank.jp/support/connect/hikari/router/bbu23-menu.php
光BBユニットのルーターのポート転送設定はこちらのリンクを参照に行いました。
無線LAN内蔵E-WMTA2.3のポート開放手順の説明
サーバー側のポート開放(ufwによるfirewallの無効化)
ルーターのポート転送ができれば、次にサーバー側(Ubuntu)のポートを開放してあげる必要があります。Ubuntuのポートを開放させるにはufwというコマンドを使って開放します。
以下のサイトを参考にしました。
Ubuntuのポート開放方法(ファイアウォールを設定する)
sshポートの開放
sshポートを上記の方法で開放するのですが、一般的に使われるsshポート22番を開放していると、他の人に気づかれて簡単にsshアクセスされかねないので、sshポートの番号を変更しておきます。(ちなみにsshアクセスはかなり強力なアクセスなので、sshでアクセスされて、「sudo rm -rf /」なんていうコマンドを打たれたらすべてのデータが消去されてしまいますので要注意です。)
sshポート番号の変更はこちらのサイトを参考にしました。
SSHのポート番号を変更 – SSHサーバーの設定
上記のポート番号設定におけるSSH設定ファイル(/etc/ssh/sshd_config)の変更だけではうまくいかなかったので、/etc/serviceの書き換えも行いました。/etc/serviceの書き換えはFuturismoさんのリンクを参照にしました。
ssh port を 22から 10022に変更する {#ssh-port-22-10022-}
これで、portが開放されたことになります。
portが開放されたかどうかは以下のサイトのツールを使ってチェックすることができます。
portCheckTool: https://www.portchecktool.com/
DDNSの設定(NOIPによるグローバルIPアドレスとドメインの紐付)
無事portを開放できましたが、現時点ではグローバルIPアドレスはDHCPにより、コロコロと変わってしまいます。ローカルIPアドレス同様にグローバルIPアドレスも固定したいのですが、グローバルIPアドレスを固定しようとするとプロバイダと有料契約する必要があることが多いです。
なんとか無料でできないかと探していると。。。DDNS(Dynamic DNS Service)という方法がありました!!
DDNSには有名どころが3つあるようで、こちらのサイトでまとめてくれています。
DDNSの無料サービスでオススメな3つの「ieServer」「mydns」「No-IP」の特徴と利用手順をまとめてみた
私はドメインの種類が最も多いというところと、何となくページのデザインがお洒落でいいなとおもったので、NOIPにすることにしました。(しょうもない理由ですみません)
NOIPを入れる手順はこちらを参考にしました。
Ubuntu 16.04 に noip を入れる
Setup Your No-IP Account
このSetup Your No-IP Accountで1つポイントがあります。
綺麗なお姉さんが解説してくれているのにしたがって、ふむふむと思いながら進めていくのですが、「Device Name」「What device are you using?」「What router are you using?」という項目が出てきたところで、何を入力すればいいんだ?となります。
最新のNo-IPのページでは動画と異なり、プルダウンではなく入力形式になっており、余計に困ります。
結論から言うと、ここは何を入れても大丈夫です。適当にsoftbankとかいれておけば問題なく設定できます。何に利用しているんかよくわかりませんが。。。
何はともあれ、これでドメインも取得することができ、晴れて外出先からssh接続が可能となりました。
Jupyterをリモート利用
最後に、別に必要ないのですが、個人的にサーバーへ外出先からアクセスして、pythonのプログラムを書きたいので、jupyter notebookをUbuntuで立ち上げておき、そこにリモートでアクセスしようと思います。
Jupyter notebookをリモートサーバーで実行する際の手順はこちらを参考にしました。
Jupyter Notebookをリモートサーバで実行する
jupyter notebookは立ち上げるポートを適当に設定(こちらのページでは9999)し、そのポートを上記の方法と同様に、ポート転送、ポート開放してあげれば無事アクセスすることができます。
おすすめ書籍
Linuxサーバー構築時に私が参考にした書籍こちらです。サーバー構築に必要な基本的な知識がわかりやすく書かれているので非常に参考になります。サーバー構築に興味がある方はぜひ読んでみてください。
その他参考サイト
- ログイン後「システムプログラムの問題が見つかりました」メッセージダイアログが表示される場合:https://jands-innovation.com/memorandum/linux-memorandum/6661/
- shutdownコマンド:https://eng-entrance.com/linux-shutdown
- 新しいHDDを認識させる:https://elsal.hatenadiary.org/entry/20090311/1236779413
- Ubuntuの初期設定とHDDのマウント:https://qiita.com/makomi/items/21e9cc9347a5df29b406
- グローバルIPとローカルIPアドレスの違い:https://viral-community.com/other-it/global-private-ip-2004/
- ネットマスクとは:https://wa3.i-3-i.info/word11983.html
- DNSネームサーバーとは:https://zenlogic.jp/user-support/knowledge/domain/nameserver.html
- ネットワーク環境の確認:https://www.atmarkit.co.jp/ait/articles/0109/29/news004.html
- NO-IPのSystemctlの設定ファイルはここを参照:https://gist.github.com/NathanGiesbrecht/da6560f21e55178bcea7fdd9ca2e39b5
- WIFIが二重ルータになっているときの確認方法:https://internet.watch.impress.co.jp/docs/column/homewifi/1142213.html
- tracerouteの使い方:https://www.atmarkit.co.jp/ait/articles/1709/15/news016.html
- sudoからuserに戻すときのコマンド:https://webkaru.net/linux/su-command/
- /etc/servicesって何に使われているのだろ?:https://yohei-a.hatenablog.jp/entry/20101127/1290875267
コメント
[…] PCを自作したいなと思った背景はこちらを参照ください。参考:Linux(Ubuntu)PCを自作し、サーバー化するまでの流れ […]