docker: Error response from daemon: Unknown runtime specified nvidia.錯誤詳解
這是筆者照著NVIDIA/nvidia-docker: Installation (version 2.0)在CentOS7下安裝nvidia-docker 2.0版時發生的錯誤。以下描述筆者的安裝步驟:一開始先照著教學將nvidia-docker 1.0移除,然後繼續安裝 nvidia-docker 2.0,但是安裝完成後忘了執行sudo pkill -SIGHUP dockerd,而直直接使用
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-docker
及nvidia-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 Processes及Difference 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?
更多推荐
所有评论(0)