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

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

3天内不再提示

如何使用Triton进行高效的推理部署

NVIDIA英伟达 来源:NVIDIA英伟达 作者:NVIDIA英伟达 2022-04-10 15:06 次阅读

一个完整的医疗影像推理流程一般包含数据的前处理、AI 推理以及数据后处理这几部分。通常情况下,我们可以通过 TensorRT, TensorFlow 或者 PyTorch 这些框架来实现 GPU 加速的 AI 推理部分,然而数据前后处理部分往往是放在 CPU 上执行的。对于一些比较大的数据,比如 CT 或者 MR 这种 3D 图像,CPU 上的数据前后处理会成为整个推理流程的瓶颈,导致推理的时延变长,GPU 使用效率不高。医疗影像推理的另一个需要考虑的问题是如何实现高效的部署。我们往往需要部署多个医疗影像 AI 应用,那么如何去调度多个模型,如何并发处理多个请求,并充分利用 GPU 资源成为挑战。

什么是 MONAI

MONAI 是一个专门针对医疗图像的深度学习开源框架。MONAI 致力于:

  • 发展一个学术界、工业界和临床研究人员共同合作的社区;

  • 为医疗图像创建最先进的端到端工作流;

  • 为研究人员提供创建和评估深度学习模型的优化和标准化的方法。

MONAI 中包含一系列的 transforms 对医疗图像数据进行前后处理。在 MONAI 0.7 中,我们在 transforms 中引入基于 PyTorch Tensor 的计算,许多 transforms 既支持 NumPy array,也支持 PyTorch Tensor 作为输入类型和计算后端。当以 PyTorch Tensor 作为输入数据时,我们可以使用 GPU 来加速数据前后处理的计算。

什么是 NVIDIA Triton 推理服务器

Triton 推理服务器是一个开源的 AI 模型部署软件,可以简化深度学习推理的大规模部署。它能够对多种框架(TensorFlow、TensorRT、PyTorch、ONNX Runtime 或自定义框架),在任何基于 GPU 或 CPU 的环境上(云、数据中心、边缘)大规模部署经过训练的 AI 模型。Triton 可提供高吞吐量推理,以实现 GPU 使用率的最大化。

在较新的版本中,Triton 增加了 Python backend 这一新特性,Python backend 的目标是让使用者可以更加容易的部署 Python 写的模型,无需再去编写任何 C++ 代码。在一些场景下,我们的推理流程中可能会出现循环、条件判断、依赖于运行时数据的控制流和其他自定义逻辑与模型混合执行。使用 Triton Python backend,开发人员可以更加容易地在自己的推理流程中实现这些控制流,并且在 Python 模型中调用 Triton 部署的其他模型。

使用 MONAI 和 Triton 高效搭建和部署 GPU 加速的医疗影像推理流程

在本文介绍的例子中,我们将使用 MONAI 中 GPU 加速的数据处理以及 Triton 的 Python backend 来构建一个 GPU 加速的医疗影像推理流程。通过这个例子,读者可以了解到,在 GPU 上进行数据处理所带来的性能增益,以及如何使用 Triton 进行高效的推理部署。

整个推理流程如下图所示,包含数据预处理,AI 模型推理,和数据后处理三部分。

4e1ff448-b7af-11ec-aa7f-dac502259ad0.png

通过 EnsureType 这个 transform,我们将输入数据转换成 PyTorch Tensor 并放到 GPU 上,这样之后的数据预处理操作都会在 GPU 上进行。我们使用 Triton 的 Torch backend 来作为 3DUnet 的推理后端,输出的结果为 GPU 上的 Torch Tensor,并作为后处理模块的输入,在 GPU 上进行后处理计算。

使用 Triton 的 Python backend,我们可以非常容易的将整个流程串联起来,即:按照 Triton Python backend 要求的模型结构构建前后处理的 Python 代码,并在其中调用 3DUnet 的推理。以下是我们例子中的代码片段。完整的代码及复现步骤请见 Github:

https://github.com/Project-MONAI/tutorials/tree/master/full_gpu_inference_pipeline

class TritonPythonModel:      """     Your Python model must use the same class name. Every Python model     that is created must have "TritonPythonModel" as the class name.     """        def initialize(self, args):          """         `initialize` is called only once when the model is being loaded.         Implementing `initialize` function is optional. This function allows         the model to intialize any state associated with this model.         """          self.inference_device_id = args.get("model_instance_device_id", "0")          infer_transforms = []          infer_transforms.append(EnsureType(device=torch.device(f"cuda:{self.inference_device_id}")))          infer_transforms.append(AddChannel())          infer_transforms.append(ScaleIntensityRange(a_min=-57, a_max=164, b_min=0.0, b_max=1.0, clip=True))          infer_transforms.append(CropForeground())          infer_transforms.append(Resize(spatial_size=(224, 224, 224)))          self.pre_transforms = Compose(infer_transforms)        def execute(self, requests):          """         `execute` must be implemented in every Python model. `execute`         function receives a list of pb_utils.InferenceRequest as the only         argument. This function is called when an inference is requested         for this model. Depending on the batching configuration (e.g. Dynamic         Batching) used, `requests` may contain multiple requests. Every         Python model, must create one pb_utils.InferenceResponse for every         pb_utils.InferenceRequest in `requests`. If there is an error, you can         set the error argument when creating a pb_utils.InferenceResponse.         """          responses = []            for request in requests:              # get the input by name (as configured in config.pbtxt)              input_triton_tensor = pb_utils.get_input_tensor_by_name(request, "INPUT0")              # convert the triton tensor to torch tensor              input_torch_tensor = from_dlpack(input_triton_tensor.to_dlpack())              transform_output = self.pre_transforms(input_torch_tensor[0])              transform_output_batched = transform_output.unsqueeze(0)              # convert the torch tensor to triton tensor              transform_tensor = pb_utils.Tensor.from_dlpack("INPUT__0", to_dlpack(transform_output_batched))              # send inference request to 3DUnet served by Triton. The name of the model is "segmentation_3d"              inference_request = pb_utils.InferenceRequest(                  model_name="3dunet", requested_output_names=["OUTPUT__0"], inputs=[transform_tensor]              )                infer_response = inference_request.exec()              output1 = pb_utils.get_output_tensor_by_name(infer_response, "OUTPUT__0")              # convert the triton tensor to torch tensor              output_tensor = from_dlpack(output1.to_dlpack())                # do the post process              argmax = AsDiscrete(argmax=True)(output_tensor[0])              largest = KeepLargestConnectedComponent(applied_labels=1)(argmax)              contour = LabelToContour()(largest)              out_tensor_0 = pb_utils.Tensor.from_dlpack("MASK", to_dlpack(largest.unsqueeze(0)))              out_tensor_1 = pb_utils.Tensor.from_dlpack("CONTOUR", to_dlpack(contour.unsqueeze(0)))              inference_response = pb_utils.InferenceResponse(output_tensors=[out_tensor_0, out_tensor_1])              responses.append(inference_response)          return responses        def finalize(self):          """         `finalize` is called only once when the model is being unloaded.         Implementing `finalize` function is optional. This function allows         the model to perform any necessary clean ups before exit.         """  pass

以 MSD Spleen 3D 数据作为输入,经过整个推理流程,将得到分割后的脾脏区域以及其轮廓。

4e38a68c-b7af-11ec-aa7f-dac502259ad0.png

性能测试

我们在 RTX 8000 上对整个推理流程进行了性能测试,以了解 Triton 及 MONAI 不同特性对性能的影响。

HTTP vs. gRPC vs. shared memory

目前 Triton 支持 HTTP, gRPC 和共享内存等方式进行数据通信。由于三维医学图像通常很大,通信带来的开销不容忽视。对于许多常见的医学图像人工智能应用,客户端与服务器位于同一台机器上,因此使用共享内存是减少发送/接收开销的一种可行方法。在测试中,我们比较了客户端和服务器之间使用不同通信方式对性能的影响。所有过程(前/后处理和AI推理)都在 GPU 上。我们可以得出结论,当数据传输量很大时,使用共享内存将大大减少延迟。

4e4ef464-b7af-11ec-aa7f-dac502259ad0.png

Pre/Post-processing on GPU vs. CPU

接着我们测试了分别在 GPU 和 CPU 进行前后数据处理时,整个推理流程的速度。可以看到,当使用 GPU 进行数据处理时,可以实现 12 倍的加速。

4e5fe38c-b7af-11ec-aa7f-dac502259ad0.png


原文标题:使用 MONAI 和 Triton 高效构建和部署 GPU 加速的医疗影像推理流程

文章出处:【微信公众号:NVIDIA英伟达】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁

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

    关注

    27

    文章

    4603

    浏览量

    128201
  • AI
    AI
    +关注

    关注

    87

    文章

    29012

    浏览量

    266444
  • Triton
    +关注

    关注

    0

    文章

    16

    浏览量

    7009

原文标题:使用 MONAI 和 Triton 高效构建和部署 GPU 加速的医疗影像推理流程

文章出处:【微信号:NVIDIA_China,微信公众号:NVIDIA英伟达】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于OpenCV DNN实现YOLOv8的模型部署推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 1095次阅读
    基于OpenCV DNN实现YOLOv8的模型<b class='flag-5'>部署</b>与<b class='flag-5'>推理</b>演示

    使用NVIDIA Triton推理服务器来加速AI预测

    这家云计算巨头的计算机视觉和数据科学服务使用 NVIDIA Triton 推理服务器来加速 AI 预测。
    的头像 发表于 02-29 14:04 466次阅读

    在AMD GPU上如何安装和配置triton

    最近在整理python-based的benchmark代码,反过来在NV的GPU上又把Triton装了一遍,发现Triton的github repo已经给出了对应的llvm的commit id以及对应的编译细节,然后跟着走了一遍,也顺利的安装成功,只需要按照如下方式即可完
    的头像 发表于 02-22 17:04 2027次阅读
    在AMD GPU上如何安装和配置<b class='flag-5'>triton</b>?

    【BBuf的CUDA笔记】OpenAI Triton入门笔记一

    这里来看官方的介绍:https://openai.com/research/triton ,从官方的介绍中我们可以看到OpenAI Triton的产生动机以及它的目标是什么,还可以看到一些经典算法的实现例子展示。
    的头像 发表于 01-23 10:00 2272次阅读
    【BBuf的CUDA笔记】OpenAI <b class='flag-5'>Triton</b>入门笔记一

    利用NVIDIA产品技术组合提升用户体验

    本案例通过利用NVIDIA TensorRT-LLM加速指令识别深度学习模型,并借助NVIDIA Triton推理服务器在NVIDIA V100 GPU上进行高效
    的头像 发表于 01-17 09:30 576次阅读

    什么是Triton-shared?Triton-shared的安装和使用

    ,并且已经在triton的main分支中,作为third_party进行了官方支持,在clone triton的时候,只需要带上recursive的flag就可以完成对triton-s
    的头像 发表于 12-19 09:47 888次阅读
    什么是<b class='flag-5'>Triton</b>-shared?<b class='flag-5'>Triton</b>-shared的安装和使用

    Triton编译器的原理和性能

    Triton是一种用于编写高效自定义深度学习原语的语言和编译器。Triton的目的是提供一个开源环境,以比CUDA更高的生产力编写快速代码,但也比其他现有DSL具有更大的灵活性。Triton
    的头像 发表于 12-16 11:22 2292次阅读
    <b class='flag-5'>Triton</b>编译器的原理和性能

    HarmonyOS:使用MindSpore Lite引擎进行模型推理

    使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开发前,请先了解以下概念。 张量 :它与数组和矩阵非常相似,是 MindSpore Lite
    发表于 12-14 11:41

    【爱芯派 Pro 开发板试用体验】模型部署(以mobilenetV2为例)

    的,只不过主角这次换成了pulsar2: 1、先在服务器上训练好网络模型,并以一个通用的中间形式导出(通常是onnx) 2、根据你要使用的推理引擎进行离线转换,把onnx转换成你的推理引擎能
    发表于 12-10 16:34

    澎峰科技发布大模型推理引擎PerfXLLM

    要的巨额开销也引发了相关研究者的关注。如何高效进行推理,并尽可能地减少成本,从而促进大模型应用的落地成为了目前的关键问题。 于是,澎峰科技研发了一款 大模型推理引擎—PerfXLLM
    的头像 发表于 11-25 15:35 935次阅读
    澎峰科技发布大模型<b class='flag-5'>推理</b>引擎PerfXLLM

    Hugging Face LLM部署大语言模型到亚马逊云科技Amazon SageMaker推理示例

     本篇文章主要介绍如何使用新的Hugging Face LLM推理容器将开源LLMs,比如BLOOM大型语言模型部署到亚马逊云科技Amazon SageMaker进行推理的示例。我们将
    的头像 发表于 11-01 17:48 784次阅读
    Hugging Face LLM<b class='flag-5'>部署</b>大语言模型到亚马逊云科技Amazon SageMaker<b class='flag-5'>推理</b>示例

    周四研讨会预告 | 注册报名 NVIDIA AI Inference Day - 大模型推理线上研讨会

    ,使用 NVIDIA Triton TM  推理服务器进行端到端部署 LLM Serving,以及金融行业的 AI、NLP/LLM 应用场景、客户案例。 通过本次活动,您将了解基于上述
    的头像 发表于 10-26 09:05 289次阅读

    ROS部署PaddlePaddle的CV模型

    paddle_inference_ros_demo功能包是基于paddle_inference_ros开发的,帮助开发者快速体验paddle_inference在ROS环境下的推理部署效果的功能包。可以直接进入该项目链接进行查看
    的头像 发表于 10-20 17:02 598次阅读
    ROS<b class='flag-5'>部署</b>PaddlePaddle的CV模型

    基于OpenVINO Python API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,我们将在 Python、C++、C# 三个
    的头像 发表于 10-20 11:15 794次阅读
    基于OpenVINO Python API<b class='flag-5'>部署</b>RT-DETR模型

    介绍一款基于昆仑芯AI加速卡的高效模型推理部署框架

    昆仑芯科技公众号全新栏目“用芯指南”重磅推出!面向AI行业技术从业者,系列好文将提供手把手的昆仑芯产品使用指南。第一期围绕昆仑芯自研效能工具——昆仑芯Anyinfer展开,这是一款基于昆仑芯AI加速卡的高效模型推理部署框架。种种
    的头像 发表于 10-17 11:16 1533次阅读
    介绍一款基于昆仑芯AI加速卡的<b class='flag-5'>高效</b>模型<b class='flag-5'>推理</b><b class='flag-5'>部署</b>框架