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

前言

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

Pytorch安装

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

结构图
在电脑上(不是容器内)使用Pytorch的结构图

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

初步设想的docker的container
初步设想的打包方式

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

CUDA版本的选择图(20230421)
Cuda的选择与系统内的具体发行版有关

Pytorch的选择图(20230421)
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是:

电脑上带的NVIDIA显卡(电脑上已装NVIDIA驱动)
电脑上的独立显卡

然后在Dockerhub找了一个Python镜像,启动以后,在容器内下载好了相应的CUDA和NVIDIA驱动安装文件:
Python镜像运行后的容器中下载了NVIDIA和CUDA的安装文件
在容器内下载了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工具包,如下所示:
在电脑上安装CUDA(for windows)之后,电脑上的CUDA版本就变了
安装CUDA时对驱动进行了自动更新所以驱动版本和CUDA版本都升级了。
在电脑上安装cuda工具包
在容器内运行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,新世界的大门向我打开了!!!

重新进入容器后可以检测出来GPU了
重新进入容器后可以检测出来GPU了

然后我还是按照上面的思路,先安装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的访问,整体结构图如下所示:

从GPU到容器
从GPU到容器

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

从GPU到容器内的驱动
从GPU到容器内的驱动

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

CUDA安装完成后提示信息
CUDA安装完成后提示信息

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

Pytorch选择(20230421)
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)
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我无法回答这个问题,但是我可以提供一些建议:1.检查docker容器的配置是否正确;2.检查python的版本是否与docker容器的版本兼容;3.尝试重新安装python和docker容器。 ### 回答2: 当将Python应用程序部署在Docker容器时,可能会遇到不断报错和重启的问题。造成这种情况的原因可能有以下几点: 1. 依赖问题:Python应用程序可能依赖于其他库或软件包,而在Docker容器可能缺少这些依赖。这可能导致Python应用程序无法正常运行并不断报错重启。解决方法是在Dockerfile明确列出所有依赖,并确保它们在容器正确安装。 2. 资源限制:Docker容器默认情况下对CPU和内存资源进行限制,如果Python应用程序需要更多的资源来运行,则可能会导致容器不断重启。可以通过调整Docker容器的资源限制来解决此问题,确保容器具有足够的资源来运行Python应用程序。 3. 网络问题:如果Python应用程序需要与外部服务或数据库进行通信,而在Docker容器无法访问这些服务或数据库,则会导致应用程序不断报错重启。确保Docker容器可以访问所需的网络资源,可以通过验证网络连接和使用正确的网络配置解决此问题。 4. 日志记录:Python应用程序可能在运行时产生大量输出,如果没有适当的配置日志记录,则可能导致Docker容器日志文件过大,从而使容器不断重启。可以通过配置适当的日志记录机制来解决此问题,例如将日志输出到容器外部的日志收集工具。 综上所述,Python在Docker容器不断报错重启的问题可能源自依赖问题、资源限制、网络问题和日志记录等方面。解决这些问题需要仔细排查并逐个解决,确保Docker容器的Python应用程序能够正常稳定地运行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值