阿里天池Docker训练营 Task01学习笔记
前言
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
虚拟机与docker之间的区别
虚拟机:
我们传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给他的资源将全部被占用,每一个虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
Docker:
容器技术是和我们的宿主机共享硬件资源及操作系统可以实现资源的动态分配。
容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。
具体对比:
docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。
docker 需要的资源更少,docker 在操作系统级别进行虚拟化,docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化。
docker 更轻量,docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
与虚拟机相比,docker 隔离性更弱,docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。
安全性: docker 的安全性也更弱。Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为 root 权限,它就直接具备了宿主机的 root 权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
可管理性:docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力。
高可用和可恢复性:docker 对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制,VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性。
快速创建、删除:虚拟化创建是分钟级别的,Docker 容器创建是秒级别的,Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。
交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署;
Docker安装
linux
$ sudo curl -sS https://get.docker.com/ | sh
MacOS
如果已经安装了 Homebrew ,使用brew 安装非常方便
Homebrew (opens new window)的 Cask (opens new window)已经支持 Docker Desktop for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
$ brew cask install docker
Docker基础命令
拉取镜像
docker pull [选项] [docker镜像地址:标签]
运行镜像
$ docker run -it --rm ubuntu:18.04 bash
root@e7009c6ce357:/# uname -a
Linux bff9f261bab2 4.15.0-106-generic #107-Ubuntu SMP Thu Jun 4 11:27:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
root@e7009c6ce357:/# exit
查看本地镜像(list 镜像)
$ docker images
查看运行中的容器
$ docker ps
进入运行中/后台运行的容器
$ docker exec -it [CONTAINER ID] /bin/bash
保存修改
docker commit [CONTAINER ID] registry.cn-shanghai.aliyuncs.com/test/pytorch:myversion
打TAG
docker tag registry.cn-shanghai.aliyuncs.com/test/pytorch:myversion my_tmp_version:0.1
推送镜像到仓库
docker push registry.cn-shanghai.aliyuncs.com/test/pytorch:myversion
构建镜像
docker build -t registry.cn-shanghai.aliyuncs.com/target:test .
如要指定dockerfile :
docker build -f ./dockerfile -t registry.cn-shanghai.aliyuncs.com/target:test .
删除镜像/容器
删除镜像:
docker rmi registry.cn-shanghai.aliyuncs.com/target:test
删除容器:
docker rm [CONTAINER ID]
FAQ
数据集挂载
天池大赛数据集默认以只读形式挂载在/tcdata下(训练集+测试集) 因此本地调试时可通过-v 模拟挂载与线上一致
docker run -it -v /your_data:/tcdata registry.cn-shanghai.aliyuncs.com/xxxx/test:0.1 /bin/bash
预训练权重
如果大赛允许使用预训练权重等外部数据,则默认以只读形式挂载在/external_data下,一般情况下如果你需要的权重大赛未提供,可向赛题方提出,需要注意的是所有外部数据必须使用官方在线上提供的,否则如自己放在镜像里提交则在代码审核时直接取消名次。
持久化存储*
如大赛出现超大数据集,常见视频类竞赛,官方会提供持久化存储以方便选手对数据处理、模型训练等耗时操作的中间结果提供持久化存储空间直到大赛结束。 持久化空间默认以可读写的形式挂载在/myspace下,但是需要注意此空间仅为日常调试时使用,最终排行榜最优成绩对应提交需是端到端完整代码运行得出,不能使用存储空间的中间结果。
执行入口
大赛一律以镜像的工作空间目录下run.sh为运行入口,且仅以此进程为程序运行状态如结束的标志。 调试时可在本地执行docker run registry.cn-shanghai.aliyuncs.com/xxxx/test:0.1 sh run.sh模拟测试
网络环境
天池大赛一律无网络链接,切记镜像内不要有网络操作否则会导致线上运行时由于无网络触达而导致程序卡住。
超时时间
一般大赛“容器镜像”页面会注明一个超时时间,此超时时间为你的代码“从开始运行到完整结束”的整个时间限制,如果你的代码仅仅超出这个时间一点(约30min内)则依然会返回成绩但是此成绩不会计入排行,仅能在日志页面内看到,如果超出这个时间许多还没结束,则会被强制清理掉。 另外 如果涉及流评测(后续大赛会逐渐被流评测代替),
日常调试提交
如果你本地有满足赛题的计算资源,那么你日常提交时可以提交打包本地训练好的权重仅在线上做预测过程,这样可以快速出分,提高大赛效率,但是这样的提交在最终是无效的 所以一定注意在大赛要求的最后几天(一般是一周)重新提交最优模型的端到端代码完成数据处理到训练预测全流程,否则最后如果最优成绩无完整代码会被直接淘汰,所以切记!
自定义镜像
如需自定义镜像,一定要确保镜像内安装了curl,且Dockerfile 中不能使用ENTRYPOINT
线上存储空间大小
物理机存储默认为500G 但是有系统、软件、docker镜像等占用空间,实际可用空间建议通过打印获取,一般大赛足够使用,可不必考虑。
线上共享内存大小
共享内存大小无特殊说明情况下默认为内存的一半 docker 本地调试时可指定如–shm_size 64 设置与线上环境大小一致
流评测工具包AI-HUB
天池大赛已逐渐全面升级为流评测形式,已规避针对测试集做训练、或者以未来测试条件预测当前数据、或工业流水线对单次预测效率严控等情况 安装:pip install ai-hub ai-hub 的inferServer模块针对天池大赛流评测定制,详情可参考https://github.com/gaoxiaos/AI_HUB 如果自己构建大赛的infer server 则需要注意API接口默认为tccapi 端口为8080 并实现当收到exit请求时服务自动退出能力
常用镜像(含国内源和美西源)
天池为大家构建了常用的竞赛镜像仓库,并更新维护。