Docker部署深度學習模型

ZeroZeroSeven發表於2024-06-05

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 <container_name_or_id> /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

相關文章