參考資料:
https://blog.csdn.net/qq_33547243/article/details/107433616
https://www.cnblogs.com/shoufu/p/12904832.html
https://github.com/NVIDIA/nvidia-docker/issues/533
首先介紹幾個事實:
1. 最初的docker是不支持gpu的
2. 為了讓docker支持nvidia顯卡,英偉達公司開發了nvidia-docker。該軟件是對docker的包裝,使得容器能夠看到並使用宿主機的nvidia顯卡。
3. 根據網上的資料,從docker 19版本之后,nvidia-docker成為了過去式。不需要單獨去下nvidia-docker這個獨立的docker應用程序,也就是說gpu docker所需要的Runtime被集成進docker中,使用的時候用--gpus參數來控制。
(P.S.:因為本實驗室服務器的docker默認是支持nvidia的runtime的,所以我在這里沒有過多糾結,讀者假如從零開始安裝docker軟件的話可能要細心地保證docker是支持gpu的docker)
然后我做了幾個有代表性的實驗:
1. docker run 的時候不加 --gpus參數,典型代碼:
docker run -it --name test --rm ubuntu:latest
此時在容器內運行nvidia-smi會提示Command not found
2. docker run 的時候加上 --gpus參數,典型代碼:
docker run -it --rm --name test --gpus all ubuntu:latest
此時在容器內運行nvidia-smi會有如下輸出:
從這兩個實驗我們可以得出結論,docker在啟動容器的時候添加的--gpus參數確實是給容器添加了新東西的。比如/usr/bin/nvidia-smi這個可執行程序,如果你不添加--gpus參數是不會給你放到容器中的!此外可以推測,不加--gpus參數,宿主的gpu將對於容器不可見。
還有一個需要注意的點是nvidia-smi的輸出!CUDA Version: N/A
首先,我的宿主機的CUDA是明確的11.0版本,宿主機的nvidia driver是明確的450.57版本(這一點宿主和容器一致)。那么為什么這里顯示 N/A 呢?
抱着nvidia-smi能用driver一定沒問題的想法,我三下五除二地在docker中安裝了pytorch。可是運行測試代碼的時候傻眼了,測試代碼:
import torch torch.cuda.is_available()
輸出報錯結果如下:
UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:100.)
return torch._C._cuda_getDeviceCount() > 0
為什么Pytorch找不到NVIDIA driver?? 我的driver哪里有問題?? nvidia-smi不是運行的好好的??
嘗試過在docker內重裝多版本的cuda無果,嘗試在docker內重裝nvidia驅動反而導致nvidia-smi都無法運行。直到我在參考資料3中找到了解決方案,原來是環境變量的問題。
最后,拉一個GPU docker的正確姿勢:
docker run -itd --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all 鏡像名
多出來的東西其實就是這個家伙:NVIDIA_DRIVER_CAPABILITIES=compute,utility
也就是說,如果你不改這個環境變量,宿主機的nvidia driver在容器內是僅作為utility存在的,如果加上compute,宿主機的英偉達driver將對容器提供計算支持(所謂的計算支持也就是cuda支持)。
docker exec進入容器,再次運行nvidia-smi
和宿主機的輸出就完全相同了。
再次嘗試pytorch的測試代碼,輸出為True。
至此,你就獲得了一個具有nvidia driver和cuda支持的docker。(需要注意的是,我的pytorch是直接用conda安裝的,它的依賴cudatoolkits僅對conda可見,如果你需要cuda做更多事,可能還需要進一步的嘗試。但是我猜想既然nvidia-smi的輸出是好的,那么大概率沒問題)