1.NVIDIA助力艾氪英诺打造稀疏卷积在TensorRT上的源码最佳实践
2.TF-TRT使用环境搭建
3.linux下tensorRT安装以及pycuda安装报错的解决
4.部署系列——神经网络INT8量化教程第一讲!
5.Pytorch量化+部署
6.使用mmdeploy部署rtmdet ins做实例分割
NVIDIA助力艾氪英诺打造稀疏卷积在TensorRT上的结构最佳实践
NVIDIA 的 GPU 技术驱动艾氪英诺在稀疏卷积部署上实现了突破,助力其在泛交通领域的源码自动驾驶-车路协同应用中取得最佳实践。
在自动驾驶领域,结构稀疏卷积作为关键算法,源码特别是结构gridmanager源码 PointPillars 等方法的升级版,因其在三维空间特征利用上的源码优势,受到了广泛关注。结构然而,源码将这种高效算法部署到 NVIDIA 设备上,结构特别是源码 TensorRT GPU 上,是结构一项挑战。艾氪英诺凭借 EE-DLVM 部署工具,源码成功实现了这一目标。结构
该工具基于 NVIDIA 的源码 TensorRT,通过高级 API 和优化实现,提升了稀疏卷积操作的性能。其创新点包括:设计的针对稀疏卷积的 Graph Trace,可将数据流程转化为 ONNX;前处理模块优化带来了倍的加速效果;以及在 Xavier NX 和 AGX Orin 等GPU上高效部署模型。这些成就使得艾氪英诺在3D点云感知算法部署上取得了重要突破。
借助 NVIDIA 技术,艾氪英诺不仅在自动驾驶-车路协同领域深化创新,还计划开源部分源代码,进一步推动行业共享。他们结合 NVIDIA 的深度学习培训资源和加速计划,提升了产品的技术含量和市场推广,旨在通过 AI 技术推动泛交通领域的应用场景拓宽。
TF-TRT使用环境搭建
TF-TRT,即TensorFlow与TensorRT的集成,是NVIDIA为加速深度学习推理应用而设计的工具。它简化了TensorFlow用户在GPU上利用TensorRT进行模型推理的流程。本文主要介绍如何在服务器上搭建TF-TRT的使用环境和编写相关代码。
首先,NVIDIA推荐的TF-TRT环境配置基于TensorRT 5.0RC,需要确保NVIDIA驱动程序版本.0以上,CUDA .0以及TensorRT。安装过程建议在Anaconda的虚拟环境中进行,从Tensorflow GitHub上下载1.版本源码,并通过bazel build工具生成pip安装包。目录浏览页面源码在编译时,由于GCC 5.0可能与新版本兼容性问题,需添加特定编译选项。
对于服务器上直接安装,你需按照官方教程安装CUDA、CUDNN、NVIDIA Driver和TensorRT。在Tensorflow的configure文件中,根据你的硬件配置进行相应的调整。然后,通过pip安装生成的.whl文件,安装时需要注意选择nvcc编译器,cudnn 7.3以上版本,以及兼容性的GCC编译选项。
另一种方式是利用Docker容器,Tensorflow .容器需要nvidia driver +版本,并需要获取Nvidia GPU cloud的API密钥。安装完成后,你可以通过Docker拉取tensorflow:.-py3镜像,验证TensorRT与Tensorflow的集成是否成功。
无论是直接安装还是容器化,都需注意选择合适的驱动和软件版本,以确保TF-TRT的稳定运行。安装过程中,还可以根据实际需求在container中安装其他软件,以满足个性化需求。
linux下tensorRT安装以及pycuda安装报错的解决
在Linux环境中安装TensorRT和解决pycuda安装报错的过程可以这样描述:
当你着手部署模型时,环境配置必不可少。首要任务是确保服务器上安装了CUDA,并且已正确添加环境变量,因为这常常是pycuda报错的根源。
首先,你需要确认CUDA的版本,这可以通过命令行查看。然后,访问NVIDIA官方网站,找到与你CUDA版本相匹配的TensorRT下载链接并下载。然而,linux源码c文件我发现下载过程中有时会出现自动断线的问题,最终我选择了8.2的稳定版,尽管GA和EA版也是选项。
下载完成后,解压文件,同样别忘了添加TensorRT到系统环境变量。接下来,编译源码并生成测试执行文件,这是常规步骤。然后,尝试在当前conda环境中安装TensorRT,但可能会遇到pycuda的安装问题。
报错指出pycuda的构建未能完成,问题可能有两个方面。首先,你可以尝试从lfd.uci.edu/~gohlke/pycuda/找到相应版本的pycuda(比如.1),这个库支持低版本CUDA,选择一个兼容的版本进行下载。
其次,如果你的服务器使用的是conda环境,并且CUDA没有添加到环境变量中,而是依赖于conda的虚拟环境,这可能会导致问题。一旦你将本机CUDA添加到环境变量,通常就能解决这个问题了。
部署系列——神经网络INT8量化教程第一讲!
神经网络量化已经成为广泛应用的技术,特别是INT8量化,它在处理大型模型和提高效率方面扮演着重要角色。2年前,作者通过NCNN和TVM在树莓派上部署简单的分类模型时,主要使用了PTQ量化方法。随着时间的推移,量化技术更加成熟,作者计划分享一系列教程,从基础到实践,重点关注TensorRT的量化方式,同时也会参考其他开源工具如Pytorch、程序源码安全检测NCNN、TVM和TFLITE。
量化是将高精度模型转换为低精度计算,如FP转FP或INT8。虽然FP转换基本无损,但INT8量化更常见,因为它能更好地平衡精度和性能。INT8量化后的模型在保持大部分精度的同时,可以利用INT8的硬件优势,如NVIDIA的Tensor Cores。
量化技术已经在生产环境中广泛应用,各大公司如Google和NVIDIA都有相应的开源解决方案。TensorRT虽然不公开源码,但支持后训练量化,且最新的版本支持ONNX导出的量化模型。Pytorch Quantization是NVIDIA针对Pytorch的量化工具,支持PTQ和QTA。
在量化操作中,关键的概念是量化和反量化,前者将浮点数转换为整数,后者则是将量化后的值恢复为原始精度。对称量化,如TensorRT采用的,简化了计算,通过调整scale值来适应INT8范围。
卷积操作是量化的核心,通过im2col和sgemm转换为INT8运算。量化公式涉及scale值的处理,以及pre-tensor和pre-channel的策略,这有助于保持精度并优化计算效率。
后续内容将深入探讨非对称量化、实际部署中的代码细节,以及TensorRT、Pytorch和TVM的量化实践。如果你对此感兴趣,记得持续关注作者的更新。
Pytorch量化+部署
量化
在Pytorch中,量化有三种主要方式:模型训练后的秒赞搭建源码动态量化、模型训练后的静态量化以及模型训练中的量化(Quantization Aware Training,QAT)。
部署
部署主要分为两个方向:对于Nvidia GPU,可通过PyTorch → ONNX → TensorRT;对于Intel CPU,可选择PyTorch → ONNX → OpenVINO。ONNX是一种用于表示深度学习模型的开放标准格式,可使模型在不同框架间进行转换。TensorRT是一个针对Nvidia GPU的高性能推理库,可与多种训练框架协同工作,优化网络推理性能。ONNX模型可通过torch.onnx.export()函数转换为ONNX模型,用于后续的推理和部署。TensorRT则提供两种方式用于ONNX模型的转换和推理,即使用trtexec工具或TensorRT的parser接口解析ONNX模型构建引擎。OpenVINO是英特尔提供的工具套件,支持CNN网络结构部署,兼容多种开源框架的模型。在OpenVINO中,ONNX模型需转换为.xml和.bin文件,用于后续的推理操作。安装OpenVINO需要下载并配置英特尔OpenVINO工具包,安装依赖库,设置环境变量等步骤。TensorRT的安装可选择直接下载源码或使用.deb文件安装,过程中可能遇到一些报错,需进行相应的解决,确保安装成功。
使用mmdeploy部署rtmdet ins做实例分割
在尝试使用mmdeploy部署rtmdet ins进行实例分割时,发现网上资源较少,github的问题也有不少未解决,只得自己动手,留作档案。
构建时需严格遵循源代码构建流程,从下载到构建,避免第三方库问题。
ppl.cv不支持cuda,构建时需在cuda.cmake中设置与自己显卡对应的flag。
使用了最新版的tensorrt和cudnn,版本对运行结果影响不大,但确保环境变量已正确设置。
安装mmcv时需注意版本,应使用大于2.0.0、小于2.2.0的版本,直接按照教程安装易导致版本2.3.0,mmdet会报错,我选择安装2.1.0版本。
在使用中需注意cuda版本,选择.x版本最为合适。
因为mmdeploy需要nvcc进行编译,所以本地的cuda toolkit也应安装。我忽视了这一点,nvcc编译可以正常通过,但在运行时在trt nms处出现错误。
在修改permuteData.cu文件后,发现问题是由于sm_不兼容(我的显卡是,查看主机cuda版本是否支持)。吐槽的是,即使卸载过cuda导致nvcc版本为.1,编译也能通过!
如果你的cuda版本高于.x,请修改zsh/bash指定版本,先执行,再添加到环境变量。
在模型转换时,需要将mmdetection的_base_文件夹导入到mmdeploy的_base_中,将mmdetection的/config/rtmdet导入到mmdeploy的/config中,否则会找不到type。
ONNX-Runtime一本通:综述&使用&源码分析(持续更新)
ONNX-Runtime详解:架构概览、实践与源码解析
ONNX-Runtime作为异构模型运行框架,其核心机制是先对原始ONNX模型进行硬件无关的图优化,之后根据支持的硬件选择相应的算子库,将模型分解为子模型并发在各个平台执行。它提供同步模式的计算支持,暂不包括异步模式。ORT(onnx-runtime缩写)是主要组件,包含了图优化(graph transformer)、执行提供者(EP)等关键模块。
EP是执行提供者,它封装了硬件特有的内存管理和算子库,可能只支持部分ONNX算子,但ORT的CPU默认支持所有。ORT统一定义了tensor,但EP可有自定义,需提供转换接口。每个推理会话的run接口支持多线程,要求kernel的compute函数是并发友好的。
ORT具有后向兼容性,能运行旧版本ONNX模型,并支持跨平台运行,包括Windows、Linux、macOS、iOS和Android。安装和性能优化是实际应用中的重要步骤。
源码分析深入到ORT的核心模块,如框架(内存管理、tensor定义等)、图结构(构建、排序与修改)、优化器(包括RewriteRule和GraphTransformer),以及平台相关的功能如线程管理、文件操作等。Session是推理流程的管理核心,构造函数初始化模型和线程池,load负责模型反序列化,initialize则进行图优化和准备工作。
ORT中的执行提供者(EP)包括自定义实现和第三方库支持,如TensorRT、CoreML和SNPE。其中,ORT与CoreML和TensorRT的集成通过在线编译,将ONNX模型传递给这些框架进行计算。ORT通过统一的接口管理元框架之上的算子库,但是否支持异构运算(如SNPE与CPU库的混合)仍有待探讨。
总结来说,ONNX-Runtime处理多种模型格式,包括原始ONNX和优化过的ORT模型,以适应多平台和多设备需求。它通过复杂的架构和优化技术,构建了可扩展且高效的推理软件栈,展示了flatbuffer在性能和体积方面的优势。
附录:深入探讨ORT源码编译过程的细节。
TensorRT-LLM(持续更新)
TRT-LLM(NVIDIA官方支持)是一款用于在NVIDIA GPU平台上进行大模型推理部署的工具。
其整体流程是将LLM构建为engine模型,支持多种大模型,如单机单卡、单机多卡(NCCL)、多机多卡,以及量化(8/4bit)等功能。
TRT-LLM的runtime支持chat和stream两种模式,并支持python和cpp(可以直接使用cpp,也可以使用cpp的bybind接口)两种模式的runtime。
构建离线模型可以通过example下的各个模型的build.py实现,而运行模型则可通过example下的run.py进行。
TRT-LLM默认支持kv-cache,支持PagedAttention,支持flashattention,支持MHA/MQA/GQA等。
在cpp下,TRT-LLM实现了许多llm场景下的高性能cuda kernel,并基于TensorRT的plugin机制,支持各种算子调用。
与hugging face transformers(HF)相比,TRT-LLM在性能上提升2~3倍左右。
TRT-LLM易用性很强,可能与其LLM模型结构比较固定有关。
TRT-LLM的weight_only模式仅仅压缩模型体积,计算时依旧是dequant到input.dtype做计算。
TRT-LLM的量化:W4A(表示weight为4bit,输入数据即activation为fp)。
LLM模型推理,性能损耗大头在data 搬移,即memory bound,compute bound占比较少。
TRT-LLM运行时内存可以通过一下参数调整,使用适合当前业务模型的参数即可。
TRT-LLM对于Batch Manager提供了.a文件,用于支持in-flight batching of requests,来较小队列中的数据排队时间,提高GPU利用率。
当前支持(0.7.1)的模型如下:
tensorrt llm需要进行源码编译安装,官方提供的方式为通过docker进行安装。
docker方式编译可以参考官方文档,此处做进一步说明。使用docker方式,会将依赖的各种编译工具和sdk都下载好,后面会详细分析一下docker的编译过程。
编译有2种包,一种是仅包含cpp的代码包,一种是cpp+python的wheel包。
docker的整个编译过程从如下命令开始:调用make,makefile在 docker/Makefile 下面,里面主要是调用了docker命令来进行构建。
后续非docker方式编译llm,也是基于上述docker编译。
一些小技巧:在编译llm过程中,会通过pip install一些python包,llm脚本中默认使用了NVIDIA的源,我们可以替换为国内的源,速度快一些。
整个过程就是将docker file中的过程拆解出来,直接执行,不通过docker来执行。
编译好的文件位于:build/tensorrt_llm-0.5.0-py3-none-any.whl。
默认编译选项下的一些编译配置信息如下:
以官方样例bloom为例:bloom example
核心在于:编译时使用的环境信息和运行时的环境信息要一致,如:python版本,cuda/cudnn/nccl/tensorrt等。
环境安装后以后,参考官方bloom样例,进行模型下载,样例执行即可。
最终生成的engine模型:
以chatglm2-6b模型为基础,进行lora微调后,对模型进行参数合并后,可以使用tensortrt-llm的example进行部署,合并后的模型的推理结果和合并前的模型的推理结果一致。
lora的源码不在赘述,主要看一下lora模型参数是如何合并到base model中的:
lora模型如下:
base模型如下:
模型构建是指将python模型构建为tensort的engine格式的模型。
整体流程如下:
整体流程可以总结为:
可以看出,原理上和模型转换并没有区别,只是实现方式有差异而已。
pytorch模型参数如何加载在tensortrt-llm中?关于量化参数加载
1. 先提取fp格式的参数
2. 调用cpp的实现进行参数量化
整体而言,模型参数加载的关键在于:算子weight一一对应,拷贝复制。
每种模型,都需要搭建和pytorch严格一致的模型架构,并将算子weight严格对应的加载到tensortrt-llm模型中
即:关键点在于:熟悉原始pytorch模型结构和参数保存方式,熟悉tensorrt-llm的模型结构和参数设定方法。
模型构建成功后,有两个文件:config.json文件推理时会用到,主要内容如下:模型参数信息和plugin信息。
在模型构建好后,就可以做模型推理,推理流程如下:
TRT-LLM Python Runtime分析
1. load_tokenizer
2. parse_input
基于 tokenizer 对输入的text做分词,得到分词的id
3. runner选择&模型加载
4.推理
5. 内存管理
TRT-layer实现举例
(1)对tensorrt的接口调用:以cast算子为例:functional.py是对TensorRT python API接口的调用
调用tensorrt接口完成一次推理计算
(2)TRT-LLM python侧对cpp侧的调用
调到cpp侧后,就会调用cpp侧的cuda kernel
trtllm更新快,用了一些高版本的python特性,新的trtllm版本在python3.8上,不一定能跑起来