因为要入门深度学习,所以想使用Pytorch进行算法开发,又恰好看到了Docker技术(把环境与代码打包,实现快速的迁移部署),种种特性深深吸引了我,但是实践过程中发现使用Docker容器进行算法开发并不是很容易。各种安装包错综复杂,先后顺序理不清楚,所以按照我的理解重新梳理一下流程。
通过分析不使用Docker容器化技术的情况下的Pytorch安装及使用不难发现Pytorch运行结构图如下所示:
只要在电脑上安装好NVIDIA驱动,CUDA(for windows),Python(for windows),然后在python环境下安装Pytorch就可以使用GPU进行深度学习算法的开发了。然后我就仔细思考了一下,如果我想把这个运行环境迁移到另一台电脑上怎么样才最方便,刚开始我设想中的虚拟化是这样:
把驱动,CUDA,python,Pytorch一起打包,然后从一个环境中迁移到另一个环境中,然后当我看系统、驱动、CUDA、Python和Pytorch之间的关系,我发现这个设想有点简单:
这个打包并不是可行的,因为受到系统和GPU的影响,驱动应该与系统和GPU来匹配,当迁移到不同的机器上时,很难保证GPU一致,所以我们要把驱动排除在外,然后至于Python,Pytorch和CUDA,他们只和系统有关,至于CUDA的版本还和系统的具体型号有关的问题,我打算只针对ubuntu或者debian系统,这样的话就相当于在Debian的linux系统之间迁移,cuda和python和pytorch就可以放在一起打包了。可以先构建出部分镜像(包括CUDA和Python和Pytorch)以后,在向具体的GPU机器上配置镜像容器时再把GPU对应的NVIDIA驱动使用wget
命令获取下载在容器中,然后再安装。
然后我就开始构建自己的可迁移的镜像了,按照上面的想法首先拉取基础镜像,是基于Linux的Python标准镜像,在启动之后下载CUDA,下载NVIDIA驱动,然后再安装NVIDIA驱动和CUDA。我以为Docker中的container容器可以感知到系统中的GPU芯片,但是安装过程中我就发现问题了。具体什么情况请看下面。我本人电脑上的GPU是:
然后在Dockerhub找了一个Python镜像,启动以后,在容器内下载好了相应的CUDA和NVIDIA驱动安装文件:
在容器内下载了NVIDIA驱动安装文件和CUDA安装文件
相关下载指令为:
#在container中安装CUDA和NVIDIA
CUDA:wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run
NVIDIA:wget https://us.download.nvidia.cn/XFree86/Linux-x86_64/525.105.17/NVIDIA-Linux-x86_64-525.105.17.run
#查看系统版本:
cat /proc/version
uname -a
lsb_release -a
cat /etc/redhat-release
#查看什么系统:
cat /etc/issue
参考链接:
然后开始在容器内安装驱动和CUDA,遇到了问题:在容器内不能安装驱动,因为检测不到GPU,然后启动容器时候加入参数–gpus all也不行,报错。然后我意识到,在容器和系统之间,应该是有个接口的(并非是电脑上的驱动,我已经装好了电脑上的NVIDIA驱动,而是CUDA接口),也就是专门在电脑上整个CUDA工具包,如下所示:
安装CUDA时对驱动进行了自动更新所以驱动版本和CUDA版本都升级了。
在容器内运行Pytorch实际的结构图
然后我试着在容器中安装NVIDIA驱动,然后容器提示需要安装kmod,安装好之后(先update包,然后才能装上kmod),再次自信安装结果发现年轻人不讲武德,还有问题。
然后我去容器内看看到底能检测出来GPU不能,然后我就发现确实不能,这就确实很奇怪,然后我就重启了电脑。
容器内输入nvidia-smi说找不到文件库
参考链接:
Docker bad,Python good!等我有钱了一定要买个能用docker的电脑!
我把电脑重启了一下,然后重新打开docker,新世界的大门向我打开了!!!
然后我还是按照上面的思路,先安装NVIDIA驱动,然后再安装CUDA,但是依旧不能在容器中安装NVIDIA的驱动,但没关系,至少我们可以访问GPU了,那我们就不装驱动了,只装CUDA,只要把CUDA的接口和GPU的接口对接一下,容器就不知道自己是在容器中了。开始:sh cuda_12.1.1_530.30.02_linux.run
;然后它就一直不动了:
只不过CUDA安装实在过于缓慢了。吓得我赶紧打开了官网指导,看看具体是不是这样安装的。
然后我成功进入了安装界面,过于珍贵不便展示。主要是我怕他卡住。第一个输入accept回车,第二个按下方向键选择install回车。胜利的曙光就在眼前。现在有时间重新思考这个容器化技术的结构以及畅想一下接下来要办的事情,首先必须要把NVIDIA驱动安装文件和CUDA安装文件从我的容器中删除。然后Docker这个容器化技术针对Pytorch给出的设计结构就是:
也就是说Docker提供的解决方案就是在系统的驱动层,通过开发一个驱动—cuda的工具包,来实现容器内对GPU的访问,整体结构图如下所示:
也就是说Docker这个容器并不是可以直接对外部环境进行访问,无法使用外部机器提供的接口,需要使用工具包才能进行。这与我以为的容器化技术有点差别。换句话说,并不能任意打包容器内的东西,需要开发出相应的穿透工具包,比如要想把驱动打包进容器,同时让容器可以正常使用驱动,需要补充从硬件到驱动的接口,穿透工具,也就是:
而且这个GPU-驱动工具包跟CUDA显然不一样,目前来看,CUDA工具包提供的穿透接口,NVIDIA驱动访问不了(因为我尝试在容器内安装NVIDIA驱动提示检测不出GPU),而CUDA可以访问。所以要想把NVIDIA驱动装进容器中,需要开发GPU----->驱动的穿透接口工具包。然后我的CUDA装完啦!
好像有点错误,我们试着把silent和driver补上。然后继续去安装pytorch。指令:pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
首先改为咱们清华的下载源。指令为:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
;然后再进行安装
按说torch应该也可以?我去试一下。大致流程就是上面这样,希望大家引以为鉴,一步到位。注意还要安装numpy。验证完成,pip install torch
也可以。成功!!!
1.电脑上安装好wsl2,docker,Nvidia驱动,cuda toolkits,然后容器内就可以访问GPU了。也就是容器内使用nvidia-smi就会有反应了。
2.如果在容器内使用gpu进行算法运算的话,还是需要在容器内安装CUDA,这样可以使用cuda来进行人工智能算法的开发了。
3.事实证明:不是路不平,只是我不行。docker,你是我的神!
windows+s;%temp%
全选删除;C:\windows\softwaredistribution\download
全选删除;windows+r;prefetch
全选删除;wsl --shutdown
;关闭docker服务。wsl --list -v
;观察是不是两个docker都是stoped状态。wsl --export docker-desktop-data D:\Docker\image\docker-desktop-data.tar
;把原始镜像位置移动到别的文件夹。wsl --unregister docker-desktop-data
;将原镜像位置注销。wsl --import docker-desktop-data D:\Docker\data D:\Docker\image\docker-desktop-data.tar --version 2
。把新的镜像源导入。参考链接: