Skip to content

Latest commit

 

History

History
executable file
·
265 lines (199 loc) · 10.4 KB

File metadata and controls

executable file
·
265 lines (199 loc) · 10.4 KB
id title type
installation
安装
explainer

安装

依赖项

依赖 版本 备注
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不再进行兼容测试,然而通过简单修改,您可能仍可运行。
opencv 3.x, 4.x 至少包含 core, imgproc,imgcodecs 和 highgui 四个模块
tensorrt >= 7.2
<= 9.3
- tensorrt 7.0 动态输入下存在内存泄漏

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

使用NGC基础镜像 {#NGC}

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

  • 最低支持 nvcr.io/nvidia/pytorch:21.11-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

:::note

  • 如果您使用的是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
pip install -e .
python setup.py bdist_wheel
# 生成的.whl文件可以在同镜像的不同容器中使用:
pip install --upgrade dist/*.whl

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

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 {#selfdocker}

 
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

说明

编译选项 {#compilation-options}

选项 默认值 说明
DEBUG 0 是否编译为调试模式
WITH_CVCUDA 0 是否编译依赖CVCUDA的c++后端(version>=0.4.0)
BUILD_PPLCV 0 是否编译依赖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-PyTorch 0
NGC-PyTorch 1
libtorch 1

编译集成第三方库(以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

import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';