写过一篇 发表于 2024-8-31 11:19:05

dockers、nvidia-dicker、nvidia-container-toolkit踩坑记

楔子

要部署和迁移paddle的几个应用(像OCR、语音辨认等),项目数据也比较巨大,所以必要调用gpu,其实如果数据量不多完全可以利用这些应用的cpu版本。paddle本身的坑也比较多(充实展现出了国产特色),一波部署下来,心态是炸裂的。而我对于nvidia-docker也不熟悉,摸石头过河踩了很多坑。
一、国际惯例

按照国际惯例(外国朋侪们讲课搞学术非常严谨,从来不会说直接一生二,二生三,三生万物,他会先告诉你道生一),先从最基本的讲起。
1.1 docker(最基本也最重要)

一句话概括我的理解:docker做到了陶渊明一直想做的事——完全与外世隔绝,如果你有一台win10电脑,如今手头有一个工程必要来跑,但是这个工程只能在Linux环境下运行,你怎么办?是在电脑上在装一个Linux系统还是下载安装VMware假造机在里面安装Linux系统,前者浪费时间后者占用机器空间也浪费时间(别问我为什么知道)。docker办理了这个问题,你可以在docker里面pull一个Linux镜像,然后实例化,在里面完成上述项目标运行!像如今很多云服务器就是这样,用docker封装基本环境,然后实例化调用gpu来运行深度学习工程。
docker就是在做这样一件事变:我们的个人电脑(后称host)平时工作休息,里面系统配置和各种环境比较复杂,docker可以先pull一个独立的系统大概环境镜像(image),然后实例化创建一个容器(container),这个容器里面独立于host,是一个完全与host隔离不相干扰的系统工作方式,因此,基于这一点,docker也非常容易做工程迁移,在上面说的容器内跑通统统,然后再打包变成镜像,就可以放到其他电脑中利用,非常方便!并且,这个迁移是可以离线完成的!!!
最常见的,比如我的电脑是Windows系统,我可以pull一个Ubuntu22.04,然后实例化进入系统以后,完成我的工程部署,然后打包成镜像用来迁移到其他电脑来利用,避免重复部署。
1.1.1安装

这里附上一个Linux系统下docker的安装技能贴链接,发起大家多看看Linux中国这个号:如安在 Ubuntu 上安装 Docker | Linux 中国 - 知乎 (zhihu.com)https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://zhuanlan.zhihu.com/p/675938110至于Windows系统,直接下载docker desktop双击打开安装即可:https://www.docker.com/products/docker-desktop/https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://www.docker.com/products/docker-desktop/
,另外docker desktop本身必要windows系统中开启假造化功能,开启方法可以看这个帖:Win10自带Hyper-V假造机上安装Linux系统_电脑上自带linux假造机吗-CSDN博客https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://blog.csdn.net/m0_37835884/article/details/79484242?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171275571716800180618837%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171275571716800180618837&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-2-79484242-null-null.142%5Ev100%5Epc_search_result_base9&utm_term=win10%E5%A6%82%E4%BD%95%E5%BC%80%E5%90%AFhyper-v&spm=1018.2226.3001.4187,这个帖只看第一部分即可!还有一点,开启了假造化还必要安装wsl2也就是windows下的linux子系统(Windows Subsystem for Linux),因为如今docker desktop默认要求wsl2为后端安装 WSL | Microsoft Learn利用 wsl --install 命令安装实用于 Linux 的 Windows 子系统。 在 Windows 计算机上利用首选 Linux 发行版(Ubuntu、Debian、SUSE、Kali、Fedora、Pengwin、Alpine 等都可用)运行的 Bash 终端。https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://learn.microsoft.com/zh-cn/windows/wsl/installtips1:WSL (Windows Subsystem for Linux) 是一种在 Windows 操纵系统上运行 Linux 环境的兼容层或子系统。它答应用户在 Windows 上直接运行 Linux 步调,而无需在本地安装完备的 Linux 系统或利用假造机。wsl类似一个Windows中管理Linux系统的管家,可以类比python中的pip,安装和卸载各种第三方库,你可以利用wsl来安装和卸载差别的Linux系统。
wsl相关命令wsl 命令详解_wsl命令-CSDN博客https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://blog.csdn.net/no1xium/article/details/132712260?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-1-132712260-blog-122390018.235%5Ev43%5Epc_blog_bottom_relevance_base9&spm=1001.2101.3001.4242.2&utm_relevant_index=4
关闭 WSL 中正在运行的 Linux 发行版 | Linux 中国 - 知乎 (zhihu.com)https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://zhuanlan.zhihu.com/p/680716065
1.1.2docker命令

docker很多命令直接上网搜索即可,Linux和Windows通用,这里有一个很不错的总结:21 Essential Docker Commands (linuxhandbook.com)https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://linuxhandbook.com/essential-docker-commands/
1.2 nvidia-docker(已经成为汗青,可以跳过)

about 3 years ago,we can create a image to migrate project only on the CPU with ease, but docker(or docker desktop) cannot  support invoke  GPU when a deep learning project  needs to be deployed. In this time,NVIDA launched the nvidia-docker solving the above-mentioned problems.
introduction:一文快速入门docker和nvidia-docker_nvidia docker和docker的区别-CSDN博客
1.2.1 nvidia-docker安装

直接上nvidia-docke2链接,虽然如今不用了,但是还能能安装利用的
Nvidia-docker 一站式配置深度学习环境服务器(cuda+cudnn+anaconda)GPU服务器的配置 - 知乎 (zhihu.com)https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://zhuanlan.zhihu.com/p/602480594
1.2.2 命令

和docker类似。
1.3 nvidia-container-toolkit

NVIDIA Container Toolkit 是一个用于容器环境中支持 NVIDIA GPU 的工具集。它提供了一组命令行工具和守护进程,用于管理容器内的 NVIDIA GPU 资源。这个工具集可以让容器中的应用步调访问并利用 NVIDIA GPU,从而加快机器学习、深度学习等 GPU 计算密集型使命。官网链接如下概述 — NVIDIA Container Toolkit 1.14.5 文档https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.htmlhttps://i-blog.csdnimg.cn/blog_migrate/1a346bd1489d29439ff955c14ea33176.png
以前docker不能调用gpu,NVIDIA出了nvidia-docker来办理,厥后在nvidia-docker的底子上,推出了nvidia-container-toolkit,相当于是nvidia-docker更新到背面就变成了nvidia-container-toolkit,就是说nvidia-container-toolkit本来就是nvidia-docker,只不外如今改名了,nvidia-docker 的末了一个版本是 v2.6.0,发布于 2021 年 6 月 22 日,另外网上还有区分nvidia-docker和nvidia-docker2的,都不用看,v2.6.0就指的是nvidia-docker2。对这些关系细节感爱好可以看这篇:
docker中GPU利用 2023年11月 - 知乎 (zhihu.com)https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://zhuanlan.zhihu.com/p/6740557201.3.1 nvidia-container-toolkit安装
在上面官网里面有安装方法
https://i-blog.csdnimg.cn/blog_migrate/0d82a68ea7a05ee49160d7bae97ea2d8.png
1.3.2 命令
Ubuntu里的docker必要安装nvidia-container-toolkit,Windows下的docker desktop已经可以大概支持调用显卡,无需安装nvidia-container-toolkit,docker desktop官网的阐明如下,按照里面说的设置好就ok。
GPU support in Docker Desktop | Docker DocsHow to use GPU in Docker Desktophttps://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://docs.docker.com/desktop/gpu/命令还是docker本身的命令,调用gpu直接将参数即可,实例化:
docker run -it --gpus=all --name 容器的名字 镜像的名字 /bin/bash 二、我踩的坑

2.1wsl中报错WSL (3) ERROR: CreateProcessEntryCommon:370: getpwuid(0) failed 2等一大堆

这是因为wsl中默认的不是Ubuntu系统,所以终端中输入wsl命令以后启动失败,办理方法就是设置Ubuntu为默认系统:
Windows 上的 Docker 桌面 WSL 2 后端 |Docker 文档https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://docs.docker.com/desktop/wsl/#turn-on-docker-desktop-wsl-2设置默认系统
#查看wsl中存在的Linux系统列表和版本
wsl -l -v
#设置默认系统
wsl --set-default <distro name> 下面是示范,当然我已经把Ubuntu设置为默认了
https://i-blog.csdnimg.cn/blog_migrate/56292329e622c73bb60e882b69571316.png

2.2 wsl下面的Ubuntu22安装应用报错/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link

WSL安装软件报错/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link_ubuntu_melody359-华为云开发者联盟 (csdn.net)https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://huaweicloud.csdn.net/63563de0d3efff3090b5bf05.html?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~activity-1-125769622-blog-135119785.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~activity-1-125769622-blog-135119785.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=2
2.3 nvidia-docker和nvidia-container-toolkit一起安装

其时由于不明确情况,照着上面的链接安装了nvidia-docker,还不放心,又安装了nvidia-container-toolkit,厥后发现并没有冲突,但是,wsl安装的Ubuntu里面nvidia-docker没有反应,而正常的Ubuntu系统有反应,如下图,其实,只安装nvidia-container-toolkit就可以。
https://i-blog.csdnimg.cn/blog_migrate/2de125d59fadfedaf1b1b77d79d27c0d.png
2.4 镜像实例化报错:libnvidia-ml.so.1:file exist:unknown

先上图:
https://i-blog.csdnimg.cn/blog_migrate/964742677b6cc4d460767485c0acd6bb.png
其时非常困惑,我的镜像能在Ubuntu系统的电脑上正常运行,但是放进wsl中就报错!!!于是找了一大圈方案,国内国外都找遍了,末了找到两篇有用的帖,链接附上
WSL Modulus Docker run error (libnvidia-ml.so.1: file exists: unknown.) - Modulus Physics-ML Model Framework / Technical Support (Modulus Only) - NVIDIA Developer Forumshttps://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://forums.developer.nvidia.com/t/wsl-modulus-docker-run-error-libnvidia-ml-so-1-file-exists-unknown/256058/2【docker创建容器的坑】WSL启动nvidia-docker镜像:报错libnvidia-ml.so.1- file exists- unknown_nvidia-container-cli: mount error: file creation f-CSDN博客https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://blog.csdn.net/weixin_43135178/article/details/131416191大抵原因就是,wsl安装的Ubuntu和一般用的Ubuntu不一样,wsl中利用nvidia-docker(虽然)启动镜像会把宿主机的nvidia driver和cuda映射到容器里面,所以在启动之前会检测镜像里面是否有这些文件,如果镜像自身带有nvidia driver和cuda那么实例化容器就会报错,而一般用的Ubuntu中会对这些文件强行覆盖,不会报错。
于是参考了上面的做法,把相关的文件改为备份格式,大概删除:
https://i-blog.csdnimg.cn/blog_migrate/ce3568785cfa459383e369a9b3affa69.png
https://i-blog.csdnimg.cn/blog_migrate/538686cc2cac39c759cfc296d86ef7c0.png
https://i-blog.csdnimg.cn/blog_migrate/9af309f590da7158c8eaaff11691bc40.png
https://i-blog.csdnimg.cn/blog_migrate/7c07c0174532ea2c799e020f1da25073.png
背面想到既然Ubuntu系统会映射文件进去,其实直接删除也无大碍,等全部删除以后,果然,问题办理了。
https://i-blog.csdnimg.cn/blog_migrate/26489192d72751d2de0095ab759512cb.png
https://i-blog.csdnimg.cn/blog_migrate/0c59beb0ab1813b2c9c3cdf95c5b50b4.png
2.5 关于wsl下Linux中的cuda

因为我是第一次做调用gpu工程的实例化,做了两次实验,一次是在wsl的Ubuntu2204中装了很多东西比如cuda,这是想尽量做到跟前面制作镜像的电脑环境同等,然而失败了,就是碰到2.4中的问题,注意到办理方法以后,我意识到这和用docker大概nvidia-container-toolkit无关,就是wsl下Ubuntu的问题,所以实验直接用docker desktop实例化,这里必要卸载Ubuntu中的docker:
ubuntu 完全干净的卸载docker_ubuntu卸载docker-CSDN博客https://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://blog.csdn.net/Asdnwosai/article/details/129740498在安装docker desktop以后,做了2.4中的文件删除,可以实例化。
必要注意的是,如果你想在wsl的Ubuntu中实例化gpu镜像,要在Ubuntu中安装cuda,而且这个cuda是wsl版本的,链接附上
CUDA Toolkit Archive | NVIDIA Developerhttps://i-blog.csdnimg.cn/blog_migrate/003a2ce7eb50c2e24a8c624c260c5930.pnghttps://developer.nvidia.com/cuda-toolkit-archivehttps://i-blog.csdnimg.cn/blog_migrate/1de75187dd6aa40b3116c61ca9789bc5.png




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: dockers、nvidia-dicker、nvidia-container-toolkit踩坑记