【Linux】GPU逆引きコマンド

# nvidiaGPU便利コマンド関連
GPUでやりたい時、GPUの動作がおかしい時にやるコマンド。
ディープラーニングの学習用、仮想通貨のマイニングなどのGPU使用などを念頭にしてます。

コマンドは基本的にLinuxで使える。


# GPUタスクをモニタしたい

```shell

nivida-smi -l
```

でメモリ使用率、温度、プロセスなどが出ます。
-l オプションをなくすと一度だけ表示させます。

```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.48                 Driver Version: 410.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:04:00.0 Off |                    0 |
| N/A   52C    P0    76W / 250W |   7023MiB / 12198MiB |     21%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  Off  | 00000000:82:00.0 Off |                    0 |
| N/A   39C    P0    75W / 250W |   1333MiB / 12198MiB |     67%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      9964      C   python                                       431MiB |
|    1     22430      C   python                                      1323MiB |
+-----------------------------------------------------------------------------+

```

# 学習に使用するGPUを指定したい
マルチGPUを利用し学習するときはコマンドライン上で使用するGPUを指定する。
指定を行わないと自動的に全てのGPUを掴んでしまい、迷惑をかけることも。
ちゃんと使うGPUは明示的にした方がベター。

## bash shellの場合
```shell

# GPU0,1両方を利用
export CUDA_VISIBLE_DEVICES=0,1
# 学習開始
python train.py
# GPU0,1を利用し学習が行われる

＃GPU0のみ利用
export CUDA_VISIBLE_DEVICES=0
# 学習開始
python train.py
# GPU0のみで学習が行われる
```

## csh系の場合
```shell

# GPU0,1両方を利用
setenv CUDA_VISIBLE_DEVICES 0,1
# 学習開始
python train.py
# GPU0,1を利用し学習が行われる

＃GPU0のみ利用
setenv CUDA_VISIBLE_DEVICES 0
# 学習開始
python train.py
# GPU0のみで学習が行われる
```

# GPU、OSがよく落ちてしまう場合
冷却性能不足などでサーバが落ちてしまうことがある場合、GPUに電力リミットをつけると良い。

```shell

>nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.48                 Driver Version: 410.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:04:00.0 Off |                    0 |
| N/A   52C    P0    76W / 250W |   7023MiB / 12198MiB |     21%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  Off  | 00000000:82:00.0 Off |                    0 |
| N/A   39C    P0    75W / 250W |   1333MiB / 12198MiB |     67%      Default |
+-------------------------------+----------------------+----------------------+
```

200Wに電力制限してみる。

```shell

# permuteモード。再起動するまで設定を保持する
>sudo nvidia-smi -pm 1
>sudo nvidia-smi -pl 200
>nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.48                 Driver Version: 410.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 00000000:04:00.0 Off |                    0 |
| N/A   52C    P0    76W / 200W |   7023MiB / 12198MiB |     21%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  Off  | 00000000:82:00.0 Off |                    0 |
| N/A   39C    P0    75W / 200W |   1333MiB / 12198MiB |     67%      Default |
+-------------------------------+----------------------+----------------------+

```

無事に電力リミットが200Wになったことを確認。
50W下げた程度ではパフォーマンスはあまり変わらないのでサーバが不安定なときにおすすめ。
これをやることで動作が安定になる場合も多い（本当は冷却機能や電源を拡充したほうがいいが。。）


# GPUをリセットしたいリセット

```shell

# GPU0をリセット
sudo nvidia-smi --gpu-reset -i 0
```

# どのユーザがGPUを利用しているか調べたい
```shell

sudo fuser -v /dev/nvidia*
```