此文记录一下算法实施过程中遇到的问题,整个过程基于Python技术栈,无缝集成到流式处理框架中,首先软硬件配置如下:
服务器配置:64 cores,256G内存,GPU Tesla K80 (4个);
TensorFlow相关版本:
tensorboard 1.6.0
tensorflow 1.6.0
tensorflow-serving-api 1.6.0
tensorrt 4.0.0.3
cuda 版本
cat /usr/local/cuda/version.txt
cudnn 版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
项目中需要提供高并发低延迟的在线predict,正好离线训练用的是TensorFlow的DNN模型,模型的hidden layer设置3层,
取的最终训练好的DNN的隐藏层的权重作为特征,可以类比FNN中用神经网络做了特征延伸,接下来要把训练好的DNN模型部署线上实时predict。
TensorFlow Serving可以提供多模型、多版本的版本发布,很适合迭代开发以及高频部署,具体的server端代码参照:
调用的client端代码参照:
如果我们还想进一步优化server端性能,比如进一步降低响应延时,该怎么办?
TensorFlow Serving只是帮我们更好的管理多版本模型及部署,使我们更便捷的对外包装接口,要想从神经网络内部去优化,我们可以借助NVIDIA TensorRT,
Tensorrt首先会将我们训练好的神经网络模型加载并优化,优化一些模型参数比如batch size, precision等,接着序列化到磁盘文件,如下图:
在线实时predict时,我们会加载磁盘文件并反序列化为TensorRT engine对象,可以看到TensorRT engine对象把之前的隐藏层及神经元都进行了优化,更适合GPU的数据运算,如下图:
在使用Tensorrt时需要对应的cuda、cudnn版本,TensorFlow 对应的的1.7以后的版本可以用Python编写涉及到TensorRT的代码,如下图:
结合物理机上测试数据,Tensorrt可以将TensorFlow serving的响应延时压缩30%以上。
refer:
https://tensorflow.google.cn/serving/
https://github.com/NVIDIA-AI-IOT/tf_trt_models
https://devblogs.nvidia.com/tensorrt-3-faster-tensorflow-inference/
https://www.nvidia.com/en-us/data-center/resources/inference-technical-overview/