极智AI | TensorRT API构建模型推理流程

简介: 大家好,我是极智视界,本文介绍一下 TensorRT API 构建模型推理流程。

大家好,我是极智视界,本文介绍一下 TensorRT API 构建模型推理流程。

TensorRT 构建模型推理一般有三种方式:(1) 使用框架自带的 TensorRT 接口,如 TF-TRT、Torch-TRT;(2) 使用 Parser 前端解释器,如 TF / Torch / ... -> ONNX -> TensorRT;(3) 使用 TensorRT 原生 API 搭建网络。当然难度和易用性肯定是由低到高的,伴随而来的性能和兼容性也是由低到高的。这里我们直接介绍第三种方式。


1 TensorRT API 构建流程

TensorRT API 的整个构建过程可以分为 构建阶段运行阶段 ,其中构建阶段指的是添加算子&数据、网络参数配置、进行算子间逻辑连接以组建模型网,来生成 TensorRT Engine;运行阶段则可以抛开算子实现,直接调用构建阶段生成的 TensorRT Engine 进行前向推理计算。两个阶段中都有一些比较关键的模块,在下面的图中予以列出:

下面分别进行细致介绍。


2 构建阶段

2.1 构建 Logger

首先是构建 Logger 日志记录器:

logger = trt.Logger(trt.Logger.VERBOSE)

可选参数:VERBOSE、INFO、WARNING、ERROR、INTERNAL_ERROR,产生不同等级的日志,由详细到简略:

  • VERIOSE:[TensorRT] VERBOSE:Graph construction and optimization completed in 0.000261295 seconds.
  • INFO:[TensorRT] INFO:Detected 1 inputs and 1 output network tensors.
  • WARNING:[TensorRT] WARNING:Tensor DataType is determined at build time for tensors not marked as input or output.
  • ERROR:[TensorRT] ERROR:INVALID_CONFIG:Deserialize the cuda engine failed.
  • INTERNAL_ERROR:[TensorRT] ERROR:../builder/tacticOptimizer.cpp (1820) - TRTInternal Error in computeCosts:0 (Could not find any implementation for node (Unnamed Layer* 0) [TopK].)

2.2 构建 Builder

然后是构建 Builder 网络元数据,这是模型搭建的入口,网络的 TensorRT 内部表示以及可执行程序引擎,都是由该对象的成员方法生成的,来看 Builder 是怎么构建的:

builder = trt.Builder(logger)

来看 Builder 的常用成员:

  • builder.max_batch_size = 256:用于指定最大 batch size,在 static shape 模式下使用;
  • builder.max_workspace_size = 1 << 30:用于指定最大可用显存,单位为 byte ( 注意:该项即将被废弃);
  • builder.fp16_mode = True / False:用于开启 / 关闭 fp16 模式 ( 注意:该项即将被废弃);
  • builder.int8_mode = True / False:用于开启 / 关闭 int8 模式 ( 注意:该项即将被废弃);
  • builder.int8_calibrator = ... :int8 模式的校准表 ( 注意:该项即将被废弃);
  • builder.strict_type_constraints = True / False:开启 / 关闭强制精度模式 ( 注意:该项即将被废弃);
  • builder.refittable = True / False:开启 / 关闭 refit 模式 ( 注意:该项即将被废弃);

你可能会比较好奇,可以看到上面很多的配置项即将被废弃,这不是说这些配置项不能用了,而是把它们移到了 BuilderConfig 中进行配置。需要注意的一点是,现在 NLP 里用的比较多的 Dynamic Shape 模式必须用 BuilderConfig 及其相关 API,那么紧接着我们来看 BuilderConfig。

2.3 构建 BuilderConfig

构建 BuilferConfig 网络元数据的选项,该项负责设置模型的一些参数,如是否开启 fp16 模式、int8 模式等。BuilderConfig 是建立在 Builder 基础之上的:

config = builder.create_builder_config()

来看 BuilderConfig 的常用成员:

  • config.max_workspace_size = 1 << 30:用于指定最大可用显存;
  • config.max_batch_size = ... :用于指定最大 batch,若没有配置该成员,则默认 Explicit batch 模式;
  • config.flag = ... :用于设置标志位,如 1 << int(trt.BuilderFlag.FP16) 或 1 << int(trt.BuilderFlag.INT8) ;
  • config.int8_calibrator = ... :int8 模式的校准表;
  • 等等更多高级用法

在以上的 等等更多高级用法 中还有如 set_tactic_sources (限制算法实现)、set_timing_cache (节约构建时间)、algorithm_selector (精确控制节点算法) 等。

2.4 构建 Network

构建 Network 计算图,是 最为核心的一个模块。Network 是网络的主体,使用 TensorRT API 搭建模型,并且标记网络的输入输出节点,以把各个计算节点织连成网状:

network = builder.create_network()
  • 常用参数:1 << int(tensorrt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH),使用 Explicit Batch 模式;
  • 常用方法:
  • network.add_input('oneTensor', trt.float32, (3, 4, 5)) 标记网络输入张量;
  • convLayer = network.add_convolution_nd(XXX) 添加各种网络层;
  • network.mark_output(convLayer.get_output(0)) 标记网络输出张量;

2.5 构建 SerializedNetwork

构建 SerializedNetwork,这是网络的 TensorRT 内部表示,这个地方的后续处理就有两种选择:(1) 可以用它生成可执行的推理引擎直接进行后续推理,这样就不用反序列化的过程;(2) 把它序列化保存为文件,方便以后重新读取和使用,这里就需要涉及到反序列化,这是工程部署常用的方式。来看看怎么构建 SerializedNetwork:

engineString = builder.build_serialized_network(network, config)

这样就完成了构建阶段,下面来看运行阶段。


3 运行阶段

运行阶段相比构建阶段,过程较为简洁明了。下面来看。

3.1 构建 Engine

构建 Engine,Engine 是推理引擎,是模型计算的核心,可以理解为可执行程序的代码段。来看 Engine 是怎么构建的:

engine = trt.Runtime(logger).deserialize_cuda_engine(engineString)

3.2 构建 Context

构建 Context,主要用于计算的 GPU 上下文,类比 cpu 上的进程概念,是执行推理引擎的主体。来看 Context 是怎么构建的:

context = engine.create_execution_context()

3.3 构建 Buffer 相关

构建 Buffer 相关,主要涉及数据的准备,包括 Host 端和 Device 端,以及数据的拷贝,如执行推理前需要将 CPU 数据拷贝到 GPU 上,即 Host -> Device;当推理完成后,需要将结果数据从 GPU 拷出到 CPU,也即 Device -> Host。一些相关的示例代码如下:

cudart.cudaMemcpy(bufferD, bufferH, bufferSize, cudart.cudaMemcpyKind.cudaMemcpyHostToDevice)   # Host -> Device
cudart.cudaMemcpy(bufferH, bufferD, bufferSize, cudart.cudaMemcpyKind.cudaMemcpyDeviceToHost)   # Device -> Host

3.4 构建 Execute

构建 Execute,Execute 调用计算核心执行计算的过程,看代码,很简单:

context.execute_v2(bufferD)

以上就完成了整个的 构建 与 运行过程,下面看个示例代码。


4 整流程构建示例代码

这里以构建单算子 ( Identity Layer ) 网络为例,进行代码展示:

## 构建期
logger = trt.logger(trt.Logger.ERROR)
if os.path.isfile(trtFile):
  with open(trtFile, 'rb') as f:
    engineString = f.read()
else:
  builder = trt.Builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
  profile = builder.create_optimization_profile()
  config = builder.create_builder_config()
  config.max_workspace_size = 1 << 30
  inputTensor = network.add_input('inputT0', trt.DataType.FLOAT, [-1, -1, -1])
  profile.set_shape(inputTensor.name, [1, 1, 1], [3, 4, 5], [6, 7, 8])
  config.add_optimization_profile(profile)
  identityLayer = network.add_identity(inputTensor)
  network.mark_output(identityLayer.get_output(0))
  engineString = builder.build_serialized_network(network, config)
  with open(trtFile, 'wb') as f:
    f.write(engineString)
## 运行期
engine = trt.Runtime(logger).deserialize_cuda_engine(engineString)
context = engine.create_execution_context()
dataShape = [3, 4, 5]
context.set_binding_shape(0, dataShape)
data = np.arange(np.prod(dataShape), dtype=np.float32).reshape(*dataShape)
bufferH = [np.ascontiguousarray(data.reshape(-1))]
bufferD = [cudart.cudaMalloc(bufferH[0].nbytes)[1]]
cudart.cudaMemcpy(bufferD[0], bufferH[0].ctypes.data, bufferH[0].nbytes, cudart.cudaMemcpyKind.cudaMemcpyHostToDevice)   # Host -> Device
context.execute_v2(bufferD)
cudart.cudaMemcpy(bufferH[i].ctypes.data, bufferD[i], bufferH[i].nbytes, cudart.cudaMemcpyKind.cudaMemcpyDeviceToHost)   # Device -> Host
cudart.cudaFree(bufferD[0])


好了,以上分享了 TensorRT API 构建模型推理流程的方法。希望我的分享能对你的学习有一点帮助。


logo_show.gif

相关文章
|
1天前
|
人工智能 弹性计算 监控
【阿里云云原生专栏】阿里云云原生与AI结合:智能应用的快速构建与部署
【5月更文挑战第24天】阿里云融合云原生和AI技术,助力快速构建智能应用。弹性伸缩、CI/CD、微服务和自动化运维带来优势。通过需求分析、环境准备、数据处理、模型开发到服务部署,阿里云提供容器服务、函数计算、服务网格等工具,支持自动化测试和监控,实现一站式智能应用开发。示例代码展示创建ACK集群和部署AI模型服务过程。
223 1
|
2天前
|
机器学习/深度学习 数据采集 人工智能
构建一个基于AI的推荐系统的技术探索
【5月更文挑战第23天】本文探讨了构建基于AI的推荐系统的关键技术,包括数据收集、预处理、特征工程、推荐算法(如协同过滤、内容过滤、深度学习)及结果评估。通过理解用户行为和偏好,推荐系统能提供个性化建议。实现步骤涉及确定业务需求、设计数据方案、预处理、算法选择、评估优化及系统部署。随着技术进步,未来推荐系统将更加智能。
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
构建未来:AI驱动的自适应学习系统
【5月更文挑战第22天】 随着人工智能技术的迅猛发展,教育领域正在经历一场由数据驱动的革新。本文将探讨AI技术在构建自适应学习系统中的关键作用,分析其如何通过个性化教学方案提高学习效率,并预测未来发展趋势。我们将深入研究机器学习算法如何识别学习者的需求,实时调整教学内容和难度,以及AI如何帮助教师和学生在教育过程中实现更好的互动和反馈。
24 0
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
构建未来:AI在持续学习系统中的创新应用
【5月更文挑战第21天】 随着人工智能(AI)技术的不断进步,机器学习模型正变得更加复杂和高效。然而,这些模型往往需要大量的数据和计算资源来训练,并且一旦部署,就很难适应新的数据或环境。为了解决这个问题,研究人员正在开发新的AI技术,使得机器能够进行持续学习。本文将探讨这种新兴的AI技术,并讨论其在各种领域的应用潜力。
|
4天前
|
机器学习/深度学习 传感器 人工智能
构建未来:AI驱动的自适应交通管理系统
【5月更文挑战第21天】 在本文中,我们将探讨一个由人工智能(AI)技术驱动的自适应交通管理系统的架构和实现。该系统利用机器学习算法实时分析交通数据,预测并优化交通流,从而减少拥堵,提高道路使用效率。通过与传统交通管理方法的比较,我们展示了AI技术如何提升城市交通管理的智能化水平,以及这些技术对环境、经济和社会的潜在积极影响。
11 3
|
4天前
|
机器学习/深度学习 人工智能 算法
构建未来:AI在持续学习系统中的进化
【5月更文挑战第20天】 随着人工智能(AI)技术的迅猛发展,机器学习模型正变得越来越复杂。然而,真正的智能不仅仅在于处理大量数据和解决特定问题,而在于不断学习和适应新环境。本文将探讨AI如何通过持续学习系统进化,以实现更加智能化的未来。我们将分析最新的研究进展,包括神经网络的自适应调整、增强学习的新策略以及元学习框架的开发。通过这些技术,AI能够更好地理解复杂的模式,并在不断变化的环境中保持其性能。文章还将讨论实施这些系统所面临的挑战,以及可能的解决方案。
|
4天前
|
机器学习/深度学习 人工智能 自动驾驶
构建未来:AI技术在智能交通系统中的应用
【5月更文挑战第20天】 随着人工智能技术的飞速进步,其在现代交通系统中的应用日益广泛,从智能导航到自动车辆调度,AI正逐步改变我们的出行方式和交通管理。本文深入探讨了AI技术在智能交通系统中的多种应用,分析了其提升交通效率、增强安全性及减少环境影响的潜在能力。同时,讨论了实施这些技术所面临的挑战和未来的发展方向,为读者提供了一个关于AI如何塑造未来交通网络的全面视角。
|
5天前
|
机器学习/深度学习 人工智能 运维
构建高效自动化运维系统:DevOps与AI的融合
【5月更文挑战第19天】 在数字化转型的浪潮中,企业IT运维面临着日益复杂的挑战。传统的手动运维方式已经无法满足快速迭代和高可靠性的需求。本文探讨了如何通过结合DevOps理念和人工智能(AI)技术,构建一个高效的自动化运维系统。文章首先回顾了DevOps的核心原则及其在自动化运维中的应用,接着分析了AI如何增强故障预测、智能决策和自动化流程的能力。最后,提出了一个综合DevOps与AI技术的自动化运维框架,并讨论了其在实际部署中的优势和潜在挑战。
|
7天前
|
存储 人工智能 测试技术
[译][AI OpenAI-doc] 批处理 API
了解如何使用 OpenAI 的批处理 API 发送异步请求组,其成本降低 50%,具有一个独立的更高速率限制池,并提供明确的 24 小时完成时间。该服务非常适合处理不需要即时响应的作业。您也可以直接在这里查看 API 参考。
|
7天前
|
机器学习/深度学习 人工智能 算法
【AI】从零构建深度学习框架实践
【5月更文挑战第16天】 本文介绍了从零构建一个轻量级的深度学习框架tinynn,旨在帮助读者理解深度学习的基本组件和框架设计。构建过程包括设计框架架构、实现基本功能、模型定义、反向传播算法、训练和推理过程以及性能优化。文章详细阐述了网络层、张量、损失函数、优化器等组件的抽象和实现,并给出了一个基于MNIST数据集的分类示例,与TensorFlow进行了简单对比。tinynn的源代码可在GitHub上找到,目前支持多种层、损失函数和优化器,适用于学习和实验新算法。
69 2

热门文章

最新文章