UbuntuのインストールからGPUで機械学習をするまでに必要なことを記述します。流れは以下となっています。
下記よりUbuntu18.04 LTSをダウンロードします。
下記よりソフトウェア「Rufus」をダウンロード、インストールします。
Rufusを起動し、画像のようにUbuntuのイメージを選択してインストールUSBメディアを作成します。
USBメディアからUbuntuを起動し、手続きにしたがってUbuntuをインストールします。
Ubuntuの解像度がおかしくない場合はこちらの手順は省略して大丈夫です。
GPU等の関係により、画像のようにUbuntuの解像度が600x800で固定され、GPUドライバをインストールしても解決しない場合があります。その場合の対処方を記述します。
まずは、システムファイルを修正できるようにvimをインストールします。
$ sudo apt install vim
続いてgrubファイルを編集します。
$ sudo vim /etc/default/grub
以下の行を追加します。
GRUB_GFXMODE=1920x1080
最後に、grubを更新して再起動します。
$ sudo update-grub
$ sudo reboot
画像のように選択し、Ubuntuのソフトウェアをアップデートします。
インストール後、再起動が必要です。
再起動後、ついでにパッケージリストとパッケージの更新も行っておきます。
$ sudo apt update
$ sudo apt upgrade
GPUで機械学習するために以下をインストールします。
以下のコマンドを入力して、適切なGPUドライバを確認します。
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ ubuntu-drivers devices
recommendedが付いているドライバをインストールします。
インストール後、再起動します。
$ sudo apt install nvidia-driver-455
$ sudo reboot
以下のコマンドでドライバがインストールされていることを確認できます。
$ nvidia-smi
CUDAはGPUで機械学習するために必要です。
以下からCUDAをダウンロードします。基本的にCUDAのバージョンはnvidia-smiで表示されるバージョンが推奨です。ここではCUDA 11.1.1を選びます。
今回はrunfileでのインストールを選択します。
上記で表示されたコマンドを打ち込みます。
$ 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を実行すると以下の表示がでます。
「既にドライバーがインストールされているけど大丈夫?ドライバを削除してからインストールすることを強く勧めます。」と表示されています。
これは、上記でインストールしたGPUドライバのことだと思われます。ただし、CUDAと同時にドライバをインストールする場合、GPUとそのドライバに互換性がない場合もあります。この場面の最適解は、ドライバのインストールもCUDAで行うことかもしれませんが、ここでは「Continue」で進めます。
ライセンス表示の場面では「accept」と入力します。
続いて、今回は既にドライバを入れているため、Driverのチェックのみを外して「install」を選択します。(CUDAと同時にドライバをインストールする場合はチェックが必要です。)
これでCUDAのインストールは完了です。
cuDNNはニューラルネットワークの計算を高速化するために必要です。高速化が目的のため、インストールしなくても機械学習は可能です。
cuDNNのダウンロードには、NVIDIAのアカウントとログインが必要です。また、ダウンロード時にアンケートに答える必要があります。
下記のサイトでダウンロードします。今回はCUDA11.1を選択します。
以下のコマンドでインストールします。
# 解凍
$ 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のバージョン管理ツールです。python3.7、python3.8といった別バージョンのpythonを簡単に切り替えたいときに使います。コードによってはpython3.7では動くがpython3.8では動かないということがあるため、そういった場面で役に立ちます。
pythonのバージョンは1つで十分という方はpyenvではなく、普通にpythonのインストールで問題ありません。
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
以下のコマンドでインストールできるpythonを確認できます。
$ pyenv install --list
今回はpython3.8.6をインストールします。
$ pyenv install 3.8.6
インストールしたpythonを使うように指定します。
$ pyenv global 3.8.6
pythonのバージョンが確認できればインストール完了です。
$ python --version
今回は音声合成モデルのTacotron2を動かしてみようと思います。Tacotron2に関しては以下の記事で説明しています。
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のバージョンを揃えた方が良いと思いますが、この構成でも動くためこのまま進めます。
$ 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
※ torchのバージョンアップにより、今はこのコードは動かない可能性が高いです
以下のリンクを参考にTacotron2を動かすコードを書いてみます。
今回は以下のような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
Ubuntuをリモート接続できるようにします。Ubuntuの設定の共有より、画像のように設定します。
以下のコマンドを打ち込み再起動します。
$ sudo gsettings set org.gnome.Vino require-encryption false
$ sudo reboot
Macからリモート接続をする場合はFinderタブの「移動→サーバへ接続」で画像のようにIPアドレスを入力することで接続可能です。
インストールUSBメディアの作成はWindows、リモート接続はMacという不思議な構成で説明を行いましたが、私の開発スタイルに合わせた結果この構成となりました。