iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
Software Development

深入認識DeepStream,不只是停在執行範例系列 第 3

[Day 03] 建立DeepStream的開發環境

  • 分享至 

  • xImage
  •  

建立DeepStream的開發環境

由於DeepStream是一個獨立的SDK,如果你要在本機上安裝就得先安裝大量的依賴程式庫。但大家都知道依賴程式庫是很複雜的,誰也不知道哪個程式庫升級了就會出大事,甚至跟你其他專案的程式庫有衝突,隨著AI迅速發展,相關的程式庫對版本號非常敏感,為了追求迭代速度往往犧牲了相容性,因此強烈推薦使用Docker來處理DeepStream的開發環境。

作業系統

再見了Windows

基本上現在AI相關的程式庫發展大量擁抱Linux,而DeepStream也不例外,整個官方文件的安裝步驟對Windows隻字不提,所以後續我們都是在Linux系統做開發哦!

難割難捨的Windows以及救星WSL

如果你跟我一樣只有Windows電腦,沒關係!還有WSL(Windows Subsystem for Linux)可以拯救你。至於說為什麼不選虛擬機就好,因為懶得設定虛擬機的資源分配,而WSL在硬體資源的使用效率也表現得比虛擬機還要好,特別是驅動程式是直接調用Windows本機的驅動程式。基於種種因素,選擇WSL作為替代方案是個明智的選擇。

WSL安裝

我相信不是每個人都有用過WSL,那如果你又剛好不是很會閱讀微軟的文章,我們這邊手把手教你安裝一遍。由於撰寫本文時最新的DeepStream版本是9.1,對標的系統是Ubuntu-24.04,所以我們就以這個版本為主,打開你的PowerShell執行以下命令:

wsl --install -d Ubuntu-24.04

然後呢?然後它就安裝好了,就是這麼簡單。

順便教一下啟動/關閉的指令

# 啟動WSL
wsl -d Ubuntu-24.04

# 關閉WSL,否則它會在背景吃你資源
wsl --shutdown

如果你的C槽不夠用

也許你會遇到有太多東西預設裝在C槽,WSL也不例外,而且DeepStream的Docker容器特別肥,動輒20~30 GB,導致你的C槽容量岌岌可危。這邊教你一個把WSL搬家的方法。

我們先確認WSL是關閉的

wsl --shutdown

再來幫它搬家,假設你的硬碟有分割一個D槽並且它剩餘容量很大,可以透過以下指令把它搬過去。D:\wsl\Ubuntu-24.04這個路徑可以隨你設定,這邊只作範例

wsl --manage Ubuntu-24.04 --move D:\wsl\Ubuntu-24.04

安裝Docker Engine

為什麼不選Docker Desktop?即便它是跑在Windows系統,但它還是會在你的WSL執行Docker Engine,加上如果你是使用公司電腦,Docker Desktop是單獨的授權條款,要特別留意。總之呢,身為一位優秀的工程師,還是得學一下怎麼用Terminal操作對吧。

官方安裝教學

https://docs.docker.com/engine/install/ubuntu/

如果你懶得打開官方文件自己安裝的話,可以參考下方手把手教學,但是任何最新的教學還是以官方文件為主。

手把手教學

  1. 設定套件倉庫
    # Add Docker's official GPG key:
    sudo apt update
    sudo apt install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
    Types: deb
    URIs: https://download.docker.com/linux/ubuntu
    Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
    Components: stable
    Architectures: $(dpkg --print-architecture)
    Signed-By: /etc/apt/keyrings/docker.asc
    EOF
    
    sudo apt update
    
  2. 安裝套件
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  3. 確定docker狀態是active(running),按q可以離開
    sudo systemctl status docker
    
  4. Optional: 把自己加到docker group,不用每次都使用sudo
    sudo usermod -aG docker $USER
    newgrp docker
    

安裝NVIDIA Container Toolkit

官方安裝教學

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

手把手教學

  1. 安裝依賴
    sudo apt-get update && sudo apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    gnupg2
    
  2. 設定倉庫並更新
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
        sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    
    sudo apt-get update
    
  3. 安裝NVIDIA Container Tookkit
    export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.19.1-1
    sudo apt-get install -y \
        nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
        nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
        libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
        libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
    
  4. 設定docker的runtime並重啟docker
    sudo nvidia-ctk runtime configure --runtime=docker
    
    sudo systemctl restart docker
    

安裝DeepStream的Docker容器

本文以當下最新版本DeepStream-9.1為主

拉取容器

```bash
docker pull nvcr.io/nvidia/deepstream:9.1-triton-multiarch
```

啟動容器

因為我是用WSL,畫面是不能顯示的,所以我簡化了官方啟動教學的一些步驟。先移動到自己的工作目錄,我們假設是~/ironman,再來我們會啟動一個命名容器在背景執行,然後把工作目錄映射到容器內,這樣後續要從容器內搬影片出來比較方便

Linux版本

cd ~/ironman
docker run -itd --name=ironman --gpus=all \
    -v .:/ironman \
    nvcr.io/nvidia/deepstream:9.1-triton-multiarch

WSL版本

我以前使用WSL時,用Linux版本的啟動方式就能正確載入驅動,但不知道是哪個版本更新後,需要一些額外的操作才能載入驅動

cd ~/ironman
docker run -itd --name=ironman --gpus=all --device /dev/dxg \
    -v .:/ironman \
    -v /usr/lib/wsl/lib/libnvcuvid.so.1:/usr/lib/x86_64-linux-gnu/libnvcuvid.so.1:ro \
    -v /usr/lib/wsl/lib/libnvidia-encode.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-encode.so.1:ro \
    -e LD_LIBRARY_PATH=/usr/lib/wsl/lib:\$LD_LIBRARY_PATH \
    nvcr.io/nvidia/deepstream:9.1-triton-multiarch

往返容器

因為容器在背景執行,所以要使用指令進入容器

docker exec -it ironman bash

在容器內執行nvidia-smi檢查是否能正確載入驅動
應該要能看到這樣的訊息

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 610.57.01              KMD Version: 610.88        CUDA UMD Version: 13.3     |
+-----------------------------------------+------------------------+----------------------+
| 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 RTX 3050        On  |   00000000:01:00.0  On |                  N/A |
|  0%   49C    P8             14W /  130W |    1051MiB /   8192MiB |      9%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

要離開容器的話就輸入

exit

使用指令檢視容器

# 只顯示運行中的
docker ps

# 顯示運行中及已停止的
docker ps -a

使用指令停止容器

docker stop ironman

要再啟動的話使用

docker start ironman

假設容器不用了,先停止再刪除

docker stop ironman
docker rm ironman

結尾

今天就著重在環境建置上啦,因為這個步驟往往不是那麼順利,我覺得把它獨立出來講的詳細一點能幫助到對這些步驟很陌生的小夥伴。明天我們就要正式進入DeepStream啦!


上一篇
[Day 02] 比起DeepStream,你應該先認識GStreamer
下一篇
[Day 04] 認識工具`gst-inspect-1.0`
系列文
深入認識DeepStream,不只是停在執行範例14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言