文章目录
- Docker的学习笔记
- 0.监视显卡
- 1.从官网镜像获取镜像文件
- 2.对容器内的文件并编辑保存
- 2.1 VIM方法
- 2.2 拷贝并更新回容器-本地更新
- 2.3 官方教程-上传到仓库
- 3 Docker文件操作
- 3.1 文件组成
- 3.2 构建镜像
- 3.3 转换成容器
- 4 Nvidia-Docker文件操作
- 4.1 为什么要用Nvidia-Docker
- 4.2 安装必要的组件
- 4.3 下次还想用这个容器怎么办
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 官方教程-上传到仓库
- 登陆阿里云(输入密码后即可登陆)
这里有个细节,有两个密码,先输入的是系统的密码对应sudo,然后输入的才是阿里云的密码。
$ sudo docker login --username=oranggg registry.cn-hangzhou.aliyuncs.com
- 从某个Registry中拉取镜像,即所谓的官方镜像源文件
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/egg_mario/mario:[镜像版本号]
- 将镜像推送到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
后可以看到对应的TAG
和IMAGE 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版本,按照命令安装即可。
- 首先查看一下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
可以发现刚才安装的库还在,成功解决了问题。