Ubuntu 20.04で機械学習用GPUサーバを構築する機会があったのでその手順を公開します。今回は
- 環境を切り分けるためにdockerのコンテナに分析環境を構築
- コンテナ側でGPUを認識しTensorflowを利用
- 外部からコンテナのJupyter notebookに接続
という構成をとっています。
サーバは
- CPU: Core i7 8700K
- Mem: 64GB
- GPU: GTX 1080 Ti x2
- SSD: Samsung SSD 960 1TB
の自作したマシンを利用しています。また、インストールメディア用に中身を消しても良いUSBメモリ(2GB以上推奨)を用意しておきます。
システム構成の検討
GPU分析環境の構築はドライバ、開発環境やフレームワークのバージョン制約が厳しく
「とりあえず最新版を入れる」というやり方は高確率で失敗する
ので事前にどのバージョンをインストールするかを検討しておきます。
今回の構成では
- GPUドライバ: ホストOSからGPUを利用するのに必要
- CUDA: GPU用の並列計算プラットフォーム。ホストOS、コンテナ上に必要
- NVIDIA Container Toolkit: コンテナからGPUを利用するのに必要
- Tensorflow: GPUを利用した機械学習フレームワーク
を使うのでそれぞれ利用できるバージョンを確認しておきます。
GPUドライバ
おススメはNVIDIAが提供しているcuda-driversパッケージを使うことです。「CUDA Toolkit」のページで
- Operating System: Linux
- Architecture: x86_64
- Distribution: Ubuntu
- Version: 20.04
- Installer Type: deb(local)
を選んで”Base Installer”の”Installation Instructions:”のコマンドを見ると現時点では
$ wget https://developer.download.nvidia.com/compute/cuda/11.2.1/local_installers/cuda-repo-ubuntu2004-11-2-local_11.2.1-460.32.03-1_amd64.deb
とありGPUドライバのバージョンは「460.32.03」になることがわかります。
CUDA
並列計算プラットフォームであるCUDAは
- GPUのアーキテクチャ(Compute Capability)をサポートしているか
- GPUドライバが対応しているか
- OSをサポートしているか
- Tensorflowが対応しているか
をもとに決めます。今回は
- GTX 1080 TiのCompute Capabilityは6.1。CUDAの英語版WikiによるとCUDA 8.0以降がサポート
- ドライバ「460.32.03」は最新の「CUDA 11.2.1 Update 1」までサポート
- Ubuntu 20.04をサポートするのはCUDA 11.0以降
- Tensorflow 2.4.0以降であればCUDA 11.0に対応
となっているのでCUDA 11.0-11.2がインストール対象になります。
NVIDIA Container Toolkit
Installation Guideを見るとnvidia-docker2は
- Ubuntu 20.04をサポート
- Docker 18.09以降で動作
とあるのでDocker 18.09以降を入れれば大丈夫そうです。
Tensorflow
- Python 3.5-3.8
- Ubuntu 16.04以降
- Compute Capability: 3.5、5.0、6.0、7.0、7.5、8.0 以降
- TensorFlow 2.4.0以降でCUDA 11に対応
とあるのでTensorflow 2.4.0以降であれば大丈夫そうです。
システム構成
以上をまとめると
- GPUドライバ: cuda-driversパッケージを使い「460.32.03」をインストール
- CUDA: 11.0-11.2をインストール
- NVIDIA Container Toolkit: Docker 18.09以降とnvidia-docker2をインストール
- Tensorflow: 2.4.0以降をインストール
とします。
Ubuntu 20.04.2 LTSのインストール
インストール準備
インストール用のUSBメモリを作成するため別のPC(ここではWindows10のマシン)で
- Ubuntu 20.04のインストールイメージのダウンロード
- インストール用USBメモリの作成
を行います。
まずUbuntuのダウンロードページに行き”Server”(画像の赤枠)をクリックし”Option 2: Manual install”を選択します。
“Download Ubuntu 20.04.1 LTS”をクリックしISOイメージをダウンロードします。
次にISOイメージをからインストール用のUSBメモリを作成します。「Linuxをインストールできる「ライブUSBメモリ」をWindowsで作成する方法【スクリーンショットつき解説】」を参考にインストール用のUSBメモリを接続しISOイメージを書き込みます。
- Rufusのダウンロード
- Rufusの起動
- デバイスの指定: インストール先のUSBメモリを指定[1]指定したデバイスの中身はすべて消去されるので指定ミスを予防するためインストールするUSBメモリ以外はPCから接続を外しておいた方が安心です。
- ISOイメージの選択: ダウンロードしたISOファイルを指定
- 書き込みの実行
書き込みが終わればインストール用USBメモリの作成は完了です。
インストール
インストール用USBメモリをインストール先のマシンに差し込んで起動します。もし、インストール画面に移らない場合はBIOS画面で起動デバイスの優先順位を確認しUSBが最優先になるように設定を変えましょう。
最初の画面で言語を選べますが一覧に日本語はないので”English”のまま進めます。
インターネットにつないでいるとインストーラの更新ができます。”Update to the new installer”を選んでインストーラを更新します。
次にキーボードレイアウトの設定は”Japanese”を選択します。
ネットワーク設定はデフォルトのまま進め、プロキシを通す場合はプロキシの設定をおこないます。
ミラーサイトの設定、ストレージの設定はデフォルトのままでOKです。プロファイル設定でユーザ、マシン名、パスワードを設定します。
ここでは
- ユーザ名: subaru
- マシン名: gpu_server
としています。
SSHの設定もここで行えますが後ほど行うのでここでは特に設定しません。
パッケージを追加できますが特に不要なので進めるとインストールが開始されます。
インストールが完了したらインストール用のUSBを抜いて再起動します。
設定作業
再起動後にログインしてリモート接続(SSH接続)の設定をおこないます。
パッケージのアップデート
まずパッケージをupdateします。
$ sudo apt update $ sudo apt upgrade
IPアドレスの固定
GPUサーバのIPアドレスを固定するためにネットワークインターフェース名(例: enp8s0)を
$ ip -4 a
で確認し、こちらを参考に/etc/netplan/に設定ファイルを置きます。
$ sudo netplan apply
とするとIPアドレスが固定されます。
ここでは192.168.10.16に固定しています。念の為、
$ ip -4 a
として指定したIPアドレスになっているかを確認します。
SSH接続の設定
SSH接続ができるように
$ sudo apt --no-install-recommends install ssh
とします。同じプライベートネットワーク(192.168.10.*)内の別マシンから
$ ssh subaru@192.168.10.16
として接続できるか確認します。
SSH接続を確認した後はリモートでGPUのセットアップやdockerを続けます。後編をご参照ください。
参考
脚注
↑1 | 指定したデバイスの中身はすべて消去されるので指定ミスを予防するためインストールするUSBメモリ以外はPCから接続を外しておいた方が安心です。 |
---|
ピンバック: Ubuntu20.04とdockerで機械学習用GPUサーバ構築(後編) | 有意に無意味な話
ピンバック: AtCoder Heuristic Contest 011 日記編 | 有意に無意味な話