TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...

2020-11-22 雷鋒網

雷鋒網(公眾號:雷鋒網) AI 科技評論按:日前,TensorFlow 團隊與 NVIDIA 攜手合作,將 NVIDIA 用來實現高性能深度學習推理的平臺——TensorRT 與 TensorFlow Serving 打通結合,使用戶可以輕鬆地實現最佳性能的 GPU 推理。目前,TensorFlow Serving 1.13 已實現對 TF-TRT 的支持,而不久後  TensorFlow 2.0 也將支持 TF-TRT 的實現。 TensorFlow 在官方博客中對這項成果進行了發布,雷鋒網 AI 科技評論編譯如下。

TensorFlow Serving 是應用於機器學習模型的靈活的高性能服務系統,而 NVIDIA TensorRT 則是一個用以實現高性能深度學習推理的平臺,將二者相結合後,用戶可以輕鬆地實現最佳性能的 GPU 推理。TensorFlow 團隊與 NVIDIA 攜手合作,在 TensorFlow v1.7 中添加了對 TensorRT 的首度支持,此後,他們更是保持密切的合作,共同致力於對 TensorFlow-TensorRT 集成(被稱作 TF-TRT)進行改進。。目前,TensorFlow Serving 1.13 已實現對 TF-TRT 的支持,而不久後  TensorFlow 2.0 也將支持 TF-TRT 的實現。 

此前的一篇博客中,我們向大家介紹了怎樣如何藉助 Docker 來使用 TensorFlow Serving。而在本文中,我們要展示的是:以同樣的方法來運行經 TF-TRT 轉換的模型到底有多簡單。一如既往地,我們嘗試將 ResNet 模型部署到生產環境中。下文的所有案例都在配備 Titan-V GPU 的工作站上運行。

在 GPU 上使用 TensorFlow Serving 創建 ResNet

在本次練習中,我們簡單地下載一個經過預訓練的 ResNet SavedModel:

$ mkdir /tmp/resnet
$ curl -s 

https://storage.googleapis.com/download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | tar --strip-components=2 -C /tmp/resnet -xvz
$ ls /tmp/resnet
1538687457

在此前的博客中,我們演示了如何使用 TensorFlow Serving CPU Docker 圖像來創建模型。在這裡,我們運行 GPU Docker 圖像(點擊查看相關說明),從而藉助 GPU 創建並測試此模型:

$ docker pull tensorflow/serving:latest-gpu
$ docker run --rm --runtime=nvidia -p 8501:8501 --name tfserving_resnet \ 


   -v /tmp/resnet:/models/resnet -e MODEL_NAME=resnet -t tensorflow/serving:latest-gpu &



… server.cc:313] Running gRPC ModelServer at 0.0.0.0:8500 …
… server.cc:333] Exporting HTTP/REST API at:localhost:8501 …


$ curl -o /tmp/resnet/resnet_client.py 

https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
$ python /tmp/resnet/resnet_client.py
Prediction class: 286, avg latency: 18.0469 ms

docker run 命令會啟動 TensorFlow Serving 伺服器,以提供 /tmp/resnet 中已下載的 SavedModel,並在主機中顯示 REST API 埠 8501。resnet_client.py 會給伺服器發送一些圖像,並返回伺服器所作的預測。現在讓我們停止運行 TensorFlow Serving 容器,來釋放其所佔用的 GPU 資源:

$ docker kill tfserving_resnet

利用 TF-TRT 轉換和提供模型

現在,我們有了可以運行的模型。為了能從 TensorRT 受益,我們需要在 TensorFlow Serving Docker 容器內運行轉換命令,從而將現有模型轉換為使用 TensorRT 運行運算的模型:

$ docker pull tensorflow/tensorflow:latest-gpu
$ docker run --rm --runtime=nvidia -it \
      -v /tmp:/tmp tensorflow/tensorflow:latest-gpu \
      /usr/local/bin/saved_model_cli convert \
      --dir /tmp/resnet/1538687457 \
      --output_dir /tmp/resnet_trt/1538687457 \
      --tag_set serve \
      tensorrt --precision_mode FP32 --max_batch_size 1 --

is_dynamic_op True

 在這裡,我們運行了 saved_model_cli 命令行工具,其中內置了對 TF-TRT 轉換的支持。--dir --output_dir 參數會告知它在哪裡找到 SavedModel 以及輸出轉換後的 SavedModel,而 --tag_set 則讓它知道該轉換 SavedModel 中的哪張圖表。隨後,我們通過在命令行中傳遞 tensorrt 並指定配置,明確指示其運行 TF-TRT 轉換器:

  • --precision_mode 參數讓轉換器知道所需用到的精度,目前它僅支持 FP32 和 FP16

  • --max_batch_size 參數確定輸入的批次大小的上限。此轉換器要求由 TensorRT 處理的所有張量將它們的首個維度作為批次維度,而該參數則讓它知道推理過程中會產生的最大值。如果已知推理過程中的實際批次大小上限,同時該值還能夠與之匹配,那麼轉換後的模型就是最優模型。要注意的是,轉換後的模型無法處理批次規模大於這裡指定了大小的輸入,但對於批次規模更小的輸入,它還是能夠處理的。

  • --is_dynamic_op 參數讓它知道在模型運行時進行實際轉換。這是因為在轉換期間,TensorRT 需要知道所有的形狀。對於該案例中所使用的 ResNet 模型,它的張量沒有固定的形狀,這也是我們需要用到該參數的原因。

如此前一樣簡單,我們現在只需為模型指定正確的目錄,便能利用 Docker 提供經 TF-TRT 轉換的模型:

$ docker run --rm --runtime=nvidia -p 8501:8501 \
      --name tfserving_resnet \
      -v /tmp/resnet_trt:/models/resnet \
      -e MODEL_NAME=resnet \
      -t tensorflow/serving:latest-gpu &

… server.cc:313] Running gRPC ModelServer at 0.0.0.0:8500 …
… server.cc:333] Exporting HTTP/REST API at:localhost:8501 …

之後向它發送請求:

$ python /tmp/resnet/resnet_client.py
Prediction class: 286, avg latency: 15.0287 ms

最後,停止運行容器:

$ docker kill tfserving_resnet

我們可以看到,使用 TensorFlow Serving 和 Docker 生成經 TF-TRT 轉換的模型與創建一個普通的模型一樣簡單。此外,作為一次演示,上文中的性能數值僅適用於我們所使用的模型和運行該案例的設備,不過它的確體現出使用 TF-TRT 所帶來的性能優勢。

接下來就輪到 TensorFlow 2.0 來實現 TF-TRT 了,而 TensorFlow 團隊和 NVIDIA 也正在合作以確保 TF-TRT 能在 2.0 中流暢運行。大家可前往 TF-TRT 的 Github 開源項目(https://github.com/tensorflow/tensorrt),查看更全面的信息。雷鋒網

via:https://medium.com/tensorflow/optimizing-tensorflow-serving-performance-with-nvidia-tensorrt-6d8a2347869a

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 步履不停:TensorFlow 2.4新功能一覽!
    集合運算        https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/collective_ops.py
  • TensorFlow極速入門
    Tensorflow 擁有易用的 python 接口,而且可以部署在一臺或多臺 cpu , gpu 上,兼容多個平臺,包括但不限於 安卓/windows/linux 等等平臺上,而且擁有 tensorboard這種可視化工具,可以使用 checkpoint 進行實驗管理,得益於圖計算,它可以進行自動微分計算,擁有龐大的社區,而且很多優秀的項目已經使用 tensorflow
  • 玩轉TensorFlow?你需要知道這30功能
    地址是:tensorflow.org/tfx/?網址是:https://www.tensorflow.org/serving/?網址:https://github.com/tensorflow/tensor2tensor13)XLA(線性代數計算加速)XLA 是線性代數領域特定的編譯器
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    開始菜單運行anaconda navigator檢查是否安裝了notebook(默認有安裝)三、安裝tensorflow/keras在激活的環境中安裝:1. 如果機器上有gpu,則安裝gpu版本,沒有GPU就安裝cpu版。
  • Tensorflow基礎教程15天之創建Tensor
    Tensor是Tensorflow中使用在計算圖中的最基本的數據單位,我們可以聲明Tensor為variable,或者為Tensor提供placeholer。但首先我們必須知道如何創建Tensor。在將Tensor定義為Variable之後,Tensorflow才會將其傳入計算圖。如何操作我們將在這裡介紹創建Tensor的主要方法。
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • 終於來了,TensorFlow 新增官方 Windows 支持
    現在你可以使用命令 C:\> pip install tensorflow 安裝 TensorFlow 了。GPU 支持的命令:C:\> pip install tensorflow-gpu有關 TensorFlow Windows 支持的更多細節請閱讀 r0.12 的版本注釋。
  • 5個簡單的步驟掌握Tensorflow的Tensor
    在這篇文章中,我們將深入研究Tensorflow Tensor的細節。我們將在以下五個簡單步驟中介紹與Tensorflow的Tensor中相關的所有主題:第一步:張量的定義→什麼是張量?我們經常將NumPy與TensorFlow一起使用,因此我們還可以使用以下行導入NumPy:import tensorflow as tfimport numpy as np張量的創建:創建張量對象有幾種方法可以創建tf.Tensor對象。讓我們從幾個例子開始。
  • 深度解讀TensorFlow,了解它的最新發展!
    TensorBoard  TensorBoard是一套可視化工具,研發人員使用TensorFlow寫的神經網絡看上去會顯得非常複雜混亂,為了可以更加直觀的調試、優化神經網絡,谷歌開發了TensorBoard。
  • TensorFlow 中文資源全集,學習路徑推薦
    https://gitee.com/fendouai/Awesome-TensorFlow-Chinese很多內容下面這個英文項目:Inspired by https://github.com/jtoy/awesome-tensorflow官方網站官網:https://www.tensorflow.org/中文:https://tensorflow.google.cn
  • 在Windows中安裝Tensorflow和Kears深度學習框架
    建立Tensorflow的Anaconda虛擬環境在一臺計算機中,我們常常需要安裝很多軟體,但是每個軟體所需要的Python的關聯模塊或版本不相同。例如,我們要使用Python開發開發網站系統,安裝的網站框架可能需要Python2.X的版本,但是安裝Tensorflow需要Python3.5的版本,此時就會發生版本不一致的問題。
  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    如果你想使用動態輸入大小,請參考這個例子。你可以使用 Java, C/C++ 或其他程式語言來運行 TFLite。在這篇文章中,我們將使用 TFLite C API,因為有許多的開發者表示希望我們能提供這樣一個範例。
  • 代碼+實戰:TensorFlow Estimator of Deep CTR——DeepFM/NFM/AFM/...
    /data/criteo/完整代碼: lambdaji/tf_repos服務框架 -- request in,pctr outTensorFlow Serving 是一個用於機器學習模型 serving 的高性能開源庫。它可以將訓練好的機器學習模型部署到線上,使用 gRPC 作為接口接受外部調用。更加讓人眼前一亮的是,它支持模型熱更新與自動模型版本管理。
  • TensorFlow官方發布消息稱將引入一個新的優化工具包
    TensorFlow官方發布消息稱將引入一個新的優化工具包 李倩 發表於 2018-09-21 08:53:44 編者按:幾個月前,Tensorflow發布了一份名為《Quantizing deep convolutional
  • TensorFlow2.1正式版上線:最後一次支持Python2,進一步支持TPU
    也就是說,如果使用 pip install tensorflow,則版本默認為是 gpu 版本(原始的 tensorflow-gpu 版本依然存在)。當然,不管有沒有英偉達版本的 GPU,tensorflow 依然能夠運行。如果需要使用 CPU 版本,用戶的安裝命令應該為:pip install tensorflow-cpu。
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    代碼的結構與之前相同,唯一不同的是這次使用張量(tensor)操作來定義誤差。使用張量可以並行(parallel)運行代碼。每個數據點被看作是來自獨立同分布的樣本。因為每個數據點假定是獨立的,所以計算也是獨立的。當使用張量時,每個數據點都在分隔的計算內核上運行。我們有 8 個數據點,所以如果你有一個有八個內核的計算機,它的運行速度應該快八倍。
  • 最簡單的深度學習TensorFlow應用舉例!
    小編我的電腦很一般,沒有32G內存,也沒有1080,就windows上直接裝了23333windows+python 3.6+pycharm+tensorflow cpu話不多說,直接線性回歸,上圖。代碼截圖#接下來貼代碼#辰星樹洞import numpy as np #這是Python的一種開源的數值計算擴展,非常強大import tensorflow
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    從源安裝和配置 TensorFlow(https://www.tensorflow.org/install/install_sources)。3.在 TensorFlow 目錄下運行下列命令行:bazel build tensorflow/tools/graph_transforms:transform_graphbazel-bin/tensorflow/tools/graph_transforms/transform_graph \ --in_graph=/your/.pb/file \ --outputs="output_node_name
  • 分享TensorFlow Lite應用案例
    輸入法引擎預測效果圖   作為輸入法這樣的一個重度使用的工具類 APP,在移動端做輕量化部署非常重要,具體包括以下四個方面:模型壓縮、快速的響應時間、較低的內存佔用以及 較小的 so 庫(shared object,共享庫)大小等。
  • 機器學習中的embedding原理及tensorflow 相關API的理解
    # 概述本文主要講解tensorflow中涉及embedding的API。之前看了一些文章,寫的雲山霧繞,花了好長時間才搞懂,太笨了。embedding 算法主要用於處理稀疏特徵,應用於NLP、推薦、廣告等領域。所以word2vec 只是embbeding 思想的一個應用,而不是全部。