機械学習のためのGPUサーバー構築手順

こんにちは、けんご(@N30nnnn)です。

度々行っている、機械学習のためのGPUサーバー構築。
備忘録としてこのページでは、外部からssh接続できるGPUマシンの構築手順を記載します。

Ubuntu 16.10 以降を対象にしてます

ubuntuインストール

まずはubuntuのインストール。
インストールUSBメモリを用いてインストールディスクを作成して行います。

  1. 公式からイメージをダウンロードし、インストールディスクを作成する
  2. イメージをUSBに書き込む
    1. Windows
      1. Universal USB Installer
        • イメージのダウンロードまでアプリ内で完結してくれるのでオススメ!
      2. Rufus
      3. ImgBurm
    2. Mac
      1. Etcher
  3. UBSを指し、BIOSからUSBのインストーラーを起動し、手順に乗っ取りインストール

ネットワーク

まずはプロバイダーと固定IPを契約します。

その上で外部からssh接続できる様にするため、2箇所設定を施します

サーバーのローカルIPアドレス固定

次にサーバーのローカルIPアドレスを固定します。

ローカルIPアドレスは有効な範囲で好きなアドレスを設定できますが、他の機器に現在割り振られているアドレスを避けたりなど細かいことを考えなくて良いように、ここでは現在割り振られているアドレスに固定することを目指します。

まずは、現在繋がってる動的IPの情報を確認。

下記サンプルのうち、 以下項目を確認

  • XXXXX : ネットワークインターフェース名
  • inet 192.168.yy.yy : 現在のローカルIPアドレス
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: XXXXX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd xx:xx:xx:xx:xx:xx
    inet 192.168.yy.yy/24 brd 192.168.zz.zz scope global noprefixroute XXXXX
       valid_lft forever preferred_lft forever
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever

次に、ローカルIPアドレスを固定する為にnetplanの設定ファイルを追加します

$ sudo vi /etc/netplan/99-netcfg.yaml

network:
  version: 2
  renderer: NetworkManager
  ethernets:
    XXXXX:
      dhcp4: false
      dhcp6: false
      addresses: [192.168.yy.yy/24] # <- 先のローカルIPアドレスを記載. ネットマスクに合わせて`/24`は変える
      gateway4: 192.168.11.1        # <- プロバイダーから提供されたGWアドレス
      nameservers:
        addresses: 
         - 192.168.11.1             # <- プロバイダーから提供されたDNSアドレス
         - 8.8.8.8

最後に設定を反映

$ sudo netplan apply

外部疎通のためのルーティング設定

ルーターに施す設定はルーターのメーカー毎に違います。 静的IPマスカレード とか アドレス変換 仮想サーバー ポート開放 あたりのワードで調べてみてください。

参考までにいくつかのメーカーの設定方法をリンク記載します

ファイアウォールの設定

このでは ufw を用いてファイアウォールを設定します。

# インストールされてない場合
$ sudo apt update
$ sudo apt-get install ufw 

$ sudo ufw disable 
$ sudo ufw default deny
$ sudo ufw allow ssh
$ sudo ufw enable

NVIDIA Driver/CUDAインストール

ドライバ・CUDAはapt経由でインストールします (これがが楽と公式も言ってる)

https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-the-nvidia-driver

方法1

# インストールできるドライババージョンを一覧
$ sudo ubuntu-drivers devices

# recommendバージョンをインストール
# 備考: ドライバインストール時にセキュアブートが有効になってるとMOK用のパスワード設定を要求される。
# MOKの説明はここでは省くが、パスワードは次回再起動時に入力する
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt install nvidia-driver-470

# !注意! 
# この再起動からの復帰時、一時的にssh接続できなくなるため
# リモートで行わないこと(MOKをenableしてパスワード入力する必要がある)
$ sudo shutdown -r now

方法2

公式のインストーラーページ から、該当する環境の deb[network] の手順書を参照

下記には Ubuntu 20.04 用のインストールコマンドを記します。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
$ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
$ sudo apt-get update
$ sudo apt-get -y install cuda-drivers
$ sudo apt-get -y install cuda

Dockerインストール

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
$ sudo apt update
$ apt-cache policy docker-ce
$ sudo apt install docker-ce

$ sudo usermod -aG docker # dockerグループを作成することで、dockerの呼び出しにsudoが不要化可

開発者ユーザーの追加

1. 開発者にsshキーペアを生成してもらう

$ ssh-keygen -b 4096

2. ユーザを発行する

発行とともに下記を行います

  • デフォルトディレクトリの作成
  • 公開鍵の登録
  • グループへの追加

を行う

$ sudo useradd -m [username] -s /bin/bash
$ sudo usermod -aG docker [username] # dockerグループに開発ユーザーを追加することで、docker呼び出しにsudoが不要化
$ sudo passwd [username]
$ sudo vi /home/[username]/.ssh/authorized_keys # もらった公開鍵を記述
$ sudo chown [username]:[username] /home/[username]/.ssh/authorized_keys 
$ sudo chmod 400 /home/[username]/.ssh/authorized_keys
$ sudo su [username] && poetry config virtualenvs.in-project true