这是一个易于使用的面向DL模型的Web服务器,致力于充分发挥单机的cpu和gpu性能。整个服务器的架构大致可以分成三层,最底层的DL模型开发依赖于 tensorflow/pytorch
框架,中间的DL模型推理引擎主要依赖 MNN 它具有高性能、易于适配多种计算后端的优势,上层的DL模型网络服务依赖高性能C++服务器引擎 workflow 来完成.
欢迎你反馈任何你发现的bug,本人还是一个c with struct 弱鸡 🙃
模型文件可以访问我的 Hugging Face Page
整个项目的简要架构图如下
欢迎你提出改进意见或者pr来帮助我把它建设的更好 😄🔥
在开始使用本项目之前,有如下的准备工作需要完成,以确保项目可以正常运行
1. 确保 CUDA&GPU&Driver 正确安装,否则只能使用cpu做服务器的计算后端,一些复杂模型cpu计算耗时非常久,不推荐使用cpu作为计算后端. 你可以参考 nvidia文档 来正确安装。
2. 确保 MNN 已正常安装. 同样可以参考他们的 官方安装文档. 推荐在本项目中使用 MNN-2.7.0
3. 确保 WORKFLOW 正确安装. 可以参考 官方安装文档
4. 确保 OPENCV 正确安装. 可以参考 官方安装文档
5. 确保你的开发环境中的 GCC 编译工具链支持 CPP17
6. Segment-Anything 目前需要使用到 ONNXRUNTIME 和 TensorRT 库. 可以参考 官方安装文档 安装onnxruntime>=1.16.0, 官方安装文档 安装TensorRT-8.6.1.6
准备工作都完成之后可以愉快的安装本项目了 🍵
Step 1: 准备一些第三方库的头文件和库文件
拷贝MNN
的头文件和库文件到 ./3rd_party/include
和 ./3rd_party/libs
文件夹, $PROJECT_ROOT_DIR
在该文档中代表此项目的根目录,MNN_ROOT_DIR
代表 MNN
项目在你机器的根目录
cd $PROJECT_ROOT_DIR
cp -r $MNN_ROOT_DIR/include/MNN ./3rd_party/include
cp $MNN_ROOT_DIR/build/libMNN.so ./3rd_party/libs
cp $MNN_ROOT_DIR/build/source/backend/cuda/libMNN_Cuda_Main.so ./3rd_party/libs
同样的方式拷贝WORKFLOW
的头文件和库文件, WORKFLOW_ROOT_DIR
代表 WORKFLOW
项目在你机器的根目录
cp -r $WORKFLOW_ROOT_DIR/_include/workflow ./3rd_party/include
cp -r $WORKFLOW_ROOT_DIR/_lib/libworkflow.so* ./3rd_party/libs
同样的方式拷贝ONNXRUNTIME
的头文件和库文件, ONNXRUNTIME_ROOT_DIR
代表 ONNXRUNTIME
项目在你机器的根目录
cp -r $ONNXRUNTIME_ROOT_DIR/include/* ./3rd_party/include/onnxruntime
cp -r $ONNXRUNTIME_ROOT_DIR/_lib/libonnxruntime*.so* ./3rd_party/libs
同样的方式拷贝TensorRT
的头文件和库文件, TENSORRT_ROOT_DIR
代表 TensorRT
项目在你机器的根目录
cp -r $TENSORRT_ROOT_DIR/include/* ./3rd_party/include/TensorRT-8.6.1.6
cp -r $TENSORRT_ROOT_DIR/_lib/libnvinfer.so* ./3rd_party/libs
cp -r $TENSORRT_ROOT_DIR/_lib/libnvinfer_builder_resource.so.8.6.1 ./3rd_party/libs
cp -r $TENSORRT_ROOT_DIR/_lib/libnvinfer_plugin.so* ./3rd_party/libs
cp -r $TENSORRT_ROOT_DIR/_lib/libnvonnxparser.so* ./3rd_party/libs
Step 2: 开始编译本项目 ☕☕☕
mkdir build && cd build
cmake ..
make -j10
Step 3: 下载项目提供的一些预训练模型 🍵🍵🍵
可以通过 百度网盘 下载预训练模型,提取码为 1y98
. 在项目根目录新建 weights
文件夹并将刚下载的预训练模型解压在该目录中。完成后的文件夹结构应该如图所示。
Step 4: 测试 MobileNetv2 基准测试工具
至此你已经完成的项目的编译工作,可以开始测试体验项目提供的预训练模型了。所有的模型基准测试工具都被编译产出在 $PROJECT_ROOT_DIR/_bin
文件夹中且都被命名为 xxx_benchmark.out
现在你可以通过如下方式来愉快的进行 mobilenetv2
图像分类基准测试
cd $PROJECT_ROOT_DIR/_bin
./mobilenetv2_benchmark.out ../conf/model/classification/mobilenetv2/mobilenetv2_config.ini
如果没有任何错误的话(应该不会有:dog:),你可以看到如下的测试结果,包含使用的模型,模型预测耗时、fps等信息
Step 5: 运行 MobileNetV2 图像分类服务器
有关网络服务器的一些细节参数可以查看 网络服务器配置说明。下面让我们愉快的开启服务
cd $PROJECT_ROOT_DIR/_bin
./mobilenetv2_classification_server.out ../conf/server/classification/mobilenetv2/mobilenetv2_server_config.ini
按照默认的配置文件,服务端口为8091
,有四个模型worker等待被调用。项目中含有一个简单的python客户端来测试该服务,使用方法如下
cd $PROJECT_ROOT_DIR/scripts
export PYTHONPATH=$PWD:$PYTHONPATH
python server/test_server.py --server mobilenetv2 --mode single
该客户端会重复向服务端发送 demo images 1000 次. 服务端应该输出如下,包含任务的 id
、提交时间
、完成时间
等信息
客户端得到的返回信息如下,包含图像的类别id和相应的置信度得分
你可以在下文的 模型说明 章节获取更多的服务示例 👇👇👇
基准测试环境如下:
OS: Ubuntu 20.04.5 LTS / 5.15.0-87-generic
MEMORY: 32G DIMM DDR4 Synchronous 2666 MHz
CPU: Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz
GCC: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
GPU: GeForce RTX 3080
CUDA: CUDA Version: 11.5
GPU Driver: Driver Version: 495.29.05
所有模型的测试过程都重复推理若干次以抵消GPU的warmup损耗,并且没有任何的io时间被算入
- 快速添加新的DL模型 🔥🔥
- 快速添加新的DL服务 🔥🔥
模型 | BenchMark |
图像分类图像增强低光照补偿图像去雨滴图像特征点检测图像Matting图像目标检测图像OCR图像分割 |
- 增加更多的DL模型
- 创建docker环境
mortred_model_server 项目参考、借鉴了以下项目: