容器镜像构建和调试指南

网友投稿 518 2022-05-29

构建镜像:

1.写一个Dockerfile,参考:

FROM swr.cn-north-4.myhuaweicloud.com/modelarts-job-dev-image/custom-cpu-base:1.0 # setup the env that you need when running a container ENV PYTHON_PATH=/mypath/:$PYTHON_PATH # copy local files (code, packages, or data) into container images COPY install/ /home/work/install/ # run shell comment to install packages or setting up configs RUN cd /home/work/install && pip install -r requirements.txt --no-cache-dir && \ cd /home/work/install/obs_sdk/src && python setup.py install

2.把要打到基础镜像的依赖包跟Dockerfile放在同一目录,cd到这个目录,执行打镜像命令:

docker build -t my_deeplearning_image:v1 .

启动容器:

('-d'参数标示后台启动,不用再新起窗口执行)

docker run -ti -d my_deeplearning_image:v1

如果在调试中需要用到GPU设备,建议使用nvidia-docker来启动。nvidia-docker的安装和使用教程参考链接:https://blog.csdn.net/zywvvd/article/details/110647382

进入容器:(一般会另起一个窗口,在debug时使用)

1.获取容器ID:

通过命令查看CONTAINER ID ,命令如:

docker ps

结果如:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 39c9ceedb1f6 my_deeplearning_image:v1 "bash" About a minute ago Up About a minute happy_meitner

2.进入容器内部

使用以下命令可进入容器内部(使用container ID)

docker exec -it 39c9ceedb1f6 /bin/bash

进入容器后,就类似通过ssh登陆了一个linux机器,可以查看所需的文件是否在正确位置,是否有正确权限。

本地调试要点:

0.确认对应的脚本、代码、流程在linux服务器上运行正常。

如果在linux服务器上运行就有问题,那么先调通以后再做容器镜像。

1.确认打入镜像的文件是否在正确的位置,是否有正确的权限。

训练场景主要看一下自研的依赖包是否正常,看一下pip list是否包含所需的包,看一下容器直接调用的python是否是自己所需要的那个(如果容器镜像装了多个python,需要设置python路径的环境变量)。

推理场景主要看一下模型包位置是否正确,看一下python相关是否正确。

2.测试训练启动脚本

2.1优先使用手工进行数据拷贝的工作并验证

一般在镜像里不包含训练所用的数据和代码,所以在启动镜像以后需要手工把需要的文件拷贝进去。建议数据、代码和中间数据都放到"/cache"目录,防止正式运行时磁盘占满。建议linux服务器申请的时候,有足够大的内存(8G以上)以及足够大的硬盘(100G以上)。

docker和linux的文件交互命令如下:

docker cp data/ 39c9ceedb1f6:/cache/

数据准备完成后,启动训练的脚本,查看训练是否能够正常拉起。一般来说,启动脚本为:

cd /cache/code/ python start_train.py

如果训练流程不符合预期,可以在容器实例中查看日志、错误等,并进行代码、环境变量的修正。

2.2然后预制脚本测试整体流程

一般使用run.sh封装训练外的文件拷贝工作(数据、代码:OBS-->容器,输出结果:容器-->OBS),run.sh的构建方法参考之前的博客:https://bbs.huaweicloud.com/blogs/281792

如果预制脚本调用结果不符合预期,可以在容器实例中进行修改和迭代。

3.分析错误时:训练镜像先看日志,推理镜像先看API的返回。

可以用过命令查看容器输出到stdout的所有日志:

docker logs -f 39c9ceedb1f6

一般在做推理镜像时,部分日志是直接存储在容器内部的,所以需要进入容器看日志。注意:重点对应日志中是否有ERROR(包括,容器启动时、API执行时)。

4.牵扯部分文件用户组不一致的情况,可以在宿主机用root权限执行命令进行修改

docker exec -u root:root 39c9ceedb1f6 bash -c "chown -R ma-user:ma-user /cache"

5.针对调试中遇到的错误,需要持久化到容器构建流程,并重新测试。

上传镜像:

完成调试后,需要上传基础镜像到SWR

1.登陆SWR,login的账号密码可在SWR页面的客户端上传指导时生成。

其他账号创建方法:获取长期login指令

2.创建自己的组织(仅需要创建一次)

3.上传镜像(认为${image_name}:${image_version}是刚做好的基础镜像)

先打tag,然后push。注意,第一次使用需要在SWR先创建一个组织,详细参考SWR文档:https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html

docker tag ${image_name}:${image_version} swr.cn-north-4.myhuaweicloud.com/${organization_name}/${image_name}:${image_version} docker push swr.cn-north-4.myhuaweicloud.com/${organization_name}/${image_name}:${image_version}

4.在SWR页面确认基础镜像已正常上传

远程调试要点:

1.直接使用对应镜像创建训练任务即可

2.观察训练任务是否正常执行

主要观察日志是否正常,然后看一下整个任务是否能够正常产出结果。

3.针对观察发现的问题,增加相关信息打印

可以通过在镜像里修改run.sh(重新构建镜像),或者在运行命令里用sed修改run.sh,或者通过增加“env”命令来查看容器环境信息。

如果输入输出的逻辑不是很确认,可以先把样例的数据和代码放到镜像里,先看一看整个训练流程是否可以正常运行。

删除本地镜像:

参考:https://blog.csdn.net/winy_lm/article/details/77980529

1.查看是否有对应容器

docker ps -a

2.停止对应容器

docker stop ${container_id}

3.删除对应容器

docker rm ${container_id}

4.删除对应镜像

docker rmi ${image_id}

镜像到导出和导入:

如果需要进行镜像的离线迁移,需要用到镜像的导出和导入的功能。

容器镜像的构建和调试指南

用save保存镜像,用load导入:

docker save ${image_name}:${image_version} > my_deeplearning_image.1.0.tar docker load -i my_deeplearning_image.1.0.tar

用export保存container

docker export ${container_id} > my_deeplearning_image.export.tar

AI开发平台ModelArts 容器 容器镜像服务 SWR

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:汇编语言--输入两位十六进制数,输出其十进制值
下一篇:10个python爬虫入门实例(小结)
相关文章