「ディープラーニングの力で結月ゆかりの声になる」ためのLinux環境構築【Ubuntu 17.10】

##　概要
ニコニコ動画でデモされている「ディープラーニングの力で結月ゆかりの声になってみた」のコードを実行するための環境構築の方法を紹介します。
手順が多いため走り書きになりますが、ご了承ください。

※新しい環境をお使いでしたら、@sakamotothogo 様の下記記事もご参照ください。
[「ディープラーニングの力で結月ゆかりの声になる」環境構築【Ubuntu Server v18.10】](https://qiita.com/sakamotothogo/items/322012f1a462f27188bf#_reference-9115c2dd255ed5887906)


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

コマンド解説の記事も作成しました
https://qiita.com/atticatticattic/items/f1e4c671d73d815bbad2

## 使用ハード
- OS: Ubuntu Server 17.10
- CPU: AMD Ryzen7 1700X
- GPU: GTX 970
- ストレージ: SSD 80G + HDD 300G

## 補足
### Windows環境での実行はできません
ソースの Readme に有るように Linux の Python 環境での実行を前提をしているようで、Windows 環境で実行しようとすると エラーが発生します。

### GPUがない場合は、中古GPUを買うのがお勧めです。
@sakamotothogo の記事では GPUメモリは4G以上必要とのことです。
中古のGTX 970(4G)が 2019/04 現在12,000円程度で買えるので、そちらをお勧めします。
下記のように EC2 インスタンスを使う方法もありますが、いろいろ試行錯誤すると、12,000円程度使ってしまいます。(EC2使用料以外にもwavデータの転送量とかもあるので)

もし、リアルタイムの音声変換を視野にいれるならば、GTX 1080Ti 程度が必要なようです。
詳細は[『ディープラーニングの力で結月ゆかりの声になるリポジトリ』の ipynb ブランチのリアルタイム変換サンプル](https://qiita.com/atticatticattic/items/f3fab0260a84ec121d4c)のコメントを参照してください。

### GPUがなければ Google Colaboratory を使えばいいじゃない！
[GPUがなくても、Google Colaboratory で結月ゆかりの声になりたい](https://qiita.com/atticatticattic/items/e9eb4a24d63dc7ec1e58)

### ~~GPUが無くても諦めるのはまだ早い~~
~~Amazon AWS の GPU 付き インスタンスを使えば 高速な学習処理ができます。~~
~~一番安い p2.xlarge をスポットインスタンスで運用すれば、一時間 30円程度で使えます。~~
~~https://aws.amazon.com/jp/ec2/instance-types/p2/~~

~~一度、学習データをさえ作ってしまえば、バッチ処理での音声変換はCPUでも現実的な時間で処理できるため、問題ないかと思います。~~

## 1. エディタ・sshのインストール
### エディタのインストール
```
sudo apt-get install emacs vim
```
### sshのインストール
```
sudo apt-get install aptitude
sudo aptitude install ssh
sudo /etc/init.d/ssh start
```

## 2. GPUドライバ インストール
※ Nvidia Toolkit 9.1 をインストールするので、ドライバは必ず nvidia-387(または390)をインストールしてください。 NvidiaのGPUドライバと Nvidia Toolkitのバージョンは正しく組み合わせないと動きません。 

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-387
```
※ 上記コマンドを実行するとおそらく nvidia-390がインストールされますが、387と同じ扱いのようなので差し支えありません。

## 3. 開発系全般のインストール
```
sudo apt-get install build-essential
```

## 4. gcc6系のインストール & コマンド置き換え
※ Nvidia Toolkit 9.1 は gcc6系を使用しますが、Ubuntu 17では gcc7がインストールされます。

```
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 のインストールで必用なライブラリをインストール
```
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とサンプルはインストールしてください。
インストールパスなどはデフォルトで大丈夫です。
※ なぜだかこの実行ファイルのドライバ入れるとクラッシュしました。

```
sudo cuda_9.1.85_387.26_linux.run
```

実行結果が下記のようになっており、エラーが発生していないか確認してください。

```
===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-9.1
Samples:  Installed in /home/[username]'

```

問題なければ、引き続き下記のコマンドでパッチをインストールしてください。

```
sudo cuda_9.1.85.1_linux.run
sudo cuda_9.1.85.2_linux.run
sudo 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
- 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 を解凍してファイルコピー

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

.bashrc に下記を追加して source .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
```

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

```
cp cuda/include/* $CUDA_PATH/include
cp cuda/lib64/* $CUDA_PATH/lib64
```


- libcudnnの2ファイルをインストール

```
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 のサンプル実行
下記コマンドで動作確認を行います。

```
cd NVIDIA_CUDA-9.1_Samples/1_Utilities/deviceQuery
make
./deviceQuery
```

実行結果の最期が下記の様になっていれば取り敢えず成功です。

```
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.1, CUDA Runtime Version = 9.1, NumDevs = 1
Result = PASS
```

## 8. python3 インストール & コマンド置き換え
```
sudo apt-get install python3 python3-pip
```

```
sudo rm /usr/bin/pip /usr/bin/python
sudo ln -s /usr/bin/pip3 /usr/bin/pip
sudo ln -s /usr/bin/python3 /usr/bin/python
pip -V
python -V
```
python 3.6.3になっていることを確認してください。


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

### 9.1 pip系のライブラリをインストール

```
sudo pip install -r requirements *途中でインストールが止まる
sudo pip install numpy
sudo pip install -r requirements
```
※ よくわからないが上記手順でインストールできた。(誰か理由を知っていたら教えてください。）
もし上手く行かなかった場合は 一度 pip uninstall してから pip install --no-cache を試してください。

##### ・追記 2018.06.02
上記に加えて tqdm というライブラリも使用してたため、下記コマンドも実行願います

```
sudo pip install tqdm
```
##### ・追記 2019.05.17
コメントで頂いた情報になりますが、一部のライブラリは最新バージョンで動かないケースがあるとご指摘いただきました。
そのため、下記のコマンドも実行して、指定バージョンのライブラリを使用願います。

```
pip install chainerui==0.3
pip install numpy==1.16.2
```

同様のケースが他にもあることが考えられるので、参考までに自分で動作確認しているライブラリのバージョン一覧を記載します。

<details><summary>**使用ライブラリバージョン一覧(クリックで表示)**</summary><div>

```console
$ pip list                  
Package          Version    
---------------- -----------
aiohttp          1.0.5      
alembic          0.9.9      
appnope          0.1.0      
APScheduler      3.5.1      
asn1crypto       0.24.0     
async-timeout    3.0.0      
attrs            18.1.0     
audioread        2.1.5      
Automat          0.7.0      
backcall         0.1.0      
beautifulsoup4   4.6.0      
blessings        1.6.1      
certifi          2018.4.16  
cffi             1.11.5     
chainer          4.0.0      
chainerui        0.3.0      
chardet          3.0.4      
click            6.7        
constantly       15.1.0     
cryptography     2.2.2      
cssselect        1.0.3      
cupy             4.0.0      
cycler           0.10.0     
Cython           0.28.2     
decorator        4.3.0      
discord.py       0.16.12    
fastdtw          0.3.2      
fastrlock        0.3        
filelock         3.0.4      
Flask            0.12.2     
gpustat          0.4.1      
hyperlink        18.0.0     
idna             2.7        
incremental      17.5.0     
ipykernel        4.8.2      
ipython          6.4.0      
ipython-genutils 0.2.0      
itsdangerous     0.24       
Janome           0.3.6      
jedi             0.12.0     
Jinja2           2.10       
joblib           0.11       
jsonschema       2.6.0      
jupyter-client   5.2.3      
jupyter-core     4.4.0      
kiwisolver       1.0.1      
librosa          0.6.0      
llvmlite         0.22.0     
lxml             4.2.3      
Mako             1.0.7      
MarkupSafe       1.0        
matplotlib       2.2.2      
msgpack          0.5.6      
multidict        4.3.1      
nbformat         4.4.0      
nose             1.3.7      
numba            0.37.0     
numpy            1.14.2     
nvidia-ml-py3    7.352.0    
pandas           0.23.3     
parsel           1.5.0      
parso            0.2.1      
pexpect          4.5.0      
pickleshare      0.7.4      
pip              18.0       
prompt-toolkit   1.0.15     
protobuf         3.5.2.post1
psutil           5.4.5      
ptyprocess       0.5.2      
pyasn1           0.4.3      
pyasn1-modules   0.2.2      
PyAudio          0.2.11     
pycparser        2.18       
PyDispatcher     2.0.5      
Pygments         2.2.0      
PyNaCl           1.2.1      
pyOpenSSL        18.0.0     
pyparsing        2.2.0      
pysptk           0.1.11     
python-dateutil  2.7.2      
python-editor    1.0.3      
pytz             2018.4     
pyworld          0.2.4      
pyzmq            17.0.0     
queuelib         1.5.0      
requests         2.19.1     
resampy          0.2.0      
scikit-learn     0.19.1     
scipy            1.0.1      
Scrapy           1.5.1      
service-identity 17.0.0     
setuptools       28.8.0     
simplegeneric    0.8.1      
six              1.11.0     
SQLAlchemy       1.2.7      
testpath         0.3.1      
tornado          5.0.2      
tqdm             4.23.0     
traitlets        4.3.2      
Twisted          18.4.0     
tzlocal          1.5.1      
urllib3          1.23       
uWSGI            2.0.17     
w3lib            1.19.0     
wcwidth          0.1.7      
websockets       3.4        
Werkzeug         0.12.2     
world4py         0.1        
zope.interface   4.5.0   
```

</div></details>

### 9.2 ソースからライブラリをインストール
 WORLD4py だけはpipからインストールできないのでソースからインストール

```
git clone https://github.com/yamachu/WORLD4py
cd WORLD4py
sudo python setup.py install
```

## 10. pythonで動作確認
pythonを対話モードで実行して下記のコマンドを実行してください。

```
import chainer
import cupy as cp
a = cp.array([1,2,3])
b = cp.array([2,3,5])
a + b
```

結果が下記のようになれば問題ないと思います。

```
array([3, 5, 8])
```

お疲れ様です。以上で、コマンド実行できるようになっているはずです。

### ※ 補足：コマンド実行する際には
各種コマンドにはいろいろオプションを付けてパスを指定したり、設定ファイルを用意したり、音声ファイルを用意したりする必用があります。
しかし、readmeには詳細は書かれていないため、ソースコードを読む必用があります。

追記 2018.06.02

コマンド解説の記事も作成しました
https://qiita.com/atticatticattic/items/f1e4c671d73d815bbad2