0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Triton進(jìn)行高效的推理部署

NVIDIA英偉達(dá) ? 來源:NVIDIA英偉達(dá) ? 作者:NVIDIA英偉達(dá) ? 2022-04-10 15:06 ? 次閱讀

一個(gè)完整的醫(yī)療影像推理流程一般包含數(shù)據(jù)的前處理、AI 推理以及數(shù)據(jù)后處理這幾部分。通常情況下,我們可以通過 TensorRT, TensorFlow 或者 PyTorch 這些框架來實(shí)現(xiàn) GPU 加速的 AI 推理部分,然而數(shù)據(jù)前后處理部分往往是放在 CPU 上執(zhí)行的。對(duì)于一些比較大的數(shù)據(jù),比如 CT 或者 MR 這種 3D 圖像,CPU 上的數(shù)據(jù)前后處理會(huì)成為整個(gè)推理流程的瓶頸,導(dǎo)致推理的時(shí)延變長(zhǎng),GPU 使用效率不高。醫(yī)療影像推理的另一個(gè)需要考慮的問題是如何實(shí)現(xiàn)高效的部署。我們往往需要部署多個(gè)醫(yī)療影像 AI 應(yīng)用,那么如何去調(diào)度多個(gè)模型,如何并發(fā)處理多個(gè)請(qǐng)求,并充分利用 GPU 資源成為挑戰(zhàn)。

什么是 MONAI

MONAI 是一個(gè)專門針對(duì)醫(yī)療圖像的深度學(xué)習(xí)開源框架。MONAI 致力于:

  • 發(fā)展一個(gè)學(xué)術(shù)界、工業(yè)界和臨床研究人員共同合作的社區(qū);

  • 為醫(yī)療圖像創(chuàng)建最先進(jìn)的端到端工作流;

  • 為研究人員提供創(chuàng)建和評(píng)估深度學(xué)習(xí)模型的優(yōu)化和標(biāo)準(zhǔn)化的方法。

MONAI 中包含一系列的 transforms 對(duì)醫(yī)療圖像數(shù)據(jù)進(jìn)行前后處理。在 MONAI 0.7 中,我們?cè)?transforms 中引入基于 PyTorch Tensor 的計(jì)算,許多 transforms 既支持 NumPy array,也支持 PyTorch Tensor 作為輸入類型和計(jì)算后端。當(dāng)以 PyTorch Tensor 作為輸入數(shù)據(jù)時(shí),我們可以使用 GPU 來加速數(shù)據(jù)前后處理的計(jì)算。

什么是 NVIDIA Triton 推理服務(wù)器

Triton 推理服務(wù)器是一個(gè)開源的 AI 模型部署軟件,可以簡(jiǎn)化深度學(xué)習(xí)推理的大規(guī)模部署。它能夠?qū)Χ喾N框架(TensorFlow、TensorRT、PyTorch、ONNX Runtime 或自定義框架),在任何基于 GPU 或 CPU 的環(huán)境上(云、數(shù)據(jù)中心、邊緣)大規(guī)模部署經(jīng)過訓(xùn)練的 AI 模型。Triton 可提供高吞吐量推理,以實(shí)現(xiàn) GPU 使用率的最大化。

在較新的版本中,Triton 增加了 Python backend 這一新特性,Python backend 的目標(biāo)是讓使用者可以更加容易的部署 Python 寫的模型,無需再去編寫任何 C++ 代碼。在一些場(chǎng)景下,我們的推理流程中可能會(huì)出現(xiàn)循環(huán)、條件判斷、依賴于運(yùn)行時(shí)數(shù)據(jù)的控制流和其他自定義邏輯與模型混合執(zhí)行。使用 Triton Python backend,開發(fā)人員可以更加容易地在自己的推理流程中實(shí)現(xiàn)這些控制流,并且在 Python 模型中調(diào)用 Triton 部署的其他模型。

使用 MONAI 和 Triton 高效搭建和部署 GPU 加速的醫(yī)療影像推理流程

在本文介紹的例子中,我們將使用 MONAI 中 GPU 加速的數(shù)據(jù)處理以及 Triton 的 Python backend 來構(gòu)建一個(gè) GPU 加速的醫(yī)療影像推理流程。通過這個(gè)例子,讀者可以了解到,在 GPU 上進(jìn)行數(shù)據(jù)處理所帶來的性能增益,以及如何使用 Triton 進(jìn)行高效的推理部署。

整個(gè)推理流程如下圖所示,包含數(shù)據(jù)預(yù)處理,AI 模型推理,和數(shù)據(jù)后處理三部分。

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

通過 EnsureType 這個(gè) transform,我們將輸入數(shù)據(jù)轉(zhuǎn)換成 PyTorch Tensor 并放到 GPU 上,這樣之后的數(shù)據(jù)預(yù)處理操作都會(huì)在 GPU 上進(jìn)行。我們使用 Triton 的 Torch backend 來作為 3DUnet 的推理后端,輸出的結(jié)果為 GPU 上的 Torch Tensor,并作為后處理模塊的輸入,在 GPU 上進(jìn)行后處理計(jì)算。

使用 Triton 的 Python backend,我們可以非常容易的將整個(gè)流程串聯(lián)起來,即:按照 Triton Python backend 要求的模型結(jié)構(gòu)構(gòu)建前后處理的 Python 代碼,并在其中調(diào)用 3DUnet 的推理。以下是我們例子中的代碼片段。完整的代碼及復(fù)現(xiàn)步驟請(qǐng)見 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 數(shù)據(jù)作為輸入,經(jīng)過整個(gè)推理流程,將得到分割后的脾臟區(qū)域以及其輪廓。

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

性能測(cè)試

我們?cè)?RTX 8000 上對(duì)整個(gè)推理流程進(jìn)行了性能測(cè)試,以了解 Triton 及 MONAI 不同特性對(duì)性能的影響。

HTTP vs. gRPC vs. shared memory

目前 Triton 支持 HTTP, gRPC 和共享內(nèi)存等方式進(jìn)行數(shù)據(jù)通信。由于三維醫(yī)學(xué)圖像通常很大,通信帶來的開銷不容忽視。對(duì)于許多常見的醫(yī)學(xué)圖像人工智能應(yīng)用,客戶端與服務(wù)器位于同一臺(tái)機(jī)器上,因此使用共享內(nèi)存是減少發(fā)送/接收開銷的一種可行方法。在測(cè)試中,我們比較了客戶端和服務(wù)器之間使用不同通信方式對(duì)性能的影響。所有過程(前/后處理和AI推理)都在 GPU 上。我們可以得出結(jié)論,當(dāng)數(shù)據(jù)傳輸量很大時(shí),使用共享內(nèi)存將大大減少延遲。

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

Pre/Post-processing on GPU vs. CPU

接著我們測(cè)試了分別在 GPU 和 CPU 進(jìn)行前后數(shù)據(jù)處理時(shí),整個(gè)推理流程的速度。可以看到,當(dāng)使用 GPU 進(jìn)行數(shù)據(jù)處理時(shí),可以實(shí)現(xiàn) 12 倍的加速。

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


原文標(biāo)題:使用 MONAI 和 Triton 高效構(gòu)建和部署 GPU 加速的醫(yī)療影像推理流程

文章出處:【微信公眾號(hào):NVIDIA英偉達(dá)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4673

    瀏覽量

    128592
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    29806

    瀏覽量

    268103
  • Triton
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    7017

原文標(biāo)題:使用 MONAI 和 Triton 高效構(gòu)建和部署 GPU 加速的醫(yī)療影像推理流程

文章出處:【微信號(hào):NVIDIA_China,微信公眾號(hào):NVIDIA英偉達(dá)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    YOLOv6在LabVIEW中的推理部署(含源碼)

    YOLOv6 是美團(tuán)視覺智能部研發(fā)的一款目標(biāo)檢測(cè)框架,致力于工業(yè)應(yīng)用。如何使用python進(jìn)行該模型的部署,官網(wǎng)已經(jīng)介紹的很清楚了,但是對(duì)于如何在LabVIEW中實(shí)現(xiàn)該模型的部署,筆者目前還沒有看到
    的頭像 發(fā)表于 11-06 16:07 ?100次閱讀
    YOLOv6在LabVIEW中的<b class='flag-5'>推理</b><b class='flag-5'>部署</b>(含源碼)

    使用OpenVINO Model Server在哪吒開發(fā)板上部署模型

    OpenVINO Model Server(OVMS)是一個(gè)高性能的模型部署系統(tǒng),使用C++實(shí)現(xiàn),并在Intel架構(gòu)上的部署進(jìn)行了優(yōu)化,使用OpenVINO 進(jìn)行
    的頭像 發(fā)表于 11-01 14:19 ?141次閱讀
    使用OpenVINO Model Server在哪吒開發(fā)板上<b class='flag-5'>部署</b>模型

    使用OpenVINO C++在哪吒開發(fā)板上推理Transformer模型

    OpenVINO 是一個(gè)開源工具套件,用于對(duì)深度學(xué)習(xí)模型進(jìn)行優(yōu)化并在云端、邊緣進(jìn)行部署。它能在諸如生成式人工智能、視頻、音頻以及語言等各類應(yīng)用場(chǎng)景中加快深度學(xué)習(xí)推理的速度,且支持來自 PyTorch
    的頭像 發(fā)表于 10-12 09:55 ?244次閱讀
    使用OpenVINO C++在哪吒開發(fā)板上<b class='flag-5'>推理</b>Transformer模型

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8的模型部署推理演示

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?1334次閱讀
    基于OpenCV DNN實(shí)現(xiàn)YOLOv8的模型<b class='flag-5'>部署</b>與<b class='flag-5'>推理</b>演示

    Groq LPU崛起,AI芯片主戰(zhàn)場(chǎng)從訓(xùn)練轉(zhuǎn)向推理

    人工智能推理的重要性日益凸顯,高效運(yùn)行端側(cè)大模型及AI軟件背后的核心技術(shù)正是推理。不久的未來,全球芯片制造商的主要市場(chǎng)將全面轉(zhuǎn)向人工智能推理領(lǐng)域。
    的頭像 發(fā)表于 02-29 16:46 ?1063次閱讀

    使用NVIDIA Triton推理服務(wù)器來加速AI預(yù)測(cè)

    這家云計(jì)算巨頭的計(jì)算機(jī)視覺和數(shù)據(jù)科學(xué)服務(wù)使用 NVIDIA Triton 推理服務(wù)器來加速 AI 預(yù)測(cè)。
    的頭像 發(fā)表于 02-29 14:04 ?532次閱讀

    在AMD GPU上如何安裝和配置triton?

    最近在整理python-based的benchmark代碼,反過來在NV的GPU上又把Triton裝了一遍,發(fā)現(xiàn)Triton的github repo已經(jīng)給出了對(duì)應(yīng)的llvm的commit id以及對(duì)應(yīng)的編譯細(xì)節(jié),然后跟著走了一遍,也順利的安裝成功,只需要按照如下方式即可完
    的頭像 發(fā)表于 02-22 17:04 ?2190次閱讀
    在AMD GPU上如何安裝和配置<b class='flag-5'>triton</b>?

    【BBuf的CUDA筆記】OpenAI Triton入門筆記一

    這里來看官方的介紹:https://openai.com/research/triton ,從官方的介紹中我們可以看到OpenAI Triton的產(chǎn)生動(dòng)機(jī)以及它的目標(biāo)是什么,還可以看到一些經(jīng)典算法的實(shí)現(xiàn)例子展示。
    的頭像 發(fā)表于 01-23 10:00 ?2441次閱讀
    【BBuf的CUDA筆記】OpenAI <b class='flag-5'>Triton</b>入門筆記一

    利用NVIDIA產(chǎn)品技術(shù)組合提升用戶體驗(yàn)

    本案例通過利用NVIDIA TensorRT-LLM加速指令識(shí)別深度學(xué)習(xí)模型,并借助NVIDIA Triton推理服務(wù)器在NVIDIA V100 GPU上進(jìn)行高效
    的頭像 發(fā)表于 01-17 09:30 ?633次閱讀

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

    ,并且已經(jīng)在triton的main分支中,作為third_party進(jìn)行了官方支持,在clone triton的時(shí)候,只需要帶上recursive的flag就可以完成對(duì)triton-s
    的頭像 發(fā)表于 12-19 09:47 ?1060次閱讀
    什么是<b class='flag-5'>Triton</b>-shared?<b class='flag-5'>Triton</b>-shared的安裝和使用

    Triton編譯器的原理和性能

    Triton是一種用于編寫高效自定義深度學(xué)習(xí)原語的語言和編譯器。Triton的目的是提供一個(gè)開源環(huán)境,以比CUDA更高的生產(chǎn)力編寫快速代碼,但也比其他現(xiàn)有DSL具有更大的靈活性。Triton
    的頭像 發(fā)表于 12-16 11:22 ?2645次閱讀
    <b class='flag-5'>Triton</b>編譯器的原理和性能

    HarmonyOS:使用MindSpore Lite引擎進(jìn)行模型推理

    使用 MindSpore Lite 推理引擎進(jìn)行模型推理的通用開發(fā)流程。 基本概念 在進(jìn)行開發(fā)前,請(qǐng)先了解以下概念。 張量 :它與數(shù)組和矩陣非常相似,是 MindSpore Lite
    發(fā)表于 12-14 11:41

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】模型部署(以mobilenetV2為例)

    的,只不過主角這次換成了pulsar2: 1、先在服務(wù)器上訓(xùn)練好網(wǎng)絡(luò)模型,并以一個(gè)通用的中間形式導(dǎo)出(通常是onnx) 2、根據(jù)你要使用的推理引擎進(jìn)行離線轉(zhuǎn)換,把onnx轉(zhuǎn)換成你的推理引擎能
    發(fā)表于 12-10 16:34

    澎峰科技發(fā)布大模型推理引擎PerfXLLM

    要的巨額開銷也引發(fā)了相關(guān)研究者的關(guān)注。如何高效進(jìn)行推理,并盡可能地減少成本,從而促進(jìn)大模型應(yīng)用的落地成為了目前的關(guān)鍵問題。 于是,澎峰科技研發(fā)了一款 大模型推理引擎—PerfXLLM
    的頭像 發(fā)表于 11-25 15:35 ?1029次閱讀
    澎峰科技發(fā)布大模型<b class='flag-5'>推理</b>引擎PerfXLLM

    如何使用OpenVINO C++ API部署FastSAM模型

    象的位置和邊界。本文將介紹如何使用 OpenVINO C++ API 部署 FastSAM 模型,以實(shí)現(xiàn)快速高效的語義分割。在前文中我們發(fā)表了《基于 OpenVINO Python API 部署
    的頭像 發(fā)表于 11-17 09:53 ?827次閱讀
    如何使用OpenVINO C++ API<b class='flag-5'>部署</b>FastSAM模型