搭建YOLO GPU版本虚拟运行环境

一、概述

由于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插件进行测试。

你可能感兴趣的:(微服,Spring,Cloud,AI)