线下容器镜像迁移指导

举报
yangzilong 发表于 2022/10/14 16:34:44 2022/10/14
【摘要】 针对ma-user用户添加以及线下镜像一般较大的问题,给出一个基于conda环境的容器镜像迁移及大小优化的方案。 以便线下训练镜像可以快速在ModelArts服务上跑起来。

本文档是ModelArts专属池使用的一个子场景说明,主要介绍如何把线下可用的环境迁移上云。

容器镜像是按层排布的,通过overlayFS能够方便的达成版本管理和按需修改的诉求。但是,在实际使用中经常会因镜像经过多次修改后导致镜像体积过大的情况。过大的容器镜像难以上传到和迁移,且存在很多无用文件,导致额外存储空间的占用。

在云化的调度平台之上,单个节点每日会接纳极多任务的调度执行,大镜像所需的下载时间较长,更容易触发硬盘镜像文件清理,会对资源的高效利用产生挑战。所以,ModelArts服务限制容器镜像不应超过25G

另外,华为云为了提升容器实例的隔离和安全性,要求在ModelArts服务上的容器实例均以非root(即,ma-user)来启动,外部镜像需要修改python及依赖权限,容易导致镜像过大。

本文针对上述问题,给出一个基于conda环境的容器镜像迁移及大小优化的方案。以便线下训练镜像可以快速在ModelArts服务上跑起来。

 

迁移依赖

1.线下镜像使用conda env管理python环境。

2.能找到或生成构建镜像用的基础镜像。到OS层或cuda驱动层。

 

迁移指导

1.导出conda环境

首先拉起我们线下的容器镜像,可以在启动的时候可以挂载本机硬盘方便数据导出:

docker  run -ti -d -v /${host_dir}:/${container_dir} ${your_image_tag}

或者可以后续通过命令将容器数据拷出,命令如:

docker  cp ${container_id}:/${container_path} .

conda环境的完整导出和导入(相关介绍参考: https://conda.github.io/conda-pack/  https://zhuanlan.zhihu.com/p/87344422)。

导出命令如下:

conda create --name pytorch --clone base
pip install conda-pack
conda pack -n pytorch -o pytorch.tar.gz

注意,如果是使用condabase环境,需要先clone到一个新的环境。

最终环境的打包结果就是:pytorch.tar.gz

注意,如果导入时没有进行“conda-unpack”操作,可能会造成Python.h找不到的问题。

另附conda官方博客存档如附件pdf


2.新镜像构建

基础镜像一般选用ubuntu 18.04的官方镜像,或者nvidia出的待cuda驱动的镜像。相关镜像直接到dockerhub官网查找即可。

构建流程:安装所需的apt包、驱动,配置ma-user用户,导入conda环境,配置Notebook依赖。

注意:

每层构建的时候都尽量把tar包等中间态文件删除,保证最终镜像更小。下面两个链接是清理缓存的方法介绍:

http://docs.projectatomic.io/container-best-practices/#_clearing_packaging_caches_and_temporary_package_downloads

https://docs.conda.io/projects/conda/en/latest/commands/clean.html

注意:

如果仅要做快速迁移,可以使用docker commit的方式边调试变构建,这样所有的个人内容都在一层里存放。记得commit之前删除无用的包和缓存文件,保证最终镜像更小。

建议:

apt等包的配置可能无法一次到位,可以启动容器边测试边安装,最终记录所有安装的apt包即可。找不到lib或其他文件的问题,一般可以通过google快速解决。

具体的镜像构建调试工作可以参考: https://bbs.huaweicloud.com/blogs/285590

建议:

最好使用dockerfile的方式构建镜像。通过将pytorch.tar.gz上传到OBS并设置公共读,并在构建时wget获取、解压、清理。这样既满足dockerfile可追溯及构建归档的需求,也保证镜像内容无冗余和残留。

 

3.构建参考样例

FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu18.04

USER root

# section1: add user ma-user whose uid is 1000 and user group ma-group whose gid is 100. If there alreay exists 1000:100 but not ma-user:ma-group, below code will remove it
RUN default_user=$(getent passwd 1000 | awk -F ':' '{print $1}') || echo "uid: 1000 does not exist" && \
    default_group=$(getent group 100 | awk -F ':' '{print $1}') || echo "gid: 100 does not exist" && \
    if [ ! -z ${default_group} ] && [ ${default_group} != "ma-group" ]; then \
        groupdel -f ${default_group}; \
        groupadd -g 100 ma-group; \
    fi && \
    if [ -z ${default_group} ]; then \
        groupadd -g 100 ma-group; \
    fi && \
    if [ ! -z ${default_user} ] && [ ${default_user} != "ma-user" ]; then \
        userdel -r ${default_user}; \
        useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user; \
        chmod -R 750 /home/ma-user; \
    fi && \
    if [ -z ${default_user} ]; then \
        useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user; \
        chmod -R 750 /home/ma-user; \
    fi && \
    # set bash as default
    rm /bin/sh && ln -s /bin/bash /bin/sh

# section2: config apt source and install tools needed.
RUN sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
    sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y ca-certificates curl ffmpeg git libgl1-mesa-glx libglib2.0-0 libibverbs-dev libjpeg-dev libpng-dev libsm6 libxext6 libxrender-dev ninja-build screen  tmux nfs-common dnsutils tcpdump sudo vim wget zip && \
    apt-get clean  && \
    rm -rf /var/lib/apt/lists/*

USER ma-user

# section3: install miniconda and rebuild conda env
RUN mkdir -p /home/ma-user/work/ && cd /home/ma-user/work/ && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-x86_64.sh && \
    chmod 777 Miniconda3-py37_4.12.0-Linux-x86_64.sh && \
    bash Miniconda3-py37_4.12.0-Linux-x86_64.sh -bfp /home/ma-user/anaconda3 && \
    wget https://ma-sa.obs.cn-north-4.myhuaweicloud.com/yangzilong/conda_env/pytorch.tar.gz && \
    mkdir -p /home/ma-user/anaconda3/envs/pytorch && \
    tar -xzf pytorch.tar.gz -C /home/ma-user/anaconda3/envs/pytorch && \
    source /home/ma-user/anaconda3/envs/pytorch/bin/activate && conda-unpack && \
    /home/ma-user/anaconda3/bin/conda init bash && \
    rm -rf /home/ma-user/work/*

ENV PATH=/home/ma-user/anaconda3/envs/pytorch/bin:$PATH

# section4: settings of Jupyter Notebook for pytorch env
RUN source /home/ma-user/anaconda3/envs/pytorch/bin/activate && \
    pip install ipykernel==6.7.0 --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple && \
    ipython kernel install --user --env PATH /home/ma-user/anaconda3/envs/pytorch/bin:$PATH --name=pytorch && \
    rm -rf /home/ma-user/.local/share/jupyter/kernels/pytorch/logo-* && \
    rm -rf ~/.cache/pip/* && \
    echo 'export PATH=$PATH:/home/ma-user/.local/bin' >> /home/ma-user/.bashrc && \
    echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/nvidia/lib64' >> /home/ma-user/.bashrc && \
    echo 'conda activate pytorch' >> /home/ma-user/.bashrc

 

4.在平台上测试

将本地构建好的镜像推送到华为云,在ModelArts里注册后可以直接创建Notebook及训练任务。

详细使用说明参考: https://bbs.huaweicloud.com/blogs/364867

如果测试有问题,可以优先在环境上快速修改,并最终沉淀改动到dockerfile中。

容器构建和调试参考: https://bbs.huaweicloud.com/blogs/285590

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。