TensorRT文档翻译

TensorRT从了入门到了解(官方文档)-学习笔记 TensorRT阅读研究 阅读详情
1 首先声明,我也是刚开始研究这个TensorRT的自定义层,之前试了很多方法,下了官方例程,看不懂ORZ。然后也去找了一些别的资料,也没能复现。特别是把NVIDIA的官方例子face_recongnition,在本机上编译失败(ubuntu16.04+gtx1060(pascal架构)),可能是因为我没有装OpenGL还有没有配置好tensorRT,但是在jetson tx1上面却是可以的0.0。

2 其次我翻译的是tensorRT3里面的TensorRT-3-User-Guide.pdf里面关于自定义层的说明,也就是3.8章节

正文

3.8. SamplePlugin - Implementing A Custom Layer
这个例子示范了怎么给tensorRT添加一个自定义层。它用直接调用cuda基础线性代数库来代替原来MNIST例子中的最后的全连接层


3.8.1关键概念
这里的关键概念为了解释以下两点:
1如何去创建自定义层
2如何去整合自定义层到NvCaffeParser然后把它输入到执行文件中


3.8.2实现plugin接口
tensorRT每个阶段(网络创建,建立,序列化,执行)需要在plugin API中实现的方法。下面回顾以下各个阶段的相关方法。


当创建网络的时候:
当网络构建的时候这些方法被调用,如果层的输出size或者任何随后的层需要通过一个ITensor::getDimensions()的调用。另外这个方法将被调用当建立者(builder)运行时。
‣ getNbOutputs()
‣ getOutputDimensions()


builder的话:


‣ configure()
‣ getWorkspaceSize()


在runtime:


‣ initialize() when an engine context is constructed
‣ enqueue() at inference time
‣ terminate() when an engine context is destroyed


For serialization(怎么翻译???序列化阶段?):


‣ getSerializationSize()
‣ serialize()


3.8.3定义网络
当在定义网络的时候,TensorRT需要去知道哪一层是输出层
/************************************************************************************************************************************************************/
*sample中给的维度没有batch size,用了相同的方法ITensor::getDimensions()去返回维度。举个栗子,一个典型的3维的卷积,维度被提供以{C,H,W}的形式(通道,高,宽),
*然后返回值也应该是{C,H,W}的格式
/************************************************************************************************************************************************************/


下面的方法提供了层的输出
int getNbOutputs() const override
{
return 1;
}


getOutputDimensions函数有三个参数,输出指针,输入维度和输出的数量。后面两个参数早就被TensorRT内部计算好了,所以你要做的是计算输出的维度基于输入维度和指针数量。


Dims getOutputDimensions(int index, const Dims* inputDims, int nbInputDims) override//override是什么鬼0.0,我学的是假的c++吧
{
assert(index == 0 && nbInputDims == 1 && inputDims[0].nbDims== 3);
assert(mNbInputChannels == inputDims[0].d[0] *inputDims[0].d[1] *inputDims[0].d[2]);
return DimsCHW(mNbOutputChannels, 1, 1);
}




3.8.4.层构建( Layer Configuration)


建立者(builder)调用网络的configuration()方法(ps:这貌似不是c++的说法吧,方法感觉应该是java的说法吧,叫成员函数是不是更好一点),去给一个选择基于他的输入的算法的机会。
在这个例子中,输入被检查是否是正确的格式。在更加复杂的例子中,你可能选择基于输入维度的卷积算法。


这个configure()方法是在build阶段唯一被调用的方法。因此,任何决定这里的东西也会在runtime阶段被需要去保存(stored)。作为plugin的成员变量,serialized(序列化??串连??)以及de-serialized亦然


3.8.5工作空间(Workspace)


TensorRT提供了工作空间为了在层执行期间的临时存储,为了最小化内存占用被各个层共享。TensorRT builder 调用getWorkspaceSize()为了决定workspace的需求(requirement)(毛估估判定需要的大小吧,类似于分配空间)。
在这个例子中,没有用到workspace。如果需要workspace,它将会被分配当一个IExecutionContext被创建,然后在runtime阶段转到enqueue()方法。


非此即彼(Alternatively),你也可以给层的执行分配显存在构造函数中,然后再析构函数中释放。然后只需要在这个回调函数(callback)中返回0。使用TensorRT的worksoace的优势是可以在执行的时候被其他plugins分享。


3.8.6 资源管理(Resource Management)
initialize()和 terminate()方法被builder调用当展示自动调整(performing auto-tuning),并且在runtime阶段当IExecutionContext被创建和销毁时。(我理解为两个阶段都会调用这两个函数)他们被用于分配和释放自愿在层执行时。
在这个例子中,为了cuDNN和cuBLAS,还有一些cuDNN张量(tensor)描述符为了bias额外操作的的句柄(handles)。


在下面的例子中,为了cuDNN和cuBLAS,还有一些为了bias额外操作的cuDNN张量(tensor)描述符创建了句柄(handles)。(为cudnn,cublas,bias额外操作提供的句柄)(ps,blablablabla没理解)


int initialize() override
{
CHECK(cudnnCreate(&mCudnn));
CHECK(cublasCreate(&mCublas));
CHECK(cudnnCreateTensorDescriptor(&mSrcDescriptor));
CHECK(cudnnCreateTensorDescriptor(&mDstDescriptor));
return 0;
}
virtual void terminate() override
{
CHECK(cublasDestroy(mCublas));
CHECK(cudnnDestroy(mCudnn));
}


3.8.7.runtime阶段实现(Runtime Implementation)


enqueue()方法会被使用去执行层的runtim阶段的实现
batch size 会被传到enqueue()以最多为最大指定batch size在build阶段,尽管他可以更小


/************************************************************************************************************************************************************/
*除了batch size,尺寸信息(dimensional information)不会被传到enqueue(),所以,其他的尺寸信息在runtime阶段被需要,举个栗子,输入和输出的通道数目,需要作为层数据
*的一部分被串连(serialized)
/************************************************************************************************************************************************************/




virtual int enqueue(int batchSize, const void*const * inputs,void**outputs, void* workspace, cudaStream_t stream) override
{
int nbOutputChannels = mBiasWeights.count;
int nbInputChannels = mKernelWeights.count /
nbOutputChannels;
float kONE = 1.0f, kZERO = 0.0f;
cublasSetStream(mCublas, stream);
cudnnSetStream(mCudnn, stream);
CHECK(cublasSgemm(mCublas, CUBLAS_OP_T, CUBLAS_OP_N,nbOutputChannels, batchSize, nbInputChannels, &kONE,reinterpret_cast<constfloat*>(mKernelWeights.values),
nbInputChannels,reinterpret_cast<const float*>(inputs[0]),nbInputChannels, &kZERO,reinterpret_cast<float*>(outputs[0]),nbOutputChannels));
CHECK(cudnnSetTensor4dDescriptor(mSrcDescriptor,CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, nbOutputChannels, 1, 1));
CHECK(cudnnSetTensor4dDescriptor(mDstDescriptor,CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, batchSize, nbOutputChannels,1, 1));
CHECK(cudnnAddTensor(mCudnn, &kONE, mSrcDescriptor,mBiasWeights.values, &kONE, mDstDescriptor, outputs[0]));
return 0;
}


3.8.8. Serialization


层参数可以和剩下的网络被串连起来。这个串连系统调用了下面的函数:


virtual size_t getSerializationSize() override
{
// 3 integers (number of input channels, number of output channels, bias size), and then the weights:
return sizeof(int)*3 + mKernelWeights.count*sizeof(float) +mBiasWeights.count*sizeof(float);
}


virtual void serialize(void* buffer) override
{
char* d = reinterpret_cast<char*>(buffer), *a = d;
write(d, mNbInputChannels);
write(d, mNbOutputChannels);
write(d, (int)mBiasWeights.count);
serializeFromDevice(d, mKernelWeights);
serializeFromDevice(d, mBiasWeights);
assert(d == a + getSerializationSize());
}
串连被下面的构造函数实现
Deserialization is implemented with the following constructor:


// create the plugin at runtime from a byte stream
FCPlugin(const void* data, size_t length)
{
const char* d = reinterpret_cast<const char*>(data), *a = d;
mNbInputChannels = read<int>(d);
mNbOutputChannels = read<int>(d);
int biasCount = read<int>(d);
mKernelWeights = deserializeToDevice(d, mNbInputChannels *
mNbOutputChannels);
mBiasWeights = deserializeToDevice(d, biasCount);
assert(d == a + length);
}




3.8.9. 添加plugin到网络中(Adding The Plugin Into A Network)


有三种方法可以添加plugin到网络中:


1在定义网络的时候使用INetwork::addPlugin()


2通过parser创建(create)网络


3在网络创建后串转并(De-serialize)


为了使用addPlugin(),请查看TensorRT API(http://docs.nvidia.com/deeplearning/sdk/tensorrt-api/index.html)


3.8.9.1从NvCaffeParser创建plugins


通过NvCaffeParser添加自定义层,通过实现nvcaffeParser::IPluginFactory接口创建一个factory,然后传一个实例到ICaffeParser::parse()。


createPlugin()方法接收到层的名字,然后权重的集合(set)从NVCaffe模型文件中提取出来。然后会将这个集合传到层的构造函数中。名字可以用来区分不同的复杂的plugins。
现在一般没办法提取参数除了从NVCaffe网络描述中提取。因此,这些参数必须要在factory中被指定。
bool isPlugin(const char* name) override
{
return !strcmp(name, "ip2");
}




virtual nvinfer1::IPlugin* createPlugin(const char* layerName,const nvinfer1::Weights* weights, int nbWeights) override
{
// there's no way to pass parameters through from the model definition, so we have to define it here explicitly

static const int NB_OUTPUT_CHANNELS = 10;
assert(isPlugin(layerName) && nbWeights == 2 &&weights[0].type ==DataType::kFLOAT && weights[1].type == DataType::kFLOAT);
assert(mPlugin.get() == nullptr);
mPlugin = std::unique_ptr<FCPlugin>(new FCPlugin(weights,nbWeights, NB_OUTPUT_CHANNELS));
return mPlugin.get();
}


3.8.9.2在Runtime阶段创建plugins
为了整合自定义层在runtime中,实现nvinfer1::IPlugin接口然后将一个factory实例到IInferRuntime::deserializeCudaEngine()。


IPlugin* createPlugin(const char* layerName, const void*serialData,size_t serialLength) override
{
assert(isPlugin(layerName));
assert(mPlugin.get() == nullptr);
mPlugin = std::make_unique<FCPlugin>(serialData,serialLength);
return mPlugin.get();
}


当构造使用NvCaffeParser or deserialized(串连)在runtime阶段,层的实现可能假设数据通过权重(来自NvCaffeParser)或者二进制流(在runtime阶段)将会存在
直到调用initialize(),允许数据在这个函数中被复制到GPU中。

TensorRT 4 开发者手册 中文版 自定义层/混合精度校准/部署(三-5) 原创作品,转载时请务必以超链接形式标明文章原始出处: http://www.dapalm.com/?p=206,作者:大数据,怕了么?   本手册为TensorRT 4.0.1.6 GA版英文手册翻译而来,博主英文水平一般般,主要作为备忘所用,分享出来以供更多开发者使用。TensorRT Developer Guide手册一共分为四个章节,主要内容在第二、三章,看懂这两章,写代码够用了。第一章为... 阅读详情

相关推荐

TensorRT 4 开发者手册 中文版 C++接口使用(三-3)

本手册为TensorRT 4.0.1.6 GA版英文手册翻译而来,博主英文水平一般般,主要作为备忘所用,分享出来以供更多开发者使用。TensorRT Developer Guide手册一共分为四个章节,主要内容在第二、三章,看懂这两章,写代码够用了。第一章为TensorRT综述,就是自吹有多牛逼。第四章为示例,介绍demo的代码结构及功能。开篇是目录,前三章每章为两到三篇,最后第四章示例,会拆...

Mars_WH的专栏 5327

1.TensorRT中文版开发教程-----指南简介

1.手册简介 NVIDIA® TensorRT™ 是一个促进高性能机器学习推理的 SDK。 它旨在与 TensorFlow、PyTorch 和 MXNet 等训练框架以互补的方式工作。 它特别专注于在 NVIDIA 硬件上快速高效地运行已经训练好的网络。 有关如何安装 TensorRT 的说明,请参阅 NVIDIA TensorRT 安装指南。 NVIDIA TensorRT 快速入门指南适用于想要试用 TensorRT SDK 的用户; 具体来说,您将学习如何快速构建应用程序以在 TensorRT 引擎

专注于人工智能领域的小何尚 1万+

ViiTor实时翻译:低延迟高准确度的AI翻译技术解析

机器翻译作为自然语言处理的核心应用,通过神经网络架构实现跨语言转换。Transformer与CNN的混合架构能同时捕捉全局语义和局部语法特征,配合动态束搜索等解码优化技术,显著提升专业领域翻译质量。在工程实践中,量化压缩、异步流水线等优化手段可确保300ms内的端到端延迟,满足视频会议、技术文档等实时场景需求。ViiTor项目通过创新的混合神经网络架构和三级处理流水线,在保持85%专业领域准确率的同时实现毫秒级响应,其领域自适应方案和内存管理技巧为AI翻译系统优化提供了实用参考。

weixin_34199405的博客 317

【tensorrt】——最全官方文档

tensorrt 链接:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#layers

怡宝2号 4000

保姆级教程:用Jetson Orin Nano和ROS2 Humble搞定PIXhawk 4飞控通信(含配置文件详解)

本文提供了一份详细的Jetson Orin Nano与PIXhawk 4飞控通信配置指南,涵盖硬件连接、ROS2 Humble环境搭建、MAVROS2配置及通信调试全流程。通过实战案例和配置文件详解,帮助开发者快速实现无人机上位机与飞控的稳定通信,适用于无人机开发与自动化控制场景。

weixin_33670786的博客 475

Switch游戏安装新思路:抛弃Commander One,试试这款免费的Mac神器OpenMTP

本文介绍了Mac用户安装Switch游戏的新选择——免费工具OpenMTP,对比收费软件Commander One,OpenMTP在MTP连接稳定性和文件管理上更具优势。详细解析了OpenMTP的安装配置、核心功能及实战操作,帮助用户高效完成游戏安装,特别适合已破解并安装DBI的Switch用户。

weixin_30664051的博客 578

cuda和cudnn和tensorrt的理解

cuda参考:https://www.zhihu.com/question/409350643/answer/1361111350cuda是Compute Unified Device Architecture的缩写。中文叫统一计算架构。是为了让nvidia gpu可以完成通用计算任务的一种集成技术。我们通常可以使用的cuda框架有c,c++,fortran,python,java的,可以为数据大吞吐量的工作提供很好的加速功能。简单的来讲,就是为了让GPU可以不仅仅工作与自己的一幕三分地,而是利用自身的优势

qq_15821487的博客 3057

Android实现自动输入文本效果 (附完整源码)

Android实现自动输入文本效果 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 414

TensorRT python API 文档翻译

前言 近期需要研究如何使用TensorRT的python API,翻译了部分文档,做我个人的笔记,大家也可分享交流,如有错误,感谢勘误. 参考网址:Using The Python API Using The Python API 1 导入TRT import tensorrt as tf TRT_LOGGER = trt.Logger(trt.Logger.WARNING) 启动一个logging界面,以输出TRT的errors,warnings和信息化的信息(informational message

mathlxj的博客 1661

yolov5-6.0的稀疏化训练、结构化剪枝、微调

YOLOv5的BN剪枝、微调

qq_41920323的博客 4394

大唐杯历届省赛押题训练(6)

考试-TD-LTE无线网络设备介绍-TD-LTE网络架构一、单选题1TD-LTE的接入网E-UTRAN由下列哪些网元组成( )。0分/1分A、RNCB、BTSC、eNode BD、Node B提交答案:B正确答案:C考点TD-LTE网络架构解析暂无试题解析二、多选题1关于LTE网络整体结构,哪些说法是正确的( )0分/2分A、E-UTRAN用E-NodeB替代原有的RNC-NodeB结构B、E-NodeB间的接口为S1接口C、各网络节点之间的接口使用IP传输。

nimo观察者 633

【tensorRT文档翻译】7. Working With Dynamic Shapes

https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#work_dynamic_shapes 文章目录7.处理动态形状7.1. Specifying Runtime Dimensions7.2. Optimization Profiles7.2.1。 多个优化配置文件的绑定7.3. Layer Extensions For Dynamic Shapes7.4. Restrictions For Dynamic Sha

AbiUni(YY熊) 1294

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_FSD创新模块进行改进)

2502_91881744的博客 315

NVIDIA NeMo实战:定制神经机器翻译模型提升技术文档翻译质量

神经机器翻译(NMT)作为自然语言处理的核心技术,通过深度学习模型实现跨语言自动翻译。其核心原理是基于编码器-解码器架构的序列到序列学习,结合注意力机制处理长距离依赖关系。在技术文档翻译场景中,通用NMT模型常面临术语不一致、专业句式处理不佳等问题。通过NVIDIA NeMo框架的领域自适应技术,开发者可以收集专业语料、优化数据预处理流程,并采用参数高效微调方法(如LoRA)提升模型表现。实践表明,结合TensorRT加速和动态批处理技术,可使技术文档翻译的BLEU值提升15-20%,显著改善医学、计算机等

weixin_30938149的博客 404

华为od统一考试B卷【食堂供餐】Python 实现

某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求。

MISAYAONE的博客 8780

CAN轴控制流【6041,6040】

【代码】CAN轴控制流【6041,6040】

cfqq1989的博客 1782

Tensorrt python api 10.11.0笔记

Tensorrt提供一个实现,基本功能都有,但是可以重写获取更高级的功能.本指南展示了如何实现和包装定义插件行为的 Python 函数,以便将其作为自定义算子添加到网络中。

xmu_cjs的博客 1228

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

墨语灵犀镜像免配置优势解析:告别conda环境冲突,专注翻译本身

本文介绍了如何在星图GPU平台上自动化部署📜 墨语灵犀 (Moyu Lingxi)镜像,实现高效AI翻译功能。该镜像预装所有依赖环境,支持33种语言互译,特别适合学术研究、商务沟通等场景,让用户告别复杂的conda环境配置,专注于翻译内容创作。

weixin_36064575的博客 299

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

双显卡协同作战:TranslateGemma企业级翻译系统搭建指南

本文介绍了如何在星图GPU平台上自动化部署TranslateGemma: Matrix Engine镜像,快速搭建企业级AI翻译系统。该镜像支持双显卡协同计算,能够高效处理大规模文档翻译、实时对话翻译等企业级应用场景,显著降低部署成本并保持专业级翻译质量。

weixin_30820933的博客 342

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STranslate:集成翻译与OCR的全能工具设计与优化

机器翻译与OCR技术是现代跨语言处理的核心组件。基于Transformer架构的神经网络机器翻译(NMT)通过注意力机制实现高质量语义转换,而OCR技术结合深度学习模型如CRNN能精准识别图像文字。这些技术在全球化办公、学术研究等场景中具有重要价值,能显著提升多语言文档处理效率。STranslate作为典型应用,创新性地整合了实时翻译、离线翻译和图像文字识别功能,采用混合引擎策略和EAST文本检测等优化方案,解决了传统工具需要多应用切换的痛点。其技术实现涉及TensorRT加速推理、模型量化等性能优化手段,

weixin_30617737的博客 431

Cursor IDE集成Hunyuan-MT 7B:AI辅助编程新体验

本文介绍了如何在星图GPU平台上自动化部署Hunyuan-MT 7B全能翻译镜像,实现AI辅助编程中的多语言翻译功能。通过该平台,开发者可快速搭建翻译环境,应用于代码注释实时翻译、技术文档多语言转换等场景,显著提升开发效率与国际协作能力。

weixin_29301059的博客 241

AI自动化批量翻译落地全攻略:从零搭建高准确率翻译流水线的7个关键步骤

快速落地AI自动化批量翻译,解决多语言内容高效处理难题。覆盖网站本地化、文档翻译、电商SKU等场景,融合大模型微调、术语库管理与质量校验机制,准确率超95%。含环境搭建、API集成、错误回滚等7步实操指南,值得收藏。

AlgoFun的博客 196

Hunyuan-HY-MT1.5如何实现格式保留?PDF文档翻译部署教程

轻量级翻译模型,参数量约 18 亿:高性能翻译模型,参数量达 70 亿两者均支持33 种主流语言之间的互译,并额外融合了藏语、维吾尔语、彝语、壮语、粤语等5 种民族语言及方言变体,显著提升了中文多语言生态的覆盖广度和文化包容性。模型名称参数规模推理速度部署场景核心优势1.8B快(<50ms/token)边缘设备、移动端轻量高效、可量化部署7B中等(~120ms/token)服务器端、专业翻译高精度、强上下文理解。

weixin_32312889的博客 669

开源翻译模型新星:腾讯混元HY-MT1.5-1.8B部署教程与性能测试

本文介绍了如何在星图GPU平台上自动化部署Tencent-Hunyuan/HY-MT1.5-1.8B翻译模型(二次开发构建by113小贝),实现高效多语言翻译。该模型支持38种语言互译,特别适用于跨境电商内容生成、技术文档实时翻译等场景,通过Docker镜像可快速搭建企业级翻译服务。

weixin_35509395的博客 54

推理优化技能:vLLM与TensorRT-LLM实现高吞吐量AI模型部署

在AI研究和工程领域,**推理优化**是确保模型在生产环境中高效运行的关键环节。AI-Research-SKILLs项目提供了完整的**推理优化技能**,特别是针对vLLM和TensorRT-LLM这两种业界领先的推理引擎。本文将为您详细介绍如何利用这些技能实现**高吞吐量AI模型部署**,帮助您轻松应对大规模语言模型的服务挑战。 ## 为什么需要专业的推理优化技能? 随着大型语言模型参数规模

gitblog_00617的博客 320
上一篇: ubuntu16.04+opencv3.1.0+cuda9.0编译错误
下一篇: OPENCV新建一个CV::MAT对象
seekforcode
博客等级 码龄12年 9粉丝 41原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值