国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Torchserve在轉轉GPU推理架構中的實踐

開發(fā) 前端
torchserve在轉轉GPU推理服務系統(tǒng)里的落地是一次平衡開發(fā)效率與系統(tǒng)性能的工程實踐,總體上達到了計劃目標并且取得了業(yè)務價值。

1 背景

轉轉面向二手電商業(yè)務,在搜索推薦、智能質檢、智能客服等場景落地了AI技術。在實踐的過程中,也發(fā)現了存在GPU執(zhí)行優(yōu)化不充分,浪費計算資源,增加應用成本等問題。

此外還存在線上線下處理邏輯需要分別開發(fā)的情況,造成額外的開發(fā)成本和錯誤排查成本,對一些需要高速迭代的業(yè)務場景的負面影響不可忽視。本文將會重點介紹基于Torchserve進行推理服務部署架構優(yōu)化的工程實踐,希望對面臨類似問題的同學們有所幫助。

2 問題和解決思路

2.1 現狀分析

圖片圖片

上圖為之前的推理系統(tǒng)架構圖,采用CPU和GPU分離的架構。這種架構的特點是:

GPU部分和CPU部分解耦分別部署微服務,預處理部分一般是在CPU上執(zhí)行,容易成為推理服務的性能瓶頸。解耦后可以將CPU部分部署在單獨的機器上,無限水平擴容擴容。

圖片圖片

上圖為美團通用高效的推理服務部署架構方案,可以看到架構思路基本相同。

2.2 問題

該方案具有很大的優(yōu)點,也是業(yè)界多個公司采取的方案,但是架構的選項也需要考慮具體的業(yè)務場景。該方案在轉轉的的場景里就出現了一些問題,比如:

  • 迭代效率:GPU執(zhí)行部分的是基于torch或者tf的模型,可以接近0成本的部署到推理微服務上,但是CPU執(zhí)行部分包含一些預處理、后處理的部分,除了一些常見的圖像解碼、縮放、NMS等操作,還有很多自定義的邏輯,難以通過統(tǒng)一協(xié)議進行低成本部署,需要在微服務里進行二次開發(fā),并且大部分情況下需要采用和離線算法實現不同的開發(fā)語言,拖累業(yè)務迭代效率。當前業(yè)界算法工程師的主要工作語言為python,對其他的語言或者dsl都存在一定的學習成本。
  • 網絡通信:轉轉的部分業(yè)務場景存在圖片尺寸較大的情況,因為二手的某些質檢場景需要高清圖片判斷有沒有破損、劃痕、污漬等細小痕跡。這樣微服務之間的網絡通信開銷負擔比一般場景大很多。

2.3 解決思路

2.3.1框架調研

深度學習模型的常見的部署框架有以下幾個:

特性

Triton

TorchServe

TensorFlow Serving

支持的框架

多種深度學習框架,包括 TensorFlow、PyTorch、ONNX、TensorRT、OpenVINO 等

專為 PyTorch 設計,支持 PyTorch 模型

專為 TensorFlow 設計,支持 TensorFlow 模型

性能

高性能推理服務器,支持動態(tài)批處理、模型并行、多模型并發(fā)等

性能較好,支持多線程推理,GPU 支持良好

性能較好,支持多線程推理,GPU 支持良好

易用性

配置相對復雜,需要手動配置模型倉庫、推理服務等

易用性較好,提供了命令行工具和 Python API

易用性較好,提供了命令行工具和 gRPC/REST API

社區(qū)和支持

由 NVIDIA 開發(fā)和維護,社區(qū)活躍,文檔和示例豐富

由 Facebook 開發(fā)和維護,社區(qū)活躍,文檔和示例豐富

由 Google 開發(fā)和維護,社區(qū)非常活躍,文檔和示例豐富

從性能和質量的角度,三個框架水平都可以達到要求。重點考慮三個框架對于非深度學習部分的自定義邏輯支持:

  • tensoflow的tf.function裝飾器和AutoGraph機制 tf.function是TensorFlow 2.x中引入的一個重要特性,它通過在Python函數上應用一個裝飾器,將原生Python代碼轉換為TensorFlow圖代碼,從而享受圖執(zhí)行帶來的性能優(yōu)勢。AutoGraph是tf.function底層的一項關鍵技術,它可以將復雜的Python代碼,比如包含while,for,if的控制流,轉換為TensorFlow的圖,例如:
@tf.function
def fizzbuzz(n):
  for i in tf.range(n):
    if i % 3 == 0:
      tf.print('Fizz')
    elif i % 5 == 0:
      tf.print('Buzz')
    else:
      tf.print(i)

fizzbuzz(tf.constant(15))
  • triton Python Backend機制 triton允許使用Python編寫后端邏輯,這樣可以利用Python的靈活性和豐富的庫。Python Backend通過實現initialize、execute和finalize等接口來完成模型的加載、推理和卸載。這種方式適合于需要復雜邏輯處理的場景,比如多模型協(xié)同工作或者需要自定義預處理和后處理的情況。Python Backend可以與Triton的pipeline功能結合,實現更復雜的推理流程。例如下面的代碼中,實現了一個initialize方法初始化,并且實現一個execute方法執(zhí)行具體的邏輯,代碼為python實現。
import numpy as np

class PythonAddModel:
    def initialize(self, args):
        self.model_config = args['model_config']

    def execute(self, requests):
        responses = []
        for request in requests:
            out_0 = request.inputs[0].as_numpy() + request.inputs[1].as_numpy()
            out_tensor_0 = pb_utils.Tensor("OUT0", out_0.astype(np.float32))
            responses.append(pb_utils.InferenceResponse([out_tensor_0]))
        return responses
  • torchserve Custom handlers TorchServe通過定義handler來處理模型的加載、預處理、推理和后處理。handler通常繼承自BaseHandler類,并重寫initialize、preprocess、inference和postprocess等方法。如下面代碼所示,與Triton Python Backend有些類似。
from ts.torch_handler import TorchHandler

class ImageClassifierHandler(TorchHandler):
    def initialize(self, params):
        """初始化模型"""
        self.model = SimpleCNN()
        self.model.load_state_dict(torch.load('model.pth', map_location=torch.device('cuda:0')))
        self.model.eval()

    def preprocess(self, batch):
        """預處理輸入數據"""
        images = [img.convert('RGB') for img in batch]
        images = [img.resize((224, 224)) for img in images]
        images = [torch.tensor(np.array(img)).permute(2, 0, 1).float() for img in images]
        images = [img / 255.0 for img in images]
        return images

    def postprocess(self, outputs):
        """后處理輸出結果"""
        _, predicted = torch.max(outputs, 1)
        return predicted

2.3.2框架選型

tensorflow serving的tf.function裝飾器和AutoGraph機制并不能保證兼容所有的python代碼和控制流,并不滿足需求,在兼容第三方python包上也存在問題。此外tensorflow作為早年應用最廣的深度學習框架,近年來在流行度上已經有被后來追上的趨勢,tensorflow serving基本上只支持tensorflow框架,所以第一個排除。 

Triton Python Backend和torchserve Custom handlers在功能和機制上比較類似。都提供了一個靈活、易用且可擴展的解決方案,特別適合于需要快速部署和靈活處理模型的場景??蚣芗嫒萆蟭riton支持主流的所有框架,torchserve主要支持pytorch和onnx協(xié)議,都可以滿足轉轉的需求。經過調研和試用,我們最終選擇了torchserve作為本次的框架選項,原因如下:

  • torchserve與PyTorch生態(tài)深度集成,而Triton的學習曲線相對陡峭。torchserve主要支持torch框架,同時只兼容onnx協(xié)議。在輕量級和易用性上更符合轉轉當前的業(yè)務場景要求。例如在模型部署的格式轉換和配置上,torchserve相較于triton要簡易很多。
  • 從后續(xù)轉轉GPU推理服務的演進來看,長期來看支持所有主流推理框架是必需的,短期在業(yè)務高速成長期優(yōu)先選擇一個框架與長期支持所有主流并不沖突。

3 torchserve實踐過程

3.1 torchserve使用與調優(yōu)

3.1.1 使用流程

圖片圖片

以一個圖像模型簡單舉例,如圖所示:

  • 將模型權重文件及前后處理邏輯python代碼打包成一個mar包
  • mar包提交到torchserve進程中進行模型注冊
  • 請求到來后執(zhí)行圖片下載和模型前處理、推理、后處理,返回結果

mar包打包指令:

torch-model-archiver --model-name your_model_name --version 1.0 --serialized-file path_to_your_model.pth --handler custom_handler.py --extra-files path_to_any_extra_files
  • your_model_name:你為模型指定的名稱。
  • 1.0:模型的版本號,可以根據實際情況進行修改。
  • path_to_your_model.pth:你的 PyTorch 模型文件的路徑。
  • custom_handler.py:處理模型輸入和輸出的自定義處理函數文件。
  • path_to_any_extra_files:如果有其他需要一起打包的文件,可以在這里指定路徑,可以是多個文件路徑用逗號分隔。

torchserve的custom handler機制和易用性對于開發(fā)效率的提升是顯著的,在我們的內部場景里,一個單人維護的推理服務,在半年內節(jié)省了約32PD(人日)的開發(fā)成本。

3.1.2 torch-trt

模型的主干網絡部分,需要進行優(yōu)化,否則執(zhí)行效率差耗時較長。torch-trt允許將PyTorch 模型轉換為 TensorRT 格式,從而能夠利用 TensorRT 強大的優(yōu)化引擎。TensorRT 針對 NVIDIA GPU 進行了高度優(yōu)化,能夠實現快速的推理性能。它通過對模型進行層融合、內核自動調整和內存優(yōu)化等操作,顯著提高了模型的推理速度。

import torch
   import torch_tensorrt

   # Load your PyTorch model
   model = torch.load('path_to_your_model.pth')

   # Convert the model to TensorRT
   trt_model = torch_tensorrt.compile(model, inputs=[torch_tensorrt.Input((1, 3, 224, 224))], enabled_precisinotallow={torch.float32})

   # Save the converted model
   torch.save(trt_model, 'path_to_trt_model.pth')

torch-trt比起tensorflow-trt和triton-trt相對來說比較簡單:

  • 使用torch.compile可以一鍵轉換。
  • 整個流程用python用簡單的代碼實現,學習成本較低。
  • 與pytorch和torchserve無縫銜接。

圖片圖片

如上圖所示為torch-trt的優(yōu)化流程:

  • Partition Graph(劃分圖) 首先要對 PyTorch 模型的計算圖進行分析,找出其中 TensorRT 所支持的節(jié)點。這是因為并非所有的 PyTorch 操作都能直接被 TensorRT 處理,需要確定哪些部分可以利用 TensorRT 的優(yōu)化能力。根據識別出的支持節(jié)點情況,決定哪些部分在 PyTorch 中運行,哪些部分可以在 TensorRT 中運行。對于可以在 TensorRT 中運行的部分,將進行后續(xù)的轉換操作。
  • Compile TensorRT(編譯 TensorRT) 對于在 Partition Graph 步驟中確定可以由 TensorRT 處理的節(jié)點,將其轉換為 TensorRT 格式。這一步驟會利用 TensorRT 的優(yōu)化技術,如層融合、內核自動調整和內存優(yōu)化等,將這些節(jié)點轉換為高效的 TensorRT Engine(引擎),從而提高模型的推理速度。

分組

GPU利用率

CPU利用率

QPS

顯存占用

torch-base

40% ~ 80%

20%~40%

10

2GB

torch-trt

10% ~ 50%

100%

17

680MB

加入torch-trt之后的優(yōu)化效果如上面表格,可以看出:

  • trt優(yōu)化后,吞吐獲得了提升,符合預期,吞吐的提升主要是半精度和執(zhí)行流程優(yōu)化帶來的。顯存占用也因為半精度和算子融合大幅下降,符合預期。
  • trt組的GPU沒有打滿,但是CPU打滿了,吞吐的瓶頸從GPU轉移到CPU,經過排查原因是預處理和后處理部分的CPU操作在請求量大的時候已經將CPU打滿了。這個問題過去是通過CPU微服務水平擴容解決的,在torchserve中CPU和GPU的執(zhí)行在一個進程內,無法水平擴容,下面將介紹解決方案。

3.2 預處理和后處理部分優(yōu)化

排查CPU執(zhí)行部分占用率較高的邏輯,原因為部分計算密集型邏輯被放在了前后處理中,例如opencv庫中的一些api執(zhí)行和通過numpy、pandas等庫進行矩陣計算。解決思路是將原來的python替換成NVIDIA官方提供的一些列對應的cuda版本庫。例如cvCuda和cuDF分別對應OpenCV與pandas,并且提供了相同的api,只需要在import包的時候進行替換,開發(fā)成本較低。

import cv2
import numpy as np
import cv2.cuda as cvcuda

# 讀取圖像
img = cv2.imread('your_image.jpg')

# 將圖像轉換為 GPU 上的格式
gpu_img = cvcuda.GpuMat(img)

# 使用 cvCuda 進行高斯模糊
gaussian_filter = cvcuda.createGaussianFilter(gpu_img.type(), -1, (5, 5), 1.5)
blurred_gpu = gaussian_filter.apply(gpu_img)

# 將處理后的圖像轉換回 CPU 格式
blurred_img = blurred_gpu.download()

# 顯示結果
cv2.imshow('Original Image', img)
cv2.imshow('Blurred Image (cvCuda)', blurred_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上demo為例,只需要將cv2庫替換為cvCuda庫即可。此外計算密集型邏輯在CPU上執(zhí)行性價比并不高,很多時候是使用習慣所致,在深度學習時代之前OpenCV和pandas就比較流行了,后續(xù)沿用之前的用法。從下面NVIDIA官方提供的測試結果來看,相關計算邏輯在GPU上執(zhí)行可以獲得極大的性能提升。

圖片圖片

上圖為OpenCV和CV-CUDA在不同算子上的吞吐表現對比。 

下圖展示了在同一個計算節(jié)點上(2x Intel Xeon Platinum 8168 CPUs , 1x NVIDIA A100 GPU),以 30fps 的幀率處理 1080p 視頻,采用不同的 CV 庫所能支持的最大的并行流數

圖片圖片

下表為我們內部的測試結果:

分組

GPU利用率

CPU利用率

QPS

顯存占用

torch-base

40% ~ 80%

20%~40%

10

2GB

torch-trt

10% ~ 50%

100%

17

680MB

GPU預處理+trt

60% ~ 80%

60%

40

2.1GB

從中可以看出,將預處理中計算密集型部分放在GPU上成功解決了此前遇到的問題。吞吐比base提升了4倍,GPU占用率提升顯著,CPU占用率沒有打滿。需要注意的是顯存占用率相應也會提升,因為之前在內存中進行的操作被移到了顯存上進行。

3.3 Torchserve on Kubernetes

torchserve官方通過Helm Charts提供了一個輕量級的k8s部署方案,可以實現服務的可靠運行和高可用性,,這也是我們在框架選型中看中torchserve的一個優(yōu)勢。

kubectl get pods

NAME                                             READY   STATUS    RESTARTS   AGE
grafana-cbd8775fd-6f8l5                          1/1     Running   0          4h12m
model-store-pod                                  1/1     Running   0          4h35m
prometheus-alertmanager-776df7bfb5-hpsp4         2/2     Running   0          4h42m
prometheus-kube-state-metrics-6df5d44568-zkcm2   1/1     Running   0          4h42m
prometheus-node-exporter-fvsd6                   1/1     Running   0          4h42m
prometheus-node-exporter-tmfh8                   1/1     Running   0          4h42m
prometheus-pushgateway-85948997f7-4s4bj          1/1     Running   0          4h42m
prometheus-server-f8677599b-xmjbt                2/2     Running   0          4h42m
torchserve-7d468f9894-fvmpj                      1/1     Running   0          4h33m

以上為一個集群的pods列表,除了torchserve的微服務階段,還提供了model-store功能,以及基于prometheus、grafana的監(jiān)控報警體系。再加上k8s原有的能力,既可實現一個輕量級的支持故障自動恢復、負載均衡、滾動更新、模型管理、安全配置的高可用性和可彈性擴展系統(tǒng)。

4  后續(xù)工作

torchserve在轉轉GPU推理服務系統(tǒng)里的落地是一次平衡開發(fā)效率與系統(tǒng)性能的工程實踐,總體上達到了計劃目標并且取得了業(yè)務價值。但是也存在一些不足,比如說原計劃前后處理部分線上和線下完全一致,共用相同的python代碼,但是實踐中遇到了CPU被打滿的情況改變了方案。盡管替代方案開發(fā)成本較低但是仍然做不到Write once, run anywhere。

此外,當前提供的解決方案以效率為先,兼顧性能,適合快速落地及迭代。后續(xù)計劃針對更復雜的業(yè)務場景(多模型推理等)及推理模型(llm推理等),提供進階的解決方案。同時,在云原生平臺建設上,當前只是實現了一個入門版本,需要補課的內容還很多。


關于作者

楊訓政,轉轉算法工程方向架構師,負責搜索推薦、圖像、大模型等方向的算法工程架構工作。

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2023-03-22 08:32:35

2022-10-28 09:15:02

2022-10-28 08:31:43

2023-06-07 08:32:32

引擎技術while

2023-04-19 13:18:41

動態(tài)線程池平臺

2023-08-24 08:11:39

斷路器監(jiān)控報警

2024-09-11 19:36:24

2024-09-19 22:22:41

多任務學習

2023-11-01 07:44:29

轉轉Flutter業(yè)務

2022-11-07 14:45:26

轉轉價格DDD

2023-12-27 19:12:42

OLAP自助分析

2023-03-02 08:54:32

2023-07-12 08:33:34

引擎LiteFlow編排

2023-03-02 08:32:41

2022-12-15 08:35:01

用戶畫像平臺

2023-02-08 09:42:30

策略方式容量

2024-08-08 07:13:36

2024-06-06 08:18:42

回收業(yè)務

2023-07-31 13:49:11

2023-09-14 08:34:28

linux架構參數
點贊
收藏

51CTO技術棧公眾號

久久久精品日本| jvid福利在线一区二区| 亚洲国产日韩欧美在线| 亚洲人成网站777色婷婷| 韩国av一区二区三区在线观看| 婷婷成人av| 婷婷久久综合九色综合伊人色| 国产精品99久久久久久久久| 成人18在线| 99精品国产91久久久久久| 国产日韩在线亚洲字幕中文| 麻豆蜜桃在线观看| 一区二区三区中文字幕| 欧美日韩视频在线一区二区观看视频| av有声小说一区二区三区| 亚洲国产成人91porn| 成人网在线免费观看| 欧美少妇激情| 精品视频全国免费看| www.99在线| 国产精品456| 国产欧美一区二区三区视频| 色网站免费在线观看| 久久亚洲综合色一区二区三区| 国产精品国产三级欧美二区| eeuss鲁片一区二区三区| 日本精品免费观看高清观看| 天天综合天天| 国产乱子伦视频一区二区三区| av蓝导航精品导航| av女在线播放| 日韩一卡二卡三卡国产欧美| 欧美精品久久久久久久久久丰满| 91麻豆国产在线观看| 久久亚洲一区二区| 中日韩视频在线观看| 欧美国产中文字幕| 亚洲日本视频在线| 欧美xxxx在线观看| 免费观看成人高潮| 欧美一区二区女人| 91精品专区| 亚洲人成网站色在线观看| 欧美日韩中文一区二区| 亚洲高清在线免费观看| 日本综合在线| 久久婷五月综合| 9191在线| 亚洲欧洲日韩在线| 免费大片黄在线观看视频网站| 热久久一区二区| 精品无码久久久久久久动漫| www.天天射.com| 欧美国产国产综合| 欧美尤物美女在线| 久久视频在线直播| 欧美三区在线| 国产九九九九九| 色狠狠av一区二区三区| 美女福利一区二区三区| 成人久久久久久久| 国产精品欧美极品| 国产v综合v| 亚洲国产一区二区三区在线播| 一区在线观看免费| 国产精品久久久久久av公交车| 久久久久久久有限公司| 五月婷婷欧美视频| 免费看成人哺乳视频网站| 成年人免费观看的视频| 欧美日韩精品一区二区三区蜜桃| 18国产精品| 欧美激情成人网| 日韩精品视频免费专区在线播放| 免费视频一区三区| 男女视频一区二区三区| www.日韩视频| 26uuu另类欧美亚洲曰本| 小视频免费在线观看| 久久精品美女| 欧美日韩日本国产| 一区二区三区四区五区精品视频| 国产香蕉视频在线观看| 国产精品成人久久久久| 五月综合激情婷婷六月色窝| 欧美激情15p| www.久久91 | 中文字幕日韩在线| 一区二区三区我不卡| 精品国产一区二区三区忘忧草| 久久美女性网| 欧洲精品一区二区三区| 久久久久免费精品| 国产精品香蕉av| 欧美一区二区不卡视频| 久久69国产一区二区蜜臀| 国产女人在线视频| 国产精品久久久久久久久久直播| 日韩欧美精品网址| 亚洲黑丝一区二区| www.综合网.com| 日韩欧美亚洲日产国产| 亚洲男人7777| 国产欧美视频一区二区| 亚洲精品无吗| 日本三级电影网| 国产免费亚洲高清| 亚洲一区二区不卡免费| 亚洲三级精品| 久久午夜剧场| 亚洲精品免费播放| 69av在线视频| 极品束缚调教一区二区网站| 五月综合网站| 性做爰过程免费播放| 亚洲精品成人天堂一二三| 老司机福利在线视频| 五月婷婷丁香色| 成人在线免费观看av| 久久久久久久久久久久久国产| 国产精品亚洲综合| 成人黄色免费看| 国产成人精品在线播放| 久久久av电影| 美日韩丰满少妇在线观看| 在线观看网站黄不卡| 女人天堂av在线播放| 欧日韩一区二区三区| 久久视频免费| 欧美一级裸体视频| 欧美激情喷水视频| 一区二区三区四区五区视频在线观看| 日韩成人午夜电影| 波多野结衣乳巨码无在线观看| 一本久道久久综合| 欧美成人精品免费| 91传媒久久久| 亚洲 激情 在线| av日韩在线看| 日本亚洲自拍| 日韩欧美的一区| 色欧美日韩亚洲| 久久久美女毛片| 91麻豆蜜桃一区二区三区| 肉肉视频在线观看| 蜜桃视频在线观看网站| 成人区精品一区二区不卡| 成人黄色网址| 91九色丨porny丨国产jk| 久热国产精品视频一区二区三区| 成人国产精品av| 日韩精品中文字幕在线| 在线综合视频播放| 日韩网站免费观看高清| 色综合久久天天| 国产精品无码永久免费888| 成人激情av网| 在线日韩欧美| 精品资源在线| 国产自产自拍视频在线观看| 在线免费激情视频| 快播日韩欧美| 粉嫩av一区二区三区免费观看| 久久99亚洲热视| 欧美国产日本高清在线| 久久久久国色av免费观看性色| 99精品视频在线播放观看| 欧美精品系列| 暧暧视频在线免费观看| 成人网18免费软件大全| 日韩精品另类天天更新| 国产欧美精品一区二区三区-老狼| 欧美成人精品1314www| 日韩精品一区二区三区蜜臀 | 91精品入口| 日韩伦理一区二区| 亚洲二区av| 精品久久毛片| 日韩在线精品强乱中文字幕| 麻豆久久一区| 亚洲激情午夜| 欧美日韩免费在线观看| 午夜精品久久久久久久99樱桃| 91久色porny| 国产高清在线精品| 亚洲成人精品影院| 亚洲成人7777| 亚洲国产精品嫩草影院久久| 欧美日韩性生活| 欧美日韩国产综合一区二区| 色香阁99久久精品久久久| 亚洲精品视频一二三| 最新在线你懂的| av在线之家电影网站| 91小视频xxxx网站在线| 任你弄精品视频免费观看| 精品1区2区3区4区| 欧美国产一区在线| 日韩区在线观看| 91久久精品一区|