0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

NVIDIA TensorRT与Apache Beam SDK的集成

jf_pJlTbmA9 来源:NVIDIA 作者:NVIDIA 2023-07-05 16:30 次阅读

为大规模运行机器学习模型而加载和预处理数据通常需要将数据处理框架和推理机无缝拼接在一起。

在这篇文章中,我们将介绍 NVIDIA TensorRT 与 Apache Beam SDK 的集成,并展示如何将复杂的推理场景完全封装在数据处理管道中。我们还演示了如何通过几行代码处理来自批处理和流传输源的 TB 数据,以实现高吞吐量和低延迟模型推断。

NVIDIA TensorRT 是一个促进高性能机器学习推理的 SDK 。它设计用于 TensorFlow 、 PyTorch 和 MXNet 等深度学习框架。它专门致力于优化和运行一个经过训练的神经网络,以便在 NVIDIA 上高效地进行推理 GPU 。 TensorRT 可以通过多种优化最大化推理吞吐量,同时保持模型精度,包括模型量化、层和张量融合、内核自动调整、多流执行和有效的张量内存使用。

Dataflow 是一个无操作、无服务器的数据处理平台,经过 15 年以上的生产实践证明,可以批量或实时处理数据,用于分析、 ML 和应用程序用例。这些通常包括将预训练的模型合并到数据管道中。无论使用情况如何, Apache Beam 作为其 SDK 的使用使 DataFlow 能够利用强大的社区,简化您的数据架构,并通过 ML 提供见解。

构建 TensorRT 推理引擎

要将 TensorRT 与 Apache Beam 一起使用,在此阶段,您需要 converted TensorRT engine file from a trained model. 以下是如何将 TensorFlow 对象检测 SSD MobileNet v2 320 × 320 模型转换为 ONNX ,从 ONNX 构建 TensorRT 引擎,并在本地运行引擎。

TF 模型转换为 ONNX

要将 TensorFlow 对象检测 SSD MobileNet v2 320 × 320 转换为 ONNX ,请使用 one of the TensorRT example converters 。如果系统具有将在数据流中用于推断的相同 GPU ,则可以在本地系统上执行此操作。

要准备环境,请按照 Setup 中的说明进行操作。本文遵循本指南,直到 Create ONNX Graph 。使用– batch _ size 1 作为示例,我们将介绍仅使用批处理大小 1 的进一步工作。您可以将最终– onnx 文件命名为 ssd _ mobilenet _ v2 _ 320×320 _ coco17 _ tpu-8.onnx 。构建和运行在 GCP 中处理。

确保您设置的 GCP 项目具有正确的凭据和对 Dataflow 、 Google 云存储( GCS )和 Google 计算引擎( GCE )的 API 访问权限。有关详细信息,请参见 Create a Dataflow pipeline using Python

启动 GCE VM

您需要一台包含以下已安装资源的计算机:

NVIDIA T4 Tensor 核心 GPU

GPU 驱动器

Docker 公司

NVIDIA 容器工具包

您可以通过 creating a new GCE VM 执行此操作。按照说明操作,但使用以下设置:

Name: tensorrt-demo

GPU type: 环境 T4

Number of GPUs: 1

Machine type: n1-standard-2

如果你知道你使用的是大型模型,你可能需要一台更强大的机器。

Boot disk 部分,选择 CHANGE ,然后转到 PUBLIC IMAGES 选项卡。对于 Operating system ,选择 Linux 上的深度学习 。有很多版本,但请确保选择 CUDA 版本。版本 基于 Debian 10 的深度学习 VM 与 M98 适用于此示例。

其他设置可以保留为默认值。

接下来, connect to the VM using SSH 。如果系统提示您安装 NVIDIA 驱动程序,请安装。

在 VM 内部,运行以下命令以创建一些稍后使用的目录:

mkdir models
mkdir tensorrt_engines

有关详细信息,请参见 Create a VM with attached GPUs 。

建立形象

您需要一个自定义容器,其中包含执行 TensorRT 代码所需的依赖项: CUDA 、 cuDNN 和 TensorRT 。

您可以将以下示例 Dockerfile 复制到新文件中,并将其命名为tensor_rt.dockerfile .

ARG BUILD_IMAGE=nvcr.io/nvidia/tensorrt:22.09-py3

FROM ${BUILD_IMAGE} 

ENV PATH="/usr/src/tensorrt/bin:${PATH}"

WORKDIR /workspace

RUN pip install --no-cache-dir apache-beam[gcp]==2.42.0
COPY --from=apache/beam_python3.8_sdk:2.42.0 /opt/apache/beam /opt/apache/beam

RUN pip install --upgrade pip 
    && pip install torch>=1.7.1 
    && pip install torchvision>=0.8.2 
    && pip install pillow>=8.0.0 
    && pip install transformers>=4.18.0 
    && pip install cuda-python

ENTRYPOINT [ "/opt/apache/beam/boot" ]

查看 Docker file used for testing in the Apache Beam repo 。请记住,可能会有比本文所用版本更高版本的 Beam 可用。

通过在本地或在 GCE VM 中运行以下命令来构建映像:

docker build -f tensor_rt.dockerfile -t tensor_rt .

如果在本地执行此操作,请执行以下步骤。否则,您可以跳到下一节。

只有当您在不同于您打算构建 TensorRT 引擎的机器上创建图像时,才需要以下命令。对于这篇文章,请使用 Google Container Registry 。将图像标记为用于项目的 URI ,然后推送到注册表。确保用适当的值替换GCP_PROJECT和MY_DIR。

docker tag tensor_rt us.gcr.io/{GCP_PROJECT}/{MY_DIR}/tensor_rt
docker push us.gcr.io/{GCP_PROJECT}/{MY_DIR}/tensor_rt

创建 TensorRT 引擎

只有当您在不同于要构建 TensorRT 引擎的机器上创建图像时,才需要以下命令。从注册表中提取 TensorRT 图像:

docker pull us.gcr.io/{GCP_PROJECT}/{MY_DIR}/tensor_rt
docker tag us.gcr.io/{GCP_PROJECT}/{MY_DIR}/tensor_rt tensor_rt

如果 ONNX 模型不在 GCE VM 中,您可以将其从本地计算机复制到/models 目录:

gcloud compute scp ~/Downloads/ssd_mobilenet_v2_320x320_coco17_tpu-8.onnx tensorrt-demo:~/models --zone=us-central1-a

现在,您应该在 VM 中拥有 ONNX 模型和构建的 Docker 映像。现在是时候同时使用它们了。

以交互方式启动 Docker 容器:

docker run --rm -it --gpus all -v /home/{username}/:/mnt tensor_rt bash

从 ONNX 文件创建 TensorRT 引擎:

trtexec --onnx=/mnt/models/ssd_mobilenet_v2_320x320_coco17_tpu-8.onnx --saveEngine=/mnt/tensorrt_engines/ssd_mobilenet_v2_320x320_coco17_tpu-8.trt --useCudaGraph --verbose

现在,您应该可以在 VM 的/tensorrt_engines目录中看到ssd_mobilenet_v2_320x320_coco17_tpu-8.trt文件。

将 TensorRT 引擎上传至 GCS

将文件复制到 GCP 。如果您在将文件直接从 GCE 上传到 GCS 时遇到gsutil 问题,您可能必须首先将其复制到本地计算机。

gcloud compute scp tensorrt-demo:~/tensorrt_engines/ssd_mobilenet_v2_320x320_coco17_tpu-8.trt ~/Downloads/ --zone=us-central1-a

在 GCP 控制台中,将 TensorRT 引擎文件上传到您选择的 GCS 存储桶:

gs://{GCS_BUCKET}/ssd_mobilenet_v2_320x320_coco17_tpu-8.trt

本地测试 TensorRT 引擎

确保您拥有使用 TensorRT RunInference 的 Beam 管道。一个示例是 tensorrt_object_detection.py ,您可以通过在 GCE VM 中运行以下命令来遵循该示例。首先键入 Ctrl + D 退出 Docker 容器。

git clone https://github.com/apache/beam.git
cd beam/sdks/python
pip install --upgrade pip setuptools
pip install -r build-requirements.txt
pip install --user -e ."[gcp,test]"

您还创建了一个名为image_file_names.txt的文件,其中 包含图像的路径。图像可以在 GCS 之类的对象存储中,也可以在 GCE VM 中。

gs://{GCS_BUCKET}/000000289594.jpg
gs://{GCS_BUCKET}/000000000139.jpg

然后,运行以下命令:

docker run --rm -it --gpus all -v /home/{username}/:/mnt -w /mnt/beam/sdks/python tensor_rt python -m apache_beam.examples.inference.tensorrt_object_detection --input gs://{GCS_BUCKET}/tensorrt_image_file_names.txt --output /mnt/tensorrt_predictions.csv --engine_path gs://{GCS_BUCKET}/ssd_mobilenet_v2_320x320_coco17_tpu-8.trt

现在您应该看到一个名为tensorrt_predictions.csv . 的文件。每行都有用分号分隔的数据。

第一项是文件名。

第二项是字典列表,其中每个字典对应一个检测。

检测包含框坐标( ymin 、 xmin 、 ymax 、 xmax )、分数和类别。

有关如何在本地设置和运行 TensorRT RunInference 的更多信息,请遵循 Object Detection 部分中的说明。

TensorRT Support Guide 概述了 GitHub 和产品包中所有支持的 NVIDIA TensorRT 8.5.1 示例。这些示例旨在展示如何在众多用例中使用 TensorRT ,同时突出显示界面的不同功能。这些示例在推荐器、机器理解、字符识别、图像分类和对象检测等用例中特别有用。

使用 DataFlow RunInference 运行 TensorRT 引擎

现在您有了 TensorRT 引擎,就可以在 Dataflow 上运行管道了。

下面的代码示例是管道的一部分,您可以使用TensorRTEngineHandlerNumPy加载 TensorRT 引擎并设置其他推断参数。然后读取图像,进行预处理以将关键点附加到图像,进行预测,然后写入 GCS 中的文件。

有关完整代码示例的更多信息,请参见 tensorrt_object_detection.py 。

  engine_handler = KeyedModelHandler(
      TensorRTEngineHandlerNumPy(
          min_batch_size=1,
          max_batch_size=1,
          engine_path=known_args.engine_path))

  with beam.Pipeline(options=pipeline_options) as p:
    filename_value_pair = (
        p
        | 'ReadImageNames' >> beam.io.ReadFromText(known_args.input)
        | 'ReadImageData' >> beam.Map(
            lambda image_name: read_image(
                image_file_name=image_name, path_to_dir=known_args.images_dir))
        | 'AttachImageSizeToKey' >> beam.Map(attach_im_size_to_key)
        | 'PreprocessImages' >> beam.MapTuple(
            lambda file_name, data: (file_name, preprocess_image(data))))
    predictions = (
        filename_value_pair
        | 'TensorRTRunInference' >> RunInference(engine_handler)
        | 'ProcessOutput' >> beam.ParDo(PostProcessor()))

    _ = (
        predictions | "WriteOutputToGCS" >> beam.io.WriteToText(
            known_args.output,
            shard_name_template='',
            append_trailing_newlines=True))

确保您已完成上一节中提到的 Google Cloud 设置。您还必须具有 Beam SDK installed 。

要在 Dataflow 上运行此作业,请在本地运行以下命令:

python -m apache_beam.examples.inference.tensorrt_object_detection 
--input gs://{GCP_PROJECT}/image_file_names.txt 
--output gs://{GCP_PROJECT}/predictions.txt 
--engine_path gs://{GCP_PROJECT}/ssd_mobilenet_v2_320x320_coco17_tpu-8.trt 
--runner DataflowRunner 
--experiment=use_runner_v2 
--machine_type=n1-standard-4 
--experiment="worker_accelerator=type:nvidia-tesla-t4;count:1;install-nvidia-driver" 
--disk_size_gb=75 
--project {GCP_PROJECT} 
--region us-central1 
--temp_location gs://{GCP_PROJECT}/tmp/ 
--job_name tensorrt-object-detection 
--sdk_container_image="us.gcr.io/{GCP_PROJECT}/{MY_DIR}/tensor_rt tensor_rt"

根据模型的大小限制,您可能需要调整 machine _ type 、 GPU 的类型和计数或 disk _ size _ gb 。有关梁管道选项的详细信息,请参见 Set Dataflow pipeline options 。

TensorRT 和 TensorFlow 目标检测基准

为了进行基准测试,我们决定在前面提到的 SSD MobileNet v2 320 × 320 模型的 TensorRT 和 TensorFlow 对象检测版本之间进行比较。

在 TensorRT 和 TensorFlow 对象检测版本中,每个推理调用都是定时的。我们计算了平均 5000 个推断调用,由于延迟增加,没有考虑前 10 个图像。我们使用的 SSD 型号是小型型号。当您的模型可以充分利用 GPU 时,您将观察到更好的加速。

首先,我们将 TensorFlow 和 TensorRT 之间的直接性能加速与本地基准进行了比较。我们旨在证明 TensorRT 上降低精度模式的额外优势。

Framework and precision Inference latency (ms)
TensorFlow Object Detection FP32 (end-to-end) 29.47 ms
TensorRT FP32 (end-to-end) 3.72 ms
TensorRT FP32 (GPU compute) 2.39 ms
TensorRT FP16 (GPU compute) 1.48 ms
TensorRT INT8 (GPU compute) 1.34 ms

表 1 。 TensorRT 上的直接性能加速

TensorRT FP32 的总体加速为 7.9x 。端到端包括数据副本,而 GPU 计算仅包括实际推断时间。我们这样做是因为示例模型很小。在这种情况下,端到端 TensorRT 延迟主要是数据拷贝。在更大的模型中使用不同的精度可以看到更显著的端到端性能改进,尤其是在推理计算是瓶颈而不是数据拷贝的情况下。

FP16 比 FP32 快 1.6 倍,没有精度损失。 INT8 比 FP32 快 1.8 倍,但有时精度会降低,需要校准过程。精度下降是特定于模型的,因此尝试您的精度并查看产生的精度总是很好的。

使用 NVIDIA QAT 工具包的量化网络也可以缓解此问题。有关详细信息,请参见 Accelerating Quantized Networks with the NVIDIA QAT Toolkit for TensorFlow and NVIDIA TensorRT 和 NVIDIA TensorRT Developer Guide .

数据流基准测试

在 Dataflow 中,使用早期实验中生成的 TensorRT 引擎,我们使用以下配置运行:n1-standard-4 machine、disk_size_gb=75和 10 个工作人员。

为了模拟通过PubSub进入 Dataflow 的数据流,我们将批大小设置为 1 。这是通过将ModelHandlers设置为最小和最大批量大小为 1 来实现的。

Stage with RunInference Mean inference_batch_latency_micro_secs
TensorFlow with T4 GPU 12 min 43 sec 99,242
TensorRT with T4 GPU 7 min 20 sec 10,836

表 2 。数据流基准

Dataflow runner 将管道分解为多个阶段。通过查看包含推理调用的阶段,而不是读取和写入数据的其他阶段,可以更好地了解RunInference的性能。这在 Stage with RunInference 列中。

对于这个度量, TensorRT 只花费 TensorFlow 运行时间的 57% 。如果你适应一个完全使用 GPU 处理能力的更大模型,你预计加速度会增长。

度量推理_ batch _ latency _ micro _ secs 是对一批示例执行推理所需的时间(以微秒为单位),即调用model_handler.run_inference的时间。这随着时间的推移而变化,这取决于BatchElements的动态批处理决策以及元素的特定值或dtype值。对于这个度量,您可以看到 TensorRT 比 TensorFlow 快 9.2 倍。

结论

在这篇文章中,我们演示了如何通过无缝拼接数据处理框架( Apache Beam )和推理引擎( TensorRT )来大规模运行机器学习模型。我们提供了一个端到端的示例,说明如何将推理工作负载完全集成到数据处理管道中。

这种集成实现了一种新的推理流水线,该流水线有助于通过更好的 NVIDIA GPU 利用率和大大提高的推理延迟和吞吐量来降低生产推理成本。使用许多现成的 TensorRT 样本,相同的方法可以应用于许多其他推断工作负载。未来,我们计划进一步自动化 TensorRT 引擎构建,并致力于 TensorRT 与 Apache Beam 的深度集成。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4596

    浏览量

    101747
  • AI
    AI
    +关注

    关注

    87

    文章

    26461

    浏览量

    264088
  • 机器学习
    +关注

    关注

    66

    文章

    8128

    浏览量

    130571
收藏 人收藏

    评论

    相关推荐

    NVIDIA JETSON载板设计开发教程 NVIDIA SDK Manager对载板进行自定义

    NVIDIA SDK Manager 是在 NVIDIA Jetson 开发者套件 上安装 NVIDIA JetPack SDK 的必备工具
    的头像 发表于 07-28 17:10 1331次阅读
    <b class='flag-5'>NVIDIA</b> JETSON载板设计开发教程 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>SDK</b> Manager对载板进行自定义

    MathWorks 宣布 MATLAB 与 NVIDIA TensorRT 集成来加快人工智能应用

    MathWorks 今日宣布 ,MATLAB 现在可通过 GPU Coder 实现与 NVIDIA TensorRT 集成。这可以帮助工程师和科学家们在 MATLAB 中开发新的人工智能和深度学习模型,且可确保性能和效率满足数据
    的头像 发表于 04-11 16:26 1w次阅读

    Grid SDK是否与Nvidia Quadro K1200兼容?

    嗨,我想知道网格sdk是否与Nvidia Quadro K1200兼容?我一直在尝试使用NvFBC,但我一直在“这个硬件不支持NvFBC”是一个错误,所以我决定在Nvidia论坛上提问。先谢谢你
    发表于 09-14 10:31

    NVIDIA DRIVE OS 5.2.6 Linux SDK发布 为加速计算和AI而设计

    DRIVE SDK的基础,NVIDIA DRIVE OS专为加速计算和AI而设计。它包括用于高效并行计算的NVIDIA CUDA、用于实时AI推理的NVIDIA
    的头像 发表于 09-03 15:03 7012次阅读

    利用NVIDIA TensorRT实现推理的QAT伪量化

    在这篇文章中,我们简要介绍了基本的量化概念和 TensorRT 的量化工具箱,然后回顾了 TensorRT 8 . 0 是如何处理 Q / DQ 网络的。我们对量化工具箱提供的 resnet50qat 示例进行了快速演练。
    的头像 发表于 03-31 16:51 3213次阅读

    NVIDIA TensorRT 8 BERT在1.2毫秒内进行推断

      TensorRT 是一个用于高性能深度学习推理的 SDK ,包括推理优化器和运行时,提供低延迟和高吞吐量。 TensorRT 用于医疗、汽车、制造、互联网/电信服务、金融服务、能源等行业,下载量近 250 万次。
    的头像 发表于 03-31 17:05 1502次阅读

    NVIDIA TensorRT 8.2将推理速度提高6倍

      TensorRT 是一款高性能的深度学习推理优化器和运行时,为人工智能应用程序提供低延迟、高吞吐量推理。 TensorRT 用于医疗、汽车、制造、互联网/电信服务、金融服务和能源等多个行业。
    的头像 发表于 03-31 17:10 1505次阅读

    NVIDIA SDK 3.0新硬件功能介绍

    NVIDIA 图灵架构引入了一种新的硬件功能,用于以非常高的性能计算一对图像之间的光流。 NVIDIA 光流 SDK 公开了使用这种光流硬件(也称为 NVOFA )加速应用程序的 API 。我们很高兴地宣布光流
    的头像 发表于 04-20 16:31 2401次阅读

    NVIDIA T4 GPU和TensorRT加速微信搜索速度

      使用NVIDIA T4 GPU以及TensorRT推理引擎进行INT8低精度推理,极大提升了微信搜索的速度,进一步提升了用户体验,节约了公司成本。
    的头像 发表于 04-21 10:53 1305次阅读

    NVIDIA TensorRT支持矩阵中的流控制结构层部分

      NVIDIA TensorRT 支持循环结构,这对于循环网络很有用。 TensorRT 循环支持扫描输入张量、张量的循环定义以及“扫描输出”和“最后一个值”输出。
    的头像 发表于 05-13 16:57 789次阅读

    NVIDIA TensorRT和DLA分析

      位于 GitHub 存储库中的sampleMNIST演示了如何导入经过训练的模型、构建 TensorRT 引擎、序列化和反序列化引擎,最后使用引擎执行推理。
    的头像 发表于 05-18 10:06 2608次阅读

    NVIDIA TensorRT网络层详解

    TensorRT 中,层代表了不同风格的数学或编程操作。以下部分描述了 TensorRT 支持的每一层。 TensorRT 所需的最小工作空间取决于网络使用的算子。
    的头像 发表于 05-20 14:38 1988次阅读

    NVIDIA TensorRT插件的全自动生成工具

    NVIDIA TensorRT 是性能最优、应用最广的 GPU 推理框架,但用户常常因为不支持的算子而面临手写插件的痛点。为此,腾讯 TEG 与 NVIDIA 联合开发了一款能自动生成插件的工具
    的头像 发表于 07-18 10:13 869次阅读

    即刻报名第三届 NVIDIA TensorRT Hackathon 生成式 AI 模型优化赛

    近日,由阿里云及 NVIDIA 联合举办的 “NVIDIA TensorRT Hackathon 2023 生成式 AI 模型优化赛”已正式启动。此大赛是由阿里云天池组织运营,TensorRT
    的头像 发表于 07-17 19:45 337次阅读
    即刻报名第三届 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b> Hackathon 生成式 AI 模型优化赛

    学习资源 | NVIDIA TensorRT 全新教程上线

    NVIDIA TensorRT   是一个用于高效实现已训练好的深度学习模型推理过程的软件开发工具包,内含推理优化器和运行环境两部分,其目的在于让深度学习模型能够在 GPU 上以更高吞吐量和更低
    的头像 发表于 08-04 17:45 470次阅读
    学习资源 | <b class='flag-5'>NVIDIA</b> <b class='flag-5'>TensorRT</b> 全新教程上线