如何在天池竞赛中使用docker提交,比赛

发表时间:2021-05-11

天池上的比赛,一般复赛阶段会让参赛选手使用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。
在这里插入图片描述
此时就处在虚拟机里面了,可以看到之前在本地的一些文件已经放入了这个容器里面。我们也可以 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、官网提交

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free