不想裝CUDA但是想跑CUDA,那就改在Docker容器裡跑吧!
Nvidia Container Toolkit是Nvidia開發的開源軟體,原始碼位於Github,當然Nvidia驅動部分還是閉源的。
Docker與Podman裡面的程式,預設是不能使用CUDA加速計算的。透過這款設計給容器用的Nvidia工具,使容器可以存取宿主機GPU,使用CUDA計算。
根據官網,架構圖如下:
即使Linux宿主機沒有安裝CUDA Toolkit,Docker容器內照樣可以使用CUDA計算。方便你在容器裡面跑不同版本的CUDA,不會受到宿主機的CUDA版本影響。
1. Nvidia Container Toolkit優點?#
有些程式(就是在說你,Tensorflow)非常吃Nvidia閉源驅動+CUDA+Linux系統的版本,三位一體只要有個版本不對就會出亂子,甚至CUDA只要差一兩個版本程式就會不給跑。
這個時候採用Docker容器化開發可以降低困擾,將CUDA塞在Docker裡面就能迴避Linux宿主機版本的要求。
Nvidia Container Toolkit僅求要求宿主機安裝Nvidia閉源驅動即可,卻不需要安裝CUDA Toolkit。
並且由於容器有多重複製的特性,開發者能夠按照不同專案需求開不同的容器環境部署服務,各個容器的CUDA版本是彼此獨立的。
此外,依賴CUDA的cudnn、TensorRT應也可如法炮製。
宿主機只需要安裝Nvidia閉源驅動,剩下的交給Docker容器去處理就好了。而負責讓容器內的CUDA跟宿主機Nvidia驅動溝通的媒介,就是Nvidia Container Toolkit了。
Nvidia Container Toolkit還可以解決依賴特定發行版的問題。如果你系統用的不是Nvidia原廠支援的發行版(Deb-based、RPM-based)的就GG了,這很不公平。
Nvidia Container Toolkit僅依賴宿主機的Nvidia閉源驅動,卻不需要安裝CUDA Toolkit。
於是它可以讓Linux宿主機在沒有安裝CUDA Toolkit的情況下,於Docker/Podman容器使用CUDA進行計算。
特別適合給不方便安裝CUDA的Linux使用。
這適用一種極端的情況:immutable distro,例如Fedora Silverblue、openSUSE MicroOS、Vanilla OS等等。他們雖然可以裝Nvidia驅動,但是沒辦法安裝CUDA套件。透過Nvidia Container Toolkit即可繞過這個問題。
2. 如何安裝Nvidia Container Toolkit#
此處以Ubuntu為例
在Ubuntu安裝Docker
Ubuntu沒有打包這個套件,需要加入NVIDIA Container Toolkit的套件庫:
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- 安裝NVIDIA Container Toolkit
sudo apt update
sudo apt install nvidia-container-toolkit- 如果使用Docker,註冊Nvidia裝置,重新啟動Docker。執行Ubuntu容器,測試能否印出Nvidia顯示卡的資訊。
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi註:如果出現ERRO[0000] unable to load config for runtime docker: EOF錯誤,嘗試手動編輯/etc/docker/daemon.json,加入以下內容:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}- 至於Podman的話,使用Nvidia CDI,執行Ubuntu容器,測試能否印出Nvidia顯示卡的資訊。
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
nvidia-ctk cdi list
podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable ubuntu nvidia-smi參考資料#
Installing the NVIDIA Container Toolkit - NVIDIA CONTAINER TOOLKIT


