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或容器中的檔案變化會實時反映到另一方,因為二者用的是同一份檔案)。
使用資源對映的方法建立容器:
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”
配置環境
首先在容器中執行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
執行程式碼
執行“準備深度學習專案”中提到的測試程式碼,也許會遇到下圖中的報錯:
解決方法如下:
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
成功執行截圖:
執行結果會儲存到runs/detect/exp2這個目錄下,下面是模型的輸出:
匯出映象
下面介紹兩種匯出映象的方法。
將容器打包為映象
執行命令:
docker commit -m "some information" <容器ID> <image_name:version>
打包成功後,我們再介紹兩種方法分享映象。
(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
基於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