Docker实战练习【初学】- 打印nvidia硬件信息,使用cuda计算张量对比cpu计算时间

这段时间在学阿里云龙珠训练营Docker方面的内容,根据练习题《打印nvidia硬件信息,使用cuda计算张量对比cpu计算时间》,我想简单记录下学习过程——从认识Docker基本概念开始,一步步安装Docker,安装wsl,搭建、运行、调试、发布镜像,储存容器卷,到最后完成赛题的过程

练习赛题目地址可访问: https://tianchi.aliyun.com/competition/entrance/531863/information

开始使用docker前,可以先大致浏览下大佬写的这篇docker教程,感觉写的比较好:
Docker教程(超全总结)

配置环境

我的机器是 win10系统、集显笔记本,docker用的是windows的桌面版(官方说这个版本的torch可能会有cuda的支持问题,在linux版应该不会出现);另外我这边的赛题文件都是根据我当时的赛题指导编写的(如果我自己改了文件我会在文章中说明),现在赛题指导可能更新了,如有不同就不在文章中另作说明了哈

安装Docker & 创建镜像仓库账号

可以参考阿里云的天池龙珠docker训练营 训练营安装文档
链接: docker practice

按照说明创建镜像仓库账号,前面的步骤都比较简单,应该可以一直清晰的执行到这一步:
可以运行到这一步为止

登录镜像仓库

1.启动软件

首先打开桌面版Docker

不然直接用cmd登录可能会报这个错:
error during connect: This error may indicate that the docker daemon is not running.: Post “http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/auth”: open //./pipe/docker_engine: The system cannot find the file specified.

在这里插入图片描述
打开后的界面
在这里插入图片描述

2.登录账户

打开cmd,输入登录指令,输入密码后登陆成功:
在这里插入图片描述
在这里插入图片描述

3.安装完成

到目前为止,如果中途没报什么错,那么练习题所要求的环境已准备完毕,输入docker info可以查看自己docker的详细信息
如果出现了以下警告可以忽略,原因(大致是cgroup环境与blkio controller不匹配)可参考
blkio-controller.txt

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

安装过程中可能遇到的问题(wsl缺失)

1.缺少 wsl (Windows Subsystem for Linux) 环境

如果安装完docker一直是 docker desktop starting… 这个界面,那可能缺少相应的wsl系统

在这里插入图片描述

可以 win+R 输入cmd,按 Ctrl+Shift+Enter 进入命令行的管理员模式,输入 wsl -l -v 观察是否有装对应的wsl(Windows Subsystem for Linux),因为windows docker虽然是windows版本的,但需要相应的linux模拟环境来运行

如果显示 适用于 Linux 的 Windows 子系统没有已安装的分发。
在这里插入图片描述
则可以参考上述图片说明,使用 wsl --list --online 列出需要安装的linux版本,并选择相应版本,使用 wsl.exe --install --Ubuntu 安装即可(假设安装的是Ubuntu)

2.安装 wsl 时连接不上 raw.githubusercontent.com(连接超时)

可以尝试将 raw.githubusercontent.com 的 ip 加入host文件中,刷新dns后再次尝试

3.安装 wsl 时显示虚拟化未开启相关报错

可参考微软的官网文档 排查适用于 Linux 的 Windows 子系统问题
https://learn.microsoft.com/zh-cn/windows/wsl/troubleshooting

在任务栏的搜索框中搜索 启用或关闭 Windows 功能,勾选 Hyper-V适用于 Linux 的 Windows 子系统虚拟机平台三个选项,然后点确定(可能需要重启电脑);同时确保BIOS中已开启允许虚拟机的选项,每个主板这个选项的名称可能不同,我这边msi主板的在OS的CPU选项设置里,叫SVM支持

不过上述选项开启后,还是有可能提示未开启虚拟化相关选项… … …

如果我们之前装过 VMware(15.5.5版本及以下),那么HyperV可能会被关闭(因为它当时不支持HyperV)(微软的Hyper-V在启用的时候,宿主机也被虚拟化了,以至于在宿主机上直接访问CPU的其他虚拟技术会失效。即使VT-X在BIOS里面开了,Intel的CPU检测工具也会报告CPU不支持VT-X)

可以输入命令 bcdedit /set hypervisorlaunchtype auto+回车,然后重启电脑
注意:开启“虚拟机监控程序”功能可能会导致,雷电、MUMU等安卓模拟器无法启动

安装完wsl之后,再运行 wsl -l -v ,应该可以显示如下的两个子系统
在这里插入图片描述

实践 docker 练习赛

编写赛题文件

按要求编写以下三个文件即可,保存在同一个文件夹内

math.py

这是一个py脚本,具体含义可以参考我在下面代码中的注释(仅个人见解,如有不足之处还请共同讨论补充)

其中包 torch 包含了多维张量的数据结构以及基于其上的多种数学操作。另外,它也提供了多种工具,其中一些可以更有效地对张量和任意类型进行序列化。它有CUDA 的对应实现,可以在NVIDIA GPU上进行张量运算(计算能力>=2.0)。具体用法可参考 官方文档:PyTorch 中文文档

关于什么是张量,可参考 CSDN文章:机器学习的数据结构——张量(详细介绍及Python中对张量的操作)

import torch
device = torch.device("cuda")
# torch.device代表将 torch.Tensor分配到的设备的对象
# torch.Tensor指张量,是 torch包中定义的一种数据类型
# 这里将对象设置成了'cuda'设备类型

a = torch.randn(3, 3)
b = torch.randn(3, 3)
# torch.randn(3, 3)返回了一个张量,包含了从标准正态分布中抽取的一组随机数,形状为(3x3)

a = a.to(device)
b = b.to(device)
# 此处将 a、b这两个张量的类型赋值为了 GPU tensor类型(即前面定义的cuda类型)

c = torch.matmul(a,b)
# c为矩阵a、b用矩阵乘法计算后得到的结果

print(c)

run.sh

这个shell试图用python3来运行math.py这个脚本(就是我们上面写的那个)

#bin/bash
#打印GPU信息
nvidia-smi
#执行math.py
python3 math.py

Dockerfile

Dockerfile就是用来构建docker镜像的构建文件,也就是命令脚本
通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本一个个的命令对应层数

文档开头的 FROM 指令开始一个新的构建阶段,设置后续构建依赖的基础镜像,Dockerfile必须以 FROM 开始。镜像可以是任意有效镜像。Docker 镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。
(关于联合文件系统的更多信息,可以参考上面提到的那篇 Docker 教程)

# Base Images
## 从天池基础镜像构建(from的base img 根据自己的需要更换,建议使用天池open list镜像链接:https://tianchi.aliyun.com/forum/postDetail?postId=67720)
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3

##安装依赖包,pip包请在requirements.txt添加
#RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

## 把当前文件夹里的文件构建到镜像的//workspace目录下,并设置为默认工作目录
ADD math.py /workspace
ADD run.sh /workspace
WORKDIR /workspace

## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]

构建镜像

输入赛题官方给出的指令,等待它自动构建完成即可

docker build -t (此处参数 -t 用于指定构建的镜像名和 tag) +
registry.cn-XXX (你的仓库的公网地址) +
:1.0 (冒号+镜像版本号,第一次的话填1.0就行) +
C:\XXX\XXX(放前面创建的Dockerfile文件的上一级地址) +
enter(回车)

上面的命令含义就是:docker build -t 我新命名的镜像名:版本号 我想让docker用这个地址下的dockerfile来build

更具体的,也可以用这个命令:
docker build -f 你的dockerfile地址 你的build context地址(就是放dockerfile文件中一些依赖项的文件地址) +
-t 镜像名:版本号

这两条命令的区别,在于前者的 Dockerfile 是直接命名为 “Dockerfile” 的,因此不用 -f 参数也可以识别到构造文件(dockerfile);后者的dockerfile可能不是直接命名为 “Dockerfile” ,而是用户自定义的命名,比如是 “test_file_1.0” ,这样就识别不出构造文件,需要我们用 -f 参数去指定位置;同样的在第一条命令内,dockerfile文件的同级目录内,还存放着依赖文件 math.py 等,如果我们的依赖文件存放在其他地址,也需要指明出来,就如同第二条命令中展示的那样

在有些案例中,可能会出现 docker build -t test:1.0 . 这样的命令,此处的dockerfile地址被命令末尾的 . 代替了,含义是读取当前目录下的dockerfile;比如我们运行docker的cmd的执行路径是 …user\desktop,但在这下面没有可用于构建的dockerfile,此时运行 docker build -t test:1.0 . 就会报错

在这里插入图片描述

如上图所示,镜像已构建完毕

测试运行镜像

镜像构建完毕后,我们可以用 docker images 来观察现有的镜像

输入指令 docker run -it 镜像名:版本号 /bin/bash 即可运行镜像,生成一个容器

这边的 -i表示以交互模式运行容器,-t表示为容器重新分配一个伪输入终端,/bin/bash表示启动容器后启动 bash (容器就相当于一个小型 linux 操作系统,这个系统由镜像中提供的系统文件生成,并且只能运行镜像中的内容)(比赛提供的镜像中,底层是一些操作系统文件,只是在上层加入了 py3 和 pytorch包,因此也可以直接运行操作系统自带的 bash)
在这里插入图片描述

如图所示,进入运行的镜像后,类似一个小型linux系统,我们可以用ls命令看到该目录下的文件(即我们上面创建的 math.pyrun.sh),使用exit命令可以退出当前容器

为了测试math.py的运行结果,我们在容器内调用python测试下python math.py
在这里插入图片描述
可以看见math.py可以正常被python解释,只是报了一些导入包的错。这边我暂时不调试它,直接上传到阿里云,之后在后面的 调试镜像 的章节再来调试

上传镜像

输入指令,等待它自动上传完成即可,其中刚才创建的镜像名,可以通过 docker images 指令查看

docker push +
registry.cn-XXX (镜像名) +
:1.0 (冒号+镜像版本号) +
enter(回车)
在这里插入图片描述

提交结果

直接在比赛页面提交即可
在这里插入图片描述

查看成绩

这边可以查看成绩,可以看到我们提交的镜像运行报错了,点击 查看日志 可以看到具体报错信息 (module ‘torch’ has no attribute ‘device’)
在这里插入图片描述
在这里插入图片描述

调试镜像

通过运行日志,我们可以看到结果和我们之前测试运行时报的导入包错误一致,从 import torch 开始,一直都是正常的在调用 python3.7 里的包内容,直到在 selectors.py 这个包里,开始 import math 时,它从我们上传的 workspace 目录下开始读了——很明显它希望读的是 py3.7 的原生 math 包——因此可能可以修改下我们之前编辑的 math.py 的文件名来避免这个问题

修改镜像内容,我目前只找到了两个方法:
1、通过运行镜像,在容器中安装 vim ,使用 vi 命令修改,再保存为新的镜像;
2、通过运行镜像时的 -v 参数,将本地某个目录挂载到镜像中需要修改的文件目录,之后直接在本地修改,即可自动同步至容器(不用再保存为新的镜像)

但因为我留有原 Dockerfile 与其他原始文件,我只需要在本地修改了 math.py 的文件名,重新 build 成新镜像 push 上传即可(因为只改了一个文件名,前面镜像层的 sha256 码都是一样的,所以重新 build 和 push 也很快)(push 时的 tag 我用了原镜像的 tag,使之可以覆盖掉原镜像)
在这里插入图片描述
可以看到 build 只用了1.0s,之后可以使用 push 命令上传到阿里云仓库
在这里插入图片描述
上传的过程也很快,因为基础层没有变化,只在最上层加入了有变动的 py 文件和 sh 文件(在镜像仓库的镜像层信息中也可以看见本次变动的具体内容)
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值