天池比赛如何使用docker提交

天池上的比赛,一般复赛阶段会让参赛选手使用docker封装好容器后,提交到线上得到结果,推理或者训练过程放在赛方提供的硬件环境下,选手一般是接触不到测试集的,更加保证了比赛的公平性。 笔者接触docker和使用已经有几次了经历了,但是都只是用于比赛,所以平时并不常使用,导致每次用的时候都要在查查资料回顾下,现在记录一下主要的提交步骤,以遍日后复习使用。

一、机制

天池平台提供了基于GPU计算资源的提交镜像的方式,将本地代码打包成镜像提交,推送至阿里云容器镜像仓库后,在天池提交页面中输入镜像地址、用户名和仓库密码。由比赛平台拉取镜像运行,运行结束即可在成绩页面查询评测结果和日志。

现在笔者自己对以上机制做一个更通俗的解释。我们可以把docker的镜像容器看成一个微型的虚拟机,这个虚拟机通过我们的搭建封装后,可以放到阿里的远程仓库里。赛方通过这个仓库,拿到你的镜像容器,然后在里面放入比赛的数据集,通过你在容器里面的模型代码,跑出预测的结果,并算出你的成绩。

二、镜像容器的制作

1、docker安装这里就不多讲了,非常容易可以自行参考官方的安装教程。
2、开通阿里云容器镜像服务,同样参考步骤1的教程。(注意仓库的地区选比赛要求的地区)
3、搭建自己的镜像容器:
这里通过Dockerfile文件来搭建自己的镜像容器。我们在自己本地先创建一个Dockerfile文件。

~:vim Dockerfile

在该文件中写入以下代码:

# 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.1.0-cuda10.0-py3 
##安装python依赖包 
RUN pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple 
## 把当前文件夹里的文件构建到镜像的根目录下,并设置为默认工作目录 
ADD . / 
WORKDIR / 
## 镜像启动后统一执行 sh run.sh 
CMD ["sh", "run.sh"]

现在一行行解释命令的意思:

  • FROM registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.1.0-cuda10.0-py3是拉取一个镜像环境和直接使用docker pull命令一样的作用,后面的镜像环境可以根据自己的需求选取,这里提供了多种模型的训练环境,比如你的深度框架用的是tensorflow-gpu==2.4.1 ,那么拉取registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:2.4.1-cuda10.1-py3这个环境后,该环境就提供了与之相应的cuda本版等一系列的环境。(这里建议读者直接拉取阿里提供的一些镜像环境,在此基础上可以安装自己额外需要的pip包,如果自己重新搭建镜像环境比较麻烦且繁琐)。

  • RUN pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple 通过pip 安装你需要的py包,确保你需要的py包都安装到镜像容器中,也可以通过requirement.txt 全部安装了

  • ADD . / 将你当前所处的文件夹,添加到镜像容器中。(ADD后面的路径可以根据自己的需要修改)

  • WORKDIR / 设定容器的工作路径为容器的根目录 。(工作路径也可以根据自己的需求修改)

  • CMD ["sh", "run.sh"] 当拉取你这个容器时,自动执行bash命令,运行run,sh。

一般来说,Dockerfile只需要前四条语句,最关键的是第一句命令。

完成Dockerfile文件后,我们就可以在本地搭建自己的镜像容器了,但再次之前我们最好先登陆下我们的远程仓库。

sudo docker login --username=xxx registry.cn-shenzhen.aliyuncs.com

xxx是你阿里云用户名,这条命令在你自己的阿里云仓库的操作指导里可以找到。
输入你的阿里云仓库密码,登陆成功。

在本地建立你自己的镜像容器。

sudo docker build  -t registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0 .

上面代码registry.cn-shenzhen.aliyuncs.com/pred_dd/sad是你仓库的公网地址,同样在你创建的仓库里能找到。
冒号:后面的1.0表示版本号,这个你可以随便写,只是用于区分不同的镜像容器而已,只是个tag。 注意后面的.,目的是把你当前的所有文件放入虚拟容器里面,你也可以指定你代码所处的文件夹,这里我默认代码所需文件和模型都在当前文件夹下。

4、进入“虚拟机”(非提交必须的操作)
你的镜像容器搭建好后,就可以进入你的"虚拟机"里面了,这步不是必须的,但是可以加深我之前说的"微型虚拟机"概念的理解。输入如下命令:

sudo nvidia-docker run -it registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0

读者应该也注意到了,-it 后面是你刚刚创建的镜像容器的名字和版本号,由于我需要Gpu训练,所以用的是nvidia-docker,如果是cpu 就用docker。
天池比赛如何使用docker提交_第1张图片
此时就处在虚拟机里面了,可以看到之前在本地的一些文件已经放入了这个容器里面。我们也可以pip list 看看该环境是否已经按照了你需要的包和版本。在docker虚拟机里,可以通过python your_code.py 来运行起来你的代码,测试下环境是否满足自己代码的环境需求。这个和官方提供的:nvidia-docker run -v /data:/tcdata your_image sh run.sh 测试命令是一样的效果,这个命令是将你本地的/data文件夹,映射到容器里/tcdata文件夹,然后bash run.sh ,我们在run.sh里面写运行代码的命令。(ctrl+d 退出镜像容器)
其实从这个官方代码,我们也能猜测出官方是如何测试我们的代码的,我们要准备一个run.sh,里面写上我们代码的运行命令,官方拉取我们的镜像容器后,就会将数据映射到我们容器的/tcdata文件夹下,然后运行run.sh 文件来产生结果。所以在提交的时候,记得要写好run.sh文件,同时放入到镜像容器里面,通过命令sudo docker build -t registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0 . 将文件添加到容器中。

5、将本地镜像容器推送到远程仓库

sudo docker push registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0

6、 提交容器
官网提交页面,输入镜像容器的名字registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0,用户名和密码即可提交成功。

总结

这个提交流程汇总
1、 准备Dockerfile 文件,里面写入需要拉取的基础镜像,以及相应的包,同时添加将本地文件放入镜像容器的命令。
2、准备好run.sh 以及相应的模型训练和预测代码。
3、登陆远程仓库sudo docker login --username=xxx registry.cn-shenzhen.aliyuncs.com
4、sudo docker build -t registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0 搭建本地的镜像容器
5、sudo docker push registry.cn-shenzhen.aliyuncs.com/pred_dd/sad:1.0 将镜像容器推送到仓库
6、官网提交

你可能感兴趣的:(比赛,study)