「ディープラーニングの力で結月ゆかりの声になる」環境構築【Ubuntu Server v18.10】

##概要
「ディープラーニングの力で結月ゆかりの声になる」ためのLinux環境構築という素晴らしい記事が既にあるのですが、
ubuntu serverの17.10が手に入らなくなってしまったので同様の環境構築に変更点が出ました。
なので、上記の記事に沿って現状手に入る18.10での実装を行った際の問題点と補足説明について記載していきます。

もう一つ、現在(2019年1月10日)の結月ゆかりの声になるリポジトリ(become-yukarin)で動作するように構築します。

変換コマンドについては大差が無いので今のところ書く予定はないですがコメントで難民が多いようでしたら書きます。


####「ディープラーニングの力で結月ゆかりの声になる」ためのLinux環境構築　←先駆者様
* https://qiita.com/atticatticattic/items/575d71dab4ee716e4969
 
基本はこちらと同じ流れに沿って記載していきます。

####ディープラーニングの力で結月ゆかりの声になってみた　←本家様
* 動画 : http://www.nicovideo.jp/watch/sm32724409
* コード : https://github.com/Hiroshiba/become-yukarin


##使用ハード

 * OS  : Ubuntu Server 18.10
 * CPU : Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
 * GPU : GeForce GTX 980 Ti
 * ストレージ: 20GB


####補足  
グラフィックボードはメモリが3.7GB以上の物しか使用できません。※1
3.7GB以上の物を用意できない場合は素直にEC2を使用しましょう。
この記述ではNvidia製のGPUを使用する前提で記載しております。※2  

##1. エディタ・sshのインストール
```sh
sudo apt-get install emacs vim
```
####エディタのインストール

####SSHのインストール
sshは最初からインストールされているため、起動するのみで問題ありません。

```sh
sudo /etc/init.d/ssh start
```
##2. GPUドライバ インストール 

```sh
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-387
```
使用するマザーボードによっては署名の無いドライバはダメだよと言われるかもしれません。
その場合はBIOSからセキュアブートを切ってからインストールしてあげてください。

##3. 開発系全般のインストール
```sh
sudo apt-get install build-essential
```
##4. gcc6系のインストール & コマンド置き換え & 確認
```sh
sudo apt-get install gcc-6 g++-6
sudo rm /usr/bin/gcc /usr/bin/g++
sudo ln -s /usr/bin/gcc-6 /usr/bin/gcc
sudo ln -s /usr/bin/g++-6 /usr/bin/g++
gcc --version
g++ --version
```
##5. Nvidia ToolKit 9.1 のインストールで必要なライブラリをインストール
```sh
sudo apt-get install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev
```
##6. Nvidia ToolKit 9.1 をダウンロード
###6.1 ファイルダウンロード
下記サイトから、
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1704&target_type=runfilelocal

パッチを含めた4ファイルをダウンロードしサーバーに配置する。

* cuda_9.1.85_387.26_linux.run
* cuda_9.1.85.1_linux.run
* cuda_9.1.85.2_linux.run
* cuda_9.1.85.3_linux.run

###6.2 インストール実行
Nvidiaドライバのインストールはスキップしてください。
それ以外のToolkitとサンプルはインストールしてください。
インストールパスなどはデフォルトで大丈夫です。

```sh
sudo sh cuda_9.1.85_387.26_linux.run
sudo sh cuda_9.1.85.1_linux.run
sudo sh cuda_9.1.85.2_linux.run
sudo sh cuda_9.1.85.3_linux.run
```
##7. Nvidia cuDNN
###7.1 ダウンロード
下記サイトから
https://developer.nvidia.com/cudnn
"Download cuDNN v7.1.3 (April 17, 2018), for CUDA 9.1"を選んで、
下記の3つのファイルをダウンロードしてください

* cuDNN v7.1.3 Library for Linux
* cuDNN v7.1.3 Runtime Library for Ubuntu16.04 (Deb)
* cuDNN v7.1.3 Developer Library for Ubuntu16.04 (Deb)
 
ダウンロードできたファイルはそれぞれ　

* cudnn-9.1-linux-x64-v7.1.tgz  ※3
* libcudnn7_7.1.3.16-1+cuda9.1_amd64.deb
* libcudnn7-dev_7.1.3.16-1+cuda9.1_amd64.deb

となります。
###7.2 インストール
cuDNN v7.1.3 Library for Linux を解凍してファイルコピー

```sh
tar xvf cudnn-9.1-linux-x64-v7.1.tgz
```

.bashrc に下記を追加して source .bashrcする

```sh:.bashrc
export CUDA_PATH=/usr/local/cuda
export PATH=$CUDA_PATH/bin:$PATH
export CFLAGS=-I/usr/local/cuda/include
export LDFLAGS=-L/usr/local/cuda/lib64
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
```

インクルードファイルとライブラリファイルをコピーする

```sh
sudo cp cuda/include/* $CUDA_PATH/include
sudo cp cuda/lib64/* $CUDA_PATH/lib64
```
libcudnnの2ファイルをインストール

```sh
sudo dpkg -i libcudnn7_7.1.3.16-1+cuda9.1_amd64.deb
sudo dpkg -i libcudnn7-dev_7.1.3.16-1+cuda9.1_amd64.deb
```
##NVIDIA 9.1 のサンプル実行
下記コマンドで動作確認を行います。

```sh
cd NVIDIA_CUDA-9.1_Samples/1_Utilities/deviceQuery
make
./deviceQuery
```
実行結果のログの最後の辺りに以下のログが出力されれば取り敢えず成功です。

```sh
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.1, CUDA Runtime Version = 9.1, NumDevs = 1
Result = PASS
```
※Nvidiaのドライバをインストールしてから一度も再起動していない場合、エラーになります。

##8. pythonで使用予定のOS経由のライブラリインストール
pythonからOS経由でライブラリを読んでいる箇所があり、pipで入れられないものを入れます。

```sh
sudo apt-get install libsqlite3-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev libssl-dev tcl-dev tk-dev libreadline-dev zlib1g-dev libssl-dev
```
##9. pyenv & Pythonのインストール
pythonのバージョンが3.6.3推奨とのことなので、pyenvでインストールを行います。

###9.1 pyenvインストール

pyenvのリポジトリ取得

```sh
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
パス設定記述と実行

```sh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.profile

source ~/.profile
```
pyenvのインストール確認

```sh
which pyenv
```
を入力した後、

```sh
/home/[username]/.pyenv/bin/pyenv
```
みたいなログが出てればパスは通ってます。

###pyrhon 3.6.3取得と適用

```sh
pyenv install 3.6.3
pyenv global 3.6.3
```
pipも更新しておきます
    pip install --upgrade pip

####バージョン確認

```sh
python -V
```
3.6.3になっていればpythonのインストールは完了です。



##10. 結月ゆかりになるリポジトリで使用するライブラリ関連の取得
後でヒホ氏のリポジトリにあるrequirements.txtを使用して必要なライブラリ一括インストールを行うのですが
cudaのバージョンの都合上、cupyだけは手動でインストールしなければなりません。

####結月ゆかりになるリポジトリ取得
requirements.txtがあるのでリポジトリの取得をします。

```sh
git clone https://github.com/Hiroshiba/become-yukarin.git
```
####requirements.txtの編集
エディタなどで取得したリポジトリ直下にあるrequirements.txtを開きます。

```sh
vi become-yukarin/requirements.txt
```
cupyと記載されている行を削除します。

```:requirements.txt
numpy
cupy　　←この行を削除
chainer
librosa
pysptk
pyworld
fastdtw
matplotlib
chainerui
```

####pyrhonで利用する各種ライブラリをインストール

```sh
pip install cupy-cuda91
pip install -r become-yukarin/requirements.txt
pip install tqdm
pip install chainerui==0.3

git clone https://github.com/yamachu/WORLD4py
cd WORLD4py
python setup.py install
```
##11. pythonで動作確認

pythonを対話モードで実行して下記のコマンドを実行してください。

```py
import chainer
import cupy as cp
a = cp.array([1,2,3])
b = cp.array([2,3,5])
a + b
```
結果が下記のようになれば問題ないと思います。

```py
array([3, 5, 8])
```
お疲れ様です。以上で、コマンド実行できるようになっているはずです。

##補足
※1 numpyが非常にメモリを散らかし容量オーバーした時点で処理が中断します。
約3.6GBほど使用していました。計算処理内容については難しすぎて省メモリ化の目途は立っておりません。

※2 AMD製のグラボなどはCUDAが動きません。ROCmという物を使用すればイケるらしいですが未検証です。

※3ダウンロードするブラウザによっては拡張子が.solitairetheme8となることがあるらしいです。
ただ、通常通りのtarで解凍できるそうなので、コマンドの拡張子を合わせてやれば良い感じです。