Skip to main content

安装

依赖项

依赖版本备注
cuda>= 11.0- 与PyTorch依赖的cuda版本必须一致(便于torch.utils.cpp_extension即时编译代码)
- 不再对CUDA 10.2(不支持c++17)的兼容进行测试。
pytorch>= 1.10.2(cuda11)- 对于c++14/cuda-10.2/pytorch==1.10.2不再进行兼容测试,然而通过简单修改,您可能仍可运行。
opencv3.x, 4.x至少包含 core, imgproc,imgcodecs 和 highgui 四个模块
tensorrt>= 7.2
<= 9.3
- tensorrt 7.0 动态输入下存在内存泄漏
备注

以上依赖项均来源于默认存在的特定计算后端。构筑c++核心不依赖于以上任意一项。

使用NGC基础镜像

最简单的方式是可以选择NGC镜像进行源码编译(低版本驱动依靠 Forward Compatibility 或者 Minor Version Compatibility 依然可能跑起来官方镜像)。

  • 最低支持 nvcr.io/nvidia/pytorch:21.07-py3(从0.3.2rc3开始)
  • 最高支持 nvcr.io/nvidia/pytorch:23.08-py3
  • 测试版本 nvcr.io/nvidia/pytorch:22.12-py3

如果在docker容器内遇到编译或者运行问题,请提交issue。

首先,克隆代码:

git clone https://github.com/torchpipe/torchpipe.git
# git clone -b main https://github.com/torchpipe/torchpipe.git
cd torchpipe/ && git submodule update --init --recursive

然后,启动容器,如果您的机器支持更高版本镜像,可采用更新版本的Pytorch镜像

img_name=nvcr.io/nvidia/pytorch:23.05-py3 #  for tensort8.6.1, LayerNorm
# img_name=nvcr.io/nvidia/pytorch:22.12-py3 # For driver version lower than 510
docker run --rm --gpus=all --ipc=host --network=host -v `pwd`:/workspace --shm-size 1G --ulimit memlock=-1 --ulimit stack=67108864 --privileged=true -w/workspace -it $img_name /bin/bash
备注
  • 如果您使用的是Transformer-like的模型,强烈推荐使用Tensorrt >= 8.6.1(nvcr.io/nvidia/pytorch:23.05-py3)以便支持 opset 17 for LayerNormalization 和 opset 18 GroupNormalization, 以及对此类模型更深的支持。然而,其NGC镜像对显卡驱动版本有所要求. 可以使用下一节自定义镜像.

接着,可以编译源代码:

python setup.py install

然后,就可以跑所有示例代码了:

cd examples/resnet18 && python resnet18.py
# or
cd examples/yolox && python yolox.py
resnet18的并行推理

获取恰当的模型文件(目前支持 onnx, trt engine等).

import torchvision.models as models
resnet18 = models.resnet18(pretrained=True).eval().cuda()

import tempfile, os, torch
model_path = os.path.join(tempfile.gettempdir(), "./resnet18.onnx")
resnet18 = models.resnet18(pretrained=True).eval().cuda()
data_bchw = torch.rand((1, 3, 224, 224)).cuda()
print("export: ", model_path)
torch.onnx.export(resnet18, data_bchw, model_path,
opset_version=17,
do_constant_folding=True,
input_names=["in"], output_names=["out"],dynamic_axes={"in": {0: "x"},"out": {0: "x"}})

# os.system(f"onnxsim {model_path} {model_path}")

现在你可以并发调用单模型了。

import torch, torchpipe
model = torchpipe.pipe({'model': model_path,
'backend': "Sequential[CvtColorTensor,TensorrtTensor,SyncTensor]", # 后端引擎, 可见overview章节的解释。
'instance_num': 2, 'batching_timeout': '5', # 实例数和超时时间
'max': 4, # 模型优化范围最大值,也可以为 '4x3x224x224'
'mean': '123.675, 116.28, 103.53',#255*"0.485, 0.456, 0.406",
'std': '58.395, 57.120, 57.375', # 将融合进tensorrt网络中
'color': 'rgb'}) # cvtColorTensor后端的参数: 目标颜色空间顺序
data = torch.zeros((1, 3, 224, 224)) # or torch.from_numpy(...)
input = {"data": data, 'color': 'bgr'}
model(input) # 可并发调用
# 使用 "result" 作为数据输出标识;当然,其他键值也可自定义写入
print(input["result"].shape) # 失败则此键值一定不存在,即使输入时已经存在。

更多示例,参见案例展示.

自定义dockerfile

 
docker build --network=host -f ./docker/Dockerfile -t torchpipe thirdparty/

docker run --rm --network=host --gpus=all --ulimit memlock=-1 --ulimit stack=67108864 --privileged=true -v `pwd`:/workspace -it torchpipe:latest /bin/bash

cd /workspace/ && python setup.py install

cd examples/resnet18 && python resnet18.py

这种方式编译出的基础镜像比NGC pytorch镜像体积更小. 需要注意,其_GLIBCXX_USE_CXX11_ABI==0

说明

编译选项

选项默认值说明
DEBUG0是否编译为调试模式
WITH_CVCUDA0是否编译依赖CVCUDA的c++后端(version>=0.4.0)
BUILD_PPLCV0是否编译依赖ppl.cv的c++后端 (version>=0.3.3b2)
IPIPE_KEY(optinal)str(length>=8),使用加解密功能时,需要设置此密钥

ABI

编译代码和依赖库的编译器需要与安装的PyTorch所使用的编译器ABI相容(ABI-compatible)。 在pytorch中,可通过如下方式查看:

python -c "import torch; print(torch._C._GLIBCXX_USE_CXX11_ABI)"
安装源_GLIBCXX_USE_CXX11_ABI
PyPI-PyTorch0
NGC-PyTorch1
libtorch1

编译集成第三方库(以ubuntu-opencv为例)

默认使用 apt-get install libopencv-dev 安装的opencv 满足_GLIBCXX_USE_CXX11_ABI=1, 其与 pypi 上的pytorch不能一起使用。通过对cmake添加-D_GLIBCXX_USE_CXX11_ABI=0 配置,可编译pypi相容的opencv.

编译指令
wget https://codeload.github.com/opencv/opencv/zip/refs/tags/4.5.4 -O opencv-4.5.4.zip

unzip opencv-4.5.4.zip && pip3 install cmake

cd opencv-4.5.4/ && \
sed -i '1a add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)' CMakeLists.txt && \
mkdir build && cd build && \
cmake -D CMAKE_BUILD_TYPE=Release \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D CMAKE_INSTALL_PREFIX=/usr/local/ \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-DENABLE_NEON=OFF \
-D WITH_TBB=ON \
-DBUILD_TBB=ON \
-DBUILD_WEBP=OFF \
-D BUILD_ITT=OFF -D WITH_IPP=ON \
-D WITH_V4L=OFF \
-D WITH_QT=OFF \
-D WITH_OPENGL=OFF \
-D BUILD_opencv_dnn=OFF \
-DBUILD_opencv_java=OFF \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_PYTHON_SUPPORT=ON \
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \
-DBUILD_opencv_java_bindings_generator=OFF \
-DBUILD_opencv_python_bindings_generator=ON \
-D BUILD_EXAMPLES=OFF \
-D WITH_OPENEXR=OFF \
-DWITH_JPEG=ON \
-DBUILD_JPEG=ON\
-D BUILD_JPEG_TURBO_DISABLE=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_calib3d=OFF \
-D BUILD_opencv_contrib=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_opencv_flann=OFF \
-DBUILD_opencv_gapi=OFF \
-D WITH_CUDA=OFF \
-D WITH_CUDNN=OFF \
-D OPENCV_DNN_CUDA=OFF \
-D ENABLE_FAST_MATH=1 \
-D WITH_CUBLAS=0 \
-D BUILD_opencv_gpu=OFF \
-D BUILD_opencv_ml=OFF \
-D BUILD_opencv_nonfree=OFF \
-D BUILD_opencv_objdetect=OFF \
-D BUILD_opencv_photo=OFF \
-D BUILD_opencv_stitching=OFF \
-D BUILD_opencv_superres=OFF \
-D BUILD_opencv_ts=OFF \
-D BUILD_opencv_video=OFF \
-D BUILD_videoio_plugins=OFF \
-D BUILD_opencv_videostab=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_opencv_calib3d=OFF \
-DBUILD_opencv_features2d=OFF\
-DBUILD_opencv_flann=OFF\
-DBUILD_opencv_ml=OFF\
-DBUILD_opencv_videoio=OFF\
.. && make -j4 && make install