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