docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #1: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: mount error: file creation failed: /var/lib/docker/overlay2/752c7d9dab7757b8cb12c97e51b0d12325f5135cc96c7bb73d61ae2273907f01/merged/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1: file exists: unknown.
提示文件已存在,需要?jiǎng)h除
故障原因:
nvidia-docker最古老的容器內(nèi)nvidia gpu的調(diào)用是需要在鏡像(或容器)中安裝與宿主機(jī)nvidia顯卡驅(qū)動(dòng)兼容的驅(qū)動(dòng)版本,但是這一要求比較難以滿足,因?yàn)槿绻拗鳈C(jī)的nvidia驅(qū)動(dòng)略低于docker容器下nvidia驅(qū)動(dòng)版本就很容易出現(xiàn)forward compatibility錯(cuò)誤,而比較可行的就是容器內(nèi)的nvidia驅(qū)動(dòng)版本略低于宿主機(jī)版本。正是因?yàn)樽钤绲膎vidia-docker這個(gè)難以保證宿主機(jī)和容器的nvidia驅(qū)動(dòng)版本匹配,因此現(xiàn)在的nvidia-docker使用的方案是在制作docker鏡像時(shí)不安裝nvidia driver和cuda,而是在nvidia-docker容器啟動(dòng)時(shí)自動(dòng)把宿主機(jī)中的nvidia driver和cuda映射給容器,對(duì)應(yīng)的nvidia-docker啟動(dòng)容器時(shí)附加參數(shù)為 --gpus all,但是有一些人對(duì)這個(gè)原理并不是很了解因此在制作鏡像的時(shí)候依舊會(huì)把nvidia driver和cuda打包進(jìn)去【應(yīng)該是在做鏡像的時(shí)候不應(yīng)該把--gpus all參數(shù)加進(jìn)去】。由于wsl下對(duì)物理機(jī)的nvidia顯卡是使用模擬的方式,這時(shí)的wsl中使用的nvidia驅(qū)動(dòng)其實(shí)是wsl-nvidia-driver,也正是由于該驅(qū)動(dòng)的一些特性導(dǎo)致在wsl中如果使用nvidia-docker啟動(dòng)自身帶有nvidia driver和cuda的容器就會(huì)在啟動(dòng)時(shí)報(bào)錯(cuò)。其報(bào)錯(cuò)的故障具體點(diǎn)為wsl使用nvidia-docker啟動(dòng)容器時(shí)在自動(dòng)創(chuàng)建/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1文件和/usr/lib/x86_64-linux-gnu/libcuda.so.1文件時(shí)會(huì)判斷鏡像中是否有相同的文件,如果有則報(bào)錯(cuò),也就是本文開頭說提的報(bào)錯(cuò)信息,而在ubuntu物理機(jī)上使用nvidia-docker首次啟動(dòng)容器時(shí)即使鏡像中存在/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1文件和/usr/lib/x86_64-linux-gnu/libcuda.so.1文件也會(huì)對(duì)其進(jìn)行強(qiáng)制覆蓋(強(qiáng)制映射)(該種覆蓋并不會(huì)影響容器的保存,比如在使用docker commit時(shí)對(duì)應(yīng)的文件依舊是原鏡像中的文件,而不是nvidia-docker映射給的宿主機(jī)中對(duì)應(yīng)的文件)
解決方案:
1. 使用docker而不是nvidia-docker啟動(dòng)原始鏡像下的容器,
sudo docker run --rm -it? 14.14.15.100:5000/pytorch/pytorch:20.08-py3-cuda11
2、在該容器下,手動(dòng)刪除或改名文件/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1和文件/usr/lib/x86_64-linux-gnu/libcuda.so.1 ,
mv /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1? /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1.bak
mv /usr/lib/x86_64-linux-gnu/libcuda.so.1? /usr/lib/x86_64-linux-gnu/libcuda.so.1.bak
或者運(yùn)行下面的三行命令也行
rm /usr/lib/x86_64-linux-gnu/libnvidia-*
rm /usr/lib/x86_64-linux-gnu/libcuda.so*
rm /usr/lib/x86_64-linux-gnu/libnvcuvid.so.*
3、然后在另開一個(gè)終端執(zhí)行,把此時(shí)的容器打包為鏡像,具體操作:
使用下面的命令得到ID:
docker ps -a?
打包該容器為新的鏡像:文章來源:http://www.zghlxwxcb.cn/news/detail-639140.html
sudo docker commit? contrainer_id? image_name:new_tag文章來源地址http://www.zghlxwxcb.cn/news/detail-639140.html
到了這里,關(guān)于windows wsl2 docker+k8s+cuda容器無法啟動(dòng)問題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!