• Docker部署深度学习模型


    Docker部署深度学习模型

    基础概念

    • Docker

      Docker是一个打包、分发和运行应用程序的平台,允许将你的应用程序和应用程序所依赖的整个环境打包在一起。比如我有一个目标检测的项目,我想分享给朋友,那么他首先需要在自己的电脑上配置好显卡驱动、CUDA、CuDNN,在拿到我的项目后,还需要安装各种依赖库,最后代码还不一定跑起来。如果我是用了docker环境进行项目配置,我只需要将环境打包好后分享给朋友。他只需要安装好显卡驱动就行,什么cuda、pytorch之类的都在我分享的环境了。

    • 镜像

      Docker镜像里包含了你打包的应用程序及其所依赖的环境。包含应用程序可用的文件系统和其他元数据。

    • 容器

      Docker容器通常是一个Linux容器,基于Docker镜像被创建,一个运行中的容器是一个运行在Docker主机上的进程,但和主机及所有在主机上的其他进程是隔离的。其资源是受限的,只能访问和使用分配的资源(CPU、内存)。

    拉取镜像

    ​ 在Windows上安装Docker Desktop就不过多赘述了。

    ​ 先拉取一个pytorch镜像(结合自己电脑的显卡版本挑选适合的镜像版本):

    docker pull anibali/pytorch:1.13.0-cuda11.8-ubuntu22.04	
    

    准备深度学习项目

    ​ 我们拿yolov5举例。

    ​ 在Windwos上下载好yolov5项目代码,同时下载检查点模型。

    ​ 准备好测试代码:

    import torch
    
    # Model
    model = torch.hub.load('.', 'custom', path='yolov5l.pt',source='local')
    
    # Images
    img = "./pic/gyt.jpg"  # or file, Path, PIL, OpenCV, numpy, list
    
    # Inference
    results = model(img)
    
    # Results
    results.save()  # or .show(), .save(), .crop(), .pandas(), etc.
    

    创建容器

    ​ 镜像我们有了,现在我们可以创建容器了。同时我们需要将深度学习项目资源拷贝到容器中,下面有两种方法。

    直接拷贝

    ​ 创建容器的命令是:

    docker run -it --gpus all --name container1 anibali/pytorch:1.13.0-cuda11.8-ubuntu22.04 /bin/bash
    

    ​ 在这个命令中,run是创建容器的指令,-it是交互式终端,因为创建的容器就相当于一个本机中的linux服务器,我们可以通过终端与容器交互。–gpus all这个就是使用本机的gpu,–name是给新建容器取个名字, anibali/pytorch:1.13.0-cuda11.8-ubuntu22.04就是要使用的镜像,/bin/bash是指定bash。

    ​ 当容器创建好后,将Windows的深度学习项目文件直接拷贝到容器中:

    # 启动容器,配置或确认文件接收路径
    docker ps -a
    docker start 容器ID或容器名
    docker exec -it 容器ID或容器名 bashmkdir demo
    
    # 关闭容器
    docker stop 容器ID或容器名
    
    # 执行拷贝
    docker cp D:\FileNeedUploadToDocker.txt 容器ID或容器名:/opt/demo
    docker start 容器ID或容器名
    docker exec -it 容器ID或容器名 bash
    cd opt/demo/dir
    

    资源映射

    ​ 与直接拷贝不同的是,用资源映射既可以节省存储资源,又更加灵活方便(Windows或容器中的文件变化会实时反映到另一方,因为二者用的是同一份文件)。

    image

    ​ 使用资源映射的方法创建容器:

    docker run -it -v F:\Desktop\yolov5-master:/app/yolov5 --gpus all --name container1 anibali/pytorch:1.13.0-cuda11.8-ubuntu22.04 /bin/bash
    

    进入容器

    ​ 下面介绍两种进入容器的方法。

    ​ (1)使用命令行进入:

    docker exec -it  /bin/bash
    

    ​ (2)使用Docker Desktop的GUI进入:

    右键点击你想要进入的容器,选择“Open in PowerShell”
    

    配置环境

    image

    ​ 首先在容器中运行nvidia-smi命令,检查容器的显卡是否可用。若出现上图的情况,则表示成功。

    ​ 创建conda环境:

    conda create -n yolo python=3.8
    

    ​ 安装pytorch:

    pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu118
    

    ​ 安装其他库:

    pip install -r requirements.txt
    

    image

    运行代码

    ​ 运行“准备深度学习项目”中提到的测试代码,也许会遇到下图中的报错:

    image

    ​ 解决方法如下:

    apt update
    apt install libgl1-mesa-glx
    pip uninstall opencv-python -y
    pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    ​ 成功运行截图:

    image

    ​ 运行结果会保存到runs/detect/exp2这个目录下,下面是模型的输出:

    image

    image

    导出镜像

    ​ 下面介绍两种导出镜像的方法。

    将容器打包为镜像

    ​ 运行命令:

    docker commit -m "some information" <容器ID> <image_name:version>
    

    image

    ​ 打包成功后,我们再介绍两种方法分享镜像。

    ​ (1)将镜像导出为tar分享给他人

    docker save image_naem:version -o output_name.tar
    

    ​ (2)将镜像推送到云仓库

    docker tag new_image:version username/new_image:version
    docker push username/pt_test_image:0
    

    image

    基于Dockerfile构建镜像

    ​ 在Windows中的深度学习项目文件夹下运行命令:

    docker build -t myapp .
    

    ​ -t参数用于指定镜像的名称,.表示使用当前文件夹中的Dockerfile。

    ​ 下面看一下yolov5提供的Dockerfile文件:

    # Start FROM PyTorch image https://hub.docker.com/r/pytorch/pytorch
    FROM pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime
    
    # Downloads to user config dir
    ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/
    
    # Install linux packages
    ENV DEBIAN_FRONTEND noninteractive
    RUN apt update
    RUN TZ=Etc/UTC apt install -y tzdata
    RUN apt install --no-install-recommends -y gcc git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg
    # RUN alias python=python3
    
    # Security updates
    # https://security.snyk.io/vuln/SNYK-UBUNTU1804-OPENSSL-3314796
    RUN apt upgrade --no-install-recommends -y openssl
    
    # Create working directory
    RUN rm -rf /usr/src/app && mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    # Copy contents
    COPY . /usr/src/app
    
    # Install pip packages
    COPY requirements.txt .
    RUN python3 -m pip install --upgrade pip wheel
    RUN pip install --no-cache -r requirements.txt albumentations comet gsutil notebook \
        coremltools onnx onnx-simplifier onnxruntime 'openvino-dev>=2023.0'
        # tensorflow tensorflowjs \
    
    # Set environment variables
    ENV OMP_NUM_THREADS=1
    
    # Cleanup
    ENV DEBIAN_FRONTEND teletype
    

    本文作者:ZeroZeroSeven

    本文链接:https://www.cnblogs.com/ggyt/p/18232868

    版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    朋友圈社区程序源码分享
    Linux部署代码的大致流程
    【回眸】英飞凌TC397测试Jupiter源代码
    基于寄生捕食算法优化概率神经网络PNN的分类预测 - 附代码
    Golang 中的 Context 包
    今天学习了excel的公式和函数,常用的还没学完,先做好笔记,都是比较常用的东西,对未来分析数据很有用,明天继续加油
    大三Web课程设计——悬崖上的波妞(4页) HTML+CSS(可以很好的应付老师的作业)
    Spring Security 用了那么久,你对它有整体把控吗?
    paddle2.3和torch1.8在SentenceBert上的性能对比
    单片机电子元器件-按键
  • 原文地址:https://www.cnblogs.com/ggyt/p/18232868