Docker 镜像封装与深度学习代码集成

Docker 安装 www.baidu.com 一大坨安装教程,看到你吐血!!!
按照规定的标准输入与输出格式开发算法,将算法封装到Docker镜像内,并将镜像推送到官方仓库中。提交镜像文件具体要求如下:

CUDA版本要求11.0;
构建镜像时指定CMD作为默认执行的命令;
容器内禁止使用网络操作,否则会造成容器卡死,影响算法执行;
数据输入目录为/input_path(容器内目录),目录权限只读,此目录对应数据组织结构中的test目录;
数据输出目录为/output_path(容器内目录),目录权限可写;
算法入口程序为main.py,所在文件夹为/work(容器内目录),main.py需要读取/input_path中的数据,并将结果输出到/output_path;

下面是使用Dockerfile配置环境的示例和main.py示例:

Dockerfile示例:

# 基础镜像, cuda为11.0,ubuntu18.04
FROM cuda:11.0-cudnn8-runtime-ubuntu18.04  ##自行修改

# 配置程序依赖环境
RUN apt-get update && apt-get install -y --no-install-recommends \
         build-essential \
         cmake \
         curl \
         ca-certificates \
         libjpeg-dev \
         libpng-dev \
         python3 \
         python3-dev \
         python3-pip && \
     rm -rf /var/lib/apt/lists/*

# 安装torch
RUN pip3 install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
RUN pip3 install matplotlib>=3.2.2
RUN pip3 install numpy>=1.18.5
RUN pip3 install scikit-build
RUN pip3 install setuptools>=33.1.1
RUN pip3 install Pillow
RUN pip3 install PyYAML>=5.3.1
RUN pip3 install scipy>=1.4.1
RUN pip3 install torch>=1.7.0
RUN pip3 install tqdm>=4.41.0
RUN pip3 install grpcio
RUN pip3 install tensorboard

RUN pip3 install seaborn>=0.11.0
RUN pip3 install pandas

RUN pip3 install opencv-python>=4.1.2
RUN python3 -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu110/torch1.7/index.html
# 将程序复制到容器内的/work路径下
COPY .  /work
#COPY ./weights/best.pt /work/weights/
# 容器启动命令
CMD ["python3", "-u", "/work/main.py"]

1.main.py示例:

def fun(input_dir, output_dir):
    pass


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    # 数据集路径
    parser.add_argument("--input_dir", default='/input_path', help="input path", type=str)
    # 输出路径
    parser.add_argument("--output_dir", default='/output_path', help="output path", type=str)
    args = parser.parse_args()
    start_time = time.time()
    torch.backends.cudnn.benchmark = True
    os.environ['CUDA_VISIBLE_DEVICES'] = '0'
    fun(args.input_dir, args.output_dir)
    print('total time:', time.time() - start_time)

2.构建镜像
编写好Dockerfile后,与需要打包的程序放到同一个文件夹下,然后进行以下步骤:

docker build -t docker.image/<image_name>:1.0.0 .

注意最后的.前面有空格.

3.测试:
运行完成后可在/data/output_path/中查看输出结果

docker run -it --rm -v /data/input_path/:/input_path -v /data/output_path/:/output_path docker.image/<image_name>:1.0.0

如果需要进行深度学习算法更换,只需要替换main.py中的fun函数就可以.

4.Docker 中会用到的指令:

  1. 镜像构建失败,需要删除tag为的镜像:
删除none的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。

$ docker images

$ docker rmi $(docker images | grep "none" | awk '{print $3}')
直接删除带none的镜像,直接报错了。提示先停止容器。

$ docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器

$ docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //删除容器

$ docker rmi $(docker images | grep "none" | awk '{print $3}') //删除镜像 
  1. 删除所有镜像:
docker rmi -f $(docker images -qa)
  1. 容器操作:

查看运行容器

docker ps

查看所有容器

docker ps -a

进入容器

其中字符串为容器ID:

1.  docker exec -it d27bd3008ad9 /bin/bash
2.  docker attach d27bd3008ad9

1.停用全部运行中的容器:

docker stop $(docker ps -q)

2.删除全部容器:

docker rm $(docker ps -aq)

3.一条命令实现停用并删除容器:

docker stop $(docker ps -q) & docker rm $(docker ps -aq)
  1. docker系统修剪

docker system prune了以下内容:

所有停止的容器
至少一个容器未使用的所有网络
所有悬空的图像
所有悬空的构建缓存 

此清除命令将节省大量硬盘空间。

$ sudo docker system prune
 
WARNING! This will remove:
 1. all stopped containers
 2. all networks not used by at least one container
 3. all dangling images
 4. all dangling build cache
 
Are you sure you want to continue? [y/N] y
Deleted Containers:
10b3f08a93df89818976a29c26f5ccefbda1e2dc2e0205a02e9a3306590a1455
89d9cb3e102dbadc9d314bea0db5feb3110931727e2da0b88d6d88d7d78f4400
49e429f26db40615557a85fdf758cd66afa208dba03f74aea860bb04bb4772b2
3e36a2c0c241f8b815ddc73f398cae97962a6799c244fd5169cd845023c5b657
...
 
Deleted Images:
deleted: sha256:fe111236265a30b8ec54390defb5da60cc7b76a0d3ff0e883691b8b3c663f2e9
deleted: sha256:2e591f44cd334c7896ed01660d45099f4f58169d0584163b6009dea56c3abcbe
deleted: sha256:8b1c255bf0e627c789fc35b3b3b0a1e5033f6be612e01dca08eb1aa4fd161364
...
 
Total reclaimed space: 251.3MB
  1. docker 从镜像中复制代码到本地
docker cp <containerId>:/file/path/within/container /host/path/target

注意是containerId 不是 image Id .

如果刚拉取的镜像, 先操作:

 1. sudo docker run -it your_docker_image:version /bin/bash

 2. docker ps -a

如果Version 是****,则用tag指令配置tag:

docker tag ec083d1555e4 docker.image/image_name:1.0.15

sudo docker cp -a 427870a03728:/work /home/yourPC/Desktop/1.0.8f/

查看对应镜像的容器ID.继续执行copy操作即可.

  1. 本地复制到docker image:
    建议使用Dockerfile的操作:
    有两个类似Dockerfile指令,COPY或着ADD,这两者都用于为包括在文件中的图像

COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。
满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。

  1. COPY指令

COPY指令能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统。

exec格式用法(推荐):

COPY ["",... ""],推荐,特别适合路径中带有空格的情况

shell格式用法:

COPY <src>... <dest>
  1. ADD指令
    ADD指令不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
    所以,可以认为ADD是增强版的COPY,支持将远程URL的资源加入到镜像的文件系统。ADD命令能对本地归档文件进行解包而COPY不行。

exec格式用法(推荐):

ADD ["",... ""],特别适合路径中带有空格的情况

shell格式用法:

ADD <src>... <dest>
将当前路径下所有程序复制到容器内的/work路径下
	COPY .  /work
  1. COPY指令和ADD指令的用法非常相似,具体注意事项如下:

    源路径可以有多个
    源路径是相对于执行build的相对路径
    源路径如果是本地路径,必须是build上下文中的路径
    源路径如果是一个目录,则该目录下的所有内容都将被加入到容器,但是该目录本身不会
    目标路径必须是绝对路径,或相对于WORKDIR的相对路径
    目标路径如果不存在,则会创建相应的完整路径
    目标路径如果不是一个文件,则必须使用/结束
    路径中可以使用通配符

  2. 读取URL远程资源

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all
  1. 切换GPU docker中 nvidia-smi可查看GPU属性
sudo docker run --gpus all nvidia/cuda:9.0-base nvidia-smi

至此,基本操作基本完成,有用都帮忙点个赞呗,写文档确实很耗时间,谢谢!

你可能感兴趣的:(ubuntu,yolov,系列,深度学习,docker,pytorch)