Ubuntu16.04におけるVisemeNet_tensorflowのCUDA環境及びROCｍ環境での動作検証したときの手順メモ

VisemeNet_tensorflow
https://github.com/yzhou359/VisemeNet_tensorflow





テスト環境は以下の記事で作った環境です
https://qiita.com/_JG1WWK/items/bfb59e2589b82bf5a8b3

#目次
・miniconda導入
・Visemenetの準備
・CPU TensorFlowでの検証（途中エラーで動作せず）
・CUDA9.2での検証（呼び出し段階でエラーが発生して動作せず）
・ROCmでの検証(途中エラー動作せず）
・CUDA8.0+CUdnn5.1環境での検証（これのみ動作）
・まとめ
・参考サイト

#まずminicondaを入れます

brewならワンコマンドで済みますがこの場合は直接.shを落とします。

```
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ bash ./Miniconda3-latest-Linux-x86_64.sh （すべてyesとenterで実行）
```
インストール中

```
Do you wish the installer to initialize Miniconda3
in your /home/w/.bashrc ? [yes|no]
[no] >>> yes

Initializing Miniconda3 in /home/w/.bashrc
A backup will be made to: /home/w/.bashrc-miniconda3.bak

```

ここをちゃんとyesにすると環境変数の自動設定をやってくれるのですが、ここで指定されてる/home/w/miniconda3/etc/profile.d/conda.shの実行パーミッションが許可されてないためこのままでは実行できないため

```
$ chmod +x /home/w/miniconda3/etc/profile.d/conda.sh
$ source .bashrc
```

とします、正直これが正しいやりかたなのかわかりませんが、これで動きます。

#準備

```
git clone https://github.com/yzhou359/VisemeNet_tensorflow.git  
````

次にCPU用、CUDA用、ROCm用で3つcondaで環境を作ります


```
$ conda create -n visnet_CPU python=3.5
$ conda create -n visnet_CUDA python=3.5
$ conda create -n visnet_ROCm python=3.5
```

次に
https://www.dropbox.com/sh/7nbqgwv0zz8pbk9/AAAghy76GVYDLqPKdANcyDuba?dl=0
から
![Screenshot from 2019-02-18 04-40-25.png](https://qiita-image-store.s3.amazonaws.com/0/232732/b37b8d91-6eee-587b-8e2f-3f16dbb62049.png)
上記の４つのファイルをダウンロードして

git cloneしたVisenetNet_tensorflow内にある data/ckpt/pretrain_biwi/にコピーしてください。


#CPUでひとまず動かす
結構突っ込まないと行けないものが多いです。

```
$ conda activate visnet_CPU
$ cd VisemeNet_tensorflow/
$ pip install numpy
$ pip install tensorflow==1.11.0
$ pip install python_speech_features
$ pip install matplotlib
$ python ./main_test.py
```

しかし計算中に

```
NotFoundError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a Variable name or other graph key that is missing from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint. Original error:
```
が出てしまいうまくいきませんでした。


#CUDA9.2
次にCUDA9.2での動作を確認します。

```
$ conda deactivate 
$ conda activate visnet_CUDA
$ pip install matplotlib
$ pip install numpy
$ pip install python_speech_features
$ pip install scipy
```

公式には

```
pip install --ignore-installed --upgrade https://download.tensorflow.google.cn/linux/gpu/tensorflow_gpu-1.1.0-cp35-cp35m-linux_x86_64.whl
```

と書かれているのでします。

ただこのまま実行しても

```
ImportError: libcublas.so.8.0: cannot open shared object file: No such file or directory
```
(エラーから抜粋）

8.0のcublasライブラリがないと出ているので多分CUDA9.2ではなく8.0でないと動きません
8.0にダウングレードして再検証したいところですがここではひとまず次に移ります。

#ROCm編

```
$ conda deactivate 
$ conda activate visnet_ROCm
$ pip install matplotlib
$ pip install numpy
$ pip install python_speech_features
$ pip install scipy
$ pip install tensorflow-rocm
```


```
Failed to load the native TensorFlow runtime.
```

案の定実行エラーになってしまいました。

もしかしてなんか足りないライブラリがあるのでは？と思いひとまず全部盛りでapt-getすることにしました。

```
sudo apt install -y --allow-unauthenticated rocm-dkms rocm-dev rocm-libs rocm-device-libs hsa-ext-rocr-dev hsakmt-roct-dev hsa-rocr-dev rocm-opencl rocm-opencl-dev rocm-utils rocm-profiler cxlactivitylogger miopen-hip miopengemm
```

その結果CPUと同じように

```
NotFoundError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a Variable name or other graph key that is missing from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint. Original error:
```
が出てきてしまいました、もしかしてtensorflow-rocmのバージョンが悪いのでは？と思い

```
$ pip uninstall tensorflow-rocm
$ pip install tensorflow-rocm==1.11.0
```

で再実行しましたが同様の結果になってしまいました。
Githubのcudnn5.0と指定されたのでそれ以外では動かないのかもしれません






#CUDA8.0編
バージョンチェンジする時はdockerを使いたいと思いましたが今回はネイティブでやりました。
手法についてはこちらを参照してください。
https://qiita.com/_JG1WWK/items/f23fe5f1fa306ecda1de
Ubuntu16.04でCUDA9.2からCUDA8.0に速攻ダウングレードしたい時のメモ


CUDA8.0でも動かなかったので原因をエラーログから調べてみると

```
ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory
```
よく考えると計算機にcudnnが入ってないと言うことに気がついたので入れて再度テストしました。
　Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0をダウンロードするのですが、なんとNVIDIAのデペロッパープログラムに参加しないとダウンロードすらできない仕様になっているらしいのでアカウントを作って
https://developer.nvidia.com/rdp/cudnn-archive
からcuDNN v5.1 Library for Linuxをダウンロードしました。


cudnn-8.0-linux-x64-v5.1.tgzを展開すると、/cudaと言うフォルダが作られる。(ここではホームディレクトリに展開した）

https://qiita.com/kazetof/items/941c3463ac452b496d59
によると
/usr/local以下に各種ファイルをコピーする流れになる

```
 ~/cuda/include$ sudo cp ./cudnn.h /usr/local/cuda/include
 ~/cuda/include$ sudo cp ./cudnn.h /usr/local/cuda-8.0/include
```
~/cuda/lib64にカレントディレクトリを切り替えて

```
~/cuda/lib64$ sudo cp ./* /usr/local/cuda/lib64
~/cuda/lib64$ sudo cp ./* /usr/local/cuda-8.0/lib64
```

次に.bashrcに

```
export CUDA_ROOT="/usr/local/cuda"
export LIBRARY_PATH=$CUDA_ROOT/lib:$CUDA_ROOT/lib64:$LIBRARY_PATH  
export LD_LIBRARY_PATH=$CUDA_ROOT/lib64/
```

以上のパスを通していただきます。
これでcudnnの環境構築は終わりです。


この状態で

```
$ conda deactivate 
$ conda activate visnet_CUDA
$ python main_test.py
```

したら最後までちゃんと完走しました。
今のところ完走してくれたのはCUDA8.0+CUDNN5.1の組み合わせだけです。


#まとめ
素直に公式の言うとおりにCUDA8.0+cuDNN5.0+GPU tensorflowの組み合わせでやったほうが無難そうです。
ROCmの場合MIOpenとcuDNNの互換性が未知数と言う点が大きそうです。

NotFoundErrorに関する情報は
http://louis-needless.hatenablog.com/entry/notfounderror-bully-me
などで参照しましたがすぐ解決に繋がりそうな糸口は見いだせませんでした。




##参考
https://qiita.com/kazetof/items/941c3463ac452b496d59
GPUを使えるようにする for tensorflow