docker: Error response from daemon: Unknown runtime specified nvidia. See 'docker run --help'.錯誤詳解

前言

這是筆者照著NVIDIA/nvidia-docker: Installation (version 2.0)在CentOS7下安裝nvidia-docker 2.0版時發生的錯誤。

錯誤訊息

docker: Error response from daemon: Unknown runtime specified nvidia.
See ‘docker run --help’.

發生背景

以下描述筆者的安裝步驟:
一開始先照著教學將nvidia-docker 1.0移除,然後繼續安裝 nvidia-docker 2.0:

sudo yum install nvidia-docker2

但是安裝完成後忘了執行:

sudo pkill -SIGHUP dockerd

而直接使用:

NV_GPU=0,1 nvidia-docker run --name tensorflow -d tensorflow/tensorflow:1.11.0-gpu-py3

於是就出現了上述錯誤。

發生原因

回顧一下上面所做的事:移除nvidia-docker 1.0 -> 安裝nvidia-docker 2.0。

在發生這個錯誤之後,筆者有試著執行nvidia-dockernvidia-docker version,發現兩者都是可以成功運行的。只有在執行nvidia-docker run xxx的時候才報錯。因此我們可以猜測只有在執行nvidia-docker run xxx時才會調用到nvidia runtime。

nvidia-docker run vs docker run --runtime=nvidia這個問答便說明了這一點:nvidia-docker run在nvidia-docker 2.0版中其實就等於docker run --runtime=nvidia

於是我們可以發現:Unknown runtime specified nvidia這個錯誤訊息其實是針對docker run --runtime=nvidia這個指令說的。

至於為什麼它找不到nvidia runtime呢?這是因為雖然nvidia-docker 2.0己經安裝,但是dockerd卻未載入相應的設定檔。

我們可以在/etc/docker這個資料夾裡發現daemon.json這個檔案,也就是dockerd的設定檔:

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

這個設定檔中指出了nvidia runtime的具體位置,也就是nvidia-container-runtime。

而這正好就是dockerd所缺少的部份。

解決辦法

解決辦法就是執行:

sudo pkill -SIGHUP dockerd

SGIHUP在這裡是什麼作用呢?關於這點筆者有稍微去了解一下:
一開始看到Sending signal to ProcessesDifference between less violent kill signal -HUP (1) -INT (2) and -TERM (15)的解釋覺得不明所以,直到看到了SIGHUP for reloading configuration這個stackoverflow上的問答才豁然開朗。

總結一下,SIGHUP對一般process的作用與SIGTERM類似,都是殺死該process的信號。
然而對daemon傳送SIGHUP的訊息卻有著全然不同的涵義:它表示的是重新載入該daemon的設定
因此這句指令的意思是在安裝nvidia-docker 2.0之後,要docker daemon這個process載入新的設定。
執行這句指令之後,再重新運行NV_GPU=0,1 nvidia-docker run --name tensorflow -d tensorflow/tensorflow:1.11.0-gpu-py3就不會報錯了。

後記

後來筆者又在其它的機器上碰到同樣的錯誤:

筆者當時己將舊版的docker(1.12版)更新為docker-ce(18.09版),但nvidia-docker仍版本為1.0.1版。
然後接著使用docker start tensorflow,這時就出錯了。

首先移除nvidia-docker 1.0,安裝nvidia-docker 2.0並試了上述的方法,但是問題仍然沒有解決。

後來才想到tensorflow這個docker container是使用nvidia-docker 1.0啟動的,所以必須移除這個container,然後使用再次使用docker run,即NV_GPU=0,1 nvidia-docker run --name tensorflow -d tensorflow/tensorflow:1.11.0-gpu-py3才行。
移除container再重新run之後tensorflow這個container果然可以順利運行。

參考連結

NVIDIA/nvidia-docker: Installation (version 2.0)
nvidia-docker run vs docker run --runtime=nvidia
Sending signal to Processes
Difference between less violent kill signal -HUP (1) -INT (2) and -TERM (15)
SIGHUP for reloading configuration
Why do I get the error Unknown runtime specified nvidia?

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐