Skip to content

DeepVAC/libdeepvac

Repository files navigation

libdeepvac

Use PyTorch model in C++ project.

这个项目定义了如何在C++项目中使用PyTorch训练的模型。

简介

在MLab(云上炼丹师)实验室,我们使用DeepVAC 来训练获得新模型,使用本项目来部署模型。

libdeepvac作为一个Linux库,在以下四个方面发挥了价值:

  • 向下封装了推理引擎,目前封装了LibTorch,即将封装TensorRT、NCNN、TNN;
  • 向上提供Deepvac类,方便用户继承并实现其自定义的模型;
  • 在modules目录下,MLab提供了经典网络的C++实现;
  • 在utils目录下,MLab提供了网络中常见helper函数的C++实现。

libdeepvac实现的模块

SOTA网络的C++实现

类名 网络 作用
SyszuxFaceRetina RetinaNet 人脸检测
SyszuxOcrPse PSENet 文字检测
SyszuxOcrDB DB Net 文字检测
SyszuxSegEsp ESPNetV2 语义分割
SyszuxClsMobile MobileNetV3 分类
SyszuxDetectYolo YOLOV5 目标检测
SyszuxClsResnet ResNet50 分类

helper函数实现

类名/函数名 作用
AlignFace 人脸对齐
nms 检测框的非极大值抑制
PriorBox 生成目标检测的候选框

未来我们会持续在modules、utils目录下提供SOTA网络的C++实现。如果用户(你)需要什么网络的C++实现,可在issues里提交申请。

编译平台的支持

libdeepvac支持在以下平台上进行编译:

  • x86_64 GNU/Linux(或者叫 AMD64 GNU/Linux)
  • aarch64 GNU/Linux(或者叫 ARM64 GNU/Linux)
  • macOS

未来不太可能扩展到其它平台。

编译目标的支持

libdeepvac支持以下目标平台的编译:

  • x86_64 GNU/Linux(或者叫 AMD64 GNU/Linux)
  • x86_64 GNU/Linux with CUDA(或者叫 AMD64 GNU/Linux with CUDA)
  • aarch64 GNU/Linux(或者叫 ARM64 GNU/Linux)
  • Android
  • iOS
  • Nvidia Jetson Xavier NX(Volta,384 CUDA cores, 48 Tensor cores, 6-core, 8GB)
  • Nvidia Jetson AGX Xavier (Volta, 512 CUDA cores, 6-core, 32GB )
  • Nvidia Jetson TX2 (Pascal, 256 CUDA cores, 2-core/4-core, 8GB)
  • Nvidia Jetson TX2 NX (Pascal, 256 CUDA cores, 2-core/4-core, 4GB)

项目依赖

libdeepvac的编译依赖C++14编译器、CMake、opencv、LibTorch。
最简便、高效的方式就是使用我们提供的MLab HomePod。使用MLab HomePod也是我们推荐的方式。

如何编译libdeepvac

libdeepvac基于CMake进行构建。

编译开关

如果要开始编译libdeepvac,需要先熟悉如下几个CMake选项的作用:

CMake选项 默认值 常用值 作用 备注
BUILD_STATIC ON ON/OFF ON:编译静态libdeepvac
OFF: 编译动态libdeepvac
OFF时,链接OpenCV静态库会带来hidden symbol问题,此时需链接OpenCV动态库
USE_STATIC_LIBTORCH OFF ON/OFF ON: 使用libtorch静态库
OFF: 使用libtorch动态库
MLab HomePod中内置有libtorch动态库
USE_MKL OFF ON/OFF 是否使用Intel MKL作为LAPACK/BLAS实现 OFF的时候,需要使用SYSTEM_LAPACK_LIBRARIES指定另外的LAPACK/BLAS实现,比如openblas、Eigen等
SYSTEM_LAPACK_LIBRARIES "" "-lblas -llapack" USE_MKL关闭后需要指定的LAPACK/BLAS库 在系统路径下安装有相应的开发环境
USE_CUDA OFF ON/OFF 是否使用CUDA 需要CUDA硬件,且系统中已经安装有CUDA ToolKit的开发时
USE_TENSORRT OFF ON/OFF 是否使用TensorRT 需要CUDA硬件,且系统中已经安装有TensorRT的开发时
USE_NUMA OFF ON/OFF 是否链接-lnuma库 NA
USE_LOADER OFF ON/OFF 是否使用图片装载器 需要C++17编译器
GARRULOUS_GEMFIELD OFF ON/OFF 是否打开调试log NA
BUILD_ALL_EXAMPLES OFF ON/OFF 是否编译所有的examples NA

下载依赖

如果你使用的是MLab HomePod 2.0 pro(或者以上版本),则忽略此小节
如果你使用的是自定义环境,那么你至少需要下载opencv库、libtorch库:

你亦可以在MLab HomePod 2.0 pro上自行从源码编译上述的依赖库。

CMake命令

以下命令所使用路径均基于MLab HomePod 2.0 pro(你可以根据自身环境自行更改)。

预备工作

# update to latest libdeepvac
gemfield@homepod2:/opt/gemfield/libdeepvac$ git pull --rebase
# create build directory
gemfield@homepod2:/opt/gemfield/libdeepvac$ mkdir build
gemfield@homepod2:/opt/gemfield/libdeepvac$ cd build

CMake

libdeepvac内置了诸多cmake开关以支持不同的软硬件开发栈:

  • 在X86_64 GPU服务器上,使用CUDA,使用libtorch静态库,且用MKL作为BLAS/LAPACK库 (MLab HomePod 2.0 pro支持):
cmake -DUSE_MKL=ON -DUSE_CUDA=ON -DUSE_STATIC_LIBTORCH=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/opt/gemfield/libtorch;/opt/gemfield/opencv4deepvac/" -DCMAKE_INSTALL_PREFIX=../install ..
  • 在X86_64 GPU服务器上,使用CUDA,使用libtorch动态库,且用MKL作为BLAS/LAPACK库 (MLab HomePod 2.0 pro支持):
cmake -DUSE_MKL=ON -DUSE_CUDA=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/opt/gemfield/opencv4deepvac;/opt/conda/lib/python3.8/site-packages/torch/" -DCMAKE_INSTALL_PREFIX=../install ..
  • 在X86_64 GPU服务器上,使用TensorRT和libtorch静态库,且用MKL作为BLAS/LAPACK库:
cmake -DUSE_MKL=ON -DUSE_CUDA=ON -DUSE_MAGMA=ON -DUSE_STATIC_LIBTORCH=ON -DUSE_TENSORRT=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/opt/gemfield/opencv4deepvac/;/opt/gemfield/libtorch" -DCMAKE_INSTALL_PREFIX=../install ..
  • 在Nvidia Jetson Xavier NX上,使用TensorRT,且用系统的blas和lapack库:
cmake -DUSE_CUDA=ON -DUSE_NUMA=ON -DUSE_TENSORRT=ON -DSYSTEM_LAPACK_LIBRARIES="-lblas -llapack" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/opt/gemfield/opencv4deepvac/;/opt/gemfield/libtorch" -DCMAKE_INSTALL_PREFIX=../install ..

编译

cmake --build . --config Release
make install

如何使用libdeepvac库

如何在自己的项目中使用libdeepvac预编译库呢?

1. 添加find_package(Deepvac REQUIRED)

在自己项目的CMakeLists.txt中,添加

find_package(Deepvac REQUIRED)

当然,基于libdeepvac的项目也必然基于opencv和libtorch,因此,下面两个find_package也是必须的:

find_package(Torch REQUIRED)
find_package(OpenCV REQUIRED)

2. 使用libdeepvac提供的头文件cmake变量

在自己项目的CMakeLists.txt中,你可以使用如下cmake变量:

  • DEEPVAC_INCLUDE_DIRS:libdeepvac库的头文件目录;
  • DEEPVAC_LIBTORCH_INCLUDE_DIRS:libtorch库的头文件目录;
  • DEEPVAC_TENSORRT_INCLUDE_DIRS:TensorRT库的头文件目录;
  • DEEPVAC_CV_INCLUDE_DIRS:OpenCV库的头文件目录;

3. 使用libdeepvac提供的库文件cmake变量

  • DEEPVAC_LIBRARIES:libdeepvac库;
  • DEEPVAC_LIBTORCH_CPU_LIBRARIES:libtorch cpu版库;
  • DEEPVAC_LIBTORCH_CUDA_LIBRARIES:libtorch cuda版库;
  • DEEPVAC_LIBTORCH_DEFAULT_LIBRARIES:libtorch默认版库(编译时用的cpu还是cuda);
  • DEEPVAC_LIBCUDA_LIBRARIES:Nvidia cuda runtime库;
  • DEEPVAC_TENSORRT_LIBRARIES:Nvidia TensorRT runtime库;
  • DEEPVAC_CV_LIBRARIES:OpenCV库;

使用举例:

#头文件
target_include_directories(${your_target} "${DEEPVAC_LIBTORCH_INCLUDE_DIRS};${DEEPVAC_TENSORRT_INCLUDE_DIRS};${CMAKE_CURRENT_SOURCE_DIR}/include>")

#库文件
target_link_libraries( ${your_target} ${DEEPVAC_LIBRARIES} ${DEEPVAC_LIBTORCH_CUDA_LIBRARIES} ${DEEPVAC_LIBCUDA_LIBRARIES} ${DEEPVAC_CV_LIBRARIES})

Benchmark

libdeepvac会提供不同目标平台及不同推理引擎的benchmark,当前仅支持libtorch推理引擎。

1. X86-64 Linux + LibTorch的benchmark步骤

# 如果是MLab HomePod 2.0 标准版
git clone https://github.com/DeepVAC/libdeepvac && cd libdeepvac

# 如果是MLab HomePod 2.0 pro版
cd /opt/gemfield/libdeepvac && git pull --rebase
  • 编译
#新建编译目录
mkdir build
cd build
#cmake(如果基于LibTorch动态库)
cmake -DGARRULOUS_GEMFIELD=ON -DUSE_MKL=ON -DUSE_CUDA=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/opt/gemfield/opencv4deepvac/;/opt/conda/lib/python3.8/site-packages/torch/" -DCMAKE_INSTALL_PREFIX=../install ..
#cmake(如果基于LibTorch静态库)
cmake -DGARRULOUS_GEMFIELD=ON -DUSE_MKL=ON -DUSE_CUDA=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/opt/gemfield/opencv4deepvac/;/opt/gemfield/libtorch/" -DCMAKE_INSTALL_PREFIX=../install ..
#编译
make -j4
  • 运行benchmark
./bin/test_resnet_benchmark cuda:0 <your_torch_script.pt> <a_imagenet_test.jpg>

2. NA

演示

SYSZUX-FACE基于本项目实现了人脸检测功能。