由於DeepStream是一個獨立的SDK,如果你要在本機上安裝就得先安裝大量的依賴程式庫。但大家都知道依賴程式庫是很複雜的,誰也不知道哪個程式庫升級了就會出大事,甚至跟你其他專案的程式庫有衝突,隨著AI迅速發展,相關的程式庫對版本號非常敏感,為了追求迭代速度往往犧牲了相容性,因此強烈推薦使用Docker來處理DeepStream的開發環境。
基本上現在AI相關的程式庫發展大量擁抱Linux,而DeepStream也不例外,整個官方文件的安裝步驟對Windows隻字不提,所以後續我們都是在Linux系統做開發哦!
如果你跟我一樣只有Windows電腦,沒關係!還有WSL(Windows Subsystem for Linux)可以拯救你。至於說為什麼不選虛擬機就好,因為懶得設定虛擬機的資源分配,而WSL在硬體資源的使用效率也表現得比虛擬機還要好,特別是驅動程式是直接調用Windows本機的驅動程式。基於種種因素,選擇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槽,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 Desktop?即便它是跑在Windows系統,但它還是會在你的WSL執行Docker Engine,加上如果你是使用公司電腦,Docker Desktop是單獨的授權條款,要特別留意。總之呢,身為一位優秀的工程師,還是得學一下怎麼用Terminal操作對吧。
https://docs.docker.com/engine/install/ubuntu/
如果你懶得打開官方文件自己安裝的話,可以參考下方手把手教學,但是任何最新的教學還是以官方文件為主。
# 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
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
active(running),按q可以離開
sudo systemctl status docker
sudo
sudo usermod -aG docker $USER
newgrp docker
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
sudo apt-get update && sudo apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg2
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
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}
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
本文以當下最新版本DeepStream-9.1為主
```bash
docker pull nvcr.io/nvidia/deepstream:9.1-triton-multiarch
```
因為我是用WSL,畫面是不能顯示的,所以我簡化了官方啟動教學的一些步驟。先移動到自己的工作目錄,我們假設是~/ironman,再來我們會啟動一個命名容器在背景執行,然後把工作目錄映射到容器內,這樣後續要從容器內搬影片出來比較方便
cd ~/ironman
docker run -itd --name=ironman --gpus=all \
-v .:/ironman \
nvcr.io/nvidia/deepstream:9.1-triton-multiarch
我以前使用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啦!