0
本文作者: 叢末 | 2019-03-07 10:53 |
雷鋒網 AI 科技評論按:日前,TensorFlow 團隊與 NVIDIA 攜手合作,將 NVIDIA 用來實現(xiàn)高性能深度學習推理的平臺——TensorRT 與 TensorFlow Serving 打通結合,使用戶可以輕松地實現(xiàn)最佳性能的 GPU 推理。目前,TensorFlow Serving 1.13 已實現(xiàn)對 TF-TRT 的支持,而不久后 TensorFlow 2.0 也將支持 TF-TRT 的實現(xiàn)。 TensorFlow 在官方博客中對這項成果進行了發(fā)布,雷鋒網 AI 科技評論編譯如下。
TensorFlow Serving 項目地址:https://tensorflow.org/serving/
NVIDIA TensorRT 項目地址:https://developer.nvidia.com/tensorrt
TensorFlow Serving 是應用于機器學習模型的靈活的高性能服務系統(tǒng),而 NVIDIA TensorRT 則是一個用以實現(xiàn)高性能深度學習推理的平臺,將二者相結合后,用戶可以輕松地實現(xiàn)最佳性能的 GPU 推理。TensorFlow 團隊與 NVIDIA 攜手合作,在 TensorFlow v1.7 中添加了對 TensorRT 的首度支持,此后,他們更是保持密切的合作,共同致力于對 TensorFlow-TensorRT 集成(被稱作 TF-TRT)進行改進。。目前,TensorFlow Serving 1.13 已實現(xiàn)對 TF-TRT 的支持,而不久后 TensorFlow 2.0 也將支持 TF-TRT 的實現(xiàn)。
在此前的一篇博客中,我們向大家介紹了怎樣如何借助 Docker 來使用 TensorFlow Serving。而在本文中,我們要展示的是:以同樣的方法來運行經 TF-TRT 轉換的模型到底有多簡單。一如既往地,我們嘗試將 ResNet 模型部署到生產環(huán)境中。下文的所有案例都在配備 Titan-V GPU 的工作站上運行。
在 GPU 上使用 TensorFlow Serving 創(chuàng)建 ResNet
在本次練習中,我們簡單地下載一個經過預訓練的 ResNet SavedModel:
$ mkdir /tmp/resnet
$ curl -shttps://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 圖像來創(chuàng)建模型。在這里,我們運行 GPU Docker 圖像(點擊查看相關說明),從而借助 GPU 創(chuàng)建并測試此模型:
$ 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 會給服務器發(fā)送一些圖像,并返回服務器所作的預測?,F(xiàn)在讓我們停止運行 TensorFlow Serving 容器,來釋放其所占用的 GPU 資源:
$ docker kill tfserving_resnet
現(xiàn)在,我們有了可以運行的模型。為了能從 TensorRT 受益,我們需要在 TensorFlow Serving Docker 容器內運行轉換命令,從而將現(xiàn)有模型轉換為使用 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 參數(shù)會告知它在哪里找到 SavedModel 以及輸出轉換后的 SavedModel,而 --tag_set 則讓它知道該轉換 SavedModel 中的哪張圖表。隨后,我們通過在命令行中傳遞 tensorrt 并指定配置,明確指示其運行 TF-TRT 轉換器:
--precision_mode 參數(shù)讓轉換器知道所需用到的精度,目前它僅支持 FP32 和 FP16
--max_batch_size 參數(shù)確定輸入的批次大小的上限。此轉換器要求由 TensorRT 處理的所有張量將它們的首個維度作為批次維度,而該參數(shù)則讓它知道推理過程中會產生的最大值。如果已知推理過程中的實際批次大小上限,同時該值還能夠與之匹配,那么轉換后的模型就是最優(yōu)模型。要注意的是,轉換后的模型無法處理批次規(guī)模大于這里指定了大小的輸入,但對于批次規(guī)模更小的輸入,它還是能夠處理的。
--is_dynamic_op 參數(shù)讓它知道在模型運行時進行實際轉換。這是因為在轉換期間,TensorRT 需要知道所有的形狀。對于該案例中所使用的 ResNet 模型,它的張量沒有固定的形狀,這也是我們需要用到該參數(shù)的原因。
如此前一樣簡單,我們現(xiàn)在只需為模型指定正確的目錄,便能利用 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 …
之后向它發(fā)送請求:
$ python /tmp/resnet/resnet_client.py
Prediction class: 286, avg latency: 15.0287 ms
最后,停止運行容器:
$ docker kill tfserving_resnet
我們可以看到,使用 TensorFlow Serving 和 Docker 生成經 TF-TRT 轉換的模型與創(chuàng)建一個普通的模型一樣簡單。此外,作為一次演示,上文中的性能數(shù)值僅適用于我們所使用的模型和運行該案例的設備,不過它的確體現(xiàn)出使用 TF-TRT 所帶來的性能優(yōu)勢。
接下來就輪到 TensorFlow 2.0 來實現(xiàn) TF-TRT 了,而 TensorFlow 團隊和 NVIDIA 也正在合作以確保 TF-TRT 能在 2.0 中流暢運行。大家可前往 TF-TRT 的 Github 開源項目(https://github.com/tensorflow/tensorrt),查看更全面的信息。雷鋒網
雷峰網原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。