楔子
要部署和迁移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://zhuanlan.zhihu.com/p/675938110至于Windows系统,直接下载docker desktop双击打开安装即可:https://www.docker.com/products/docker-desktop/
https://www.docker.com/products/docker-desktop/
,另外docker desktop本身需要windows系统中开启虚拟化功能,开启方法可以看这个帖:Win10自带Hyper-V虚拟机上安装Linux系统_电脑上自带linux虚拟机吗-CSDN博客https://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://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://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://zhuanlan.zhihu.com/p/680716065
1.1.2docker命令
docker很多命令直接上网搜索即可,Linux和Windows通用,这里有一个很不错的总结:21 Essential Docker Commands [Explained With Examples] (linuxhandbook.com)https://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链接,虽然现在不用了,但是还能能安装使用的
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://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html
以前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://zhuanlan.zhihu.com/p/6740557201.3.1 nvidia-container-toolkit安装
在上面官网里面有安装方法
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://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为默认系统:
#查看wsl中存在的Linux系统列表和版本
wsl -l -v
#设置默认系统
wsl --set-default <distro name>
下面是示范,当然我已经把Ubuntu设置为默认了
2.2 wsl下面的Ubuntu22安装应用报错/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link
2.3 nvidia-docker和nvidia-container-toolkit一起安装
当时由于不明白情况,照着上面的链接安装了nvidia-docker,还不放心,又安装了nvidia-container-toolkit,后来发现并没有冲突,但是,wsl安装的Ubuntu里面nvidia-docker没有反应,而正常的Ubuntu系统有反应,如下图,其实,只安装nvidia-container-toolkit就可以。
2.4 镜像实例化报错:libnvidia-ml.so.1:file exist:unknown
先上图:
当时非常困惑,我的镜像能在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://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://blog.csdn.net/weixin_43135178/article/details/131416191大致原因就是,wsl安装的Ubuntu和一般用的Ubuntu不一样,wsl中使用nvidia-docker(虽然)启动镜像会把宿主机的nvidia driver和cuda映射到容器里面,所以在启动之前会检测镜像里面是否有这些文件,如果镜像自身带有nvidia driver和cuda那么实例化容器就会报错,而一般用的Ubuntu中会对这些文件强行覆盖,不会报错。
于是参考了上面的做法,把相关的文件改为备份格式,或者删除:
后面想到既然Ubuntu系统会映射文件进去,其实直接删除也无大碍,等全部删除以后,果然,问题解决了。
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://blog.csdn.net/Asdnwosai/article/details/129740498在安装docker desktop以后,做了2.4中的文件删除,可以实例化。
需要注意的是,如果你想在wsl的Ubuntu中实例化gpu镜像,要在Ubuntu中安装cuda,而且这个cuda是wsl版本的,链接附上
CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive