ノートPCでDeepStream SDK 6.1.1を動かしてみた

# はじめに
家にあるASUSのゲーミングPCがWeb閲覧専用機となりつつあるのですが
せっかくついているGPUを使ってみたくなったのでお正月の宿題として動作確認を行うことにしました。


# キーワード
- docker
- GPU
- ubuntu20.04
- nvidia deepstream SDK 6.1.1

# 参考

https://nttdocomo-developers.jp/entry/202212231200_3

https://developer.nvidia.com/deepstream-getting-started


# 環境
- ASUS TUF DASH F15 (Intel Corei5-11300H + Nvidia GeForce RTX 3060 Laptop GPU)
- Ubuntu 20.04.5 LTS
- docker ver.20.10.22
- NVIDIA Driver 515.86.01
- nvcr.io/nvidia/deepstream:6.1.1-devel

# 手順
## Winodows11からUbuntu20.04へ変更
ざっくりWindowsを消してUbuntuを入れても良いのですがさすがに。。。
裏ブタを開けて新しいSSDを入れ替えました。元のSSDは大切に取っておきます。

UbuntuのインストールはデフォルトのままUSBメモリからインストールしました。

## nvidia driverインストール

コマンドラインからインストールしても良いのですがubuntu20.04ではGUIでインストールできるようなのでインストールしてみました。

設定→このシステムについて→ソフトウェアのアップデート
→追加のドライバータブを選択しお好きなNvidiaDriverを選択→変更の適用を押します。
※ちなみに私はnvidia-driver-515をインストールしました。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245578/990be989-bf81-800c-faf5-249b1bc60dc9.png)

終わったら再起動します。

## 内臓グラフィックドライバからnvidiaGPUへ変更（必要に応じて）
インストール直後、GPUが複数あるシステムの場合、NVIDIA以外のグラフィックドライバが選択されていることがあります。

設定→このシステムについて→グラフィック　を参照
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245578/0cc294c1-8c07-060e-1a5e-c2b928d9d964.png)

ここでNVIDIA以外の（例えばIntel）グラフィックが選択されているときは切り替えが必要です。

https://qiita.com/HajimeKawahara/items/5e932ddced9bbd4b2d9a

コンソールで

    sudo prime-select nvidia

## dockerインストール

↓こちらの手順を拝借しました。

https://qiita.com/tatsuya11bbs/items/3af03e704812b6c89965

https://takake-blog.com/ubutnu2004-install-nvidia-docker/


### dockerインストール

    $ sudo apt-get update
    $ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    $ sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
         $(lsb_release -cs) \
       　stable"
    $ sudo apt-get update
    $ sudo apt-get install -y docker-ce

### dockerの動作確認

    $ sudo docker run hello-world

        Hello from Docker!
        This message shows that your installation appears to be working correctly.
        
        To generate this message, Docker took the following steps:
         1. The Docker client contacted the Docker daemon.
         2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
            (amd64)
         3. The Docker daemon created a new container from that image which runs the
            executable that produces the output you are currently reading.
         4. The Docker daemon streamed that output to the Docker client, which sent it
            to your terminal.
        
        To try something more ambitious, you can run an Ubuntu container with:
         $ docker run -it ubuntu bash
        
        Share images, automate workflows, and more with a free Docker ID:
         https://hub.docker.com/
        
        For more examples and ideas, visit:
         https://docs.docker.com/get-started/

### docker実行ユーザの追加
いちいちsudoを使うのは面倒なので現在んもユーザでdockerが使えるように権限を付与します。

    # sudo usermod -aG docker ${USER}
 

## nvidia-docker2のインストール
dockerからGPUが使えるよう設定します。

    $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
    $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    $ sudo apt-get update && sudo apt-get install -y nvidia-docker2
    
    $ sudo systemctl restart docker

### dockerでGPUが使えるか確認

    $ docker run --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
    Unable to find image 'nvidia/cuda:11.6.2-base-ubuntu20.04' locally
    11.6.2-base-ubuntu20.04: Pulling from nvidia/cuda
    846c0b181fff: Pull complete 
    b787be75b30b: Pull complete 
    40a5337e592b: Pull complete 
    8055c4cd4ab2: Pull complete 
    a0c882e23131: Pull complete 
    Digest: sha256:9928940c6e88ed3cdee08e0ea451c082a0ebf058f258f6fbc7f6c116aeb02143
    Status: Downloaded newer image for nvidia/cuda:11.6.2-base-ubuntu20.04
    Mon Jan 16 04:43:49 2023       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.86.01    Driver Version: 515.86.01    CUDA Version: 11.7     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0 Off |                  N/A |
    | N/A   47C    P8    13W /  N/A |    415MiB /  6144MiB |     14%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+


## NVIDIA DeepStream SDKを実行
実行結果を画面に描画するためdocker内からGUI表示ができるよう設定します。

    $ xhost +
    access control disabled, clients can connect from any host

NVIDIAのリポジトリからdockerimageをPullして実行します。
「-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY」でホストOSのGUIリソースが利用できるようにします。
 
    $ docker run --gpus all -it --rm \
    > -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY \
    > -w /opt/nvidia/deepstream/deepstream-6.1 \
    > nvcr.io/nvidia/deepstream:6.1.1-devel
    ・・・・
    root@5ecfcfbbc8c5:/opt/nvidia/deepstream/deepstream-6.1#

dockerが起動してコンソールが出てきたら動画認識のサンプルプログラムを起動してみます。
最初モデルの変換が行われるので起動に時間がかかります。

    root@5ecfcfbbc8c5:/opt/nvidia/deepstream/deepstream-6.1# deepstream-app -c sampl
    es/configs/deepstream-app/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt 
    
    (gst-plugin-scanner:10): GStreamer-WARNING **: 04:51:23.265: Failed to load plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstchromaprint.so': libavcodec.so.58: cannot open shared object file: No such file or directory
    
    (gst-plugin-scanner:10): GStreamer-WARNING **: 04:51:23.413: Failed to load plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_inferserver.so': libtritonserver.so: cannot open shared object file: No such file or directory
    
    (gst-plugin-scanner:10): GStreamer-WARNING **: 04:51:23.413: Failed to load plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_udp.so': librivermax.so.0: cannot open shared object file: No such file or directory
    WARNING: ../nvdsinfer/nvdsinfer_model_builder.cpp:1482 Deserialize engine failed because file path: /opt/nvidia/deepstream/deepstream-6.1/samples/configs/deepstream-app/../../models/Secondary_CarMake/resnet18.caffemodel_b16_gpu0_int8.engine open error
    ・・・


    0:01:22.940566209     9 0x5647876d7f90 INFO                 nvinfer gstnvinfer_impl.cpp:328:notifyLoadModelStatus:<primary_gie> [UID 1]: Load new model:/opt/nvidia/deepstream/deepstream-6.1/samples/configs/deepstream-app/config_infer_primary.txt sucessfully
    
    Runtime commands:
    	h: Print this help
    	q: Quit
    
    	p: Pause
    	r: Resume
    
    NOTE: To expand a source in the 2D tiled display and view object details, left-click on the source.
          To go back to the tiled display, right-click anywhere on the window.
    
    
    **PERF:  FPS 0 (Avg)	FPS 1 (Avg)	FPS 2 (Avg)	FPS 3 (Avg)	
    **PERF:  0.00 (0.00)	0.00 (0.00)	0.00 (0.00)	0.00 (0.00)	
    ** INFO: <bus_callback:194>: Pipeline ready

こんな感じでGUI上にWindowが生成され、認識結果が表示されます。

![Screenshot from 2023-01-16 14-23-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245578/9d88703d-a934-05b1-db19-6949dde9e3a7.png)

# 終わりに
次回はAtomCamとの連携を行ってみようと思います。