Jupyterもしくはブラウザ上でGPUの状態を可視化出来るダッシュボード

GPUの使用状況が可視化できるダッシュボードがあるぞ

これを使用すればGPUを効率よく使用できているか確認できますね。

導入も簡単だからおすすめだ

GPUの状態の可視化について

GPUの状態を可視化できれば、GPUを効率よく使用してDeep Learningのモデルを作成できているかを確認できます。またcudfなどのGPUを利用したデータの前処理でも効率よく使用できているか効果を確認できます。

本記事では”GPU Dashboards in Jupyter Labを使ってGPUの状態を可視化してみます。

可視化できる内容について

下記の情報を可視化できます。

  • GPUの計算状況
  • GPUのメモリ状況
  • PCIeのスループット
  • NVlinkのスループット
  • Machineのリソース

PCIeですがGPUとCPUをつなげる部分になります。ここで効率よくデータCPUからGPUに転送できていないとGPUで計算できないのでここも計測します。

NVlinkはPCIeだとGPUへの転送幅が限られているのでより大きなバンド幅を持つハードデバイスです。PCIe 3.0の5倍程度のバンド幅があります。CPUによってはCPUとGPUをNVlinkで繋げられますが、基本的にGPU間をつなげています。複数のGPUを使用する場合にチェックする項目になります。

https://news.mynavi.jp/article/architecture-357/

Machineのリソースは下記の項目が計測できます。

  • CPU
  • メモリー
  • Disk I/O バンド幅
  • Network I/O バンド幅

計測方法について

rapidsのdockerコンテナにjupyterをインストールすれば簡単に動作できます。他の環境にインストールする場合はnode.jsを事前にインストールする必要があります。

Jupyterで計測する方法について

NVIDIA GPU CLOUDからコンテナを取得します。

docker run --gpus all --rm -it -p 8889:8889 -p 8787:8787 -p 8786:8786          rapidsai/rapidsai:cuda10.1-runtime-ubuntu18.04

NVIDIA GPU CLOUDの登録方法は下記です。

docker内で下記コマンドでGPUダッシュボードをインストールします。

pip install jupyterlab-nvdashboard
jupyter labextension install jupyterlab-nvdashboard

docker内でjupyterを動作します。

jupyter-lab --allow-root --ip=0.0.0.0 --NotebookApp.token=""

ブラウザの”localhost:8889″ にアクセスすると下記のようなJupyterを確認できます。

実際に表示してみると下記のようになります。

Bokeh Serverを使用する方法

jupyter上からGPUダッシュボードを確認する方法ではなくローカルでサーバーを立ててサーバーから確認する方法になります。

docker上で下記コードを動作します。ホストと連携しているポート番号を指定します。

python -m jupyterlab_nvdashboard.server <port number>

起動すると下記のような画面になります。

GPU resourcesをクリックすると下記のような画面になります。

実装のカスタマイズについて

下記リンクに詳細が記述されています。

https://medium.com/rapids-ai/gpu-dashboards-in-jupyter-lab-757b17aae1d5

内容を簡単に紹介するとPyNVMLライブラリを使用してGPUのリソースの状況を取得しています。

取得できる項目で今回、表示していない項目は下記になります。

  • エラー数:修正可能なシングルビットと検出可能なダブルビットの両方のエラーが報告されます。エラーカウントは、現在のブートサイクルとGPUのライフサイクルの両方について提供されます。
  • アクティブな計算プロセス: GPU上で実行されているアクティブなプロセスのリストが、対応するプロセス名/IDおよび割り当てられたGPUメモリとともに提供されます。
  • 温度とファン速度: 現在のコアGPUの温度とファン速度が提供されます。
  • パワーマネジメント: サポートされている製品のみですがボードの電力消費量と電力制限が報告されます。
  • Identification: ボードのシリアル番号、PCIデバイスID、VBIOS/Inforomのバージョン番号、製品名など、さまざまな動的および静的情報が報告されます。

jupyterlab_nvdashboard/apps/gpu.pyが対象になるようなので下記コマンドで探して温度が計測できるか実装してみました。

find / -name "jupyterlab_*"

/opt/conda/envs/rapids/lib/python3.6/site-packages/jupyterlab_nvdashboard/apps/gpu.pyが見つかったので修正してみます。

GPUの温度を取得して表示するコードを追加しました。下記のようなコードになります。

GPUの温度取得用関数を設定。殆どの項目はダッシュボード表示に必要な項目になります。

def gpu_temp(doc):
    item_dict = {
        "time": [],
        "temp-total": [],
    }

    source = ColumnDataSource(item_dict)
    tools = "reset,xpan,xwheel_zoom"
    x_range = DataRange1d(follow="end", follow_interval=20000, range_padding=0)

    temp_fig = figure(
        title = "GPU Temperature [Celsius]",
        sizing_mode="stretch_both",
        x_axis_type="datetime",
        x_range=x_range,
        tools=tools,
    )
    temp_fig.line(source=source, x="time", y="temp-total", color="blue", legend="Temp")
    temp_fig.yaxis.formatter = NumeralTickFormatter(format="0.0 Celsius")
    temp_fig.legend.location = "top_left"

    doc.title = "GPU temp Timeline"
    doc.add_root(
        column(temp_fig, sizing_mode="stretch_both")
    )

    last_time = time.time()

    def cb():
        nonlocal last_time
        now = time.time()
        src_dict = {"time": [now * 1000]}
        temp_tot = 0
        for i in range(ngpus):
            temp = (
                pynvml.nvmlDeviceGetTemperature(gpu_handles[i], pynvml.NVML_TEMPERATURE_GPU)
            )
            temp_tot += temp
        src_dict["temp-total"] = [temp_tot]

        source.stream(src_dict, 1000)

        last_time = now

    doc.add_periodic_callback(cb, 200)

GPUの温度を取得しているコードは下記になります。GPUのIDを指定してGPUの温度を取得しています。

pynvml.nvmlDeviceGetTemperature(gpu_handles[i], pynvml.NVML_TEMPERATURE_GPU)

このコードだけだとダッシュボード上で確認できないので/opt/conda/envs/rapids/lib/python3.6/site-packages/jupyterlab_nvdashboard/server.pyも修正します。

"/GPU-Temperature": apps.gpu.gpu_temp,を追記しています。これによって先程作成した関数からGPUの温度を取得して表示できます。

routes = {
    "/GPU-Utilization": apps.gpu.gpu,
    "/GPU-Temperature": apps.gpu.gpu_temp,
    "/GPU-Memory": apps.gpu.gpu_mem,
    "/GPU-Resources": apps.gpu.gpu_resource_timeline,
    "/PCIe-Throughput": apps.gpu.pci,
    "/NVLink-Throughput": apps.gpu.nvlink,
    "/NVLink-Timeline": apps.gpu.nvlink_timeline,
    # "/CPU-Utilization": apps.cpu.cpu,
    "/Machine-Resources": apps.cpu.resource_timeline,
}

実際に表示している様子です。

Close Bitnami banner
Bitnami