Ubuntu18.04のインストールからGPUで機械学習をするまで

目次

f:id:shirowanisan:20201113223013p:plain

UbuntuのインストールからGPUで機械学習をするまでに必要なことを記述します。流れは以下となっています。

  1. WindowsでUbuntuインストールUSBメディアを作成
  2. Ubuntuのインストール・初期設定
  3. 機械学習のためのGPUドライバ・CUDA・cuDNNの設定
  4. pyenvによるpythonのインストール
  5. 機械学習モデルの実行
  6. おまけ:Ubuntuにリモート接続

WindowsでUbuntuインストールUSBメディアを作成

Ubuntu18.04のダウンロード

下記よりUbuntu18.04 LTSをダウンロードします。

Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team

f:id:shirowanisan:20201109201900p:plain

インストールUSBメディアを作成するためのソフトウェアをダウンロード

下記よりソフトウェア「Rufus」をダウンロード、インストールします。

rufus.ie

Rufusを使ってインストールUSBメディアを作成する

Rufusを起動し、画像のようにUbuntuのイメージを選択してインストールUSBメディアを作成します。

f:id:shirowanisan:20201109223549p:plain

Ubuntuのインストール

USBメディアからUbuntuをインストール

USBメディアからUbuntuを起動し、手続きにしたがってUbuntuをインストールします。

Ubuntuの解像度がおかしいときの対応

Ubuntuの解像度がおかしくない場合はこちらの手順は省略して大丈夫です。

GPU等の関係により、画像のようにUbuntuの解像度が600x800で固定され、GPUドライバをインストールしても解決しない場合があります。その場合の対処方を記述します。

f:id:shirowanisan:20201110214038p:plain

まずは、システムファイルを修正できるようにvimをインストールします。

$ sudo apt install vim

続いてgrubファイルを編集します。

$ sudo vim /etc/default/grub

以下の行を追加します。

GRUB_GFXMODE=1920x1080

f:id:shirowanisan:20201110220633p:plain

最後に、grubを更新して再起動します。

$ sudo update-grub
$ sudo reboot

Ubuntuのソフトウェアアップデート

画像のように選択し、Ubuntuのソフトウェアをアップデートします。

f:id:shirowanisan:20201110221502p:plain

f:id:shirowanisan:20201110221601p:plain

インストール後、再起動が必要です。

再起動後、ついでにパッケージリストとパッケージの更新も行っておきます。

$ sudo apt update
$ sudo apt upgrade

機械学習のためのGPUドライバ・CUDA・cuDNNの設定

機械学習のために必要なもの

GPUで機械学習するために以下をインストールします。

  1. GPUドライバ(GPUの機能を使うために必要。)
  2. CUDA Toolkit(GPUで機械学習をするために必要。)
  3. cuDNN(ニューラルネットワークの計算を高速化するために必要。高速化が目的のため、インストールしなくても機械学習は可能。)

GPUドライバのインストール

以下のコマンドを入力して、適切なGPUドライバを確認します。

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ ubuntu-drivers devices

recommendedが付いているドライバをインストールします。 

f:id:shirowanisan:20201110223157p:plain

インストール後、再起動します。

$ sudo apt install nvidia-455
$ sudo reboot

以下のコマンドでドライバがインストールされていることを確認できます。

$ nvidia-smi

CUDAのインストール

CUDAはGPUで機械学習するために必要です。

以下からCUDAをダウンロードします。基本的にCUDAのバージョンはnvidia-smiで表示されるバージョンが推奨です。ここではCUDA 11.1.1を選びます。

developer.nvidia.com

今回はrunfileでのインストールを選択します。

f:id:shirowanisan:20201111001138p:plain

上記で表示されたコマンドを打ち込みます。

$ wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run
$ sudo sh cuda_11.1.1_455.32.00_linux.run

runfileを実行すると以下の表示がでます。

f:id:shirowanisan:20201111102745p:plain
「既にドライバーがインストールされているけど大丈夫?ドライバを削除してからインストールすることを強く勧めます。」
と表示されています。

これは、上記でインストールしたGPUドライバのことだと思われます。ただし、CUDAと同時にドライバをインストールする場合、GPUとそのドライバに互換性がない場合もあります。この場面の最適解は、ドライバのインストールもCUDAで行うことかもしれませんが、ここでは「Continue」で進めます。

ライセンス表示の場面では「accept」と入力します。

f:id:shirowanisan:20201111103326p:plain

続いて、今回は既にドライバを入れているため、Driverのチェックのみを外して「install」を選択します。(CUDAと同時にドライバをインストールする場合はチェックが必要です。)

f:id:shirowanisan:20201111103400p:plain

これでCUDAのインストールは完了です。

cuDNNのインストール

cuDNNはニューラルネットワークの計算を高速化するために必要です。高速化が目的のため、インストールしなくても機械学習は可能です。

cuDNNのダウンロードには、NVIDIAのアカウントとログインが必要です。また、ダウンロード時にアンケートに答える必要があります。

下記のサイトでダウンロードします。今回はCUDA11.1を選択します。

https://developer.nvidia.com/rdp/cudnn-download

f:id:shirowanisan:20201113175610p:plain

以下のコマンドでインストールします。

# 解答
$ tar -xzvf cudnn-11.1-linux-x64-v8.0.5.39.tgz

# ローカルのCUDAフォルダにコピー(インストール)
$ sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64

# 読み取り権限付与
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

pyenvによるpythonのインストール

pyenvとは

pyenvはpythonのバージョン管理ツールです。python3.7、python3.8といった別バージョンのpythonを簡単に切り替えたいときに使います。コードによってはpython3.7では動くがpython3.8では動かないということがあるため、そういった場面で役に立ちます。

pythonのバージョンは1つで十分という方はpyenvではなく、普通にpythonのインストールで問題ありません。

pyenvのインストール

pyenvに必要なパッケージをインストールします。 

$ sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

gitでpyenvをダウンロードします。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

.bash_profileにpyenvの設定を書きこみます。

$ vim ~/.bash_profile

以下の内容を書き込み、保存しましょう。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

.bash_profileを反映させ、pyenvのバージョンが確認できればインストール完了です。

$ source ~/.bash_profile
$ pyenv -v

pyenvでのpythonのインストール

以下のコマンドでインストールできるpythonを確認できます。

$ pyenv install --list

今回はpython3.8.6をインストールします。

$ pyenv install 3.8.6

インストールしたpythonを使うように指定します。

$ pyenv global 3.8.6

pythonのバージョンが確認できればインストール完了です。

$ python --version

機械学習モデルの実行

Tacotron2を動かしてみる

今回は音声合成モデルのTacotron2を動かしてみようと思います。Tacotron2に関しては以下の記事で説明しています。

shirowanisan.com

pytorchのインストール

tacotron2を動かすためには、pythonにpytorchライブラリをインストールする必要があります。まずは、pythonのpipとsetuptoolsのアップデートを行っておきます。

$ pip install --upgrade pip
$ pip install --upgrade setuptools

続いて、pytorchをインストールします。

以下のサイトを参考に、インストールコマンドを打ち込みます。今回、UbuntuにインストールされているのはCUDA11.1ですが、pytorchがCUDA11.0までしかないため、11.0を選択してインストールします。本当はCUDAとpytorchのバージョンを揃えた方が良いと思いますが、この構成でも動くためこのまま進めます。

https://pytorch.org/

f:id:shirowanisan:20201111163330p:plain

$ pip install torch==1.7.0+cu110 torchvision==0.8.1+cu110 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

これでpytorchのインストール完了です。

他にもTacotron2を動かすために必要なパッケージもインストールしておきます。

$ pip install numpy scipy librosa unidecode inflect librosa

Tacotron2を動かしてみる

以下のリンクを参考にTacotron2を動かすコードを書いてみます。

Tacotron 2 | PyTorch

今回は以下のようなpythonファイルを作成しました。

$ vim tacotron2-test.py
import torch
tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2')

import numpy as np

tacotron2 = tacotron2.to('cuda')
tacotron2.eval()

text = "hello world, I missed you"

# preprocessing
sequence = np.array(tacotron2.text_to_sequence(text, ['english_cleaners']))[None, :]
sequence = torch.from_numpy(sequence).to(device='cuda', dtype=torch.int64)

# run the models
with torch.no_grad():
    _, mel, _, _ = tacotron2.infer(sequence)

print(mel)

2020年11月現在、RTX30系(もしくはCUDA11系)でwaveglowがエラーになる問題があります。そのため、このコードはTacotron2のみを動かし「hello world, I missed you」のメルスペクトログラムの取得までとしました。

実行してみると、メルスペクトログラムの予測ができていることがわかります。これでGPUを用いての予測が確認できました。

$ python tacotron2-test.py

f:id:shirowanisan:20201111171007p:plain

おまけ:Ubuntuにリモート接続

Ubuntuをリモート接続できるようにします。Ubuntuの設定の共有より、画像のように設定します。

f:id:shirowanisan:20201113182651p:plain

f:id:shirowanisan:20201113182705p:plain

以下のコマンドを打ち込み再起動します。

$ sudo gsettings set org.gnome.Vino require-encryption false
$ sudo reboot

Macからリモート接続をする場合はFinderタブの「移動→サーバへ接続」で画像のようにIPアドレスを入力することで接続可能です。

f:id:shirowanisan:20201113183440p:plain

インストールUSBメディアの作成はWindows、リモート接続はMacという不思議な構成で説明を行いましたが、私の開発スタイルに合わせた結果この構成となりました。

参考文献 

WindowsでUbuntuのインストールUSBメディアを作成する – diagnose-fix.com

Ubuntu18.04で突然解像度がおかしくなったときの対処法 - Qiita

ubuntu18.04LTS インストール後はSoftware Updateしましょう

Ubuntu18.04 LTSのインストールからNVIDIA GPU Driverのインストールまで - Qiita

Windows環境へのCUDA・cuDNNのインストール | ネジと銀

Installation Guide :: NVIDIA Deep Learning cuDNN Documentation

Ubuntu 18.04にpyenvをインストールする|setoyama60jp|note

Ubuntu に pyenv を利用して Python をインストールする - MathPython

Common build problems · pyenv/pyenv Wiki · GitHub

Windows10もしくはMacOSからUbuntu 18.04 LTSにリモート接続(リモートデスクトップ)してみた - いろいろ試してみる