英伟达TRTTorch

PyTorch JIT的提前(AOT)编译Ahead of Time (AOT) compiling for PyTorch JIT

TRTorch是PyTorch / TorchScript的编译器,通过NVIDIA针对NVIDIA GPU的TensorRT深度学习优化器和运行时runtime。与PyTorch的即时(JIT)编译器不同,TRTorch是一种提前(AOT)编译器,这意味着在部署TorchScript代码之前,需要执行显式的编译步骤,以TensorRT引擎为目标,将标准的TorchScript程序转换为模块。TRTorch充当PyTorch扩展,编译与JIT运行时runtime无缝集成的模块。使用优化图进行编译后,应该感觉与运行TorchScript模块没有什么不同。还可以在编译时访问TensorRT的配置套件,因此可以为模块指定算子精度(FP32 / FP16 / INT8)和其他设置。

用法示例

C ++

#include "torch/script.h"

#include "trtorch/trtorch.h"

...

auto compile_settings = trtorch::CompileSpec(dims);

// FP16 execution

compile_settings.op_precision = torch::kFloat;

// Compile module

auto trt_mod = trtorch::CompileGraph(ts_mod, compile_settings);

// Run like normal

auto results = trt_mod.forward({in_tensor});

// Save module for later

trt_mod.save("trt_torchscript_module.ts");

...

python

import trtorch

...

compile_settings = {

"input_shapes": [

{

"min": [1, 3, 224, 224],

"opt": [1, 3, 512, 512],

"max": [1, 3, 1024, 1024]

}, # For static size [1, 3, 224, 224]

],

"op_precision": torch.half # Run with FP16

}

trt_ts_module = trtorch.compile(torch_script_module, compile_settings)

input_data = input_data.half()

result = trt_ts_module(input_data)

torch.jit.save(trt_ts_module, "trt_torchscript_module.ts")

以较低的精度运行时runtime的注意事项:

  • 使用compile_spec.op_precision设置精度
  • 编译之前,模块应使用FP32(FP16可支持半张量模型)
  • 在FP16中,仅应将输入张量转换为FP16,其他精度使用FP32

平台支援

依存关系

这些是以下用于验证测试用例的依赖项。TRTorch可以与其他版本一起使用,但不能保证测试能够通过。

  • Bazel 3.7.0
  • Libtorch 1.7.1(使用CUDA 11.0构建)
  • CUDA 11.0
  • cuDNN 8
  • TensorRT 7.2.1.6

预构建的二进制文件和Wheel文件

发布:https : //github.com/NVIDIA/TRTorch/releases

编译TRTorch

安装依赖项

0.安装Install Bazel

如果没有安装bazel,最简单的方法是使用选择https://github.com/bazelbuild/bazelisk的方法来安装bazelisk

否则,可以按照以下说明安装二进制文件https://docs.bazel.build/versions/master/install.html

最后,如果需要从源代码进行编译(例如aarch64,直到bazel为该体系结构分发二进制文件),则可以使用以下说明

export BAZEL_VERSION=<VERSION>

mkdir bazel

cd bazel

curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip

unzip bazel-$BAZEL_VERSION-dist.zip

bash ./compile.sh

需要先在系统上安装CUDA,LibTorch会自动被bazel提起,然后有两个选择。

1.使用cuDNN和TensorRT tarball发行版进行构建

推荐这样做是为了构建TRTorch,并确保任何错误不是由版本问题引起的

确保在运行TRTorch时,这些版本的库在$LD_LIBRARY_PATH的文件中具有优先权

  1. 需要从NVIDIA网站下载TensorRT和cuDNN的压缩包。
  2. 将这些文件放在目录中(third_party/dist_dir/[x86_64-linux-gnu | aarch64-linux-gnu]为此目的而存在目录)
  3. 编译使用:
bazel build // :: libtrtorch --compilation_mode opt --distdir third_party / dist_dir / [x86_64-linux-gnu | aarch64-linux-gnu]

2.使用本地安装的cuDNN和TensorRT进行构建

如果发现错误并使用此方法进行编译,请在问题中进行披露(ldd转储也可以)

  1. 开始编译之前,请在系统上安装TensorRT,CUDA和cuDNN。
  2. 在WORKSPACE评论中
  1. # Downloaded distributions to use with --distdir
  2. http_archive(
  3. name = "cudnn",
  4. urls = ["<URL>",],
  5. build_file = "@//third_party/cudnn/archive:BUILD",
  6. sha256 = "<TAR SHA256>",
  7. 10.     strip_prefix = "cuda"

11. )

  1. 12.

13. http_archive(

  1. 14.     name = "tensorrt",
  2. 15.     urls = ["<URL>",],
  3. 16.
  4. 17.     build_file = "@//third_party/tensorrt/archive:BUILD",
  5. 18.     sha256 = "<TAR SHA256>",
  6. 19.     strip_prefix = "TensorRT-<VERSION>"
20. )

和不加评论

#本地安装的依赖项
new_local_repository(
     name  =  “ cudnn”,
     path  =  “ / usr /”,
     build_file  =  “ @ // third_party / cudnn / local:BUILD”
)
 
new_local_repository(
    name  =  “ tensorrt”,
    path  =  “ / usr /”,
    build_file  =  “ @ // third_party / tensorrt / local:BUILD” 
)
  1. 编译使用:
bazel build // :: libtrtorch --compilation_mode选择

调试版本

bazel build // :: libtrtorch --compilation_mode = dbg

NVIDIA Jetson AGX上的本机编译

bazel build // :: libtrtorch --distdir third_party / dist_dir / aarch64-linux-gnu

注意:有关先决条件,请参阅安装说明

然后可以在bazel-bin中找到包含包含文件和库的tarball

在JIT图上运行TRTorch

确保将LibTorch添加到的LD_LIBRARY_PATH

export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/bazel-TRTorch/external/libtorch/lib

bazel run //cpp/trtorchexec -- $(realpath <PATH TO GRAPH>) <input-size>

编译Python包

要为本地计算机编译python软件包,只需python3 setup.py install在//py目录中运行即可。要为不同的python版本构建wheel文件,请先构建Dockerfile,//py然后运行以下命令

docker run -it -v$(pwd)/..:/workspace/TRTorch build_trtorch_wheel /bin/bash /workspace/TRTorch/py/build_whl.sh

Python编译期望从上面使用基于tarball的编译策略。

如何添加对新算子的支持...

在TRTorch?

支持新算子有两种主要方法。可以从头开始为op编写一个转换器并将其注册到NodeConverterRegistry中,或者如果可以将op映射到一组已经具有转换器的op上,则可以编写图形重写过程,将新的op替换为等效的子图支持的算子。首选使用图形重写,因为这样就不需要维护大型的op转换器库。还要查看问题中的各种算子支持跟踪器,以获取有关各种算子的支持状态的信息。

如何申请

Node Converter Registry不在顶级API中公开,而是在tarball附带的内部header中公开。

可以使用NodeConverterRegistry应用程序内部为算子注册一个转换器。

Structure of the repo结构

英伟达TRTTorch的更多相关文章

  1. 第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )

    前言 本文讲解如何在VS 2010开发平台中搭建CUDA开发环境. 当前配置: 系统:WIN7 64位 开发平台:VS 2010 显卡:英伟达G卡 CUDA版本:6.0 若配置不同,请谨慎参考本文. ...

  2. 英伟达CUVID硬解,并通过FFmpeg读取文件

    虽然FFmpeg本身有cuvid硬解,但是找不到什么好的资料,英伟达的SDK比较容易懂,参考FFmpeg源码,将NVIDIA VIDEO CODEC SDK的数据获取改为FFmpeg获取,弥补原生SD ...

  3. Ubuntu18.04安装英伟达显卡驱动

    前几天买了一张RTX2060显卡,想自学一下人工智能,跑一些图形计算,安装Ubuntu18.04后发现英伟达显卡驱动安装还是有点小麻烦,所以这里记录一下安装过程,以供参考: 1.卸载系统里低版本的英伟 ...

  4. 不用写代码就能实现深度学习?手把手教你用英伟达 DIGITS 解决图像分类问题

    2006年,机器学习界泰斗Hinton,在Science上发表了一篇使用深度神经网络进行维数约简的论文 ,自此,神经网络再次走进人们的视野,进而引发了一场深度学习革命.深度学习之所以如此受关注,是因为 ...

  5. NCCL(Nvidia Collective multi-GPU Communication Library) Nvidia英伟达的Multi-GPU多卡通信框架NCCL 学习;PCIe 速率调研;

    为了了解,上来先看几篇中文博客进行简单了解: 如何理解Nvidia英伟达的Multi-GPU多卡通信框架NCCL?(较为优秀的文章) 使用NCCL进行NVIDIA GPU卡之间的通信(GPU卡通信模式 ...

  6. 【视频开发】【CUDA开发】英伟达CUVID硬解,并通过FFmpeg读取文件

    虽然FFmpeg本身有cuvid硬解,但是找不到什么好的资料,英伟达的SDK比较容易懂,参考FFmpeg源码,将NVIDIA VIDEO CODEC SDK的数据获取改为FFmpeg获取,弥补原生SD ...

  7. 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!

    本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完 ...

  8. 【并行计算与CUDA开发】英伟达硬件加速编解码

    硬件加速 并行计算 OpenCL OpenCL API VS SDK 英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器 使用 SDK 中的编解码接口 使用编码器对于 OpenC ...

  9. 【并行计算-CUDA开发】英伟达硬件解码器分析

    这篇文章主要分析 NVCUVID 提供的解码器,里面提到的所有的源文件都可以在英伟达的 nvenc_sdk 中找到. 解码器的代码分析 SDK 中的 sample 文件夹下的 NvTranscoder ...

随机推荐

  1. 【SpringBoot】Spring Boot

    Spring Boot是由Pribotal团队提供,设计用来简化新Spring应用的初始搭建和开发过程的开源框架. 随着Spring体系越来越庞大,各种配置也是越来越复杂,Spring Boot就是解 ...

  2. Thinkphp5之ajax分页实现_paginate()参数详细

    Thinkphp5 做数据搜索需要带关键词分页,如何将查询条件带入到分页中,本文详细介绍Thinkphp5 分页带参数 一.基本使用方法: $list = Db::name('user')->w ...

  3. DexHunter在ART虚拟机模式下的脱壳原理分析

    本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...

  4. androguard安装和体验

    安装步骤按照官方教程https://code.google.com/p/androguard/wiki/Installation,下面记录下无法在ubuntu下apt-get的模块: python模块 ...

  5. MetInfo Password Reset Poisoning By Host Header Attack

    if we know some user's email, the we will can reset the user's email by host header attack. The atta ...

  6. Windows bat批处理删除指定N天前的文件

    1:新建批处理文件:del_old_file.bat,更改系统时间为7天前,在c盘sql back 目录下新建测试文件,再将系统时间改为正确时间 2:编辑内容: rem 删除C:\sql back目录 ...

  7. DWVA--File Inclusion

    文件包含漏洞 先来了解一下什么是文件包含 因为程序开放人员通常会把可重复使用的函数写到单个文件中,在需要使用到这些函数时候,就可以 直接调用这个文件,这种对文件的调用过程就被称为文件包含. 文件包含漏 ...

  8. Pytorch_Part1_简介&张量

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  9. .Net Core导入千万级数据至Mysql

    ​最近在工作中,涉及到一个数据迁移功能,从一个txt文本文件导入到MySQL功能. 数据迁移,在互联网企业可以说经常碰到,而且涉及到千万级.亿级的数据量是很常见的.大数据量迁移,这里面就涉及到一个问题 ...

  10. [刷题] PTA 7-61 找最长的字符串

    程序: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 81 4 5 int main() { 6 char ch[N ...