部署云端Serving服务

总览

云端Serving 为「天枢平台」提供了 OneFlow,TensorFlow,Pytorch 三种框架下模型部署后的推理功能,需要与平台前端、后端搭配使用。其中共包含有两个服务:

  • 在线服务:用户可基于该模块部署模型,然后使用在线推理服务,得到 top5 推理结果。
  • 批量服务:该服务需要用户先上传大量图片,然后部署模型进行推理得出对应图片的 json 结果文件。

部署方式

提供三种部署方式供选择:

  • 基于服务器部署

  • 基于docker部署

  • 基于kubernetes部署

基于服务器部署

note

部署指南:

  • 环境准备
## Centos7
rm -rf /etc/yum.repos.d/nvidia-ml.repo && rm -rf /etc/yum.repos.d/cuda.repo && \
yum update -y && \
yum install -y wget && \
yum -y install openssl-devel && \
#安装python
wget https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tgz && \
tar -zxvf Python-3.6.11.tgz && rm -rf Python-3.6.11.tgz && \
cd Python-3.6.11 && ./configure prefix=/usr/local/python3 && \
make && make install && \
rm -rf /usr/local/Python-3.6.11 && \
rm -rf /usr/bin/python && \
rm -rf /usr/bin/python3 && \
rm -rf /usr/bin/python3.6 && \
rm -rf /usr/bin/pip && \
rm -rf /usr/bin/pip3 && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3 && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3.6 && \
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip && \
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 && \
pip install --upgrade pip && \
#安装深度框架
pip install tensorflow-gpu==2.1.0 -i https://pypi.douban.com/simple/ && \
python3 -m pip install --find-links https://oneflow-static.oss-cn-beijing.aliyuncs.com/staging/dev_serving/pip.index.html oneflow_cu102 && \
pip install torch==1.6.0 torchvision==0.7.0 && \
#安装serving需要的python第三方库
pip install fastapi && \
pip install python-multipart && \
pip install uvicorn && \
pip install numpy
## Ubuntu 16.04+
rm -rf /etc/apt/sources.list.d && apt update && apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
#安装python
wget https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tgz && \
tar -zxvf Python-3.6.11.tgz && \
rm -rf Python-3.6.11.tgz && \
cd Python-3.6.11 && ./configure prefix=/usr/local/python3 && \
make && make install && \
rm -rf /usr/local/Python-3.6.11 && \
rm -rf /usr/bin/python && \
rm -rf /usr/bin/python3 && \
rm -rf /usr/bin/python3.6 && \
rm -rf /usr/bin/pip && \
rm -rf /usr/bin/pip3 && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3 && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3.6 && \
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip && \
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 && \
pip install --upgrade pip && \
#安装深度框架
pip install tensorflow-gpu==2.1.0 -i https://pypi.douban.com/simple/ && \
python3 -m pip install --find-links https://oneflow-static.oss-cn-beijing.aliyuncs.com/staging/dev_serving/pip.index.html oneflow_cu102 && \
pip install torch==1.6.0 torchvision==0.7.0 && \
#安装serving需要的python第三方库
pip install fastapi && \
pip install python-multipart && \
pip install uvicorn && \
pip install numpy
  • 拉取 Dubhe git 仓库最新源码至 root 目录

  • 启动 http 在线服务

cd Dubhe/dubhe_serving
python http_server.py --platform='框架名称' --model_path='模型地址'

通过访问 ip:5000/docs 进入 swagger 页面,调用 ip:5000/inference 进行图片上传得道推理结果。

  • 启动 grpc 在线服务
cd Dubhe/dubhe_serving
python grpc_server.py --platform='框架名称' --model_path='模型地址'

再启动 grpc_client.py 进行上传图片推理得道结果,或者根据 ip 端口自行编写 grpc 客户端。

注:如需域名使用需要生成 TLS 证书

## 生成TLS证书
# 生产私钥
openssl genrsa -out server.key 2048
# 生产公钥,别的随便填,需要注意的是Common Name需要填写你自定义的域名
openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650
  • 多模型部署

支持多模型部署,可以自行配置 config 文件夹下的 model_config_file.json 进行多模型配置,启动 http 或 grpc 时输入不同的模型名称即可,或者自行修改 inference 接口入参来达到启动单一服务多模型推理的功能。

  • 启动批量服务
cd Dubhe/dubhe_serving
python batch_server.py --platform='框架名称' --model_path='模型地址' --input_path='批量图片地址' --output_path='输出JSON文件地址'
  • 批量服务支持分布式

需要开启 enable_distributed=True ,需要设置服务器环境变量 NODE_IPS="ip,ip,ip" ,可自行配置。

基于docker部署

note

部署指南:

  • 环境准备

在 docker 环境下,可直接使用下面的脚本另存为 DockerFile 文件,然后执行生成镜像即可

FROM nvidia/cuda:10.2-cudnn7-devel-centos7
#安装需要的依赖库
RUN rm -rf /etc/yum.repos.d/nvidia-ml.repo && rm -rf /etc/yum.repos.d/cuda.repo && \
yum update -y && \
yum install -y wget && \
yum -y install openssl-devel && \
#安装python
wget https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tgz && \
tar -zxvf Python-3.6.11.tgz && rm -rf Python-3.6.11.tgz && \
cd Python-3.6.11 && ./configure prefix=/usr/local/python3 && \
make && make install && \
rm -rf /usr/local/Python-3.6.11 && \
rm -rf /usr/bin/python && \
rm -rf /usr/bin/python3 && \
rm -rf /usr/bin/python3.6 && \
rm -rf /usr/bin/pip && \
rm -rf /usr/bin/pip3 && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3 && \
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3.6 && \
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip && \
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 && \
pip install --upgrade pip && \
#安装深度框架
pip install tensorflow-gpu==2.1.0 -i https://pypi.douban.com/simple/ && \
python3 -m pip install --find-links https://oneflow-static.oss-cn-beijing.aliyuncs.com/staging/dev_serving/pip.index.html oneflow_cu102 && \
pip install torch==1.6.0 torchvision==0.7.0 && \
#安装serving需要的python第三方库
pip install fastapi && \
pip install python-multipart && \
pip install uvicorn && \
pip install numpy
#docker build -t <your-harbor-url>/serving/serving-gpu:base .
# 根据宿主机的cuda版本拉取对应的cuda镜像
FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
# 删除nvidia更新源以避免apt update失败,安装python3-pip会同时安装python3
RUN rm -rf /etc/apt/sources.list.d && apt update && apt install -y python3-pip
# 建立python软连接到python3,以兼容使用python运行命令的情况
RUN ln -s /usr/bin/python3 /usr/bin/python
# 升级pip3以支持manylinux的方式安装wheel包
RUN pip3 install --upgrade pip && \
#安装深度框架
pip install tensorflow-gpu==2.1.0 -i https://pypi.douban.com/simple/ && \
python3 -m pip install --find-links https://oneflow-static.oss-cn-beijing.aliyuncs.com/staging/dev_serving/pip.index.html oneflow_cu102 && \
pip install torch==1.6.0 torchvision==0.7.0 && \
#安装serving需要的python第三方库
pip install fastapi && \
pip install python-multipart && \
pip install uvicorn && \
pip install numpy
#docker build -t harbor.dubhe.ai/serving/serving-gpu:base .
  • 启动服务

基本与服务器上启动一致,需要把模型与 serving 代码挂载到容器内并开启端口去运行。

docker run -id -p 5000:5000 -it --gpus all --privileged -v Dubhe/dubhe_serving:/usr/local/serving <your-harbor-url>/serving/serving-gpu:base /bin/bash

启动容器后进入容器运行对应的服务即可,如:

python /usr/local/serving/http_server.py --platform='框架名称' --model_path='模型地址'
python /usr/local/serving/grpc_server.py --platform='框架名称' --model_path='模型地址'
python /usr/local/serving/batch_server.py --platform='框架名称' --model_path='模型地址' --input_path='批量图片地址' --output_path='输出JSON文件地址'

基于kubernetes部署

note

部署指南:

  • 环境准备

在 docker 环境下,使用上述 DockerFile 文件生成镜像并推送到 harbor 中,在NFS下拉取 dubhe_serving 代码,放在 serving 目录下。把镜像地址及 serving 代码路径配置到天枢后台代码的配置文件中,后续将由天枢后端服务调用 k8s 启动该服务。如:

serving:
gpu-image: <your-harbor-url>/serving/serving-gpu:base
sourcePath: "/serving/dubhe_serving"
  • 启动服务

在天枢平台云端serving 模块中进行在线服务和批量服务创建即可。

Last updated on