Windows系统中在Docker容器中运行Pytorch

文章目录

  • 前言
  • Pytorch安装
  • 阶段性总结
  • 打脸来得太快
  • 总结
  • 让你的C盘重新美丽

前言

因为要入门深度学习,所以想使用Pytorch进行算法开发,又恰好看到了Docker技术(把环境与代码打包,实现快速的迁移部署),种种特性深深吸引了我,但是实践过程中发现使用Docker容器进行算法开发并不是很容易。各种安装包错综复杂,先后顺序理不清楚,所以按照我的理解重新梳理一下流程。

Pytorch安装

通过分析不使用Docker容器化技术的情况下的Pytorch安装及使用不难发现Pytorch运行结构图如下所示:

Windows系统中在Docker容器中运行Pytorch_第1张图片
在电脑上(不是容器内)使用Pytorch的结构图

只要在电脑上安装好NVIDIA驱动,CUDA(for windows),Python(for windows),然后在python环境下安装Pytorch就可以使用GPU进行深度学习算法的开发了。然后我就仔细思考了一下,如果我想把这个运行环境迁移到另一台电脑上怎么样才最方便,刚开始我设想中的虚拟化是这样:

Windows系统中在Docker容器中运行Pytorch_第2张图片
初步设想的打包方式

把驱动,CUDA,python,Pytorch一起打包,然后从一个环境中迁移到另一个环境中,然后当我看系统、驱动、CUDA、Python和Pytorch之间的关系,我发现这个设想有点简单:

Windows系统中在Docker容器中运行Pytorch_第3张图片
Cuda的选择与系统内的具体发行版有关

Windows系统中在Docker容器中运行Pytorch_第4张图片
Pytorch的版本与Cuda和Python的版本有关。

Windows系统中在Docker容器中运行Pytorch_第5张图片
Pytorch涉及的各个部件之间的关系图

这个打包并不是可行的,因为受到系统和GPU的影响,驱动应该与系统和GPU来匹配,当迁移到不同的机器上时,很难保证GPU一致,所以我们要把驱动排除在外,然后至于Python,Pytorch和CUDA,他们只和系统有关,至于CUDA的版本还和系统的具体型号有关的问题,我打算只针对ubuntu或者debian系统,这样的话就相当于在Debian的linux系统之间迁移,cuda和python和pytorch就可以放在一起打包了。可以先构建出部分镜像(包括CUDA和Python和Pytorch)以后,在向具体的GPU机器上配置镜像容器时再把GPU对应的NVIDIA驱动使用wget命令获取下载在容器中,然后再安装。

Windows系统中在Docker容器中运行Pytorch_第6张图片
首先构建部分组件所组成的镜像

然后我就开始构建自己的可迁移的镜像了,按照上面的想法首先拉取基础镜像,是基于Linux的Python标准镜像,在启动之后下载CUDA,下载NVIDIA驱动,然后再安装NVIDIA驱动和CUDA。我以为Docker中的container容器可以感知到系统中的GPU芯片,但是安装过程中我就发现问题了。具体什么情况请看下面。我本人电脑上的GPU是:

Windows系统中在Docker容器中运行Pytorch_第7张图片
电脑上的独立显卡

然后在Dockerhub找了一个Python镜像,启动以后,在容器内下载好了相应的CUDA和NVIDIA驱动安装文件:
Windows系统中在Docker容器中运行Pytorch_第8张图片
在容器内下载了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

参考链接:

  1. 怎么查看linux是什么版本-linux运维-PHP中文网
  2. (9条消息) Linux 查看操作系统_linux 查看系统_ooyyaa6561的博客-CSDN博客

然后开始在容器内安装驱动和CUDA,遇到了问题:在容器内不能安装驱动,因为检测不到GPU,然后启动容器时候加入参数–gpus all也不行,报错。然后我意识到,在容器和系统之间,应该是有个接口的(并非是电脑上的驱动,我已经装好了电脑上的NVIDIA驱动,而是CUDA接口),也就是专门在电脑上整个CUDA工具包,如下所示:
Windows系统中在Docker容器中运行Pytorch_第9张图片
安装CUDA时对驱动进行了自动更新所以驱动版本和CUDA版本都升级了。
Windows系统中在Docker容器中运行Pytorch_第10张图片
在容器内运行Pytorch实际的结构图

然后我试着在容器中安装NVIDIA驱动,然后容器提示需要安装kmod,安装好之后(先update包,然后才能装上kmod),再次自信安装结果发现年轻人不讲武德,还有问题。

报错信息,说检测不到GPU
报错说找不到GPU

说对于当前正在运行的核找不到核心源树(咱也不知道这是个啥)
说对于当前正在运行的核找不到核心源树(咱也不知道这是个啥)

还说安装失败了,让我去看日志
还说安装失败了,让我去看日志

然后我去容器内看看到底能检测出来GPU不能,然后我就发现确实不能,这就确实很奇怪,然后我就重启了电脑。
容器内输入nvidia-smi说找不到文件库
容器内输入nvidia-smi说找不到文件库

参考链接:

  1. (9条消息) 【CUDA】在Windows 11运行Docker + GPU计算 | - WSL2 & RTX3060_Dongbo X的博客-CSDN博客
  2. (9条消息) Docker Desktop 中使用GPU_chenxizhan1995的博客-CSDN博客
  3. CSDN编程社区 (smartapps.cn)

阶段性总结

Docker bad,Python good!等我有钱了一定要买个能用docker的电脑!

打脸来得太快

我把电脑重启了一下,然后重新打开docker,新世界的大门向我打开了!!!

Windows系统中在Docker容器中运行Pytorch_第11张图片
重新进入容器后可以检测出来GPU了

然后我还是按照上面的思路,先安装NVIDIA驱动,然后再安装CUDA,但是依旧不能在容器中安装NVIDIA的驱动,但没关系,至少我们可以访问GPU了,那我们就不装驱动了,只装CUDA,只要把CUDA的接口和GPU的接口对接一下,容器就不知道自己是在容器中了。开始:sh cuda_12.1.1_530.30.02_linux.run;然后它就一直不动了:

Windows系统中在Docker容器中运行Pytorch_第12张图片
可以肯定,它还在动

只不过CUDA安装实在过于缓慢了。吓得我赶紧打开了官网指导,看看具体是不是这样安装的。

Windows系统中在Docker容器中运行Pytorch_第13张图片
没错,理论没错,理论没问题

然后我成功进入了安装界面,过于珍贵不便展示。主要是我怕他卡住。第一个输入accept回车,第二个按下方向键选择install回车。胜利的曙光就在眼前。现在有时间重新思考这个容器化技术的结构以及畅想一下接下来要办的事情,首先必须要把NVIDIA驱动安装文件和CUDA安装文件从我的容器中删除。然后Docker这个容器化技术针对Pytorch给出的设计结构就是:

Windows系统中在Docker容器中运行Pytorch_第14张图片
容器虚拟化结构

也就是说Docker提供的解决方案就是在系统的驱动层,通过开发一个驱动—cuda的工具包,来实现容器内对GPU的访问,整体结构图如下所示:

Windows系统中在Docker容器中运行Pytorch_第15张图片
从GPU到容器

也就是说Docker这个容器并不是可以直接对外部环境进行访问,无法使用外部机器提供的接口,需要使用工具包才能进行。这与我以为的容器化技术有点差别。换句话说,并不能任意打包容器内的东西,需要开发出相应的穿透工具包,比如要想把驱动打包进容器,同时让容器可以正常使用驱动,需要补充从硬件到驱动的接口,穿透工具,也就是:

Windows系统中在Docker容器中运行Pytorch_第16张图片
从GPU到容器内的驱动

而且这个GPU-驱动工具包跟CUDA显然不一样,目前来看,CUDA工具包提供的穿透接口,NVIDIA驱动访问不了(因为我尝试在容器内安装NVIDIA驱动提示检测不出GPU),而CUDA可以访问。所以要想把NVIDIA驱动装进容器中,需要开发GPU----->驱动的穿透接口工具包。然后我的CUDA装完啦!

Windows系统中在Docker容器中运行Pytorch_第17张图片
CUDA安装完成后提示信息

好像有点错误,我们试着把silent和driver补上。然后继续去安装pytorch。指令:pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

Windows系统中在Docker容器中运行Pytorch_第18张图片
Pytorch选择(20230421)

首先改为咱们清华的下载源。指令为:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple;然后再进行安装

安装torch
安装torch

按说torch应该也可以?我去试一下。大致流程就是上面这样,希望大家引以为鉴,一步到位。注意还要安装numpy。验证完成,pip install torch也可以。成功!!!

总结

1.电脑上安装好wsl2,docker,Nvidia驱动,cuda toolkits,然后容器内就可以访问GPU了。也就是容器内使用nvidia-smi就会有反应了。
2.如果在容器内使用gpu进行算法运算的话,还是需要在容器内安装CUDA,这样可以使用cuda来进行人工智能算法的开发了。
3.事实证明:不是路不平,只是我不行。docker,你是我的神!

让你的C盘重新美丽

  • windows+s;%temp%全选删除;
  • C:\windows\softwaredistribution\download全选删除;
  • windows+r;prefetch全选删除;
  • 卸载docker!(开玩笑)可以把image位置转移到其他地方,具体看下方指示。
  • 移动docker的镜像位置:
    1.关闭docker,以管理员身份启动cmd。
    2.输入:wsl --shutdown;关闭docker服务。
    3.输入:wsl --list -v;观察是不是两个docker都是stoped状态。
    4.输入:wsl --export docker-desktop-data D:\Docker\image\docker-desktop-data.tar;把原始镜像位置移动到别的文件夹。
    5.输入:wsl --unregister docker-desktop-data;将原镜像位置注销。
    6.输入:wsl --import docker-desktop-data D:\Docker\data D:\Docker\image\docker-desktop-data.tar --version 2。把新的镜像源导入。

参考链接:

  1. 把 docker-desktop-data 移出系统盘 - 简书 (jianshu.com)

你可能感兴趣的:(pytorch,windows,docker)