NVIDIA Visual Profiler 入門

#はじめに
NVIDIA Visual Profilerという、CUDAに関する、描画が少しリッチなProfilerがあります。
こんな感じです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/8bfbd043-e386-c9c6-14d6-4d70b6971a08.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/7dc1812a-c8be-c151-9b9b-c76af60c5842.png" alt="2" width="50%" />

ボトルネックを解析したり、Optimizationしたりするのに有効です。
リモートマシンでInstallしておいて `nvvp` とすると起動して、以下のようにターミナル端末からX11とかで起動することもできますが

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/ff9ca40a-bbad-3007-9b5e-5ac204814e67.png" alt="1" width="50%"><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/cad39565-0fcd-7a45-ac86-6b12bee16210.png" alt="2" width="50%">

動作が重くなりがちなので、 `nvprof` でprofilingだけリモートマシンで行なって、 `scp` でローカルマシンに結果を飛ばして、
ローカルの NVIDIA Visual Profilerを使う という一連の流れを紹介したいと思います。
(なお、リモートマシンは `nvprof`が使えることを前提としてます)

公式のドキュメントはここにあります。(英語)
http://docs.nvidia.com/cuda/profiler-users-guide/index.html#visual
http://cs.colby.edu/courses/S14/cs336/online_materials/CUDA_Profiler_Users_Guide.pdf
http://www.sie.es/wp-content/uploads/2015/12/cuda-profiling-tools.pdf
http://people.maths.ox.ac.uk/gilesm/cuda/lecs/NV_Profiling_lowres.pdf
こちらも参考になりました。
http://topsecret.hpc.co.jp/wiki/index.php/CUDA_5%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD(4):_nvprof%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%A9

#ローカルマシンのセットアップ
まずはここからローカルマシンにダウンロード & インストール
https://developer.nvidia.com/nvidia-visual-profiler


1. 左側のDownload CUDA Toolkit 8.0を選択
2. 今回、localマシンがOSXなので、OSXの最新版っぽいものを選択して、dmgとpatchをダウンロード

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/9e33cac4-dc6f-10a2-7a9e-a06b61a6593d.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/92b207a9-9044-d892-e81c-2d8cbc4e6a0a.png" alt="1" width="50%" />


1. まず、容量大きい方のdmgを開いて、インストーラーを起動、この時パスワードを求められる
2. Accept and Proceedを選択
3. Install CompleteしたらFinish

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/bd49a3b6-6cc5-f361-f140-453be4c0f160.png" alt="1" width="33%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/783f8a83-bb4e-17f6-cbf7-1fa45341d2f9.png" alt="2" width="33%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/b58f00ee-df25-5512-a7ce-6aed2d8dd9b6.png" alt="3" width="33%" />




1. 同様にpatchを開き、CUDA Patchを選択したまま、Next
2. Install CompleteしたらFinish

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/d5bf57f1-90c3-484b-f2f8-9e773c439191.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/d0f0a1b4-e1ac-5cd0-05b4-aced22f6462c.png" alt="2" width="50%" />


これにて準備は完了。

nvvpアプリケーションを探し出して、起動すれば、NVIDIA Visual Profilerがローカル環境で使えるようになります。
<img width="1524" alt="Screen Shot 2017-08-23 at 16.26.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/56510/8f0f7d9e-5b79-6810-ec33-42afc1af562a.png">


#使ってみる
### `nvprof`でprofileをとる

例えばCaffe2とかで、以下のようなコマンドを、先頭に、`nvprof -o profile.nvp` をつけるような形でprofilingします。
`nvprof`に関しては、以下のサイトを
http://docs.nvidia.com/cuda/profiler-users-guide/index.html#nvprof-overview

```bash
nvprof -o profile.nvp \
	  python \
          ${CAFFE2_HOME}/caffe2/python/examples/resnet50_trainer.py  \
          --train_data $TRAIN_DATA \
          --num_gpus $NUM_GPUS \
          --batch_size 32 \
          --epoch_size 90 \
          --num_epochs 1 \
          --base_learning_rate 1.0 \
          --weight_decay 0.0001
```

このようにして、`nvprof`の結果を`profile.nvp`として、保存します。



### `scp`などでローカルマシンに結果を転送
この`profile.nvp`を`scp`コマンドなどを用いて、ローカルマシンにダウンロードし、NVIDIA Visual Profilerで見てみます。

```bash
$ scp username@XXX_Cluster:/hoge/profile.nvp /hoge/Desktop
```

### NVIDIA Visual Profilerで`profile.nvp`を開く

1. まずNVIDIA Visual Profilerを起動し、importから`profile.nvp`を開きます
2. nvprofを選択し、今回はsingle processを選択します。
3. Timeline data file から Browseを選択し、`profile.nvp`のパスを指定
4. 選択したらFinishでloadする

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/44c7b40d-aa34-e363-719f-26e5412bf8ba.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/6eae7538-3af6-68d6-99fc-ff4741878781.png" alt="2" width="50%" />


<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/f7c8b022-9681-41e1-b7f7-9b9347ade784.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/63bf7a2d-3b26-182a-737e-084429af590d.png" alt="2" width="50%" />

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/7e2c6c1f-03c0-f332-497e-2b01d11c7db7.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/c502939a-151c-d34c-973a-ae004d105419.png" alt="2" width="50%" />

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/6e643af6-20b8-810c-1f4d-410a745da3a3.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/686fa824-a125-c768-67ce-dd2742231ef0.png" alt="2" width="50%" />

すると、以下のような画面が表示されます。


![Screen Shot 2017-08-26 at 17.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/56510/da59445f-05a8-2acd-1ed8-e21574065154.png)




# 参考
https://gist.github.com/sonots/5abc0bccec2010ac69ff74788b265086