一、概述
由于GPU的资源比较昂贵,尤其在云端,为了充分利用GPU资源,考虑用GPU资源虚拟化。为了让YOLOv3 GPU版本能够在虚拟化环境运行,需要安装YOLOv3 GPU版本耐以运行的Docker环境。
二、安装YOLOv3 GPU环境到Docker
2.1、编写Dockerfile
#我这里从dockerhub选用cuda10.0,cudnn7.0,ubuntu16.04的镜像为基础镜像
FROM my-registry:5000/nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04
#加上国内源,提升下载速度,这里我不给出,你可以追加国内源,到docker ubuntu系统的/etc/apt/sources.list文件内。
#RUN cp /etc/apt/sources.list /etc/apt/sources.list.old
#ADD sources.list /etc/apt/sources.list
#必须先更新,方可进行后面的安装动作
RUN apt-get update
#安装必要的编译所需工具和其他基础软件
RUN apt-get install -y software-properties-common
RUN apt-get install -y build-essential
RUN apt-get install -y python3-pip
RUN pip3 install --upgrade pip
# 安装numpy opencv
RUN python3 -m pip install wheel
RUN apt-get install -y python3-scipy
RUN apt-get install -y python3-nose
RUN python3 -m pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN python3 -m pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN python3 -m pip install opencv-contrib-python -i
https://pypi.tuna.tsinghua.edu.cn/simple
RUN apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
RUN apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
#安装httpserver开发的tornado组件
RUN python3 -m pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple
二、制作YOLOv3 GPU虚拟运行环境
2.2 生成YOLOv3 GPU虚拟化环境,my-registry是我的局域网的私有仓库地址,你可以在本地搭建一个registry。
docker build -t my-registry:5000/gpu:lastest .
docker push my-registry:5000/gpu:lastest
2.3 验证环境可用性
docker run --rm -it gpu nvidia-smi
出现以下结果,表示GPU环境安装成功。
$ docker run --rm -it my-registry:5000/gpu:lastest nvidia-smi
Mon Nov 25 01:47:09 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.48 Driver Version: 410.48 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 2070 Off | 00000000:01:00.0 Off | N/A |
| 0% 30C P8 6W / 175W | 2638MiB / 7951MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
三、编译
3.1、下载YOLOv3源码(确保你的系统已经安装YOLOv3编译环境,cuda,cudnn,opencv,python都要安装)
我这里用的是AlexeyAB优化的YOLOv3版本,在下载的源码里面,编辑Makefile,并编译。
git clone https://github.com/AlexeyAB/darknet.git
3.2、准备OpenCV库
在Dockerfile目录下,创建lib文件,同时将你系统安装的lib库拷贝到Dockerfile所在目录的lib文件夹下。我的系统用的安装的是OpenCV4.1,安装路径在/usr/local目录下,对应的opencv lib库在/usr/local/lib目录下。所以我执行了命令,cp /usr/local/lib/* ./lib
3.3 编写运行darknet.py运行脚本
#!/bin/bash
python3 http_server.py 9898
3.4、编写http_server.py 用于http server测试的服务。
这里,略,我用的是tornado组件编写的http server。
3.5、 制作darkentDockerfile
FROM my-registry:5000/gpu:lastest
RUN mkdir -p /home/ellis/ai/darknet-master
ADD lib /usr/local/lib
ADD darknet-master /home/ellis/ai/darknet-master
ADD run-darknet.sh /home/ellis/ai/darknet-master
#指定python3环境
ENV PYTHONIOENCODING utf-8
WORKDIR /home/ellis/ai/darknet-master
ENTRYPOINT ["/bin/sh"]
CMD ["./run-darknet.sh"]
EXPOSE 9898
3.6、 制作生成镜像脚本
docker build -t my-registry:5000/darknet:runtime -f darknetDockerfile .
docker push my-registry:5000/darknet:runtime
四、制作集群环境
4.1、制作集群环境
这里集群环境服务编排,我采用docker swarm进行管理,并创建server。命令如下:
docker swarm init
docker service create \
--name darknet \
--publish 9898:9898 \
--replicas=3 \
my-registry:5000/darknet:runtime
4.2、查看service
查看结果replicas 3/3代表执行成功,这里我开了3个副本服务。
$:~/docker-darknet$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
at0fd73974s8 darknet replicated 3/3 my-registry:5000/darknet:runtime *:9898->9898/tcp
tl@SD02:~/docker-darknet$
4.3、利用http client测试。
略,可以借助jmeter 或者 Chrome的http插件进行测试。