此文記錄一下算法實施過程當中遇到的問題,整個過程基於Python技術棧,無縫集成到流式處理框架中,首先軟硬件配置以下:
服務器配置:64 cores,256G內存,GPU Tesla K80 (4個);git
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 2github
項目中須要提供高併發低延遲的在線predict,正好離線訓練用的是TensorFlow的DNN模型,模型的hidden layer設置3層,
取的最終訓練好的DNN的隱藏層的權重做爲特徵,能夠類比FNN中用神經網絡作了特徵延伸,接下來要把訓練好的DNN模型部署線上實時predict。
TensorFlow Serving能夠提供多模型、多版本的版本發佈,很適合迭代開發以及高頻部署,具體的server端代碼參照:算法
調用的client端代碼參照:api
若是咱們還想進一步優化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/