业界 | TensorFlow 携手 NVIDIA,使用 TensorRT 优化 TensorFlow Serving 性能

2019 年 3 月 7 日 AI研习社


AI 科技评论按:日前,TensorFlow 团队与 NVIDIA 携手合作,将 NVIDIA 用来实现高性能深度学习推理的平台——TensorRT 与 TensorFlow Serving 打通结合,使用户可以轻松地实现最佳性能的 GPU 推理。目前,TensorFlow Serving 1.13 已实现对 TF-TRT 的支持,而不久后  TensorFlow 2.0 也将支持 TF-TRT 的实现。 TensorFlow 在官方博客中对这项成果进行了发布,雷锋网 AI 科技评论编译如下。

  • TensorFlow Serving 项目地址:https://tensorflow.org/serving/

  • NVIDIA TensorRT 项目地址:https://developer.nvidia.com/tensorrt

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 的实现。 

此前的一篇博客(https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008)中,我们向大家介绍了怎样如何借助 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 图像(点击https://www.tensorflow.org/serving/docker#serving_with_docker_using_your_gpu查看相关说明),从而借助 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.0 新特性来啦,部分模型、库和 API 已经可以使用

登录查看更多
8

相关内容

高性能TensorFlow模型托管服务器
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【阿里巴巴】 AI编译器,AI Compiler @ Alibaba,21页ppt
专知会员服务
44+阅读 · 2019年12月22日
社区分享 | Spark 玩转 TensorFlow 2.0
TensorFlow
15+阅读 · 2020年3月18日
社区分享|如何让模型在生产环境上推理得更快
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
TensorFlow 2.0如何在Colab中使用TensorBoard
专知
17+阅读 · 2019年3月15日
DLI 精选课程 | 用TensorRT 优化和部署TensorFlow模型
英伟达NVIDIA中国
6+阅读 · 2019年3月8日
发布TensorFlow 1.4
谷歌开发者
7+阅读 · 2017年11月23日
【推荐】一步一步带你用TensorFlow玩转LSTM
机器学习研究会
9+阅读 · 2017年9月12日
Real-time Scalable Dense Surfel Mapping
Arxiv
5+阅读 · 2019年9月10日
Arxiv
3+阅读 · 2018年3月13日
VIP会员
相关VIP内容
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【阿里巴巴】 AI编译器,AI Compiler @ Alibaba,21页ppt
专知会员服务
44+阅读 · 2019年12月22日
相关资讯
社区分享 | Spark 玩转 TensorFlow 2.0
TensorFlow
15+阅读 · 2020年3月18日
社区分享|如何让模型在生产环境上推理得更快
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
TensorFlow 2.0如何在Colab中使用TensorBoard
专知
17+阅读 · 2019年3月15日
DLI 精选课程 | 用TensorRT 优化和部署TensorFlow模型
英伟达NVIDIA中国
6+阅读 · 2019年3月8日
发布TensorFlow 1.4
谷歌开发者
7+阅读 · 2017年11月23日
【推荐】一步一步带你用TensorFlow玩转LSTM
机器学习研究会
9+阅读 · 2017年9月12日
Top
微信扫码咨询专知VIP会员