Ubuntuで機械学習用リモートサーバの構築

OS が入っていない空のサーバをリモートで使えるようにしてほしいと頼まれたので,いろいろ参考にしながら構築しました.

大まかに説明すると,Ubuntu の入った USB を使って OS をインストールしてからネットワークの設定やドライバ,パッケージのインストールを行って SSH で使えるようになればゴールです.

(Windows ユーザーの場合)下記の説明では macOS のターミナルを用いて説明していますが,Windows の PowerShell などは一部のコマンドが対応していません.SSH には WLogin, SCP には WinSCP などのソフトウェアを利用することをおすすめします.

インストールメディアの作成

最初に,サーバに Ubuntu をインストールするためのメディアが必要になります.メディアは CD や DVD でも可能ですが,今回は USB メモリを使っています.

TensorFlow は 18.04 にも対応していますが,Chainer はまだのようです.他にも 18.04 に未対応のパッケージがあるかもしれないので,Ubuntu のバージョンは 16.04 LTS で進めていきます.

また,今回はデスクトップ版を使っています.Ubuntu Desktop と Ubuntu Server の違いは最初に含まれているパッケージだけらしいです.

インストールメディアの作成方法は下の記事を参考にしました.

OS インストールの手順

USB でブート

インストールメディアが作成できたら,電源が入っていないサーバに挿して起動します.このとき,USB でブートしなければならないため,起動した直後に一瞬だけ表示される画面で特定のキーを押す必要があります(よく見るのはファンクションキーか Del).

どのキーを押すかはメーカーによって異なるので,目を凝らしてみてください.

本体にインストール

ブートメニューが開けたら USB ドライバのブート順位を上げて再起動します.USB からブートできると GNU GRUB が表示されるので,Try Ubuntu without installing を選択します.

起動後,デスクトップ左上にインストールマネージャーが表示されるはずです.これを利用してサーバ本体に OS をインストールしますが,一点だけデフォルト設定を変更する箇所があります.

インストール方法を選択する画面で「それ以外」を選択し,Ubuntu の利用方法は「ext4 ジャーナリングファイルシステム」,マウントポイントは「/」とします.また,ブートローダのインストール先がサーバの SSD になっていることを確認します.

(Install Ubuntu で進めたところ,ブートローダが入らなかったようで起動できなかった)

Ubuntu の起動順位を上げる

インストールが終了すると,再起動を求められます.電源が落ちてから USB メモリを抜き,再びブートメニューに入って Ubuntu の起動順位を上げます.

その後,設定を保存して再起動すると自動的に Ubuntu が立ち上がるはずです!

イーサネット接続を確認する

まず,有線接続,無線接続を確認し,有線の場合は LAN ケーブルが接続されているか確認します.

次に,Ubuntu 上のターミナルで以下のコマンドを実行し,LAN カードを認識しているか確認します.

terminal
$ ifconfig

アウトプットに lo 以外が表示されていれば,LAN カードを認識できています.認識できていない場合はドライバを入れてください.対応するドライバは以下のコマンドで確認できます.

terminal
$ lspci | grep 'Ethernet/|Network'

ドライバのインストール方法はメーカーごとに異なるのでぐぐってください.

LAN カードが認識できていれば自動的に接続できるはずですが,うまく接続できなかった場合は以下の情報を調べて,手動で入力する必要があります.

  • IP アドレス
  • ネットマスク
  • ゲートウェイ
  • DNS

OS を更新する

イーサネットに接続し,インターネットが利用できるようになったら OS を最新版に更新します.

terminal
$ sudo apt-get update
$ sudo apt-get upgrade

リモート接続できるようにする

Ubuntu Desktop なのでサーバにするためにパッケージをインストールします.

terminal
$ sudo apt-get install openssh-server

ユーザーを作成する

利用するにあたっては sudo ユーザー以外に個人でアカウントを使いたいので,下記のコマンドで sudo 権限なしのユーザーを作成します.作成したユーザーには後から sudo 権限を付与することができます.

terminal
$ adduser <username>

接続可能か確認する

ここまで来たら,サーバに接続できるか確認します.

terminal
$ ssh <username>@<IP address or domain>

NVIDIA GPU を利用する準備

TensorFlow のドキュメントに従って,GPU を使うためのドライバのインストールなどを行っていきます.

terminal# 環境変数設定
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/extras/CUPTI/lib64

# NVIDIAドライバ,CUDAインストール
# Add NVIDIA package repositories
# Add HTTPS support for apt-key
$ sudo apt-get install gnupg-curl
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
$ sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
$ sudo apt-get update

# Install NVIDIA driver
# Issue with driver install requires creating /usr/lib/nvidia
$ sudo mkdir /usr/lib/nvidia
$ sudo apt-get install --no-install-recommends nvidia-410

# Reboot. Check that GPUs are visible using the command: nvidia-smi
# SSH接続は切断されるので,再起動終了まで数分待ってから再接続
$ systemctl reboot -i
$ nvidia-smi

# Install development and runtime libraries (~4GB)
$ sudo apt-get install --no-install-recommends \
        cuda-10-0 \
        libcudnn7=7.4.1.5-1+cuda10.0  \
        libcudnn7-dev=7.4.1.5-1+cuda10.0

# Install TensorRT. Requires that libcudnn7 is installed above.
$ sudo apt-get update && \
sudo apt-get install nvinfer-runtime-trt-repo-ubuntu1604-5.0.2-ga-cuda10.0 \
            && sudo apt-get update \
            && sudo apt-get install -y --no-install-recommends libnvinfer-dev=5.0.2-1+cuda10.0

Python 環境の確認

今回は Python3 を使っていきます.仮想環境を作ってデフォルトの環境を汚染しないようにするため,virtualenv も利用します.

terminal
$ python3 --version
$ pip3 --version
$ virtualenv --version

不足パッケージのインストール

もしバージョンが表示されなければパッケージが入っていないので,インストールします.

terminal
$ sudo apt update
$ sudo apt install python3-dev python3-pip
$ sudo pip3 install -U virtualenv

仮想環境の利用

仮想環境の構築

Python3 が動く環境を作ります.

terminal# ホームディレクトリ直下で作成する場合
<username>@<pc name>:~$ virtualenv --system-site-packages -p python3 ./<environment>

仮想環境の有効化

仮想環境を切り替えると python コマンドで Python3 が立ち上がります.(デフォルトは Python2)

また,pip も pip3 が使われるようになります.

terminal
$ source ./<environment>/bin/activate

仮想環境の無効化

terminal
(<environment>) <username>@<pc name>:~$ deactivate

ログイン時に自動で仮想環境を有効化する

利用するユーザーのホームディレクトリ下の .bashrc を編集して,ログイン後に仮想環境に入るように設定します.有効化のコマンドを記述すればいいだけです.

terminal
# 何らかのテキストエディタで開く
$ vi ~/.bashrc

--------------------------------------------------
source ./<environment>/bin/activate
--------------------------------------------------

TensorFlow (GPU 版) インストール

仮想環境下でパッケージをインストールします.

terminal
$ pip install --upgrade pip
$ pip install --upgrade tensorflow-gpu

インストールできていれば,Python 上から呼び出せます.

terminal
$ python
>>> import tensorflow as tf