Ubuntu20.04+Cuda11.2利用GPU运行Docker+Nvidia-Docker的总结

Docker的学习笔记

0.监视显卡

watch -n 1 nvidia-smi

1表示每间隔1s监视一下显卡状态

在这里插入图片描述

1.从官网镜像获取镜像文件

参考链接
具体操作为:

  • 拉取镜像(上海服务器)
$ docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/super-mario-ppo:race
  • 启动容器后台运行
$ docker run -id registry.cn-shanghai.aliyuncs.com/tcc-public/super-mario-ppo:race
  • 查看容器内的文件
$ docker ps

结果如下

CONTAINER ID    IMAGE       COMMAND       CREATED     STATUS        PORTS           NAMES
3d747e7ccb2b 12f1b1d66471e "/bin/bash"  5 seconds ago  Up 7 seconds       xenodochial_dewdne

这个ID很重要,接下来ls 进入这个容器。

$ docker exec -it 3d747e7ccb2b /bin/bash

然后查看当前目录下的文件

root@3d747e7ccb2b:/workspace#
root@3d747e7ccb2b:/workspace# ls
__pycache__  core_lstm.py  env.py  gym-results  ppo_lstm.py  pretrain  spinningup  test_lstm.py

退出这个容器只需要exit即可。

root@3d747e7ccb2b:/workspace# exit  #输入exit命令退出当前容器或按ctrl+D退出当前容器

2.对容器内的文件并编辑保存

有两种方法可以实现,第一种是使用vi+文件名的方式修改后保存,第二种是将文件拷贝到本地,修改后再拷贝回容器并且更新镜像。

2.1 VIM方法

$ vi ppo_lstm.py

进入界面后按a键开启编辑模式,按ESC键退出编辑模式,最后:输入wq保存并退出。

2.2 拷贝并更新回容器-本地更新

  • 建立一个文件夹用来存储这些文件。

  • 将该ID容器里的文件拷贝到你创建的文件夹中。

$ docker cp 3d747e7ccb2b:/workspace/ppo_lstm.py E:/tianchi_rl_submit/
  • 将修改后的拷贝文件拷贝回容器
$ docker cp E:/tianchi_rl_submit/ppo_lstm.py 3d747e7ccb2b:/workspace/
  • 更新镜像(自己的),这里是深圳服务器。
$ docker commit 3d747e7ccb2b registry.cn-shenzhen.aliyuncs.com/docker_tanchi/rl_submit:race
  • 查看生成的镜像
 $ docker images
 REPOSITORY                                                  TAG       IMAGE ID       CREATED         SIZE
 registry.cn-shenzhen.aliyuncs.com/docker_tanchi/rl_submit   race      12f1b1d66471   3 hours ago     11.2GB
 registry.cn-shanghai.aliyuncs.com/tcc-public/python         3         a4cc999cf2aa   20 months ago   929MB

如此操作,大概理解了流程,这里都是本地的更新过程,那么再回顾官方的教程复习一遍,官方教程是完整的上传到个人仓库的一个过程。

2.3 官方教程-上传到仓库

  1. 登陆阿里云(输入密码后即可登陆)

    这里有个细节,有两个密码,先输入的是系统的密码对应sudo,然后输入的才是阿里云的密码。

$ sudo docker login --username=oranggg registry.cn-hangzhou.aliyuncs.com
  1. 从某个Registry中拉取镜像,即所谓的官方镜像源文件
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/egg_mario/mario:[镜像版本号]
  1. 将镜像推送到Registry
$ sudo docker login --username=oranggg registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/egg_mario/mario:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/egg_mario/mario:[镜像版本号]

在输入docker images后可以看到对应的TAGIMAGE ID

如果提示denied: requested access to the resource is denied,那么再运行一下login即可。

在这里插入图片描述

登陆容器镜像服务后可以看到结果,地址
在这里插入图片描述

在这里插入图片描述

3 Docker文件操作

3.1 文件组成

  • 一个Dockerfile文件
    也就是建立一个名字为这个,内容是以下内容的文件。

内容如:

# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3

## 把当前文件夹里的文件构建到镜像的根目录下
ADD . /

## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /

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

3.2 构建镜像

相当于定制一个虚拟机,给这个镜像起一个名字。

注意最后面有一个

$ docker build -t mario .

3.3 转换成容器

  • cpu镜像
$ docker run mario sh run.sh
  • gpu镜像

需要安装nvidia-docker官网链接,按照步骤一步步来即可。

$ nvidia-docker run mario sh run.sh

遗憾的是,1650显卡显存4个G不够用,看来还得修改模型。

在这里插入图片描述

4 Nvidia-Docker文件操作

在读论文的过程中,有一些作者觉得配置起来比较麻烦的情况下,直接提供了docker环境,不过作者只提供了文件和简要运行的sh文件方法,并没有说明如何具体使用docker,踩了一下坑,讲一讲具体咋用的

4.1 为什么要用Nvidia-Docker

个人理解是说要用到GPU和充分利用显卡资源,自己在运行普通的docker时候出现了显示问题,而运行了nvidia-docker就解决了这个问题。

  • 首先,从github上找到论文作者提供的docker地址,即docker pull NAME/NAME
  • 然后查看当前有哪些镜像,nvidia-docker images
  • 然后,运行这个docker镜像,产生容器nvidia-docker run -it NAME/NAME /bin/bash
  • 这个时候我们就进入了这个容器,但有一种情况是我想同时打开多个容器的终端,就像在ubuntu一样,启动多个终端进行诸如通讯等操作,注意不能使用docker attach CONTAINER_ID,似乎这种情况会复制一个终端出来,显示界面完全一样,那么接下来我们先查看CONTAINER_ID
  • nvidia-docker ps -a显示了所有容器的ID,那么复制这串容器的ID
  • 运行nvidia-docker exec -it CONTAINER_ID /bin/bash,就开启了另一个终端。

占一个坑,在开启的时候可以选择占用的端口,这样实现通讯功能,这里还没怎么研究。

4.2 安装必要的组件

如果你配置过WINDOWS或者LINUX的GPU组件,就知道CUDA,Pytorch-gpu等相匹配的规则。
而使用docker,作者一般会在里面内置了CUDA,但我不太理解我配置的这个Docker环境中,没有pytorch组件,于是在这个链接下Pytorch下载链接找到了相匹配的pytorch版本,按照命令安装即可。

  • 首先查看一下CUDA的版本,一般放在目录/usr/local/cuda/version.txt下,这里我的版本是CUDA10.0
  • 然后在上面那个链接CTRL+F搜索CUDA 10.0后按照命令安装pip install torch==1.2.0 torchvision==0.4.0
  • 顺便说一下,另一种查看CUDA的版本也可以使用命令nvidia-smi

4.3 下次还想用这个容器怎么办

测试了一下,如果在容器里安装了一些库函数,关闭之后再开启一个镜像后貌似就没了,还好记得上次的容器ID,因此还能找回来。

  • 首先查看历史的容器信息,nvidia-docker ps -a
  • 然后可以看到很多个容器ID,记一下刚才那个ID,(可以从时间上大概推测一下)
  • 如果留意一下状态,可以看到有STATUS有两种类型,一种是UP n minutes,一种是Exited (xxx) n hours,那么这个之前的那个容器退出了,状态应该是后者,记住此时的容器ID。
  • 激活一下,使用nvidia-docker restart CONTAINER_ID
  • 那么就可以利用上述指令nvidia-docker exec -it CONTAINER_ID /bin/bash开启了这个容器
  • 检查一下比如pip list或者conda list可以发现刚才安装的库还在,成功解决了问题。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值